Item 44: Verify Your Reasoning by Perturbing the Debugged Program#
隨意修改程式來「看看會發生什麼」常被貶抑為 hacking。但是,以有計劃的方式進行實驗性修改,可以讓你測試假設、深入了解系統和底層平台。這在程式碼或 API 文件品質不佳時特別有價值。
可以透過擾動回答的問題#
- 傳入
null作為參數會怎樣? - 變數超過 999 毫秒時程式碼還能正確運作嗎?
- 進入這個函式時如果持有 lock,是否會記錄警告?
- method 的呼叫順序是否與我的問題有關?
- 換用另一個 API 會不會更好?
兩種實驗方向#
修改運算式和值:將 runtime 運算式替換為具體值來測試:
- 傳入正確值給函式,確認故障是否因此消失,來驗證故障確實與該值相關
- 傳入或回傳錯誤值,確認問題是否可歸因於該值
- 將參數設為極端值,讓微小或罕見的問題(如效能衰退)變得明顯且易於觀察
測試替代實作:替換可能有錯的程式碼,看問題是否解決:
- 例如 Windows API 提供超過五種取得字串寬度的方式,如果文字對齊有問題,可以嘗試將
GetTextExtentPoint32換成GetTextExtentExPoint - 如果對函式呼叫順序有疑慮,嘗試替代順序
- 也可以嘗試極端的程式碼簡化(見 Item 46)
重點回顧#
- 在程式碼中手動設定值來辨識正確與錯誤的值
- 如果找不到修正的指引,嘗試替代實作來進行實驗