本書探討了軟件工程的真正含義,匯集了一些重要的軟件開發(fā)基本原則,將它們緊密結合成一個一致的模型,旨在幫助讀者有效、快速地構建軟件。全書共4個部分:第1部分探討軟件工程的真正含義,以及如何將工程的原則和原理應用到軟件開發(fā)中;第2部分講述運用科學思想優(yōu)化軟件開發(fā)過程的方法,包括迭代式、增量式工作,獲得并利用快速、高質(zhì)量的反饋,采用實驗性和經(jīng)驗主義的科學方法;第3部分介紹管理軟件復雜性的方法,深入探討模塊化、內(nèi)聚力、關注點分離、信息隱藏和抽象、管理耦合等原則;第4部分介紹支持軟件工程的工具,以及一些貫穿本書的軟件開發(fā)理念,包括可測試性、可部署性、速度、控制變量、持續(xù)交付等。
(1)持續(xù)交付先驅(qū)戴維·法利全新力作。曾與耶斯·亨布爾(JezHumble)共同撰寫了獲Jolt大獎的圖書《持續(xù)交付:發(fā)布可靠軟件的系統(tǒng)方法》。
(2)改進復雜軟件系統(tǒng)的工程實踐指南。糾正人們對軟件工程的傳統(tǒng)認知誤區(qū),闡述生產(chǎn)力和創(chuàng)造力在軟件工程中缺一不可的辯證關系;跳出特定的工具或技術,抽象、提煉、連貫為一套具有普適性、基礎性的現(xiàn)代軟件工程思想和范式;以實用有效的方法為重點,講解科學原理、工程技術如何應用于軟件開發(fā)。
(3)廣泛適用于各類軟件開發(fā)團隊。書中提及的“道法術器”,對于初創(chuàng)公司或大型企業(yè)都適用,促進軟件組織更加可靠、有效、高質(zhì)量地構建軟件,交付業(yè)務價值,激發(fā)創(chuàng)新活力。
(4)國家衛(wèi)星氣象中心風云四號氣象衛(wèi)星地面系統(tǒng)副總設計師 楊磊、中國信息通信研究院云計算與大數(shù)據(jù)研究所副總工程師陳屹力等業(yè)界學者、實踐者親筆推薦。
戴維·法利(David Farley)是持續(xù)交付的先驅(qū)、思想領袖,也是持續(xù)交付、DevOps、測試驅(qū)動開發(fā)和軟件開發(fā)領域的專家。
從現(xiàn)代計算的早期開始,戴維曾擔任過程序員、軟件工程師、系統(tǒng)架構師和成功團隊的核心,他掌握了計算機和軟件開發(fā)的基本原理,并形成了開創(chuàng)性的方法,改變了開發(fā)人員和團隊的工作方式。他挑戰(zhàn)了傳統(tǒng)的思維方式,帶領團隊開發(fā)了世界top級的軟件。
戴維是獲Jolt大獎的《持續(xù)交付:發(fā)布可靠軟件的系統(tǒng)方法》一書的作者之一,是一位受歡迎的會議演講者,并在YouTube上運營著廣受歡迎的“持續(xù)交付”頻道,主題是軟件工程。他建立了世界上速度快的金融交易所之一,是行為驅(qū)動開發(fā)的先驅(qū),是《反應式宣言》的作者之一,并憑借LMAX Disruptor獲得了杜克開源軟件獎。
戴維熱衷于通過咨詢、YouTube 頻道和培訓課程分享他的專業(yè)知識,幫助世界各地的開發(fā)團隊改進軟件的設計,提高軟件的質(zhì)量和可靠性。
序 ——特麗莎·吉(Trisha Gee),開發(fā)技術推廣工程師和Java 擁護者
第 1部分 什么是軟件工程?
第 1章 簡單介紹 3
1.1 工程——科學的實際應用 3
1.2 軟件工程的定義 4
1.3 重新定義“軟件工程” 6
1.4 軟件工程的誕生 7
1.5 范式轉移 9
1.6 小結 10
第 2章 什么是工程? 11
2.1 生產(chǎn)不是我們的問題 12
2.2 設計工程,而非生產(chǎn)工程 12
2.3 工程學的初步定義 17
2.4 工程不等于代碼 18
2.5 為什么工程很重要? 20
2.6 “工藝”的極限 20
2.7 精度和可伸縮性 21
2.8 管理復雜性 22
2.9 測量的可重復性和準確性 23
2.10 工程、創(chuàng)造和工藝 25
2.11 為什么我們所做的不是軟件工程 27
2.12 權衡 28
2.13 進步的錯覺 28
2.14 從工藝到工程的旅程 29
2.15 只有工藝還不夠 30
2.16 是時候反思了? 30
2.17 小結 32
第3章 工程方法的基本原理 33
3.1 變革的行業(yè)? 33
3.2 度量的重要性 35
3.3 應用穩(wěn)定性和吞吐量 37
3.4 軟件工程學科的基礎 38
3.5 學習專家 39
3.6 管理復雜性的專家 40
3.7 小結 41
第 2部分 優(yōu)化學習
第4章 迭代式工作 45
4.1 迭代式工作的實際優(yōu)勢 47
4.2 迭代作為防御性設計策略 49
4.3 計劃的誘惑 51
4.4 迭代式工作的實用性 56
4.5 小結 58
第5章 反饋 59
5.1 反饋重要性的實例 60
5.2 編碼中的反饋 63
5.3 集成中的反饋 64
5.4 設計中的反饋 66
5.5 架構中的反饋 68
5.6 傾向于早期反饋 70
5.7 產(chǎn)品設計中的反饋 71
5.8 組織和文化中的反饋 72
5.9 小結 74
第6章 增量主義 75
6.1 模塊化的重要性 76
6.2 組織增量主義 77
6.3 增量主義工具 79
6.4 限制變更的影響 80
6.5 增量式設計 82
6.6 小結 84
第7章 經(jīng)驗主義 85
7.1 立足于現(xiàn)實 86
7.2 區(qū)分經(jīng)驗主義與實驗性 87
7.3 “我知道那個bug!” 87
7.4 避免自我欺騙 89
7.5 創(chuàng)造符合我們論點的現(xiàn)實 90
7.6 以現(xiàn)實為指導 93
7.7 小結 94
第8章 實驗性 95
8.1 “實驗性”是什么意思? 96
8.2 反饋 97
8.3 假設 99
8.4 度量 100
8.5 控制變量 101
8.6 自動化測試作為實驗 102
8.7 將測試的實驗結果置于環(huán)境中 103
8.8 實驗范圍 105
8.9 小結 106
第3部分 優(yōu)化管理復雜性
第9章 模塊化 109
9.1 模塊化的標志 111
9.2 低估優(yōu)秀設計的重要性 111
9.3 可測試性的重要性 113
9.4 可測試性設計提高模塊化 114
9.5 服務和模塊化 120
9.6 可部署性和模塊化 121
9.7 不同規(guī)模的模塊化 123
9.8 人類系統(tǒng)中的模塊化 124
9.9 小結 126
第 10章 內(nèi)聚力 127
10.1 模塊化和內(nèi)聚力:設計的基礎 127
10.2 內(nèi)聚力的基本降低 128
10.3 上下文很重要 131
10.4 高性能軟件 134
10.5 與耦合的聯(lián)系 135
10.6 測試驅(qū)動開發(fā)推動高內(nèi)聚力 136
10.7 如何實現(xiàn)內(nèi)聚軟件 136
10.8 內(nèi)聚力差的代價 139
10.9 人類系統(tǒng)中的內(nèi)聚力 140
10.10 小結 140
第 11章 關注點分離 141
11.1 依賴注入 145
11.2 分離本質(zhì)復雜性和偶然復雜性 146
11.3 領域驅(qū)動設計的重要性 149
11.4 可測試性 151
11.5 端口和適配器 151
11.6 何時采用端口和適配器 154
11.7 什么是API 155
11.8 使用測試驅(qū)動開發(fā)推動關注點分離 156
11.9 小結 157
第 12章 信息隱藏和抽象 158
12.1 抽象或信息隱藏 158
12.2 是什么導致了“大泥球” 159
12.3 組織和文化問題 159
12.4 技術問題和設計問題 162
12.5 對過度設計的恐懼 165
12.6 通過測試改進抽象 168
12.7 抽象的力量 169
12.8 抽象泄漏 170
12.9 選擇適當?shù)某橄? 172
12.10 問題領域的抽象 174
12.11 抽象偶然復雜性 175
12.12 隔離第三方系統(tǒng)和代碼 178
12.13 總是傾向于隱藏信息 179
12.14 小結 180
第 13章 管理耦合 181
13.1 耦合的代價 181
13.2 擴展 182
13.3 微服務 183
13.4 解耦可能意味著更多的代碼 185
13.5 松耦合不是重要的類型 187
13.6 傾向于松耦合 188
13.7 這與關注點分離有何不同? 189
13.8 DRY 太過于簡單化 190
13.9 異步作為松耦合的工具 192
13.10 松耦合設計 193
13.11 人類系統(tǒng)中的松耦合 194
13.12 小結 196
第4部分 支持軟件工程的工具
第 14 章 工程學科的工具 199
14.1 什么是軟件開發(fā)? 200
14.2 可測試性作為工具 202
14.3 測量點 205
14.4 實現(xiàn)可測試性的問題 205
14.5 如何提高可測試性 209
14.6 可部署性 210
14.7 速度 212
14.8 控制變量 213
14.9 持續(xù)交付 214
14.10 支持工程的通用工具 215
14.11 小結 216
第 15章 現(xiàn)代軟件工程師 217
15.1 工程作為人類過程 219
15.2 數(shù)字化顛覆性組織 220
15.3 結果與機制 222
15.4 持久且普遍適用 224
15.5 工程學科的基礎 227
15.6 小結 227