軟件開(kāi)發(fā)既需要理論和科學(xué),也需要經(jīng)驗(yàn)和手藝。可惜,一直以來(lái)許多圖書(shū)都只關(guān)注前一部分,而忽略了后一部分。Mark 的這本書(shū)主要關(guān)注的就是經(jīng)驗(yàn)和手藝的部分。本書(shū)既詳細(xì)講解了 API 設(shè)計(jì)、紅綠重構(gòu)等常用技術(shù),也演示了如何撰寫(xiě)提交說(shuō)明、如何修改單元測(cè)試,同時(shí)對(duì)故障定位、代碼閱讀、團(tuán)隊(duì)合作等傳統(tǒng)上被認(rèn)為“難以說(shuō)清”的話題,也給出了實(shí)用而且精當(dāng)?shù)慕ㄗh。難能可貴的是,與其他圖書(shū)提供的示例代碼庫(kù)不同,本書(shū)的示例代碼庫(kù)包含了完整的 Git 提交記錄。也就是說(shuō),讀者可以按照作者的路徑,一步一個(gè)腳印地重溫整個(gè)開(kāi)發(fā)過(guò)程。如果你的經(jīng)驗(yàn)還不夠豐富,建議嚴(yán)格按照作者的講解,認(rèn)真讀完全書(shū),掌握軟件工程的技巧。如果你已經(jīng)有足夠的開(kāi)發(fā)經(jīng)驗(yàn),不妨在速覽全書(shū)后,精讀自己不熟悉但感興趣的部分。對(duì)自己不認(rèn)同的部分,也不妨花時(shí)間了解作者主張的前因后果,讓自己對(duì)許多問(wèn)題有更全面的認(rèn)知。全書(shū)以 C# 為示范語(yǔ)言,但并沒(méi)有用到太多 C# 的專屬特性。面對(duì)示例代碼,任何熟悉現(xiàn)代主流面向?qū)ο笳Z(yǔ)言的讀者,都可以很容易地理解作者背后的思考。
Mark Seemann 是一位平庸的經(jīng)濟(jì)學(xué)家,于是他改行當(dāng)了程序員。從 20 世紀(jì) 90 年代起,他一直在開(kāi)發(fā) Web 和企業(yè)應(yīng)用。Mark 年輕的時(shí)候想成為搖滾明星,然而不幸的是他既沒(méi)有音樂(lè)天賦,也沒(méi)有搖滾明星的長(zhǎng)相—不過(guò)陰差陽(yáng)錯(cuò),他現(xiàn)在成了搖滾明星級(jí)別的王牌開(kāi)發(fā)者。他寫(xiě)的一本關(guān)于依賴注入的書(shū)獲得了Jolt大獎(jiǎng),他還做過(guò) 100 余場(chǎng)國(guó)際會(huì)議演講,并給在線教育網(wǎng)站 Pluralsight 和 Clean Coders 錄制過(guò)視頻課程。從 2006 年開(kāi)始,他一直定期更新博客,F(xiàn)在,他和妻子以及兩個(gè)孩子一起住在丹麥?zhǔn)锥几绫竟?BR>余晟,知名互聯(lián)網(wǎng)自媒體創(chuàng)作人,歷任抓蝦網(wǎng)主力程序員盛大創(chuàng)新院高級(jí)研究員,廣州某外貿(mào)公司技術(shù)總監(jiān),滬江教育科技集團(tuán)技術(shù)中心高級(jí)研發(fā)總監(jiān)。在互聯(lián)網(wǎng)行業(yè)有超過(guò)十五年的開(kāi)發(fā)經(jīng)驗(yàn),涉足傳媒、電商、教育等眾多行業(yè),帶領(lǐng)團(tuán)隊(duì)參與過(guò)多個(gè)國(guó)際合作項(xiàng)目,在跨國(guó)業(yè)務(wù)方面有一定經(jīng)驗(yàn)。其寫(xiě)作的《正則指引》和獨(dú)譯的《精通正則表達(dá)式(第三版)》廣為流傳。
第1部分 由慢到快
第1章 是藝術(shù),還是科學(xué)
1.1 蓋房子
1.1.1 項(xiàng)目論之誤
1.1.2 階段論之誤
1.1.3 依賴
1.2 培育花園
1.2.1 花園中的植物為何會(huì)生長(zhǎng)
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 針對(duì)新代碼庫(kù)的checklist
2.2.1 使用Git
2.2.2 自動(dòng)化構(gòu)建
2.2.3 顯示所有錯(cuò)誤消息
2.3 為已有的代碼庫(kù)新增檢查規(guī)則
2.3.1 漸進(jìn)式開(kāi)發(fā)
2.3.2 在組織中“便宜行事”
2.4 結(jié)論
第3章 控制復(fù)雜性
3.1 目標(biāo)
3.1.1 可持續(xù)性
3.1.2 價(jià)值
3.2 為何編程是困難的
3.2.1 人腦類比
3.2.2 讀得多、寫(xiě)得少的代碼
3.2.3 可讀性
3.2.4 腦力勞動(dòng)
3.3 關(guān)于軟件工程
3.3.1 與計(jì)算機(jī)科學(xué)的關(guān)系
3.3.2 人性化代碼
3.4 結(jié)論
第4章 垂直切片
4.1 從能使用的軟件開(kāi)始
4.1.1 從數(shù)據(jù)入口到數(shù)據(jù)持久化
4.1.2 最小的垂直切片
4.2 活動(dòng)骨架
4.2.1 特征測(cè)試
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ù)訂請(qǐng)求
4.3.3 單元測(cè)試
4.3.4 DTO和領(lǐng)域模型
4.3.5 假對(duì)象
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ù)庫(kù)的配置
4.4.4 冒煙測(cè)試
4.4.5 使用Fake數(shù)據(jù)庫(kù)的邊界測(cè)試
4.5 結(jié)論
第5章 封裝
5.1 保存數(shù)據(jù)
5.1.1 代碼改動(dòng)優(yōu)先級(jí)的原則
5.1.2 參數(shù)化測(cè)試
5.1.3 把DTO復(fù)制到領(lǐng)域模型中
5.2 驗(yàn)證
5.2.1 錯(cuò)誤的日期
5.2.2 紅綠重構(gòu)
5.2.3 自然數(shù)
5.2.4 Postel定律
5.3 保護(hù)不變量
5.3.1 恒常有效
5.4 結(jié)論
第6章 三角測(cè)量
6.1 短期記憶與長(zhǎng)期記憶
6.1.1 遺留代碼和記憶
6.2 能力
6.2.1 超訂
6.2.2 惡魔的辯詞
6.2.3 已有的預(yù)訂記錄
6.2.4 惡魔的辯詞 vs 紅綠重構(gòu)
6.2.5 多少測(cè)試才算夠
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)換的代價(jià)
7.2.5 解析,而不是驗(yàn)證
7.2.6 分形架構(gòu)
7.2.7 清點(diǎn)變量
7.3 結(jié)論
第8章 API設(shè)計(jì)
8.1 API設(shè)計(jì)原則
8.1.1 預(yù)設(shè)用法
8.1.2 防錯(cuò)設(shè)計(jì)
8.1.3 寫(xiě)給讀者看的代碼
8.1.4 比起注釋,花更多精力在代碼的命名上
8.1.5 蒙住名字
8.1.6 命令與查詢分離
8.1.7 交流的層次
8.2 API設(shè)計(jì)實(shí)例
8.2.1 領(lǐng)班
8.2.2 與封裝對(duì)象交互
8.2.3 實(shí)現(xiàn)細(xì)節(jié)
8.3 結(jié)論
第9章 團(tuán)隊(duì)合作
9.1 Git
9.1.1 提交說(shuō)明
9.1.2 持續(xù)集成
9.1.3 小步提交
9.2 代碼的集體所有權(quán)
9.2.1 結(jié)對(duì)編程
9.2.2 團(tuán)伙編程
9.2.3 code review的延遲
9.2.4 拒絕某個(gè)變更集
9.2.5 code review
9.2.6 pull request
9.3 結(jié)論
第2部分 由快到穩(wěn)
第10章 新增代碼
10.1 功能標(biāo)識(shí)
10.1.1 日歷標(biāo)識(shí)
10.2 絞殺榕模式
10.2.1 方法層面的絞殺榕
10.2.2 類層面的絞殺榕
10.3 版本管理
10.3.1 事先警告
10.4 結(jié)論
第11章 修改單元測(cè)試
11.1 重構(gòu)單元測(cè)試
11.1.1 修改安全網(wǎng)
11.1.2 添加新測(cè)試代碼
11.1.3 分開(kāi)重構(gòu)測(cè)試代碼和生產(chǎn)代碼
11.2 見(jiàn)證測(cè)試失敗
11.3 結(jié)論
第12章 故障排除
12.1 理解
12.1.1 科學(xué)方法
12.1.2 簡(jiǎn)化
12.1.3 橡皮鴨法
12.2 缺陷
12.2.1 通過(guò)測(cè)試重現(xiàn)缺陷
12.2.2 慢速測(cè)試
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 日志寫(xiě)什么
13.3 結(jié)論
第14章 節(jié)奏
14.1 個(gè)人節(jié)奏
14.1.1 時(shí)間段
14.1.2 休息
14.1.3 有意識(shí)地利用時(shí)間
14.1.4 盲打
14.2 團(tuán)隊(duì)節(jié)奏
14.2.1 定期更新依賴項(xiàng)
14.2.2 安排其他事務(wù)
14.2.3 康威定律
14.3 結(jié)論
第15章 常見(jiàn)困惑
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 基于屬性的測(cè)試
15.3.2 行為代碼分析
15.4 結(jié)論
第16章 代碼庫(kù)導(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 從測(cè)試中學(xué)習(xí)
16.3.2 用心聆聽(tīng)測(cè)試
16.4 結(jié)論
附錄A 實(shí)踐技巧列表
參考資料