無瑕的程式碼 函數式設計篇 封面

無瑕的程式碼 函數式設計篇

👨‍💼: Robert C. Martin
📅: September 21, 2023
Buy Now
📖:
Bob 大叔以 Clojure 與 Java 對照,用 TDD、SOLID、設計模式串起函式式風格的工程實務——主張兩種典範並非互斥,優秀工程師應同時運用。
📘 深度概覽

作者背景#

羅伯特‧馬丁(Robert C. Martin, 1952-),業界普遍稱呼為「Bob 大叔(Uncle Bob)」,是當代最具影響力的軟體工程倡議者之一。他自 1970 年起寫程式,1990 年代成為 C++ 與物件導向社群的核心人物,後創立 Object Mentor 顧問公司。

馬丁是敏捷宣言(Agile Manifesto)十七位原始簽署人之一,並擔任「敏捷聯盟(Agile Alliance)」首任主席。他亦提出影響深遠的 SOLID 設計原則,並長期推廣測試驅動開發(TDD)Clean CodeClean Architecture 等實務工程理念。

代表著作構成「Clean 系列」:《Clean Code》(2008)、《Clean Coder》(2011)、《Clean Architecture》(2017)、《Clean Agile》(2019)、《Clean Craftsmanship》(2021)。本書 2023 年出版,是該系列在語言典範層次的延伸——也是他首次以一本完整著作探討函式式編程。值得注意的是:作者選擇 Clojure 而非 Haskell 或 F# 作為示範語言,理由是「語意豐富、語法極簡」。

完整摘要#

本書要回答的核心問題是:對日常工作的程式設計師而言,為什麼以及如何運用函式式編程? 馬丁刻意略過 Monad、Functor、範疇論等理論話題(他認為這些對主流語言已「烤進蛋糕裡」),改聚焦於結構與設計層面的差異——亦即同一個系統用兩種風格寫出來,會長得多不一樣?這些差異是否在某種意義上有優劣之分?

第一部「函式式基礎」按「禁慾 → 放鬆」的順序安排五章:不可變性(immutability)、持久性資料(persistent data)、遞迴與迭代、惰性求值(laziness),最後才談狀態管理——讓讀者先建立「沒有變數」的紀律,再一步步引進現實世界的妥協。

第二部「比較分析」是全書方法論的核心:把質因數分解、保齡球計分、閒聊的巴士司機、薪資系統等練習題,用 Java(OO)與 Clojure(FP)各寫一遍,全程以 TDD 驅動,逐步呈現結構如何在紅綠循環中長出來。第三部「函式式設計」把焦點從比較轉到設計,提出全書最具洞見的一句話定調——「在可變語言中,行為流經物件;在函式式語言中,物件流經行為」——並重新詮釋 SOLID 在函式式世界中如何依然適用。

第四部「函式式實務」處理真實工作中的問題:測試(含 mock 與 property-based testing)、GUI、併發。馬丁在此提出反直覺的論點:函式式並不能讓多執行緒「自動安全」於競態條件——讀者不該被「函式式即天然並發安全」的口號誤導。第五部「設計模式」直球反駁「GOF 只適用於 OO」的常見偏見,逐一示範經典模式在 Clojure 中的對應寫法。第六部「案例研究」以 Wa-Tor(捕食者-獵物細胞自動機)做收束,刻意把這支可以數小時 hack 完的小遊戲,當成 5,000 萬行企業級應用來架構——演練邊界、依賴反轉、Factory Method 等所有前面提過的工具。

本書的貢獻與定位#

本書的獨特定位在於——它並非另一本 FP 教科書,而是一本由 OO/SOLID 陣營老將寫的「跨典範橋接書」。多數函式式入門書(如 Mark Seemann、Eric Normand、Scott Wlaschin 的著作)面向已被 FP 哲學說服的讀者;馬丁則明確寫給「在 OO 戰壕裡打了一輩子的程式設計師」,用他們已熟悉的 SOLID、TDD、設計模式詞彙作為腳手架。

馬丁在本書中提出兩個重要主張:第一,OO 與 FP 完全相容、優秀工程師應同時運用;第二,SOLID 與設計模式關注的是「模組與依賴」而非語言特性,因此在函式式世界依然適用。這兩個主張對於分裂的程式典範社群是重要的整合訊息。本書侷限在於:對於已熟練 Clojure 或 Haskell 的資深 FP 工程師而言,書中的洞察強度不如純 FP 著作;其價值主要落在 OO 背景的中高階工程師「初次認真看待 FP」的轉捩點上。