軟件開(kāi)發(fā)既需要理論和科學(xué),也需要經(jīng)驗(yàn)和技藝?上,一直以來(lái)許多圖書都只關(guān)注前一部分,而忽略了后一部分。馬克的這本書主要關(guān)注的就是經(jīng)驗(yàn)和技藝的部分。本書既詳細(xì)講解了API設(shè)計(jì)、紅綠重構(gòu)等常用技術(shù),也演示了如何撰寫提交說(shuō)明、如何修改單元測(cè)試,同時(shí)對(duì)故障定位、代碼閱讀、團(tuán)隊(duì)合作等傳統(tǒng)上被認(rèn)為“難以說(shuō)清”的話題,也給出了實(shí)用且精當(dāng)?shù)慕ㄗh。難能可貴的是,與其他圖書提供的示例代碼庫(kù)不同,本書的示例代碼庫(kù)包含了完整的Git提交記錄。也就是說(shuō),讀者可以按照作者的道路,一步一個(gè)腳印地重溫整個(gè)開(kāi)發(fā)過(guò)程。如果你的經(jīng)驗(yàn)還不夠豐富,建議嚴(yán)格按照作者的講解,認(rèn)真讀完全書,掌握軟件工程的技巧。如果你已經(jīng)有足夠的開(kāi)發(fā)經(jīng)驗(yàn),不妨略讀全書,精讀自己不熟悉但感興趣的部分。對(duì)自己不認(rèn)同的部分,也不妨花時(shí)間了解作者主張的前因后果,讓自己對(duì)許多問(wèn)題有更全面的認(rèn)知。
馬克·西曼是一位平庸的經(jīng)濟(jì)學(xué)家,于是他改行當(dāng)了程序員。從20世紀(jì)90年代末起,他一直在開(kāi)發(fā)Web和企業(yè)應(yīng)用。馬克年輕的時(shí)候想成為搖滾明星,然而不幸的是他既沒(méi)有音樂(lè)天賦,也沒(méi)有搖滾明星的長(zhǎng)相——結(jié)果,他成了Certi?ed Rockstar Developer。他寫的一本關(guān)于依賴注入的書獲得了Jolt大獎(jiǎng),做過(guò)100余場(chǎng)國(guó)際會(huì)議演講,并給教育在線網(wǎng)站Pluralsight和Clean Coders錄制過(guò)視頻課程。
馬克·西曼是一位平庸的經(jīng)濟(jì)學(xué)家,于是他改行當(dāng)了程序員。從20世紀(jì)90年代末起,他一直在開(kāi)發(fā)Web和企業(yè)應(yīng)用。馬克年輕的時(shí)候想成為搖滾明星,然而不幸的是他既沒(méi)有音樂(lè)天賦,也沒(méi)有搖滾明星的長(zhǎng)相——結(jié)果,他成了Certi?ed Rockstar Developer。他寫的一本關(guān)于依賴注入的書獲得了Jolt大獎(jiǎng),做過(guò)100余場(chǎng)國(guó)際會(huì)議演講,并給教育在線網(wǎng)站Pluralsight和Clean Coders錄制過(guò)視頻課程。
第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 花園中的植物為何會(huì)生長(zhǎng) 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 針對(duì)新代碼庫(kù)的檢查清單 15
2.2.1 使用Git 16
2.2.2 自動(dòng)化構(gòu)建 17
2.2.3 顯示所有錯(cuò)誤消息 21
2.3 為已有的代碼庫(kù)新增檢查規(guī)則 25
2.3.1 漸進(jìn)式開(kāi)發(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 價(jià)值 31
3.2 為何編程是困難的 33
3.2.1 人腦類比 33
3.2.2 讀得多、寫得少的代碼 35
3.2.3 可讀性 35
3.2.4 腦力勞動(dòng) 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 從能使用的軟件開(kāi)始 41
4.1.1 從數(shù)據(jù)入口到數(shù)據(jù)持久化 42
4.1.2 最小的垂直切片 43
4.2 活動(dòng)骨架 44
4.2.1 特征測(cè)試 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ù)訂請(qǐng)求 54
4.3.3 單元測(cè)試 58
4.3.4 DTO 和領(lǐng)域模型 59
4.3.5 偽對(duì)象 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ù)庫(kù)的配置 70
4.4.4 冒煙測(cè)試 71
4.4.5 使用偽(Fake)數(shù)據(jù)庫(kù)的邊界測(cè)試 72
4.5 結(jié)論 73
第5章 封裝 75
5.1 保存數(shù)據(jù) 75
5.1.1 代碼改動(dòng)優(yōu)先級(jí)的原則 76
5.1.2 參數(shù)化測(cè)試 77
5.1.3 把DTO復(fù)制到領(lǐng)域模型中 79
5.2 驗(yàn)證 80
5.2.1 錯(cuò)誤的日期 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章 三角測(cè)量 96
6.1 短期記憶與長(zhǎng)期記憶 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 多少測(cè)試才算夠 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)換的代價(jià) 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 防錯(cuò)設(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 與封裝對(duì)象交互 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 提交說(shuō)明 156
9.1.2 持續(xù)集成 159
9.1.3 小步提交 161
9.2 代碼的集體所有權(quán) 164
9.2.1 結(jié)對(duì)編程 166
9.2.2 團(tuán)伙編程 167
9.2.3 代碼審校的延遲 168
9.2.4 拒絕某個(gè)變更集 170
9.2.5 代碼審校 171
9.2.6 拉取請(qǐng)求 172
9.3 結(jié)論 173
第2部分 由快到穩(wěn)
第10章 充實(shí)代碼 177
10.1 功能標(biāo)識(shí) 178
10.1.1 日歷標(biāo)識(shí) 178
10.2 絞殺榕模式 183
10.2.1 方法層面的絞殺榕 184
10.2.2 類層面的絞殺榕 187
10.3 版本管理 191
10.3.1 事先警告 192
10.4 結(jié)論 192
第11章 修改單元測(cè)試 194
11.1 重構(gòu)單元測(cè)試 194
11.1.1 修改安全網(wǎng) 194
11.1.2 添加新測(cè)試代碼 195
11.1.3 分離對(duì)測(cè)試代碼和對(duì)生產(chǎn)代碼的重構(gòu) 198
11.2 見(jiàn)證測(cè)試失敗 204
11.3 結(jié)論 204
第12章 故障排除 205
12.1 理解 205
12.1.1 科學(xué)方法 206
12.1.2 簡(jiǎn)化 207
12.1.3 橡皮鴨法 208
12.2 缺陷 209
12.2.1 像做測(cè)試那樣重現(xiàn)問(wèn)題 209
12.2.2 慢速測(cè)試 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 個(gè)人節(jié)奏 242
14.1.1 時(shí)間段 242
14.1.2 休息 244
14.1.3 有意識(shí)地利用時(shí)間 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章 常見(jiàn)困惑 251
15.1 性能 252
15.1.1 歷史負(fù)擔(dān) 252
15.1.2 可識(shí)別性 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 基于屬性的測(cè)試 263
15.3.2 行為代碼分析 268
15.4 結(jié)論 270
第16章 代碼庫(kù)導(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 從測(cè)試中學(xué)習(xí) 285
16.3.2 用心聆聽(tīng)測(cè)試 287
16.4 結(jié)論 288
附錄A 實(shí)踐技巧列表 290