提高調試能力的一些方法
你們好!我一直在編寫一本關於調試的雜誌(這是 目錄的初稿)。
作為其中的一部分,我認為閱讀一些關於調試的學術論文可能會很有趣,上周 Greg Wilson 給我發了一些關於調試學術研究的論文。
其中一篇論文(《建立一個調試教學的框架[付費牆]》)對我們有效調試所需的不同種類的知識/技能進行了分類,我非常喜歡。它來自另一篇關於故障排除的更一般性的論文:《學會排錯:一個新的基於理論的設計架構》。
我認為這個分類對於思考如何更好地進行調試是一個非常有用的結構,所以我把論文中的五個類別重新規劃為你可以採取的行動,以提高調試的效率。
以下是這些行動:
1、學習代碼庫
要調試一些代碼,你需要了解你正在使用的代碼庫。
這似乎有點顯而易見(當然,不了解代碼的工作原理,你就無法調試代碼!)
這種學習隨著時間的推移會很自然地發生,而且實際上調試也是 學習 一個新的代碼庫如何工作的最好方法之一—— 看到一些代碼是如何崩潰的,有助於你了解它是如何工作的。
該論文將此稱為「系統知識」。
2、學習系統
論文中提到,你需要了解編程語言,但我認為不止於此 —— 為了修復 bug,往往你需要學習很多更廣泛的環境,而不僅僅是語言。
舉個例子,如果你是後端 Web 開發者,你可能需要的一些「系統」知識包括:
- HTTP 緩存如何工作
- CORS
- 資料庫事務是如何工作的
我發現我經常需要更有意識地去學習像這樣的系統性的東西 —— 我需要真正花時間去查找和閱讀它們。
該論文將此稱為「領域知識」。
3、學習你的工具
現在有很多工具,例如:
- 調試器(GDB 等)
- 瀏覽器開發工具
- 剖析器
strace
/ltrace
tcpdump
/wireshark
- 核心轉儲
- 甚至像錯誤信息這樣的基本東西(如何正確閱讀它們)
我在這個博客上寫了很多關於調試工具的文章,並且肯定學習這些工具給我帶來了巨大的變化。
該論文將此稱為「處理性知識」。
4、學習策略
這是最模糊的一類,在如何高效調試的過程中,我們都有很多策略和啟發式方法。比如說:
- 寫一個單元測試
- 寫一個小的獨立程序來重現這個錯誤
- 找到一個能工作的版本的代碼,看看有什麼變化
- 列印出無數的東西
- 增加額外的日誌記錄
- 休息一下
- 向朋友解釋這個錯誤,然後在中途發現問題所在
- 查看 GitHub 上的問題,看看是否有匹配的問題
在寫這本雜誌的時候,我一直在思考這個類別,但我想讓這篇文章簡短,所以我不會在這裡多說。
該論文將此稱為「戰略知識」。
5、獲得經驗
最後一個類別是「經驗」。這篇論文對此有一個非常有趣的評論:
他們的研究結果並沒有顯示出新手和專家所採用的策略有什麼明顯的區別。專家只是形成了更多正確的假設,並且在尋找故障方面更有效率。作者懷疑這個結果是由於新手和專家之間的編程經驗不同造成的。
這真的引起了我的共鳴 —— 我遇到過很多第一次遇到時非常令人沮喪和困難的 bug,而在第五次、第十次或第二十次時就非常簡單了。
對我來說,這也是最直接的知識類別之一 —— 你需要做的就是調查一百萬個 bug,反正這就是我們作為程序員的全部生活 : ) 。這需要很長的時間,但我覺得它發生得很自然。
本文將此稱為「經驗知識」。
就這樣吧!
我打算把這篇文章寫得很短,我只是非常喜歡這個分類,想把它分享出來。
via: https://jvns.ca/blog/2022/08/30/a-way-to-categorize-debugging-skills/
作者:Julia Evans 選題:lkxed 譯者:aftermath0703 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive