读书笔记——调试九法
这本书不仅讲了软件调试,也讲了硬件调试,这不仅是程序员,也是工程师非常有用的技能。我粗略得读过这本书之后,结合自己这次学软件工程,以及以前做上电子设计实践2做风力摆的经历,感触颇深。
根据作者26年的系统设计和调试经验,他发现了两件事情:
1)如果查找一个bug花费了大量的时间,那么原因可能是忽略了某个最基本的、最重要的规则,一旦应用了那条规则,很快就会找到问题。
(2)擅于快速调试的人已经深刻理解了这些规则,而那些很难理解或使用这些规则的人则很难找到bug。
这九条规则是:
1>理解系统
<2>制造失败
<3>不要想,而要看
<4>分而治之
<5>一次只改一个地方
<6>保持审计追踪
<7>检查插头
<8>获得全新观点
<9>如果你不修复bug,它将永远存在
我对其中的几条规则,结合我以前做硬件和软件的经历,进行分析
(1)理解系统
这是最重要的一条规则,所以放在第一条。你必须理解系统的工作原理及它是如何设计的。在某些情况下还得知道为什么这样设计。
上学期我们做风力摆,卡住了很久做不出来的原因。就是因为没有理解风力摆这一受控对象的对象建模(俯仰角,翻滚角等),以及没有很好地理解PID算法。如果你没有理解系统的某个部分,那么这通常是出问题的地方。
理解系统最基本的办法就是阅读手册。产品说明书、官方的技术支持文档等,都归属于手册这一含义。仔细阅读手册,解决问题的关键隐藏在细节中,遇到问题不要盲目地相信你的记忆能力,该翻手册时就要翻。通过阅读手册掌握基础的知识,了解工作的流程,这样就能迅速定位错误是由哪个步骤造成的。所以,夯实基础十分重要。
(2)制造失败
当你决绝了一个问题,记住这次经历,将你解决问题的工具保留下来,保不准下次就得用上。
很多错误其实是同一种错误,当你犯了这些错误,记住它,就能减少下次犯错的几率。
除此之外,查找那些不受你控制的条件(导致间歇性的失败),例如未初始化的数据,随机数据输入,多线程同步和外部设备。
(上学期数据结构大作业很多就是因为数据没有初始化)
(3)不要想,而要看
亲眼查看失败,留意实际情况发生的过程,不要想当然的凭想象猜测。通过观察,让你能尽量缩小范围至几种可能性之内。你可以利用工具去观察错误,但必须知道,工具也会影响要测试的对象。
(4)分而治之
这是调试的核心。类似于二分查找法,根据错误特征反复将问题分成好的一般与坏的一半,来缩小搜索范围,进一步研究有问题的一半。当错误的特征不明显时,可以尝试放大这个特征。查找问题时从有问题的分支上溯查找。bug之间相互保护,相互隐藏,所以出现多个bug时,修复已知的bug,解决一个,往往连带着解决了多个。
(5)一次只改一个地方
改动后不能解决问题要还原后再进行下一次改动,因为改动了后,环境条件也会发生改变,会影响错误的查找。每次改动专注于一处地方。你要能明白正常情况下的结果,与你遇见的情况做对比。在改动时,要隔离关键因素以确保每次改动只改变了一个。
(ps:其实你会发先 (4)也是一次只改一个地方的原因,因为你修复了一个bug,往往就连带着解决了其他bug,上学期做数据结构大作业的时候,尤其有这种感觉,往往是修复了一个bug,就解决了很多bug,因为bug是会耦合的)
<8>获得全新的观点
放下无谓的自尊向他人,最好是专家求助,他会给你带来新的观点。在咨询时,报告问题的症状而不是你认为的原因(理论),这会将他人陷入你的固定思维中。学会利用工具搜索问题,比如Google。向小黄鸭倾诉你的想法,以理清你的思路。有一个教训就是当时做电设请教助教的时候,就是把自己认为的原因告诉他。但实际上这样并不好。但是话说回来,如何利用工具搜索解决问题,我好像这方面的能力也不太强。