全書旅程回顧#
導論:動機#
前兩章探索了重構的定義、重要性與優先級。奠定了重構的三大目標:
| 目標 | 手段 |
|---|---|
| 降低脆弱性 | 透過局部化不變量(localizing invariants) |
| 增加彈性 | 透過減少耦合(reducing coupling) |
| 理解軟體的領域 | 透過重構過程深入探索領域結構 |
Part 1:具體化#
在 Part 1 中,我們從一個看似合理的程式碼庫出發,逐步改善。使用一組規則聚焦注意力、避免掉進理解細節的兔子洞,並同步建立了一套小而強大的重構模式目錄。
旅程依序為:拆分長函式 → 以 class 取代 type code → 將函式推入 class 成為方法 → 統一 if、函式與 class → 進階封裝模式。
Part 2:拓寬視野#
在 Part 2 中,從具體的規則與重構提升到更高的抽象層次,探討了影響重構與程式碼品質的社會技術議題(socio-technical subjects):
| 面向 | 內容 |
|---|---|
| 工具 | 編譯器、feature toggling、Kanban、約束理論等 |
| 文化 | 刪除程式碼、新增程式碼、「破壞」程式碼的態度 |
| 技能 | 挖掘結構、安全地優化效能 |
底層哲學#
追尋更小的步驟#
本書與 TDD 等方法共享一個基本信念:越小的步驟,犯錯的風險越低。永遠從「可運作」走到「可運作」(green to green),即使中間需要經過多個只做了最小改進的中間狀態。
小步驟帶來的額外好處是靈活性:如果發現重要新資訊,只需走到下一個 green state 即可切換方向;如果收到緊急修復需求,可以 git reset 回最近的 green state,損失極少。
重構進行到一半時,腦中通常維持著許多鬆散的線索。如果此時做上下文切換(context switch),回來後很可能記不住這些線索,犯錯風險暴增。應該只在 green state 之間切換上下文。
搜尋隱藏的結構#
作者喜歡把自己比作黏土雕塑家——從一團黏土出發,慢慢塑形以揭示內在的結構。引用米開朗基羅的名言:
Every block of stone has a statue inside it, and it is the task of the sculptor to discover it.
實務上的技巧是由內而外級聯:
| 引導來源 | 目標邊界 |
|---|---|
| 程式行 | 方法的邊界 |
| 方法 | 類別的邊界 |
| 類別 | namespace / package 的邊界 |
flowchart LR
A["程式行"] -->|引導| B["方法邊界"]
B -->|引導| C["類別邊界"]
C -->|引導| D["namespace\n邊界"]
style A fill:#fff3e0
style B fill:#e8f5e9
style C fill:#e1f5fe
style D fill:#f3e5f5因此,寧可多一個方法也不要少一個——一個方法的差異可能決定了是否出現共同詞綴,進而決定是否需要另一個類別。
規則是工具,不是法律#
將規則當作棍棒互相敲打是大忌。心理安全感是開發團隊的第一優先。規則應該是關於程式碼品質的對話基礎、合理的經驗法則起點、以及學習重構的動機與必要性。
團隊優先於個人#
軟體開發是團隊工作。平行作業的個人看似提升效率,實則容易產生知識孤島(knowledge silos)。Pair programming、ensemble programming 等實踐能有效分散知識、技能與責任,建立更強的信任與承諾。
If you want to go fast, go alone. If you want to go far, go together. — 非洲諺語
當有人問「這行程式碼太長了嗎?」或「這段程式碼不好嗎?」時,作者會反問三個問題:
- 你的團隊成員理解它嗎?
- 他們對它滿意嗎?
- 有沒有更簡單的版本且不違反效能 / 安全限制?
簡單優先於完備#
如果你想制定自己的規則,必須遵守一個設計原則:在「簡單但不完美」與「複雜但正確」之間,偏向簡單。
認知心理學描述了兩套認知系統:System 1 快速但不精確、幾乎不耗能;System 2 緩慢但精確、耗能高。程式設計主要是 System 2 的工作,開發者的心智容量已經被手上的問題佔滿。任何想讓人遵守的規則,都必須簡單到可以用 System 1 執行。
物件或高階函式#
從重構的角度來看,一個只有一個方法的物件等同於一個 higher-order function;如果物件有欄位,就等同於一個 closure。它們的耦合程度相同,差別只在可讀性。選擇團隊認為更易讀的那個即可。
繼續前行的三條路線#
Micro-architecture 路線#
本書的主要焦點,最自然的延伸。關注從表達式到公開介面之前的耦合與脆弱性:
- 深入 code smells → Robert C. Martin 的 Clean Code
- 擴充重構模式 → Martin Fowler 的 Refactoring
Macro-architecture 路線#
跨團隊架構受 Conway’s Law 主導——架構會鏡射組織的溝通結構。要影響程式碼,必須先影響人。推薦 Matthew Skelton 的 Team Topologies。
Software Quality 路線#
依團隊性質有不同方向:
| 團隊類型 | 學習方向 | 推薦書籍 |
|---|---|---|
| 產品團隊(面對非工程師使用者) | 學習測試 | Kent Beck 的 Test-Driven Development |
| 平台團隊(面對其他工程師) | 學習型別理論(type theory) | Benjamin C. Pierce 的 Types and Programming Languages |
| 最有野心的讀者 | 學習可證明正確性(provable correctness) | Edwin Brady 的 Type-Driven Development with Idris |
型別安全是防彈的,但只能涵蓋我們教它的範圍;測試涵蓋面廣但非萬無一失;可證明正確性是當前品質的最高標準,防彈且涵蓋一切,但需要巨大的精力才能掌握。
本章重點#
- 本書的旅程從動機出發,經由具體的規則與重構模式,最終拓展到影響程式碼品質的社會技術議題
- 底層哲學是將大型轉換分解為穩定狀態之間的微小步驟
- 結構往往是隱藏的——用程式行引導方法、用方法引導類別,由內而外逐層浮現
- 規則用於支持協作與團隊合作,重構沒有任何東西能取代常識
- 人的認知限制決定了規則必須偏向簡單
- 從本書出發,可以沿著 micro-architecture、macro-architecture 或 software quality 三條路線繼續深入