除錯前:先做好清潔工作#

十個可能的 fault 可以組合出一千種(2^10)表現形式;二十個則是一百萬種(2^20)。因此,除錯時應該先摘取低垂的果實——清理你工作區域周圍的小問題:

  • 工具能找到的問題(static program analysis)
  • Runtime 警告,例如可恢復的 assertion failure
  • 與你問題相關的難以閱讀的程式碼
  • 標記為 XXXFIXMETODO 的可疑程式碼,或含有 shouldthinkmust 等不確定語氣的註解
  • 其他已知但被忽視的小 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

重點回顧#

  • 在展開重大除錯任務前,確保基本的程式碼品質
  • 完成後,清理暫時的程式碼修改並提交有用的修改