Sam 的系統教會我們什麼#

書的主線是 Sam 的 CD 出租店——一個刻意小規模、卻能承載多種真實情境的範例。

Sam’s CD rental system demonstrated prefactoring guidelines in a specific situation——具體永遠是雙刃劍:把概念落在某個情境中能讓人「看見」它的形狀,但也容易讓人覺得「換到別的情境就用不上」。本書故意承擔這個風險。

從 Sam 的故事中,可以提煉出三件事:

  • 設計是與客戶共同進行的對話:CDDisc/CDRelease 的拆分、Address 的群聚、OverdueRentalLateReturnOfRental 的分裂——都源自談話與回顧,而非單向的演繹。
  • 最常被改寫的不是程式,而是命名:每次需求成長都伴隨命名澄清,這比任何重構都更重要。
  • 架構決策的成本,是以「未來變動範圍」計價的:peer-to-peer vs. central server、單一 Dollar vs. 多幣別 Money,每個選擇都對應一個可調整空間。

一般指南,特定變奏#

本書刻意避開語言或環境的特定議題。若某條指南對你的場景顯得太抽象,請把它當作起點,而不是終點,往特定語言、框架的方向發展自己的版本。

實踐路徑:

  • 把書中的指南列入團隊的工程指南或設計檢核表。
  • 為自己常用的語言或框架補上具體寫法(例如「Don’t Let the Cold Air In」在 Spring 框架的 filter 怎麼實作)。
  • 衡量每條指南在當下情境的成本與效益,逐步替換成更貼合的版本。

持續寫設計日誌#

Document Your Assumptions and Your Decisions——預重構不止於指南,還在於從自身經驗持續學習。

書末再次強調:

  • 把「為什麼採或不採某條指南」記下來,紀錄發生的情境與結果。
  • 一段時間後翻閱,能發展出更貼合自己的變體與新增條目。
  • 日誌可成為下一個專案的起點——不必每次從零思考。

推薦的閱讀清單#

想擴充自己的指南庫時,可閱讀本書引用的書籍,或閱讀 Fred Brooks、Gerry Weinberg、David Parnas、Edsger W. Dijkstra 的近乎任何作品——這些經典都在用不同語言陳述相同的設計原則。

書中常被引用的延伸閱讀包含:

  • 《Refactoring: Improving the Design of Existing Code》 Martin Fowler
  • 《Design Patterns》 Gamma, Helm, Johnson, Vlissides
  • 《The Pragmatic Programmer》 Andrew Hunt, David Thomas
  • 《Code Complete, Second Edition》 Steve McConnell
  • 《Object Design: Roles, Responsibilities, and Collaborations》 Rebecca Wirfs-Brock, Alan McKean
  • 《Project Retrospectives》 Norman L. Kerth
  • 《Domain-Driven Design》 Eric Evans

把預重構帶進每天的工作#

把這本書讀完,最重要的不是記住所有指南,而是把以下幾個習慣納入日常:

  • 動手前先問三個問題:未來最可能變動的軸是什麼?我現在做的選擇有沒有把它鎖死?我有寫下這個選擇的理由嗎?
  • 每次釋出後做小型回顧:哪幾條指南幫到我?哪幾條讓我繞遠路?哪些經驗值得記下?
  • 重構與預重構互為輪替:預重構讓你少做幾次大重構,但也不會徹底取代它;當代價合理時,仍要果斷重構。

Prefactoring is not just about static guidelines. It also is about learning from your own experience——預重構不只是套用清單,而是把每次的成敗轉化為下一輪的判斷力。

結語#

設計沒有完美解。書中每一條指南都帶著取捨;每一個取捨都需要在你當下的情境中重新衡量。

從 Sam 的具體故事走過一遍後,下一次面對自己的需求時,把這些指南當作「別人走過的路標」——它們不會替你決定方向,但能讓你在分岔口多一個參考。

作者在書末歡迎讀者回饋自己發展出的指南:預重構這套思維本身也是「持續演化的」實踐,每一個讀者都是它的共同作者。