看懂遺留碼 (Understanding Legacy Code)

★★★★★Draft

FromWorking Effectively with Legacy Code

📚 From the Books

看懂遺留碼 (Understanding Legacy Code)Legacy Code

改遺留碼的第一道關卡,往往不是沒測試,而是根本看不懂:命名爛、方法長、結構糊,讓你不敢下手。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

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading