调试九法读书笔记(四)
第七章 一次只修改一个地方
“有人说天才就是无止境地吃苦耐劳的本领。这个定义下得很不恰当,但是在侦探工作上倒还是用。” --福尔摩斯,《血字研究》
又听说天赋就是做起来永不厌倦的事情。
为了看到一个变量的影响,科学家尝试控制可能影响结果的所有其他变量——就是著名的控制变量法。
7.1 使用步枪,而不要用散弹枪
我们知道使用散弹枪能覆盖更大的面积。在解决问题的时候,使用散弹枪指的是,我们把可能想到的问题都修复一下。有时候发现问题真的解决了。但是这种盲目修复可能会导致其他不可知的问题。我们应该使用步枪,一次只针对一个地方进行修复。
7.2 用双手抓住黄铜杆
在很多时候,你可能想改变系统的不同部分,以便看看是否对问题有影响。这往往是一个危险的信号,只是在猜测,而不是使用插桩工具来确定问题的范围。你正在改变条件,而不是观察系统,捕捉错误的自然发生。这可能会把最初的问题隐藏起来,而且可能会引起更多错误。在核潜艇中,动力控制台前面有一个黄铜杆。当发生某种事情的时候,工程师必须双手抓住黄铜杆,并一直保持,直到看清所有仪表的指示器,明白发生了什么。这是为了让工程师克服修复问题的冲动。这些快速的修复举动会扰乱系统的自动修复功能,由于快速设置新的条件而隐藏了原来的问题,而且还可能会引发更大的灾难。在软件工程领域,遇到问题首先做的应该是了解系统,定位问题,而不是尝试解决问题。
7.3 一次只改变一个测试
一定要保证系统只有一个地方有改变,如果改变后没有效果,那么一定要将他改变回来。
7.4 与正常系统进行比较
如果我们有正常的系统可以进行比较事情就会变得容易的多。我们可以运行两个程序,对比他们调试记录,输出和中间值。比较差异,问题很快就应该能定位到。
7.5 自从上次能够正常工作以后你更改了什么
正常的系统和错误的系统之间的区别是由于一项修改造成的。做了更改以后,正常的系统出现了故障。一种有效的方法是找出第一个出问题的版本。然后对比正常的版本和错误的版本之间的差异。把问题缩小到两个版本之间的修改上。
7.6 小结
我们的生活要有一点先见之明。如果你所做的更改没有起到预期的作用,那么把它改回。它们可能会产生无法预料的影响。
- 隔离关键因素。如果你在检查日照时间的影响,就不要改变灌溉的方法。一次只修改一个地方。
- 用双手抓住黄铜杆。控制住自己想要修改系统的冲动,先搞清楚到底发生了什么事情。
- 一次只修改一个测试。之所以能定位到哪个组件损坏了是因为没有其他东西发生了改变。
- 与正常情况进行比较。如果所有出错的情况都有一些特征,而这些特征是正常情况所没有的,那么就找到了问题所在。
- 确定自从上一次正常工作以来你改变了什么地方。这很有效的帮助我们缩小了需要测试的范围,顺利的话,很快就能定位到问题。