軟件開發(fā)既需要理論和科學(xué),也需要經(jīng)驗(yàn)和手藝?上,一直以來許多圖書都只關(guān)注前一部分,而忽略了后一部分。Mark 的這本書主要關(guān)注的就是經(jīng)驗(yàn)和手藝的部分。本書既詳細(xì)講解了 API 設(shè)計、紅綠重構(gòu)等常用技術(shù),也演示了如何撰寫提交說明、如何修改單元測試,同時對故障定位、代碼閱讀、團(tuán)隊合作等傳統(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)知。全書以 C# 為示范語言,但并沒有用到太多 C# 的專屬特性。面對示例代碼,任何熟悉現(xiàn)代主流面向?qū)ο笳Z言的讀者,都可以很容易地理解作者背后的思考。
Mark Seemann 是一位平庸的經(jīng)濟(jì)學(xué)家,于是他改行當(dāng)了程序員。從 20 世紀(jì) 90 年代起,他一直在開發(fā) Web 和企業(yè)應(yīng)用。Mark 年輕的時候想成為搖滾明星,然而不幸的是他既沒有音樂天賦,也沒有搖滾明星的長相—不過陰差陽錯,他現(xiàn)在成了搖滾明星級別的王牌開發(fā)者。他寫的一本關(guān)于依賴注入的書獲得了Jolt大獎,他還做過 100 余場國際會議演講,并給在線教育網(wǎng)站 Pluralsight 和 Clean Coders 錄制過視頻課程。從 2006 年開始,他一直定期更新博客,F(xiàn)在,他和妻子以及兩個孩子一起住在丹麥?zhǔn)锥几绫竟?BR>余晟,知名互聯(lián)網(wǎng)自媒體創(chuàng)作人,歷任抓蝦網(wǎng)主力程序員盛大創(chuàng)新院高級研究員,廣州某外貿(mào)公司技術(shù)總監(jiān),滬江教育科技集團(tuán)技術(shù)中心高級研發(fā)總監(jiān)。在互聯(lián)網(wǎng)行業(yè)有超過十五年的開發(fā)經(jīng)驗(yàn),涉足傳媒、電商、教育等眾多行業(yè),帶領(lǐng)團(tuán)隊參與過多個國際合作項目,在跨國業(yè)務(wù)方面有一定經(jīng)驗(yàn)。其寫作的《正則指引》和獨(dú)譯的《精通正則表達(dá)式(第三版)》廣為流傳。
第1部分 由慢到快
第1章 是藝術(shù),還是科學(xué)
1.1 蓋房子
1.1.1 項目論之誤
1.1.2 階段論之誤
1.1.3 依賴
1.2 培育花園
1.2.1 花園中的植物為何會生長
1.3 工程
1.3.1 作為手工藝品的軟件
1.3.2 實(shí)用性
1.3.3 軟件工程的早期表述
1.3.4 與軟件工程共同進(jìn)步
1.4 結(jié)論
第2章 checklist
2.1 助記工具
2.2 針對新代碼庫的checklist
2.2.1 使用Git
2.2.2 自動化構(gòu)建
2.2.3 顯示所有錯誤消息
2.3 為已有的代碼庫新增檢查規(guī)則
2.3.1 漸進(jìn)式開發(fā)
2.3.2 在組織中“便宜行事”
2.4 結(jié)論
第3章 控制復(fù)雜性
3.1 目標(biāo)
3.1.1 可持續(xù)性
3.1.2 價值
3.2 為何編程是困難的
3.2.1 人腦類比
3.2.2 讀得多、寫得少的代碼
3.2.3 可讀性
3.2.4 腦力勞動
3.3 關(guān)于軟件工程
3.3.1 與計算機(jī)科學(xué)的關(guān)系
3.3.2 人性化代碼
3.4 結(jié)論
第4章 垂直切片
4.1 從能使用的軟件開始
4.1.1 從數(shù)據(jù)入口到數(shù)據(jù)持久化
4.1.2 最小的垂直切片
4.2 活動骨架
4.2.1 特征測試
4.2.2 預(yù)備-執(zhí)行-斷言
4.2.3 靜態(tài)代碼分析的合理尺度
4.3 由外到內(nèi)
4.3.1 接收J(rèn)SON
4.3.2 提交預(yù)訂請求
4.3.3 單元測試
4.3.4 DTO和領(lǐng)域模型
4.3.5 假對象
4.3.6 Repository接口
4.3.7 Repository中的Create方法
4.3.8 配置依賴關(guān)系
4.4 完成切片
4.4.1 schema
4.4.2 SQL Repository
4.4.3 連接數(shù)據(jù)庫的配置
4.4.4 冒煙測試
4.4.5 使用Fake數(shù)據(jù)庫的邊界測試
4.5 結(jié)論
第5章 封裝
5.1 保存數(shù)據(jù)
5.1.1 代碼改動優(yōu)先級的原則
5.1.2 參數(shù)化測試
5.1.3 把DTO復(fù)制到領(lǐng)域模型中
5.2 驗(yàn)證
5.2.1 錯誤的日期
5.2.2 紅綠重構(gòu)
5.2.3 自然數(shù)
5.2.4 Postel定律
5.3 保護(hù)不變量
5.3.1 恒常有效
5.4 結(jié)論
第6章 三角測量
6.1 短期記憶與長期記憶
6.1.1 遺留代碼和記憶
6.2 能力
6.2.1 超訂
6.2.2 惡魔的辯詞
6.2.3 已有的預(yù)訂記錄
6.2.4 惡魔的辯詞 vs 紅綠重構(gòu)
6.2.5 多少測試才算夠
6.3 結(jié)論
第7章 分解
7.1 代碼腐化
7.1.1 閾值
7.1.2 圈復(fù)雜度
7.1.3 80/24規(guī)則
7.2 與思維合拍的代碼
7.2.1 六角花
7.2.2 內(nèi)聚
7.2.3 依戀情結(jié)
7.2.4 類型轉(zhuǎn)換的代價
7.2.5 解析,而不是驗(yàn)證
7.2.6 分形架構(gòu)
7.2.7 清點(diǎn)變量
7.3 結(jié)論
第8章 API設(shè)計
8.1 API設(shè)計原則
8.1.1 預(yù)設(shè)用法
8.1.2 防錯設(shè)計
8.1.3 寫給讀者看的代碼
8.1.4 比起注釋,花更多精力在代碼的命名上
8.1.5 蒙住名字
8.1.6 命令與查詢分離
8.1.7 交流的層次
8.2 API設(shè)計實(shí)例
8.2.1 領(lǐng)班
8.2.2 與封裝對象交互
8.2.3 實(shí)現(xiàn)細(xì)節(jié)
8.3 結(jié)論
第9章 團(tuán)隊合作
9.1 Git
9.1.1 提交說明
9.1.2 持續(xù)集成
9.1.3 小步提交
9.2 代碼的集體所有權(quán)
9.2.1 結(jié)對編程
9.2.2 團(tuán)伙編程
9.2.3 code review的延遲
9.2.4 拒絕某個變更集
9.2.5 code review
9.2.6 pull request
9.3 結(jié)論
第2部分 由快到穩(wěn)
第10章 新增代碼
10.1 功能標(biāo)識
10.1.1 日歷標(biāo)識
10.2 絞殺榕模式
10.2.1 方法層面的絞殺榕
10.2.2 類層面的絞殺榕
10.3 版本管理
10.3.1 事先警告
10.4 結(jié)論
第11章 修改單元測試
11.1 重構(gòu)單元測試
11.1.1 修改安全網(wǎng)
11.1.2 添加新測試代碼
11.1.3 分開重構(gòu)測試代碼和生產(chǎn)代碼
11.2 見證測試失敗
11.3 結(jié)論
第12章 故障排除
12.1 理解
12.1.1 科學(xué)方法
12.1.2 簡化
12.1.3 橡皮鴨法
12.2 缺陷
12.2.1 通過測試重現(xiàn)缺陷
12.2.2 慢速測試
12.2.3 非確定性缺陷
12.3 二分法
12.3.1 用Git完成二分法
12.4 結(jié)論
第13章 關(guān)注點(diǎn)分離
13.1 組合
13.1.1 嵌套組合
13.1.2 順序組合
13.1.3 引用透明性
13.2 橫切面關(guān)注點(diǎn)
13.2.1 日志
13.2.2 裝飾器
13.2.3 日志寫什么
13.3 結(jié)論
第14章 節(jié)奏
14.1 個人節(jié)奏
14.1.1 時間段
14.1.2 休息
14.1.3 有意識地利用時間
14.1.4 盲打
14.2 團(tuán)隊節(jié)奏
14.2.1 定期更新依賴項
14.2.2 安排其他事務(wù)
14.2.3 康威定律
14.3 結(jié)論
第15章 常見困惑
15.1 性能
15.1.1 歷史負(fù)擔(dān)
15.1.2 一廂情愿的依托
15.2 安全
15.2.1 STRIDE
15.2.2 欺騙
15.2.3 篡改
15.2.4 否認(rèn)
15.2.5 信息泄露
15.2.6 拒絕服務(wù)
15.2.7 提權(quán)
15.3 其他技術(shù)
15.3.1 基于屬性的測試
15.3.2 行為代碼分析
15.4 結(jié)論
第16章 代碼庫導(dǎo)覽
16.1 導(dǎo)航
16.1.1 看到全局圖景
16.1.2 文件組織
16.1.3 尋找細(xì)節(jié)
16.2 架構(gòu)
16.2.1 單體架構(gòu)
16.2.2 循環(huán)依賴
16.3 使用方法
16.3.1 從測試中學(xué)習(xí)
16.3.2 用心聆聽測試
16.4 結(jié)論
附錄A 實(shí)踐技巧列表
參考資料