現代軟件工程:如何高效構建軟件 Modern Software Engineering: Doing What Works to Build Better Software Faster

David Farley 譯 趙睿 ,茹炳晟

買這商品的人也買了...

商品描述

本書探討了軟件工程的真正含義,匯集了一些重要的軟件開發基本原則,
將它們緊密結合成一個一致的模型,旨在幫助讀者有效、快速地構建軟件。
全書共4個部分:
第1部分探討軟件工程的真正含義,以及如何將工程的原則和原理應用到軟件開發中;
第2部分講述運用科學思想優化軟件開發過程的方法,包括迭代式、
增量式工作,獲得併利用快速、高質量的反饋,採用實驗性和經驗主義的科學方法;
第3部分介紹管理軟件複雜性的方法,深入探討模塊化、內聚力、關注點分離、信息隱藏和抽象、管理耦合等原則;
第4部分介紹支持軟件工程的工具,以及一些貫穿本書的軟件開發理念,包括可測試性、可部署性、速度、控制變量、持續交付等。

目錄大綱

第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 生產不是我們的問題12
2.2 設計工程,而非生產工程12
2.3 工程學的初步定義17
2.4 工程不等於代碼18
2.5 為什麼工程很重要?20
2.6 “工藝”的極限20
2.7 精度和可伸縮性21
2.8 管理複雜性22
2.9 測量的可重複性和準確性23
2.10 工程、創造和工藝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 變革的行業?33
3.2 度量的重要性35
3.3 應用穩定性和吞吐量37
3.4 軟件工程學科的基礎38
3.5 學習專家39
3.6 管理複雜性的專家40
3.7 小結41
第2部分優化學習
第4章迭代式工作45
4.1 迭代式工作的實際優勢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 產品設計中的反饋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章經驗主義85
7.1 立足於現實86
7.2 區分經驗主義與實驗性87
7.3 “我知道那個bug!” 87
7.4 避免自我欺騙89
7.5 創造符合我們論點的現實90
7.6 以現實為指導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 將測試的實驗結果置於環境中103
8.8 實驗範圍105
8.9 小結106
第3部分優化管理複雜性
第9章模塊化109
9.1 模塊化的標誌111
9.2 低估優秀設計的重要性111
9.3 可測試性的重要性113
9.4 可測試性設計提高模塊化114
9.5 服務和模塊化120
9.6 可部署性和模塊化121
9.7 不同規模的模塊化123
9.8 人類系統中的模塊化124
9.9 小結126
第10章內聚力127
10.1 模塊化和內聚力:設計的基礎127
10.2 內聚力的基本降低128
10.3 上下文很重要131
10.4 高性能軟件134
10.5 與耦合的聯繫135
10.6 測試驅動開發推動高內聚力136
10.7 如何實現內聚軟件136
10.8 內聚力差的代價139
10.9 人類系統中的內聚力140
10.10 小結140
第11章關注點分離141
11.1 依賴注入145
11.2 分離本質複雜性和偶然複雜性146
11.3 領域驅動設計的重要性149
11.4 可測試性151
11.5 端口和適配器151
11.6 何時採用端口和適配器154
11.7 什麼是API 155
11.8 使用測試驅動開發推動關注點分離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 選擇適當的抽象172
12.10 問題領域的抽象174
12.11 抽象偶然複雜性175
12.12 隔離第三方系統和代碼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 人類系統中的松耦合194
13.12 小結196
第4部分支持軟件工程的工具
第14 章工程學科的工具199
14.1 什麼是軟件開發?200
14.2 可測試性作為工具202
14.3 測量點205
14.4 實現可測試性的問題205
14.5 如何提高可測試性209
14.6 可部署性210
14.7 速度212
14.8 控制變量213
14.9 持續交付214
14.10 支持工程的通用工具215
14.11 小結216
第15章現代軟件工程師217
15.1 工程作為人類過程219
15.2 數字化顛覆性組織220
15.3 結果與機制222
15.4 持久且普遍適用224
15.5 工程學科的基礎227
15.6 小結227