改遺留碼的第一道關卡,往往不是沒測試,而是根本看不懂:命名爛、方法長、結構糊,讓你不敢下手。Feathers 的解方不是「更用力盯著看」,而是把理解變成一個動手的過程——邊讀邊畫、直接在碼上標記、大膽地做一次「用完就丟」的重構。理解是動詞,不是盯出來的。
🧠 為什麼要專門「經營理解」
看不懂就改,是恐懼的來源,也是引入 bug 的溫床。與其祈禱自己讀懂了,不如用幾個低成本的動作,把腦中的心智模型逼出來、外化到紙上或碼上。這些技術都便宜、可拋棄,重點全在過程而非產物。
⚖️ 四個動手理解的技術
① Notes / Sketching — 邊讀邊畫
拿紙或白板,邊讀邊寫邊畫:類別關係、呼叫流程、標記不確定處、寫下假設與疑問。
TIP
不需要正式 UML 或任何標準格式,重點是邊讀邊思考的過程。即使最後把草圖丟掉,你在畫的當下已經理解了很多。
② Listing Markup — 直接在碼上標記
在列印稿或螢幕上動筆:圈出關鍵條件與賦值、連線標出「誰呼叫誰」、用符號標「這裡我不確定 / 可能有 bug」、在 margin 寫下每段的職責。特別適合肢解一個巨大方法——把它在視覺上先切開。
③ Scratch Refactoring — 用完就丟的試驗重構
大膽重構,但打定主意不保留:確保能一鍵撤銷(先 commit 乾淨)→ 盡情提取方法、改名、搬移 → 不管測試、不求完美命名 → 理解完成後全部 revert → 帶著新理解,用正確方式重做一次。
git commit -am "wip: 開始前存檔" # 網子
# …大膽提取/改名/搬移,只為看懂結構…
git checkout . # 用完就丟,一行都不留為什麼有效:重構逼你逐行細讀、提取逼你回答「這段在做什麼」、改名逼你替行為賦義。即使最後撤銷,心智模型已經建好了。
WARNING
一定要在版本控制下做,且千萬別不小心留下 scratch 的結果——它沒有測試保護,可能挾帶 bug。它的價值在「理解」,不在「改善」。
④ Delete Unused Code — 刪掉沒在用的碼
理解過程中發現從未被呼叫的碼,最好的處理是刪掉:它增加閱讀負擔、誤導你以為某功能還活著。
NOTE
「也許以後會用到」的代價是:每個讀到它的人都得花時間搞懂它、再發現它沒在用。版本控制就是你的安全網——需要時隨時找得回來,放心刪。
🧭 理解之後:接回主線
理解不是終點,是為了能安全改動。看懂結構後,順勢辨認出可下手的 接縫、為要改的區域補上 特徵測試,再用 提取函式 等手法把 scratch 階段看到的「更好結構」這次正式且有測試地落地。
🔑 Takeaways
- 理解遺留碼是動手的過程,不是更用力地盯——把心智模型外化出來。
- Sketching(邊讀邊畫)、Listing Markup(在碼上標記職責)適合初讀與肢解大方法。
- Scratch Refactoring:大膽重構、用完即丟,用「重構的動作」逼出理解;務必在版控下且不留痕。
- 刪掉未使用的碼降低雜訊,版控是你的安全網。
- 看懂之後接回主線:找 接縫 → 補 特徵測試 → 正式重構。
No notes yet — jot your takeaways or Q&A here.