除錯前:先做好清潔工作#
十個可能的 fault 可以組合出一千種(2^10)表現形式;二十個則是一百萬種(2^20)。因此,除錯時應該先摘取低垂的果實——清理你工作區域周圍的小問題:
- 工具能找到的問題(static program analysis)
- Runtime 警告,例如可恢復的 assertion failure
- 與你問題相關的難以閱讀的程式碼
- 標記為
XXX、FIXME、TODO的可疑程式碼,或含有 should、think、must 等不確定語氣的註解 - 其他已知但被忽視的小 bug
在一個相對乾淨的環境中除錯困難問題,才不會被「千刀萬剮」。不過需要用判斷力——如果清理程式碼確實有助於除錯就值得冒險;如果問題可以透過檢查 log 定位,那額外的清理可能是不必要的風險。
關於「不壞就別修」的反論#
這個方法有反對意見:
- 「If it ain’t broke, don’t fix it」
- 只升級系統一部分會造成風格不一致
你需要根據情況判斷。如果你面對的是脆弱的程式碼和可以透過 log 定位的 bug,那麼大規模清理就是不必要的風險。
除錯後:兩項收尾任務#
修復 bug 之後,你還沒有完成。有兩項重要的收尾工作:
1. 搜尋並修復類似錯誤#
搜尋程式碼中其他類似的錯誤並修復它們(參見 Item 21: Fix All Instances of a Problem Class)。
2. 清理暫時修改#
處理你為了定位問題而做的暫時修改:
- 撤銷為了讓 fault 更明顯而加入的臨時修改
- 如果在獨立的 revision control branch 上工作,這會很容易
- 保留並提交未來可能有用的修改,例如 assertions、logging statements、新的 debug commands
重點回顧#
- 在展開重大除錯任務前,確保基本的程式碼品質
- 完成後,清理暫時的程式碼修改並提交有用的修改