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