Item 38: Review and Manually Execute Suspect Code#

透過仔細審查程式碼手動逐行執行,你往往能精確定位演算法中的 bug。目標是驗證程式碼的正確性,以及你對程式碼的理解是否準確。

審查常見錯誤#

第一遍閱讀程式碼時,仔細檢查每一行,尋找常見錯誤:

  • 運算子優先順序錯誤(尤其是 bit operators 特別容易出錯)
  • 遺漏的大括號break 語句
  • 控制語句後面多餘的分號
  • assignment 誤用為 comparison= vs ==
  • 未初始化或錯誤初始化的變數
  • Off-by-one 錯誤
  • 錯誤的型別轉換
  • 遺漏的 method、拼寫錯誤、語言特有的陷阱

現代工具如 static analysis(見 Item 51)可以自動捕捉許多這類錯誤,但在不遵循良好 coding conventions 的程式碼中,錯誤仍可能漏過。

手動執行程式碼#

要手動執行程式碼,準備一張空白紙

  1. 寫下關鍵變數的名稱
  2. 按照電腦執行的順序逐行執行
  3. 每次變數值改變時,劃掉舊值寫上新值
  4. 用鉛筆書寫方便修正

避免使用電腦來輔助這個過程(例如用試算表追蹤變數值、用編輯器瀏覽程式碼)。瀏覽 email 或其他分心行為會破壞這個方法所需的深度專注

視覺化複雜資料結構#

當程式碼操作複雜的資料結構時,用圖形來表達:

  • 用線條、方框、圓圈和箭頭畫出演算法的關鍵部分
  • 設計適合的圖示慣例(例如方括號表示閉區間端點,圓括號表示開區間端點)
  • 畫出程式的 call graph 來理解函式之間的呼叫關係
  • 使用大張的紙或白板,並加入顏色來區分元素

操作實體物件#

更進一步,可以操作實體物件(磁鐵、迴紋針、牙籤、便利貼、積木等)來模擬問題。這透過引入更多感官(3D 視覺、觸覺、本體感覺)來加深你對問題的投入程度,可用來模擬佇列、分組、協定、評級等。

重點回顧#

  • 逐行檢查程式碼,尋找常見的語法和邏輯錯誤
  • 用紙筆手動執行程式碼來驗證正確性
  • 用圖形來釐清複雜的資料結構
  • 善用大紙張、白板和顏色來處理複雜度
  • 操作實體物件可以加深對問題的理解