第 7 / 7 部 待錄

氣味與啟發

《Clean Code》Podcast 準備稿:程式碼的氣味與啟發(全書收官)

書名: 無瑕的程式碼 Clean Code(A Handbook of Agile Software Craftsmanship) 作者: Robert C. Martin(Uncle Bob) 系列: Reading Uncle Bob(恩普拉氏) 公開標題建議: Reading Uncle Bob|Clean Code.壞味道大全:一份你會一直回頭查的清單 (7/7) 涵蓋範圍: 第17章 程式碼的氣味和啟發(重章單獨,含全書收束)

背景速覽

這是《Clean Code》的壓軸,也是 Reading Uncle Bob《Clean Code》全 7 集的收官。第 17 章把全書的原則濃縮成一份**「壞味道(smells)+啟發(heuristics)」清單**——數十條跨「註解/環境/函式/命名/測試/一般性」的具體準則,是日常 code review 與重構時可以一直回頭查的索引。這集要把清單講活,並替整本書與整季收尾。

一句話重點

這份清單真正的貢獻不是規則,而是一套價值體系——當你能「聞到」程式碼的壞味道,你就從「會寫能跑的 code」進化成「有品味的軟體工匠」;而品味,是靠這幾十條啟發養成的直覺。

值得討論的重點

1. 幾條最高頻、最該記住的壞味道

挑聽眾最容易對號入座的講:

  • G5 重複(Duplication):萬惡之源,代表「抽象化的缺失」。
  • G9 / F4 死 code、死函式:不會被執行的就刪掉(相信 Git)。
  • F1 參數過多 / F3 旗標參數:傳 bool 通常代表函式做了兩件事。
  • G28 封裝條件判斷if (shouldBeDeleted(timer)) 優於 if (timer.hasExpired() && !timer.isRecurrent())
  • G29 避免否定判斷:別寫 if (!isNotAvailable()) 這種雙重否定。
  • G36 笛米特法則(Law of Demeter):別寫 a.getB().getC().doSomething()——別人的內部結構不該被你串著用。
  • G14 依戀情結(Feature Envy):某方法一直在動別的類別的資料→它可能放錯類別了。

2. 環境與測試的「單一步驟」原則

  • E1/E2:建置與跑測試都該「一鍵完成」——build 不該需要一堆手動咒語,跑全部測試該是一個指令。這是團隊健康度的體檢指標。
  • 測試類(T):覆蓋率工具找「沒測到的 code」最快;錯誤最愛躲邊界(0/null/空字串);bug 會群聚(一個函式有 bug,附近通常還有)。

3. 全書收束:童子軍規則 + 軟體工藝

  • 清單不是教條,是啟發——幫你寫 code 時保持警覺。
  • 回扣全書起點的童子軍規則:你不必一次掃乾淨整個 codebase,只要每次都讓它比你來時乾淨一點。
  • 核心精神:Software Craftsmanship(軟體工藝)——把寫 code 當成一門需要品味與紀律的手藝,而不只是讓機器動起來。

注意事項

⚠️ 這份清單最大的風險是被當成「教條檢查表」拿去打人。 Uncle Bob 自己開宗明義說這是「啟發(heuristics)不是規則」。在團隊裡,拿這些當「code review 時羞辱別人」的武器,恰恰違背了整本書的精神。框成:這是養「鼻子(嗅出問題的直覺)」的清單,不是審判別人的法典。

⚠️ 有些條目帶 2008/Java 時代色彩(如 J1 用 import package.*、J2 不要繼承常數、checked exception 相關),現代語言或團隊規範可能不同。挑「跨語言通用」的講(重複、死 code、笛米特、Feature Envy、封裝條件),語言特定的點到即可。

⚠️ 收官時要替整季做一個誠實的總評:《Clean Code》是改變一代工程師的經典,命名/重構/測試/壞味道這些核心歷久彌新;但它的某些教條(極短函式、用多型消滅 switch)在效能與可讀性上都有正當的反對聲音。最好的讀法是「吸收它的價值體系、保留自己的判斷」——這也是整個 Reading Uncle Bob 系列想傳達的態度。

專家補充

💡 「聞得出壞味道」這個比喻本身很深——它說明資深工程師的能力不是「記住規則」,而是養成了一種幾乎是直覺的不適感:看到某段 code 會「覺得哪裡怪」,然後才回頭分析為什麼。這份清單的真正用途,是把這種直覺「可教化」——讓新手有具體的東西可以對照、練習,直到內化成鼻子。

💡 「壞味道(code smell)」這個詞其實是 Kent Beck 發明、靠 Martin Fowler《Refactoring》發揚光大的。Fowler 的《Refactoring》有一份更完整的壞味道型錄,並且每個味道都配一個具名的重構手法。Clean Code 給你「鼻子」,Refactoring 給你「手術刀」——這是收官最該推的延伸閱讀。

💡 笛米特法則(G36)值得展開:「只跟你的直接朋友說話,別跟陌生人說話。」a.getB().getC().doSomething() 之所以危險,是因為它讓你的 code 依賴了 B 的「內部結構」——B 一改,你就斷。這條接到「迪米特/封裝/六邊形架構」,也是下一本《Clean Architecture》的伏筆。

討論問題

🎙️ 開場鉤子:「資深工程師看一段 code,常常能在三秒內說『這裡怪怪的』,但講不太出為什麼——那個『怪怪的』,就是今天這份清單想教你的『鼻子』。」

🎙️ 自問自答(收官總評):「讀完《Clean Code》,我們到底該『全盤照做』還是『帶腦取捨』?」——給出整季的立場:吸收它的價值體系(為人而寫、持續精煉、有品味),但對它的教條(極短函式、消滅 switch)保留判斷。

🎙️ 帶走的一題:「從這份清單挑三條你最常犯的壞味道,貼在你的螢幕旁。下次 code review(review 自己的也算)時,先用這三條檢查。」

更大範圍關聯

  • Refactoring(Fowler):壞味道的完整型錄+對應重構手法。Clean Code 的最佳續讀,系列旗艦大書。
  • Reading Uncle Bob 路線:Clean Code(入門/品味)→ Clean Architecture(架構/SOLID/依賴方向)→ Clean Coder(職業態度)→ Clean Agile → Clean Craftsmanship → Functional Design。本集是入口的收官,下一本《Clean Architecture》把 SRP/OCP/DIP 系統化。
  • 對照與辯證:A Philosophy of Software Design(Ousterhout,深模組 vs 小函式)、Casey Muratori(整潔 vs 效能)——整季埋的兩條反方線,可在系列後續或【主題】集正式收束。
  • 軟體工藝運動:Software Craftsmanship 接《The Clean Coder》《Apprenticeship Patterns》——工程師的職業態度與成長路徑。

錄製建議

  • 建議時長:約 20 分鐘(重章單獨+全書收束)。建議結構:壞味道精選約 13–14 分(挑高頻、跨語言的講,別念完整張表),全書與整季收束約 5–6 分。
  • 討論策略:這集是「索引型」內容,切忌逐條念清單(音訊上最催眠)。改成「挑 7–8 條最常見、最有梗的壞味道,每條配一個聽眾會心一笑的場景」。收官時用「鼻子(品味)」這個意象把全書七集串起來——從命名到壞味道,都是在養同一個東西:對程式碼的品味。最後給整季一個誠實總評(經典但要帶腦讀),並預告下一本《Clean Architecture》。
  • 結尾可回扣 EP1 的童子軍規則,首尾呼應:「七集講了這麼多,如果只能帶走一句——每次打開檔案,讓它比你來時乾淨一點。」