軟體設計的哲學 封面

軟體設計的哲學

👨‍💼: John Ousterhout
📅: July 25, 2021
Buy Now
📖:
歐斯特豪以「複雜性」為唯一主題,把軟體設計化約為與依賴和模糊性的長期搏鬥,並提出「深模組」「把錯誤從定義中消除」「戰略型 vs 戰術型」等可操作的高層次原則。
📘 深度概覽

作者背景#

約翰・歐斯特豪(John Ousterhout)是史丹佛大學電腦科學系資深教授,也是當代系統研究最具影響力的學者之一。學術上他是 Raft 共識演算法(與 Diego Ongaro 合作)、Log-Structured File System(LFS)、以及超低延遲記憶體儲存系統 RAMCloud 的共同設計者;在工業界則是腳本語言 Tcl/Tk 的創造者,後者催生 1990 年代大量 GUI 工具與自動化框架。本書源自他在史丹佛開設的 CS 190: Software Design Studio 課程——一門小班、密集程式碼審查的軟體設計課,學生反覆改寫同一個專案的多個模組設計,逐步累積對「好設計」的直覺。書中許多範例(File I/O 的層次設計、HTTP 解析的拆分爭論、Java 與 Unix I/O 的對比)都直接來自課堂上的實際討論。本書 2018 年首版,2021 年推出第二版(增加 6 個新章與配套網站範例),規模仍維持在不到 200 頁的精煉教科書尺度,與《Code Complete》《Clean Code》等大部頭形成鮮明對比——這份簡潔本身就是作者哲學的體現。

完整摘要#

全書的整個論述可以濃縮為一句話:「軟體設計就是與複雜性的長期搏鬥」。歐斯特豪在第 1-2 章為複雜性給出可操作的定義——複雜性源自兩個根本成因:依賴(dependencies)模糊(obscurity)——並列舉它的三個症狀:變更放大(change amplification)、認知負擔(cognitive load)、以及最危險的「未知的未知」(unknown unknowns,你不知道改一個地方會壞到哪裡)。

第 3 章提出全書的心態軸:戰術型程式設計(Tactical Programming)vs 戰略型程式設計(Strategic Programming)。戰術型以「盡快讓功能跑起來」為目標,戰略型則持續投資乾淨設計——作者主張戰略型「長期下來反而比戰術型便宜」,最佳實踐是每位工程師在每次變更中都做一點點小投資

第 4-9 章是模組化設計的核心:模組要深Modules Should Be Deep)——好模組的特徵是「簡單的介面,強大的功能」,把最大量的複雜性藏在抽象之下;反例是「淺模組」(shallow module)與 Classitis 過敏(認為「類別越多越好」的迷思,導致一堆只能傳遞資訊的薄包裝)。第 5 章「資訊隱藏與洩漏」、第 6 章「通用模組更深」、第 7 章「不同層應有不同抽象」(pass-through methods 是設計失敗的訊號)、第 8 章「把複雜度往下推」(讓模組消化複雜度,而非把它推給呼叫者)、第 9 章「合併或分離」(拆分本身會引入額外複雜性,密切相關的事物應放一起)。

第 10 章是書中最具爭議的「把錯誤從定義中消除」(Define Errors Out of Existence)——例外處理是軟體系統最大的複雜性來源之一,最好的做法不是更好地處理例外,而是調整操作的語意讓「正常行為」涵蓋所有情境(如 Tcl 的 unset 命令在變數不存在時不報錯)。第 11 章倡導「設計兩次」(Design It Twice)——對重要設計總是探索 2-3 種替代方案。

第 12-15 章是註解與命名的 unusually 大份量處理:作者主張寫註解的根本理由是表達程式碼無法表達的設計意圖——註解應描述「為何」(why)與「怎麼用」(how to use),而非「做了什麼」(what it does);他甚至提出「寫註解先於寫程式碼」(Write Comments First)——若你寫不出清晰的註解,代表你還沒想清楚介面該長什麼樣。第 16-18 章涵蓋修改既有程式碼、一致性、以及「程式碼應該顯而易見」(Code Should Be Obvious)的綜合判準。第 19-20 章對 OOP、TDD、設計模式、敏捷、Getters/Setters 等流行做法逐一檢驗,毫不避諱地表達異議;第 21 章用一頁總結:本書談的就是一件事——複雜性

本書的貢獻與定位#

在 1990 年代以來的軟體設計文獻光譜中(McConnell 的 Code Complete、Martin 的 Clean Code、Hunt & Thomas 的 The Pragmatic Programmer、Gamma et al. 的 Design Patterns),本書的獨特定位有三。第一,徹底還原問題——其他著作試圖列舉所有最佳實踐,本書斷言「軟體設計只有一個問題:複雜性」,所有原則都從這個根問題推導出來,因此論述極度經濟。第二,直面與主流對立的判斷——書中明確反對「短方法是美德」(許多短方法是淺模組)、Robert Martin 式的 Clean Code 教條、過度的 TDD 實踐、以及大部分情境下的 Getter/Setter 樣板,這些反潮流立場使本書在實務工程師間反覆引發辯論(GitHub 上的批評論述本身已成為值得閱讀的二次文獻)。第三,教學現場的反饋驅動——書中每個原則都經過史丹佛小班學生數年的實際嘗試與失敗修正,因此具體可操作;它不只是「應該這樣」,而是「在大量學生程式碼上,這樣做反覆得到較好結果」。本書最適合三類讀者:寫過 3 年以上程式碼但隱約感到設計判斷力停滯的中階工程師、進行 code review 卻苦於無法明確指出「為何這段不對」的技術主管、以及任何嘗試在敏捷文化下保持系統長期可維護性的開發者。它與《Clean Code》形成的「清潔派 vs 哲學派」之辯,至今仍是程式設計師內部最有趣的方法論張力之一。