你好!我一直在写一本关于调试的杂志(这里是目录的早期草稿)。
作为其中的一部分,我认为阅读一些关于调试的学术论文可能会很有趣,上周Greg Wilson给我发了一些关于调试学术研究的论文。
其中一篇论文( Towards a framework for Teaching debugging [paywalled] )有一个分类,我非常喜欢我们需要有效调试的不同类型的知识/技能。它来自另一篇关于故障排除的更一般的论文: Learning to Troubleshoot: A New Theory-Based Design Architecture 。
我认为分类是思考如何更好地调试的非常有用的结构,因此我将论文中的五个类别重新构建为您可以采取的行动以更好地调试。
他们来了:
1.学习代码库
要调试一些代码,您需要了解您正在使用的代码库。这似乎很明显(当然,如果不了解代码的工作原理,您就无法调试代码!)。
这种学习会随着时间的推移自然而然地发生,实际上调试也是了解新代码库如何工作的最佳方法之一——看看某些东西是如何崩溃的,可以帮助你了解很多关于它是如何工作的。
该论文称其为“系统知识”。
2.学习系统
论文提到你需要了解编程语言,但我认为还有更多的东西——要修复错误,通常你需要了解更多关于更广泛环境的知识,而不仅仅是语言。
例如,如果您是后端 Web 开发人员,您可能需要的一些“系统”知识包括:
- HTTP 缓存的工作原理
- CORS
- 数据库事务如何工作
我发现我经常需要更加有意识地学习这样的系统性东西——我需要花时间去查找它们并阅读它们。
该论文称其为“领域知识”。
3. 学习你的工具
那里有很多调试工具,例如:
- 调试器(gdb 等)
- 浏览器开发者工具
- 剖析器
- strace / ltrace
- tcpdump/wireshark
- 核心转储
- 甚至是错误消息之类的基本内容(您如何正确阅读它们)
我在这个博客上写了很多关于调试工具的文章,而且学习这些工具肯定对我产生了巨大的影响。
该论文称其为“程序性知识”。
4.学习策略
这是最模糊的类别,我们都有很多策略和启发式方法,我们在此过程中学到了如何有效调试。例如:
- 编写单元测试
- 编写一个小的独立程序来重现错误
- 找到代码的工作版本并查看发生了什么变化
- 打印一百万件东西
- 添加额外的日志记录
- 在休息
- 向朋友解释错误,然后在中途找出问题所在
- 查看 github 问题以查看是否有任何匹配项
在写杂志的时候我一直在思考这个类别,但我想保持这篇文章简短,所以我不会在这里多说。
该论文称其为“战略知识”。
5.获得经验
最后一类是“经验”。这篇论文对此有一个非常有趣的评论:
他们的发现并没有显示新手和专家采用的策略有显着差异。专家们只是形成了更正确的假设,并且更有效地发现了错误。作者怀疑这个结果是由于新手和专家在编程经验上的差异。
这真的引起了我的共鸣——我遇到了很多错误,当我第一次遇到它们时非常令人沮丧和困难,而第五次、第十次或第二十次则非常简单。
这对我来说也是最直接的知识类别之一——你需要做的就是调查一百万个错误,这就是我们作为程序员的一生:)。这需要很长时间,但我觉得这很自然。
该论文称其为“经验性知识”。
就这样!
我将保持这篇文章简短,我真的很喜欢这个分类并想分享它。
原文: https://jvns.ca/blog/2022/08/30/a-way-to-categorize-debugging-skills/