【架構師拯救世界】
在我的職業(yè)生涯中,曾經(jīng)見過一些差勁的系統(tǒng),沒有人知道這個系統(tǒng)是從什么時候開始變差的,參與其中的每個人都痛苦不堪,所有人都在同這個差勁的系統(tǒng)比賽,要么自己的工作進度足夠快,在系統(tǒng)變得更差勁之前把自己的功能開發(fā)完成,發(fā)布上線;要么自己足夠快,在系統(tǒng)變得更差之前“跑路走人”。
這樣的系統(tǒng)通常都有一個共同特征:缺乏一個強有力的技術掌舵者,沒有人為這個系統(tǒng)進行整體規(guī)劃和設計,甚至沒有人對系統(tǒng)整體負責,也就是說沒有一個真正意義上的軟件架構師。系統(tǒng)從一開始為實現(xiàn)某些功能堆砌了一堆代碼,然后就是不斷地往上繼續(xù)堆砌代碼,隨著時間推移,系統(tǒng)變成了一團亂麻,每天的日常開發(fā)變成了一場冒險之旅,很容易就掉到坑里。
軟件編程似乎沒有門檻,任何接受過義務教育的人經(jīng)過一些基本的編程培訓就能夠?qū)懸恍┛梢詧?zhí)行的代碼。但是想要設計一個架構良好、易于維護、富有彈性的系統(tǒng),卻是一件非常困難的事情。就我所見,很多項目團隊根本沒有系統(tǒng)架構設計這樣一個軟件開發(fā)階段,也沒有一個掌控整個系統(tǒng)技術架構的人,項目管理者主要關注內(nèi)部和外部的各種溝通,以及人員、進度管理,而缺乏對系統(tǒng)架構的關注,導致系統(tǒng)架構在日復一日的開發(fā)過程中逐漸“腐爛”。
在實際工作中,很多軟件工程師可能從來沒有體會過良好架構設計帶來的好處:系統(tǒng)模塊的層次邊界清晰,每個團隊成員的工作都很少耦合;需求變更不需要在一大堆代碼中改來改去,只要擴展幾個類就能輕松實現(xiàn);用戶量快速增加時,只需要變更部署方案就可以應對,甚至不需要改動代碼。而由此獲益的其實是企業(yè)管理者,他不必為急劇膨脹的技術人員招聘預算而愁眉不展。
很多軟件項目團隊缺乏一個合格的軟件架構師,甚至沒有架構師。如果不能面對問題、解決問題,你跑得再快也于事無補,逃往的下一個地方也許有一個更不友好的系統(tǒng)在等著你。如果當前項目沒有一個能夠掌控技術架構的人,那么,最好的辦法就是你盡早站出來,為整個系統(tǒng)的技術架構承擔責任,讓自己成為軟件架構師。整個過程你收獲的不只是更好的工作體驗,還有更廣闊、更美好的未來。
優(yōu)秀的軟件架構師能夠設計架構良好的系統(tǒng),并讓它在漫長的生命周期中持續(xù)演進、清晰合理。優(yōu)秀的軟件架構師既能夠?qū)懫恋募夹gPPT,又能夠?qū)懫恋拇a,他開發(fā)的核心代碼可支撐起系統(tǒng)的核心架構,架構方案可得到大多數(shù)人的擁護。優(yōu)秀的軟件架構師擁有宏觀的技術視角,能夠用更廣闊的愿景來詮釋當前項目的技術、架構和未來的演化趨勢;優(yōu)秀的軟件架構師擁有某種技術影響力和領導力,無須施展權威就可以讓其他工程師聽信于他;優(yōu)秀的軟件架構師還會掌握一些特別的管理、談判技能,讓自己的技術構想易于被其他工程師、項目經(jīng)理、企業(yè)管理者和用戶接納。
軟件架構師也許不能拯救世界,但是他可以拯救自己,而自己即是世界。
【讀者對象】
●希望成為架構師的軟件開發(fā)工程師;
●需要掌握全面架構方法的技術經(jīng)理;
●期望進行技術提升的架構師;
●計算機專業(yè)的在校大學生、研究生;
●計劃轉行進入軟件開發(fā)領域的人員。
【你可以從本書收獲什么】
軟件架構師應該是軟件開發(fā)方面的全才,需要掌握方方面面的知識,這樣才能針對業(yè)務場景選擇最合適的技術解決方案,解決開發(fā)實踐中形形色色的問題。
那么,架構師如何獲得這些技能,如何構建自己的架構師知識體系呢?本書總結了以下四個方面:
1)架構師的基礎知識修煉:軟件的基礎知識主要包括操作系統(tǒng)、數(shù)據(jù)結構、數(shù)據(jù)庫原理等。本書會從一個常見的問題入手,直達這些基礎技術的原理,并覆蓋這些基礎技術的關鍵技術點,讓你在理解這些基礎技術原理和日常開發(fā)工作的關聯(lián)基礎上,對這些基礎技術產(chǎn)生全新的認知。
2)架構師的程序設計修煉:如何設計一個強大、靈活、易復用、易維護的軟件?在這個過程中,可以使用哪些工具和方法?遵循哪些原則和思想?使用哪些模式和手段?如果軟件只是實現(xiàn)功能,那么,程序員就沒有高下之分,軟件也沒有好壞之分,技術也就不會進步。好的軟件究竟好在哪里?如何寫出一個好的程序?本書會逐一解答這些問題。
3)架構師的架構方法修煉:圍繞目前主要的互聯(lián)網(wǎng)分布式架構以及大數(shù)據(jù)、物聯(lián)網(wǎng)架構,分析這些架構背后的原理,看它們都遵循著什么樣的設計思想,有哪些看似不同而原理相同的技術,以及如何通過這些技術實現(xiàn)系統(tǒng)的高可用和高性能。
4)架構師的思維修煉:軟件開發(fā)是實踐性很強的活動,只是學習技術無異于紙上談兵。只有將知識技能應用到工作實踐中,你才能真正體會到技術的關鍵點在哪里,才能分辨出哪些技術是真正有用的,哪些方法是“花拳繡腿”。但是公司不是你實踐技術的實驗室,怎樣才能處理好工作中的各種關系,得到充分的授權和信任,在工作中實踐自己的技術思想,并為公司創(chuàng)造更多的價值,得到更大的晉升和發(fā)揮空間,使自己的技術成長和職業(yè)發(fā)展進入正向通道?架構師也需要工作思維方面的修煉與提升。
應該說,這些內(nèi)容涵蓋了架構師技術技能的各個方面,但是在學習和實踐的過程中,技術的全面與精通必然會有沖突,那該怎么辦呢?對于架構師而言,應該優(yōu)先建立全面的技術知識體系,然后針對知識短板和實踐中遇到的問題,有針對性地提高和學習。本書的目的就在于此,即全面呈現(xiàn)架構師的知識結構體系與相關技術的本質(zhì)和內(nèi)涵,使讀者構建架構知識之網(wǎng),能從全局思考并面對自己的工作。
而構建知識體系的過程,是學習,也是修煉。
【第一部分 架構師的基礎知識修煉】
第1章 操作系統(tǒng)原理:程序是如何運行和崩潰的 2
1.1 程序是如何運行起來的 2
1.2 一臺計算機如何同時處理數(shù)以百計的任務 4
1.3 系統(tǒng)為什么會變慢,為什么會崩潰 5
1.4 小結 7
第2章 數(shù)據(jù)結構原理:Hash表的時間復雜度為什么是O(1) 8
2.1 數(shù)組的結構 8
2.2 鏈表的結構 9
2.3 Hash表的結構 10
2.4 棧的結構 12
2.5 隊列的結構 13
2.6 樹的結構 14
2.7 小結 14
第3章 Java虛擬機原理:JVM為什么被稱為機器 16
3.1 JVM的構造 17
3.2 JVM的垃圾回收 19
3.3 Web應用程序在JVM中的執(zhí)行過程 22
3.4 小結 24
第4章 網(wǎng)絡編程原理:一個字符的互聯(lián)網(wǎng)之旅 25
4.1 DNS域名解析原理 26
4.2 CDN 27
4.3 HTTP的結構 28
4.4 TCP的結構 29
4.5 鏈路層負載均衡原理 32
4.6 小結 33
第5章 文件系統(tǒng)原理:用1分鐘遍歷一個100TB的文件 34
5.1 硬盤結構原理 35
5.2 文件系統(tǒng)原理 36
5.3 RAID硬盤陣列原理 37
5.4 分布式文件系統(tǒng)架構原理 39
5.5 小結 40
第6章 數(shù)據(jù)庫原理:SQL為什么要預編譯 42
6.1 數(shù)據(jù)庫架構與SQL執(zhí)行過程 43
6.2 使用PrepareStatement執(zhí)行SQL的好處 45
6.3 數(shù)據(jù)庫文件存儲與索引工作原理 46
6.4 小結 48
第7章 編程語言原理:面向?qū)ο缶幊淌蔷幊痰慕K極形態(tài)嗎 49
7.1 軟件編程的遠古時代 49
7.2 機器與匯編語言時代 51
7.3 高級編程語言時代 51
7.4 面向?qū)ο缶幊虝r代 52
7.5 編程語言的未來 53
7.6 小結 54
【第二部分 架構師的程序設計修煉】
第8章 軟件設計的方法論:軟件為什么要建模 56
8.1 什么是軟件建模 57
8.2 4+1視圖模型 58
8.3 UML建模 59
8.4 小結 60
第9章 軟件設計實踐:使用UML完成一個設計文檔 61
9.1 用類圖設計對象模型 61
9.2 用序列圖描述系統(tǒng)調(diào)用 62
9.3 用組件圖進行模塊設計 63
9.4 用部署圖描述系統(tǒng)物理架構 64
9.5 使用用例圖進行需求分析 65
9.6 用狀態(tài)圖描述對象狀態(tài)變遷 66
9.7 用活動圖描述調(diào)用流程 66
9.8 使用合適的UML模型構建一個軟件設計文檔 67
9.9 軟件架構設計文檔示例模板 68
9.10 小結 74
第10章 軟件設計的目的:糟糕的程序差在哪里 75
10.1 糟糕的設計有多糟糕 76
10.2 一個設計“腐壞”的例子 77
10.3 解決之道 78
10.4 小結 80
第11章 軟件設計的開閉原則:不修改代碼卻能實現(xiàn)需求變更 81
11.1 什么是開閉原則 81
11.2 一個違反開閉原則的例子 82
11.3 使用策略模式實現(xiàn)開閉原則 84
11.4 使用適配器模式實現(xiàn)開閉原則 85
11.5 使用觀察者模式實現(xiàn)開閉原則 86
11.6 使用模板方法模式實現(xiàn)開閉原則 88
11.7 小結 89
第12章 軟件設計的依賴倒置原則:不依賴代碼卻可以復用它的功能 91
12.1 依賴倒置原則 91
12.2 依賴倒置的關鍵是接口所有權的倒置 93
12.3 使用依賴倒置來實現(xiàn)高層模塊復用 94
12.4 小結 96
第13章 軟件設計的里氏替換原則:正方形可以繼承長方形嗎 97
13.1 里氏替換原則 98
13.2 一個違反里氏替換原則的例子 99
13.3 正方形可以繼承長方形嗎 100
13.4 子類不能比父類更嚴格 101
13.5 小結 102
第14章 軟件設計的單一職責原則:一個類文件打開后最好不要超過一屏 104
14.1 單一職責原則 107
14.2 一個違反單一職責原則的例子 107
14.3 從Web應用架構演進看單一職責原則 108
14.4 小結 110
第15章 軟件設計的接口隔離原則:如何對類的調(diào)用者隱藏類的公有方法 112
15.1 接口隔離原則 113
15.2 一個使用接口隔離原則優(yōu)化的例子 114
15.3 接口隔離原則在迭代器設計模式中的應用 117
15.4 小結 117
第16章 設計模式基礎:不會靈活應用設計模式,就沒有掌握面向?qū)ο缶幊?119
16.1 面向?qū)ο缶幊痰谋举|(zhì)是多態(tài) 119
16.2 設計模式的精髓是對多態(tài)的使用 121
16.3 小結 123
第17章 設計模式應用:編程框架中的設計模式 125
17.1 什么是框架 125
17.2 Web容器中的設計模式 127
17.3 JUnit中的設計模式 129
17.4 小結 132
第18章 反應式編程框架設計:如何使程序調(diào)用不阻塞等待,立即響應 133
18.1 反應式編程 135
18.2 反應式編程框架Flower的基本原理 135
18.3 反應式編程框架Flower的設計方法 138
18.4 反應式編程框架Flower的落地效果 140
18.5 小結 141
第19章 組件設計原則:組件的邊界在哪里 143
19.1 組件內(nèi)聚原則 144
19.2 組件耦合原則 145
19.3 小結 147
第20章 領域驅(qū)動設計:35歲的程序員應該寫什么樣的代碼 148
20.1 領域模型模式 149
20.2 領域驅(qū)動設計 151
20.3 小結 154
【第三部分 架構師的架構方法修煉】
第21章 分布式架構:如何應對高并發(fā)的用戶請求 156
21.1 垂直伸縮與水平伸縮 157
21.2 互聯(lián)網(wǎng)分布式架構演化 157
21.3 小結 163
第22章 緩存架構:減少不必要的計算 165
22.1 通讀緩存 166
22.2 旁路緩存 168
22.3 緩存注意事項 171
22.4 小結 173
第23章 異步架構:避免互相依賴的系統(tǒng)間耦合 174
23.1 使用消息隊列實現(xiàn)異步架構 175
23.2 消息隊列異步架構的好處 178
23.3 小結 180
第24章 負載均衡架構:用10行代碼實現(xiàn)一個負載均衡服務 181
24.1 HTTP重定向負載均衡 181
24.2 DNS負載均衡 183
24.3 反向代理負載均衡 184
24.4 IP負載均衡 184
24.5 數(shù)據(jù)鏈路層負載均衡 186
24.6 小結 187
第25章 數(shù)據(jù)存儲架構:改善系統(tǒng)的數(shù)據(jù)存儲能力 188
25.1 數(shù)據(jù)庫主從復制 188
25.2 數(shù)據(jù)庫分片 190
25.3 關系數(shù)據(jù)庫的混合部署 193
25.4 NoSQL數(shù)據(jù)庫 196
25.5 小結 197
第26章 搜索引擎架構:瞬間完成海量數(shù)據(jù)檢索 199
26.1 搜索引擎倒排索引 199
26.2 搜索引擎結果排序 202
26.3 小結 205
第27章 微服務架構:微服務究竟是“靈丹”還是“毒藥” 206
27.1 單體架構的困難和挑戰(zhàn) 206
27.2 微服務框架原理 208
27.3 微服務架構的落地實踐 210
27.4 小結 211
第28章 高性能架構:除了代碼,還可以在哪些地方優(yōu)化性能 212
28.1 性能指標 212
28.2 性能測試 213
28.3 性能優(yōu)化 215
28.4 小結 219
第29章 高可用架構:淘寶應用升級時,為什么沒有停機 220
29.1 高可用的度量 221
29.2 高可用的架構 222
29.3 小結 225
第30章 安全性架構:為什么說用戶密碼泄露是程序員的問題 227
30.1 數(shù)據(jù)加密與解密 227
30.2 HTTP攻擊與防護 230
30.3 小結 233
第31章 大數(shù)據(jù)架構:思想和原理 234
31.1 HDFS分布式文件存儲架構 235
31.2 MapReduce大數(shù)據(jù)計算架構 236
31.3 Hive大數(shù)據(jù)倉庫架構 238
31.4 Spark快速大數(shù)據(jù)計算架構 240
31.5 大數(shù)據(jù)流計算架構 242
31.6 小結 242
第32章 AI與物聯(lián)網(wǎng)架構:從智能引擎到物聯(lián)網(wǎng)平臺 243
32.1 大數(shù)據(jù)平臺架構 244
32.2 智能推薦算法 245
32.3 物聯(lián)網(wǎng)大數(shù)據(jù)架構 249
32.4 小結 250
第33章 區(qū)塊鏈技術架構:區(qū)塊鏈到底能做什么 251
33.1 比特幣與區(qū)塊鏈原理 251
33.2 聯(lián)盟鏈與區(qū)塊鏈的企業(yè)級應用 255
33.3 小結 257
【第四部分 架構師的思維修煉】
第34章 技術修煉之道:同樣工作十幾年,為什么有的人成為資深架構師,有的人失業(yè) 260
34.1 德雷福斯模型 261
34.2 如何在工作中成長 263
34.3 小結 264
第35章 技術進階之道:你和世界上頂級的程序員差幾個等級 265
35.1 軟件技術的生態(tài)江湖與等級體系 265
35.2 技術進階之捷徑 267
35.3 小結 269
第36章 技術落地之道:你真的知道自己要解決的問題是什么嗎 270
36.1 確定會議真正要解決的問題是什么 271
36.2 不需要去解決別人的問題,提醒他問題的存在即可 272
36.3 去解決那些被人們習以為常而忽略了的問題 273
36.4 小結 273
第37章 技術溝通之道:如何解決問題 275
37.1 讓有能力解決問題的人感受到問題的存在 275
37.2 “直言有諱” 276
37.3 想解決一個大家都不關注的問題,可以等問題變得更糟 277
37.4 如果不填老師想要的答案,你就得不了分 278
37.5 小結 278
第38章 技術管理之道:真的要轉管理嗎 280
38.1 彼得定律 281
38.2 用目標驅(qū)動 282
38.3 小結 283
附錄A 軟件開發(fā)技術的第一性原理 284
附錄B 我的架構師成長之路 287
附錄C 無處不在的架構之美 293
附錄D 軟件架構師之道 298