云风写过一篇博客”断点单步跟踪是一种低效的调试方法“,说高效的调试方法是code review,在大脑中模拟一段代码的运行,在大脑中模拟各个分支、前进回退应该是比一次次单步调试高效的。再辅以日志输出就可以对付绝大多数场景。
我觉得这种方式很神奇,而且很好奇的是,如何有效实践培养这个能力,我并不知道高手们都是怎么进行实际操作的,似乎很少有文章详细讲这方面的内容,也许我只能通过自己的理解去试试。
我在Google上做了一些搜索,一下是我搜索的一些相关网页。
Paul Graham写过一篇博客”Holding a Program in One's Head“,有相似的描述:
一个擅长编写自己的代码的优秀程序员可以像数学家解决自己正在解决的问题的方式将其牢记在心。数学家不会通过像教小学生一样在纸上解决问题来回答问题。他们在脑海中做更多的事情:他们试图充分理解问题空间,以至于可以绕着您成长的房屋的记忆走动。最好的编程是相同的。您将整个程序放在脑海中,可以随意进行操作。
相关的一些观点在”真正的程序员使用调试器吗“这一类问题下有所展现。
Quora上有位回答者说他是很少使用调试器的,主要靠阅读代码,他早期编程用的是打孔的卡片,是不允许犯错的,不能以“改变一下,看看会发生什么”这种模式来写代码,所以写下的代码会反复检查。
这里也有一个观点,认为在脑海中测试可能发生的情况是一个不错的能力。
在stackexchange上有几个相关的讨论:
Real programmers use debuggers?
What's the benefit of avoiding the use of a debugger?
这种主观讨论的东西自然是两个观点都有人支持,有人说什么情况下使用调试器,什么情况下不使用,可以有一定判断准则的。
调试回答里还引出了Linus Torvalds喷kdb的邮件:
I happen to believe that not having a kernel debugger forces people to think about their problem on a different level than with a debugger. I think that without a debugger, you don't get into that mindset where you know how it behaves, and then you fix it from there. Without a debugger, you tend to think about problems another way. You want to understand things on a different level.
我恰好相信,没有内核调试器会迫使人们在不同的层面上思考问题,而不是用调试器。我认为,如果没有调试器,你就不会进入那种你知道它是如何运行的,然后你从那里开始修复它的思维模式。如果没有调试器,你会倾向于用另一种方式来思考问题。你想在不同的_层次上理解事物。
不过,内核和普通程序似乎有些不一样,Linus Torvalds的观点是否完全适用于普通程序我也不知道。
搜索了一圈,觉得code review,在大脑中模拟程序运行这个技能还是很高级的,也许在实际的开发过程中我可以尝试一下,毕竟没有搜到那种很详细的指导,只能胡乱试试了。