系統化除錯
不要猜測後直接修補。每個步驟都應縮小錯誤可能存在的範圍。
1. 重現
- 獲取確切的錯誤訊息、堆疊追蹤、日誌、輸入內容及環境資訊(版本、作業系統、設定)。
- 能隨意觸發失敗,理想情況下只需一個指令或一個測試。如果問題是間歇性的,找出什麼因素會讓它更常發生(負載、時機、順序、特定輸入)。
- 如果無法重現問題,請說明狀況,並在修改程式碼前收集更多資訊。
2. 隔離
- 縮小重現範圍:移除輸入、步驟和程式碼,直到移除任何其他東西都會讓錯誤消失為止。
- 如果之前能正常運作,找出是哪個變更破壞了它:對受影響的檔案執行
git log,或執行git bisect run <test command>。 - 從你自己的程式碼頂端開始閱讀堆疊追蹤,而不是從框架的部分開始。
3. 假設與測試
- 寫下一個具體的假設:「快取回傳了過時的條目,因為鍵值忽略了地區設定」。
- 設計一個能證明或反駁該假設的檢查:一則日誌行、一個斷言、一個除錯器斷點、一個單元測試。在執行之前預測結果。
- 如果結果出乎你的意料,表示你對程式碼的理解有誤。在嘗試下一個想法之前,先更新你的理解模型。
- 一次只改變一個變數。還原沒有幫助的實驗。
4. 修復原因
- 修正錯誤值產生的地方,而不是它被發現的地方。檢查同樣的錯誤是否也存在於其他位置。
- 加入一個在修復前會失敗、修復後會通過的回歸測試。
- 移除暫時的日誌記錄和除錯程式碼。
5. 報告
用一兩句話解釋根本原因、修復方式、驗證方法,以及任何仍未解決的問題。