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 的程式碼中,錯誤仍可能漏過。
手動執行程式碼#
要手動執行程式碼,準備一張空白紙:
- 寫下關鍵變數的名稱
- 按照電腦執行的順序逐行執行
- 每次變數值改變時,劃掉舊值寫上新值
- 用鉛筆書寫方便修正
避免使用電腦來輔助這個過程(例如用試算表追蹤變數值、用編輯器瀏覽程式碼)。瀏覽 email 或其他分心行為會破壞這個方法所需的深度專注。
視覺化複雜資料結構#
當程式碼操作複雜的資料結構時,用圖形來表達:
- 用線條、方框、圓圈和箭頭畫出演算法的關鍵部分
- 設計適合的圖示慣例(例如方括號表示閉區間端點,圓括號表示開區間端點)
- 畫出程式的 call graph 來理解函式之間的呼叫關係
- 使用大張的紙或白板,並加入顏色來區分元素
操作實體物件#
更進一步,可以操作實體物件(磁鐵、迴紋針、牙籤、便利貼、積木等)來模擬問題。這透過引入更多感官(3D 視覺、觸覺、本體感覺)來加深你對問題的投入程度,可用來模擬佇列、分組、協定、評級等。
重點回顧#
- 逐行檢查程式碼,尋找常見的語法和邏輯錯誤
- 用紙筆手動執行程式碼來驗證正確性
- 用圖形來釐清複雜的資料結構
- 善用大紙張、白板和顏色來處理複雜度
- 操作實體物件可以加深對問題的理解