第 3 / 5 部 待錄

TDD與測試紀律

《The Clean Coder》Podcast 準備稿:TDD 與測試紀律

書名: 無瑕的程式碼番外篇 The Clean Coder(A Code of Conduct for Professional Programmers) 作者: Robert C. Martin(Uncle Bob) 系列: Reading Uncle Bob(恩普拉氏) 公開標題建議: Reading Uncle Bob|The Clean Coder.TDD、刻意練習與測試金字塔 (3/5) 涵蓋範圍: 第5章 測試驅動開發 + 第6章 練習 + 第7章 驗收測試 + 第8章 測試策略

背景速覽

這是全季最「技術紀律」的一集,把四章串成一條完整的測試論述:從個人層次的 TDD(怎麼寫每一行 code)、到技能層次的刻意練習(怎麼維持手感)、再到團隊層次的驗收測試(怎麼定義「完成」)、最後到系統層次的測試策略(誰負責哪一層測試)。Uncle Bob 在這裡把 TDD 講到了近乎信仰的高度——「如果你不用 TDD,說明你還不夠專業」——這也是他全書最被擁護、同時最被質疑的立場。

一句話重點

TDD 不只是測試手法,而是一套讓你「敢改 code」的紀律和一份「不會說謊的活文件」;而專業要靠刻意練習維持手感、靠自動化驗收測試定義「完成」、靠分層的測試金字塔讓每種測試各司其職——讓人去做人該做的探索,讓機器去做機器該做的回歸。

值得討論的重點

1. TDD 三大法則:把週期縮到「秒到分鐘」

Uncle Bob 把 TDD 拆成三條鐵律:(一) 在寫出一個會失敗的測試前,不准寫任何產品程式;(二) 只寫剛好失敗的測試(連編譯不過都算失敗);(三) 只寫剛好讓當前測試通過的產品程式。三條合起來會把你逼進一個極短的循環——寫一點測試、寫一點 code、通過、再來——每圈只有幾秒到幾分鐘。他用一個很妙的比喻:每行產品程式碼像「抗體」,都是為了對應一個特定測試案例這個「抗原」而誕生的。

2. TDD 的真正價值不是「測試」,是「勇氣」和「設計」

Uncle Bob 列了 TDD 的好處,但他特別強調其中兩個常被忽略的:第一是勇氣——沒有測試,你不敢重構(怕改壞),於是 code 只能腐爛下去;有了完整測試,只要綠燈你就敢動手,這是他認為「最重要的心理優勢」。第二是設計——TDD 強迫你在寫 code「之前」先想「這東西怎麼被測」,而「可被測試」幾乎等於「低耦合」;不先寫測試,code 容易長成高度耦合、最終無法測試的「大泥球(Big Ball of Mud)」。另外,單元測試還是一份不會說謊的活文件——它示範了系統「該怎麼被使用」,而且一旦過時就會紅燈報錯,不像註解會默默腐爛。

3. 練習:程式設計師的 Kata 與「別在客戶專案上練基本功」

第6章 Uncle Bob 借武術術語 Kata(形/套路):找一個你已經知道答案的題目(保齡球計分、質因數分解、自動換行),反覆練,重點不在解開未知,而在把「編碼/測試循環」的動作磨成肌肉記憶,讓你在壓力下也能反射性做對。他也提倡雙人對練、貢獻開源專案來接觸不同設計思維。最後一句很關鍵:「音樂家不會在演奏會上才開始練音階,專業程式設計師也不該在客戶的專案上練基本功。」——練習要在自己的時間做。

4. 驗收測試:對抗「假性共識」與「過早精細化」

第7章戳的是研發與業務之間最大的坑:雙方「以為」談妥了,交付時才發現南轅北轍——這叫假性共識。Uncle Bob 的解方是自動化的驗收測試:它是業務與研發之間的「合約」,是判斷需求「完成」與否的唯一真理標準,寫給業務和測試人員看(不是給開發者看的單元測試)。他也點出另一個陷阱過早精細化——專案最早、資訊最少的時候逼你給最精確的承諾,最不合理;正解是「推遲(deferral)」,隨資訊變多再逐步細化。實作上 GUI 最難測,所以要繞過 UI、直接打 API,針對背後相對穩定的業務邏輯測,而不是糾結按鈕位置。

5. 測試金字塔:誰負責哪一層

第8章把測試分成五層,畫成金字塔(底層最多、越上越少):單元測試(程式設計師寫,覆蓋率近 100%,TDD 的產物)→ 元件測試(QA+業務,約 50%,只測正常路徑,因為異常路徑單元測試早攔掉了)→ 整合測試(架構師寫,測元件之間的「編排」和通訊,常在此做效能測試)→ 系統測試(測整個系統「組裝正確」,但不等於行為正確)→ 人工探索式測試(人類用直覺和創意去挖機器想不到的缺陷)。核心紀律一句話:不要讓人去做電腦能做的事(回歸測試),把人類智慧留給探索式測試。

注意事項

⚠️ 「不用 TDD 就不夠專業」是全書最強硬、也最該打折扣的斷言。 TDD 是極有價值的技術,但「測試先行」並非唯一正解——很多頂尖工程師和團隊用「測試後寫」「探索式開發完再補測試」一樣交付高品質。學界的證據也偏向:TDD 帶來的好處,相當程度其實來自「有寫測試」和「小步快跑」本身,而不一定是「測試必須寫在前面」這個順序。所以這條請當成「強烈推薦的紀律之一」,而不是「不從就出教」的信條。

⚠️ 第6章「該用自己的時間練功」呼應了第1章的爭議,這集會更尖銳。 「別在客戶專案上練基本功」這個原則本身很合理,但 Uncle Bob 把練習的責任完全推給「個人的非辦公時間」,等於暗示專業工程師理當付出私人時間——這正是本書被批 toxic 的核心。比較健康的立場:刻意練習確實重要,但「在哪裡、用誰的時間練」是雇主與個人都有份的責任,好的公司會把學習時間制度化(20% time、學習假、上班時間的 Kata),不該全甩給員工的週末。

專家補充

💡 「TDD = 設計工具」這個論點,是 TDD 社群和批評者最大的分歧點。支持方(Kent Beck,TDD 之父)強調它逼出低耦合;批評方最有名的是 DHH(Rails 作者)2014 年那篇〈TDD is dead〉,主張過度測試先行會逼出一堆為了好測而存在的無用抽象,傷害設計。Martin Fowler、Kent Beck、DHH 三人後來還做了一系列對談「Is TDD Dead?」——這是工程界最精彩的方法論辯論之一,很適合在這集提一嘴給聽眾延伸。

💡 「測試金字塔」這個詞其實是 Mike Cohn 提出、Martin Fowler 推廣的。現代有個重要的補充叫「測試獎盃(Testing Trophy)」(Kent C. Dodds 針對前端提出)——主張整合測試才該是重心而非單元測試,因為前端的價值在元件協作。所以「金字塔」不是唯一形狀,形狀該隨你系統的風險分布而變。Uncle Bob 的五層分法偏 2011 年的後端視角,講的時候可以提醒這點。

💡 Kata 練習法在台灣/華語圈最具體的落地,是各種 Coding Dojo 和 TDD 工作坊(保齡球計分幾乎是公認的入門 Kata)。如果聽眾想動手,最低成本的起點就是去找「Bowling Game Kata」跟著做一遍——一個小時就能親身體會三大法則的節奏感,比聽十遍解說都有用。

討論問題

🎙️ 開場鉤子:「你有沒有過這種經驗——明明只是想改一個小地方,手卻在鍵盤上懸著不敢動,因為不知道會不會弄壞別的東西?那種『不敢改』的恐懼,正是 Uncle Bob 說 TDD 要解決的核心問題。」

🎙️ 自問自答:「『不用 TDD 就不專業』——這句我同意嗎?」可以誠實表態:我認同「要有測試、要小步走、要敢重構」這個精神,但「測試一定得寫在前面」是手段不是信仰,DHH 那場辯論值得聽眾自己去評。把這條當紀律的精神、而非教條的字面。

🎙️ 帶走的一題:「這禮拜花一個小時,找『Bowling Game Kata』跟著做一遍 TDD——嚴格遵守三大法則:沒紅燈不准寫 code。做完你會親身體會那個『秒級循環』的節奏,比聽我講有用一百倍。」

更大範圍關聯

  • 本季核心位置:這四章是《The Clean Coder》的技術紀律核心,把前兩集的「態度/承諾」落實成「具體怎麼做」——TDD 是「除錯趨近於零」的兌現,驗收測試是「完成的定義」的兌現。可以說前兩集講價值觀,這集講價值觀的執行細節。
  • 與 Uncle Bob 自己其他書的接點:TDD 的完整教學在系列第六本《Clean Craftsmanship》(有專章逐步示範);而「可測試 = 低耦合」這條設計主張,是《Clean Architecture》的依賴反轉、邊界劃分在「測試」這個切面的投影。三本互相印證。
  • 方法論辯論的座標:TDD 之父是 Kent Beck(《Test-Driven Development: By Example》是原典);反方代表是 DHH〈TDD is dead〉。本書站在 Beck 這一側偏激進的位置。把這個光譜講給聽眾,比單方面背誦 TDD 好處更誠實、也更有縱深。
  • 領域定位:用 [軟體工程領域切分藍圖] 看,這集橫跨「測試與品質保證」和「個人技能養成(刻意練習)」兩支——是工程師「硬技術紀律」最密集的一塊,也是本書少數真正談「怎麼寫 code」而非「怎麼當人」的部分。

錄製建議

  • 建議時長:約 22 到 25 分鐘(四章份量最重的一集,可考慮稍長,或在錄製時把第6章練習壓精簡一點)。配比:TDD 約 9 分(主菜,三大法則+勇氣/設計兩大價值講透)、練習約 4 分、驗收測試約 5 分、測試金字塔約 5 分。
  • 討論策略:用「不敢改 code 的恐懼」開場最有共鳴,再把 TDD 定位成「買勇氣的工具」而非「多寫測試的麻煩」,立刻翻轉聽眾對它的成本印象。四章銜接用一條主線串:個人(TDD)→ 技能(練習)→ 團隊(驗收測試)→ 系統(金字塔),由內而外放大尺度,聽眾比較不會覺得是四個散章。注意事項兩段(TDD 教條化、練功用誰的時間)一定要講,這是本季「帶腦讀 Uncle Bob」的定調延續。
  • 結尾轉場:「會寫、會測、會練了,但時間永遠不夠、deadline 永遠在逼——下一集談專業人士怎麼管理時間、做預估、在壓力下不亂陣腳。」