全書旅程回顧#

導論:動機#

前兩章探索了重構的定義、重要性與優先級。奠定了重構的三大目標:

目標手段
降低脆弱性透過局部化不變量(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 三條路線繼續深入