軟件開發(fā)既需要理論和科學(xué),也需要經(jīng)驗(yàn)和技藝。可惜,一直以來許多圖書都只關(guān)注前一部分,而忽略了后一部分。馬克的這本書主要關(guān)注的就是經(jīng)驗(yàn)和技藝的部分。本書既詳細(xì)講解了API設(shè)計(jì)、紅綠重構(gòu)等常用技術(shù),也演示了如何撰寫提交說明、如何修改單元測試,同時對故障定位、代碼閱讀、團(tuán)隊(duì)合作等傳統(tǒng)上被認(rèn)為“難以說清”的話題,也給出了實(shí)用且精當(dāng)?shù)慕ㄗh。難能可貴的是,與其他圖書提供的示例代碼庫不同,本書的示例代碼庫包含了完整的Git提交記錄。也就是說,讀者可以按照作者的道路,一步一個腳印地重溫整個開發(fā)過程。如果你的經(jīng)驗(yàn)還不夠豐富,建議嚴(yán)格按照作者的講解,認(rèn)真讀完全書,掌握軟件工程的技巧。如果你已經(jīng)有足夠的開發(fā)經(jīng)驗(yàn),不妨略讀全書,精讀自己不熟悉但感興趣的部分。對自己不認(rèn)同的部分,也不妨花時間了解作者主張的前因后果,讓自己對許多問題有更全面的認(rèn)知。
馬克·西曼是一位平庸的經(jīng)濟(jì)學(xué)家,于是他改行當(dāng)了程序員。從20世紀(jì)90年代末起,他一直在開發(fā)Web和企業(yè)應(yīng)用。馬克年輕的時候想成為搖滾明星,然而不幸的是他既沒有音樂天賦,也沒有搖滾明星的長相——結(jié)果,他成了Certi?ed Rockstar Developer。他寫的一本關(guān)于依賴注入的書獲得了Jolt大獎,做過100余場國際會議演講,并給教育在線網(wǎng)站Pluralsight和Clean Coders錄制過視頻課程。
馬克·西曼是一位平庸的經(jīng)濟(jì)學(xué)家,于是他改行當(dāng)了程序員。從20世紀(jì)90年代末起,他一直在開發(fā)Web和企業(yè)應(yīng)用。馬克年輕的時候想成為搖滾明星,然而不幸的是他既沒有音樂天賦,也沒有搖滾明星的長相——結(jié)果,他成了Certi?ed Rockstar Developer。他寫的一本關(guān)于依賴注入的書獲得了Jolt大獎,做過100余場國際會議演講,并給教育在線網(wǎng)站Pluralsight和Clean Coders錄制過視頻課程。
第1部分 由慢到快
第1章 是藝術(shù),還是科學(xué) 3
1.1 蓋房子 4
1.1.1 項(xiàng)目論之誤 4
1.1.2 階段論之誤 5
1.1.3 依賴 5
1.2 培育花園 6
1.2.1 花園中的植物為何會生長 6
1.3 工程 7
1.3.1 作為手工制品的軟件 7
1.3.2 實(shí)用性 8
1.3.3 軟件工程的早期表述 9
1.3.4 與軟件工程共同進(jìn)步 10
1.4 結(jié)論 12
第2章 檢查清單 13
2.1 助記工具 13
2.2 針對新代碼庫的檢查清單 15
2.2.1 使用Git 16
2.2.2 自動化構(gòu)建 17
2.2.3 顯示所有錯誤消息 21
2.3 為已有的代碼庫新增檢查規(guī)則 25
2.3.1 漸進(jìn)式開發(fā) 26
2.3.2 在組織中“便宜行事” 27
2.4 結(jié)論 28
第3章 控制復(fù)雜性 29
3.1 目標(biāo) 30
3.1.1 可持續(xù)性 31
3.1.2 價值 31
3.2 為何編程是困難的 33
3.2.1 人腦類比 33
3.2.2 讀得多、寫得少的代碼 35
3.2.3 可讀性 35
3.2.4 腦力勞動 36
3.3 關(guān)于軟件工程 38
3.3.1 與計(jì)算機(jī)科學(xué)的關(guān)系 38
3.3.2 人性化代碼 39
3.4 結(jié)論 40
第4章 垂直切片 41
4.1 從能使用的軟件開始 41
4.1.1 從數(shù)據(jù)入口到數(shù)據(jù)持久化 42
4.1.2 最小的垂直切片 43
4.2 活動骨架 44
4.2.1 特征測試 45
4.2.2 預(yù)備-執(zhí)行-斷言 47
4.2.3 靜態(tài)代碼分析的合理尺度 48
4.3 由外到內(nèi) 50
4.3.1 接收J(rèn)SON 52
4.3.2 提交預(yù)訂請求 54
4.3.3 單元測試 58
4.3.4 DTO 和領(lǐng)域模型 59
4.3.5 偽對象 62
4.3.6 Repository接口 63
4.3.7 Repository中的Create方法 64
4.3.8 配置依賴關(guān)系 65
4.4 完成切片 66
4.4.1 schema 67
4.4.2 SQL Repository 68
4.4.3 連接數(shù)據(jù)庫的配置 70
4.4.4 冒煙測試 71
4.4.5 使用偽(Fake)數(shù)據(jù)庫的邊界測試 72
4.5 結(jié)論 73
第5章 封裝 75
5.1 保存數(shù)據(jù) 75
5.1.1 代碼改動優(yōu)先級的原則 76
5.1.2 參數(shù)化測試 77
5.1.3 把DTO復(fù)制到領(lǐng)域模型中 79
5.2 驗(yàn)證 80
5.2.1 錯誤的日期 81
5.2.2 紅綠重構(gòu) 83
5.2.3 自然數(shù) 86
5.2.4 Postel定律 89
5.3 保護(hù)不變量 92
5.3.1 恒常有效 93
5.4 結(jié)論 95
第6章 三角測量 96
6.1 短期記憶與長期記憶 96
6.1.1 遺留代碼和記憶 98
6.2 能力 99
6.2.1 超訂 99
6.2.2 惡魔的辯詞 103
6.2.3 已有的預(yù)訂記錄 105
6.2.4 惡魔的辯詞與紅綠重構(gòu) 107
6.2.5 多少測試才算夠 110
6.3 結(jié)論 110
第7章 分解 112
7.1 代碼惡化 112
7.1.1 閾值 113
7.1.2 圈復(fù)雜度 114
7.1.3 80/24 規(guī)則 116
7.2 與思維合拍的代碼 117
7.2.1 六角花 117
7.2.2 內(nèi)聚 120
7.2.3 依戀情結(jié) 123
7.2.4 類型轉(zhuǎn)換的代價 124
7.2.5 解析,而不是驗(yàn)證 125
7.2.6 分形架構(gòu) 129
7.2.7 清點(diǎn)變量 132
7.3 結(jié)論 133
第8章 API設(shè)計(jì) 135
8.1 API設(shè)計(jì)原則 135
8.1.1 預(yù)設(shè)用法 136
8.1.2 防錯設(shè)計(jì) 138
8.1.3 寫給讀者看的代碼 139
8.1.4 比起注釋,花更多精力在代碼的命名上 140
8.1.5 蒙住名字 141
8.1.6 分離命令與查詢 143
8.1.7 交流的層次 146
8.2 API設(shè)計(jì)實(shí)例 146
8.2.1 領(lǐng)班 147
8.2.2 與封裝對象交互 149
8.2.3 實(shí)現(xiàn)細(xì)節(jié) 152
8.3 結(jié)論 153
第9章 團(tuán)隊(duì)合作 155
9.1 Git 156
9.1.1 提交說明 156
9.1.2 持續(xù)集成 159
9.1.3 小步提交 161
9.2 代碼的集體所有權(quán) 164
9.2.1 結(jié)對編程 166
9.2.2 團(tuán)伙編程 167
9.2.3 代碼審校的延遲 168
9.2.4 拒絕某個變更集 170
9.2.5 代碼審校 171
9.2.6 拉取請求 172
9.3 結(jié)論 173
第2部分 由快到穩(wěn)
第10章 充實(shí)代碼 177
10.1 功能標(biāo)識 178
10.1.1 日歷標(biāo)識 178
10.2 絞殺榕模式 183
10.2.1 方法層面的絞殺榕 184
10.2.2 類層面的絞殺榕 187
10.3 版本管理 191
10.3.1 事先警告 192
10.4 結(jié)論 192
第11章 修改單元測試 194
11.1 重構(gòu)單元測試 194
11.1.1 修改安全網(wǎng) 194
11.1.2 添加新測試代碼 195
11.1.3 分離對測試代碼和對生產(chǎn)代碼的重構(gòu) 198
11.2 見證測試失敗 204
11.3 結(jié)論 204
第12章 故障排除 205
12.1 理解 205
12.1.1 科學(xué)方法 206
12.1.2 簡化 207
12.1.3 橡皮鴨法 208
12.2 缺陷 209
12.2.1 像做測試那樣重現(xiàn)問題 209
12.2.2 慢速測試 212
12.2.3 非確定性缺陷 214
12.3 二分法 218
12.3.1 用Git完成二分法 219
12.4 結(jié)論 222
第13章 關(guān)注點(diǎn)分離 224
13.1 組合 225
13.1.1 嵌套組合 225
13.1.2 順序組合 228
13.1.3 引用透明性 230
13.2 橫切面關(guān)注點(diǎn) 233
13.2.1 日志 233
13.2.2 裝飾器 234
13.2.3 日志寫什么 238
13.3 結(jié)論 240
第14章 節(jié)奏 241
14.1 個人節(jié)奏 242
14.1.1 時間段 242
14.1.2 休息 244
14.1.3 有意識地利用時間 245
14.1.4 盲打 246
14.2 團(tuán)隊(duì)節(jié)奏 247
14.2.1 定期更新依賴項(xiàng) 247
14.2.2 安排其他事務(wù) 248
14.2.3 康威定律 249
14.3 結(jié)論 250
第15章 常見困惑 251
15.1 性能 252
15.1.1 歷史負(fù)擔(dān) 252
15.1.2 可識別性 254
15.2 安全 256
15.2.1 STRIDE 256
15.2.2 欺騙 257
15.2.3 篡改 258
15.2.4 否認(rèn) 259
15.2.5 信息泄露 259
15.2.6 拒絕服務(wù) 261
15.2.7 提權(quán) 262
15.3 其他技術(shù) 263
15.3.1 基于屬性的測試 263
15.3.2 行為代碼分析 268
15.4 結(jié)論 270
第16章 代碼庫導(dǎo)覽 272
16.1 導(dǎo)航 272
16.1.1 看到全局圖景 273
16.1.2 文件組織 276
16.1.3 尋找細(xì)節(jié) 278
16.2 架構(gòu) 280
16.2.1 單體系統(tǒng) 280
16.2.2 循環(huán)依賴 281
16.3 使用方法 285
16.3.1 從測試中學(xué)習(xí) 285
16.3.2 用心聆聽測試 287
16.4 結(jié)論 288
附錄A 實(shí)踐技巧列表 290