解Bug的經驗分享

經過4天的奮鬥, 總算把解封包演算法的Bug解決, 分享一下長久一來我的解Bug經驗, 雖然我還稱不上什麼武林高手, 但是這些經驗幫我渡過不少難關, 應該頗具有參考價值
  1. 當Bug出現的時候, 先使用Bug資料庫, 或是Issue Tracking軟體新增一個Bug.
    我記得剛開始寫程式的那幾年, 遇到Bug, 第一件事就是先跳進去Source code 看問題到底出現在那裡? 但是往往Bug還沒解完, 其它事接踵而來, 開會,等等的中斷, 當思緒已經快想出問題的解法, 確因為"中斷"造成下次再接下去解Bug的時候又要重來. 所以先在Bug資料庫新增一個Bug, 看似很簡單, 但是這個習慣確是我工作兩三年後才養成的習慣.
  2. 勤寫Bug Comment
    將心中對於Bug會發生的所有可能性記下來, 當思緒打結的時候, 將目前的進度與結果做個記錄. 這些記錄寫在資料庫中所建立的Bug是最好的. 以我解Bug的經驗, 每當遇到很棘手的Bug, 心中總是千頭萬緒, 不知從何下手, 在這思考的過程中, 沒有將思考的結果寫下來, 最後很容易陷入"思考的迷宮" , 思緒一直在繞圈圈, 走也走不出來, 但是有做記錄, 雖然會花一點時間, 但是確可以review自己的思路, 很快就可以找到出路.
  3. 善用Log message
    例如 Java 的log4j , Object-C的NSLog. 如果是寫底層的device driver也是有對應的log utility. 使用Log也要有一些技巧性, 我的經驗是, 先將source code好好看過一次, 然後在可疑處下Log, 然後從console看Log是否按照自己所設計的邏輯顯示出來. 如果是Fat client程式 而且沒有具備通信功能, IDE的source level debugger就夠用了, 但是目前的程式幾乎都具備有通訊功能, source level dugger在解決realtime的訊息就略顯不足.
  4. 使用第三方工具驗證
    當解Bug陷入膠著, 通常我會找其它功能正常的工具來驗證, 這種情況在寫DLL, Library或是framework常遇到, 例如我在解通訊程式的封包問題, 我可以先找已經可以正常工作的第三方軟體, 觀察正常的封包到底是長什麼樣子, 不過 這有點像是在做逆向工程, 一開始開發的產品是獨一無二的產品,可能就不適用了.
  5. 學習使用驗證工具或是儀器
    如果是寫純軟體, 通常SDK會附有許多工具, 例如記憶體的使用檢測, 如果是寫device driver, 我以USB device為例, USB有一種儀器叫USB analyser, 可以很清楚看到資料的傳遞流程. 在寫TCP/IP網路通訊程式, 可以使用tcpdump 所以解Bug時, 如果能善用這些工具, 可以讓你解Bug的時間大幅減少. 不過以我的經驗, 都是所有的方法都用盡了到最後不得已才使用這些工具.
  6. 勤加閱讀
    閱讀,等於是在幫自己補充解決問題的能量, 以往為了了解問題的核心所在, 得先將相關技術文件狠狠的K一遍, 所以解決問題絕不是靠天外神來一筆. 多方閱讀非資訊以外的文件對於思考也有很大的幫助
  7. 善用網路社群/Google搜尋引擎
    剛開始寫程式時, 網路並不是很發達, 大概只有News群組可以找到一群同好討論, 或是使用MSDN尋找解答, 但是自從有了Google, 只要會利用關鍵字,很快就可以看到相關的問題討論, 並獲得解答. 不過真的要 懂得用問題核心的"關鍵字", 我看過許多Engineer不會用google找答案, 真的是很可惜.

留言

這個網誌中的熱門文章

使用 AI 專門幫公司內部的流程做最佳化,這個團隊的角色會越來越重要

使用 New Bing 的 Chat 功能來當作閱讀 PDF/網頁文章/程式碼的輔助工具

我的Kindle 2支援中文顯示了