《Functional Design》Podcast 準備稿:案例研究與系列收官
書名: Functional Design(Principles, Patterns, and Practices) 作者: Robert C. Martin(Uncle Bob) 系列: Reading Uncle Bob(恩普拉氏) 公開標題建議: Reading Uncle Bob|Functional Design.軟體本來該長的樣子 (10/10) 涵蓋範圍: 第六部 第17章 Wa-Tor 案例研究 + 後記(Gina Martiny)
背景速覽
這是 Functional Design 的最後一章,也是整個 Reading Uncle Bob 六本系列的最後一集。前面九集講觀念、比較、原則、實務、模式——這一集把所有工具放進一個完整的小程式裡實戰:Wa-Tor,一個魚與鯊魚的捕食者/獵物細胞自動機。Uncle Bob 刻意把這個「幾小時能 hack 完」的小遊戲,當成 5000 萬行的企業級應用來思考,全程演練架構、邊界、依賴反轉、設計模式。讀完這章,你會看到 FP 和 OO 怎麼在一支 Clojure 程式裡自然融合。最後再用一篇女兒寫的後記,給整個系列一個有溫度的句點。
一句話重點
把一個玩具程式當企業級應用來打磨,你會看見整本書的所有原則自然浮現——TDD 會在「結構不對」時主動報警、依賴循環逼出依賴反轉、Factory Method 和 Template Method 在小尺度也派上用場;而最終的成品揭示了 Uncle Bob 想說的終極答案:好的軟體既是函式式的、也是物件導向的——資料封裝且不可變、行為與資料就近綁定、但資料流經行為而非行為對資料迭代。這就是軟體本來該長的樣子。
值得討論的重點
1. 把玩具當企業級來寫:為什麼這麼做
Wa-Tor 規則很簡單:魚會隨機移動、偶爾繁殖;鯊魚會移動、吃相鄰的魚、吃夠了繁殖、太久沒吃會餓死;世界是個環面(上下左右相連,所以叫 WAter TORus)。Uncle Bob 大可一個檔案 hack 完,但他故意演練紀律:先從兩個 actor(UX 設計師會改畫面、建模者會調行為)切出架構邊界(UI 是 Model 的插件、依賴方向從 UI 指向 Model)。這個「殺雞用牛刀」的練習方式本身就是教學——架構肌肉是練出來的,不是等到大專案才臨時長出來的。
2. TDD 的最後一個 D 是 Design——它會主動報警
這章最動人的地方,是展示 TDD 怎麼驅動設計決策、並在結構不對時自動發警訊。光是寫「魚會移動」這個測試,就逼出三個重要決策:animal 不該知道整個 world(所以 world 當參數傳)、animal 不該知道自己的位置(所以 loc 也傳進去)、move 不能修改 world(只回傳「新位置 + 動物」,由 world 重組)。更精彩的是中途 Uncle Bob「直覺報警」——他意識到很多回傳格式的決定都基於對 world/tick 的猜想,於是停下來先寫 world/tick,免得作出錯誤決定。還有一次他在「洗澡時」想到該用 Factory Method 解決「在 world 裡建 water 很 icky」的問題。這些都是真實工程師的思考軌跡,比任何教條都真實。
3. 依賴循環逼出依賴反轉——兩次
Clojure 痛恨依賴循環,而 Wa-Tor 撞上了兩次。第一次:water 依賴 fish(演化)、fish 依賴 animal、animal 依賴 water(檢查可去的格子)——循環!解法是把每個型別拆成「宣告」和「實作」兩個模組(water/water-imp、fish/fish-imp),讓實作依賴宣告、而非反過來——這就是 DIP,把循環方向反轉掉。第二次在 world/tick 又撞一次,一樣的解法。這活生生展示了 EP6 講的 DIP 不是抽象教條,而是日常編譯錯誤的具體解藥。最後用 Factory Method(world 自己當 factory、用不透明 token 建 cell)把架構邊界畫乾淨。
注意事項
⚠️ 這章是完整程式的逐步建構,細節極多(do-move、tick 回傳格式、moved-into 集合、tramp data……)。絕不要跟著程式碼走。抓三條敘事線講:(1)把玩具當企業級的紀律;(2)TDD 如何驅動並報警;(3)依賴循環如何逼出 DIP。具體的 Clojure 實作全部可略。
⚠️ Uncle Bob 在這章很誠實地展示了「現實工程的取捨」——比如 :moved-into 沒用正式的 namespaced keyword,因為它不算 world 的正式欄位,是「搭便車的 tramp data」。這種「教條有時要讓位給務實」的姿態要傳達出來,它讓整本書不顯得死板。這也呼應整季「帶腦讀經典」的定調。
⚠️ 這是系列收官集,要留足夠時間做整季 + 整個 Reading Uncle Bob 系列的總回顧。別把全部時間花在 Wa-Tor 上。建議 Wa-Tor 講 60%,整季/整系列總結 + 後記 40%。
專家補充
💡 Wa-Tor 的結論段是整本書、甚至整個系列的「金句中的金句」,值得逐字唸:「這不是 Frankenstein(科學怪人拼裝物)。這就是軟體本來該長的樣子:資料封裝且不可變、行為與其操作的資料就近綁在一起、但資料流經行為,而不是行為對資料迭代。」這句話徹底超越了「FP vs OO」的對立——它說兩者本來就是同一枚硬幣的兩面,好軟體自然會把兩者的優點都吸收進來。這是 Uncle Bob 晚年最成熟的軟體哲學。
💡 那篇後記(Afterword)是個溫暖的收尾,由 Uncle Bob 的女兒 Gina Martiny 寫——她原是化工工程師(做鈾六氟化物製程!),2020 疫情期間在父親指導下八週速成轉行軟體,後來成為 Clean Coders Studio 的全職開發者。她的故事印證了前言說的「Clojure 學起來極簡單」,也讓這本硬核技術書有了人情味。她分享的兩個小心得(用 .cljc 讓前後端共用程式碼、Clojure 的 for 不是迴圈)很接地氣。用她在派對被問「你最愛的 stack 是什麼」、緊張答出「Clojure?」的場景開場,會是很好的收官氛圍。
💡 作為整個 Reading Uncle Bob 系列的終點,這集適合做一次思想史回顧:從《Clean Code》(命名、函式的基本功)→《Clean Architecture》(依賴規則、邊界)→《Clean Coder》(職業素養)→《Clean Agile》(敏捷初心)→《Clean Craftsmanship》(TDD、紀律)→《Functional Design》(晚年轉向 FP)。一條清晰的弧線:從「怎麼寫乾淨的程式」一路走到「用什麼典範寫都行,重點是設計原則永恆」。Uncle Bob 花了一輩子證明「整潔、紀律、好設計」超越語言與典範——這本 FP 收官書是這個信念最徹底的演示。
討論問題
🎙️ 開場鉤子:「一個魚和鯊魚的小遊戲,幾個小時就能寫完——Uncle Bob 卻把它當成五千萬行的企業級系統來打磨。為什麼?因為架構的肌肉,是在小事上練出來的。今天是 Functional Design 的最後一章,也是整個 Reading Uncle Bob 系列的句點。」
🎙️ 自問自答:「FP 和 OO 到底誰贏了?」——讀完這本書,答案是:這個問題本身就問錯了。Uncle Bob 的結論是,好軟體既封裝又不可變、行為和資料就近綁定、但資料流經行為。它同時是函式式、也是物件導向的。不是誰贏,是兩者本來就該合一。
🎙️ 帶走的一題(也是整季的):「這一季我們跟著一個 OO 宗師走進函式式的世界。如果只帶走一句話,我希望是這句——設計原則是永恆的,典範只是表達它的方言。不可變消滅一類 bug、SOLID 講的是依賴、模式只是換形。下次有人跟你吵 FP vs OO,你可以笑笑說:你們吵的是方言,不是語言。」
更大範圍關聯
- 整本書收官:Wa-Tor 是所有工具的綜合演練(TDD、DIP、Factory Method、Template Method、架構邊界),把前九集的線索全部收攏。
- 整個 Reading Uncle Bob 系列終點:六本書的弧線從《Clean Code》到《Functional Design》——這集適合回顧整條思想線,是系列的謝幕。
- 與 FP 經典的對話:整季可上接 SICP(用 λ 演算的眼光看程式)、Grokking Simplicity(actions/calculations/data)、Domain Modeling Made Functional(用型別與資料流建模)——Functional Design 是「給 OO 老手的 FP 過渡橋」,這三本是延伸進階。
- 細胞自動機的趣味:Wa-Tor 出自 A. K. Dewdney 1984 年《Scientific American》專欄,與 Conway 生命遊戲同屬細胞自動機家族。用 [軟體工程領域切分藍圖] 看,這集是「架構設計」的綜合落地。
錄製建議
- 建議時長:約 24 分鐘(收官集,值得豐厚)。配比:Wa-Tor(當企業級的紀律 + TDD 報警 + 兩次 DIP)約 13 分、Wa-Tor 結論金句約 3 分、整季 + 整系列總回顧約 5 分、後記 Gina 的故事約 3 分。
- 討論策略:Wa-Tor 用「殺雞用牛刀,但這正是練架構肌肉的方法」當切入,主打「TDD 會主動報警」「依賴循環逼出 DIP」兩條最有教學價值的線。中段務必逐字唸出「這就是軟體本來該長的樣子」這個全書金句。後半轉成總回顧——把整季十集的弧線、再把整個 Reading Uncle Bob 六本的弧線收一遍,用「設計原則永恆、典範只是方言」作為整季的句點。
- 最後用 Gina 的後記收尾,從硬核技術轉向人情味——一個化工工程師八週轉行寫 Clojure,正好印證了 Uncle Bob 整本書的善意:FP 沒那麼可怕、好設計人人可學。給聽眾一個溫暖、有盼望的告別。記得花 30 秒感謝聽眾陪走完整個 Reading Uncle Bob 系列。