《调试九法》
读书笔记
娄雨禛 PB16060356
理解问题本身,远比解决问题更加重要
“人们想要掌握本书中的所有有用知识也并非完全不可能,事实上我就是尽全力这样做的。”
——福尔摩斯 《杀人的五个橘核》
我们总是惊叹福尔摩斯的能力,将其归于惊人的天赋。殊不知惊人的天赋总是扎根于辛勤的努力,辛勤的努力总是体现在日常一点一滴的积累。
抛开小说中虚幻的情节,回到我们的主题。我们所得出的结论是,尽我们所能地去深入地了解问题本身,得到的收获将超出想象。这个道理在软件工程之中尤为体现。
“理解问题本身”要求我们,在遇到每一个新的系统时,先去全面了解它——了解为什么会有这么多系统问题发生,了解是怎样的构造和原理导致了问题的发生。而备受初高中老师推崇的“快速解决问题”的能力,则被列为下等。其原因很简单:不理解问题,何谈解决问题?即使解决的,也一定是不彻底的解决,不能保证以后不会再次发生。
“求源”精神 与“遍历”精神,是每一位优秀工程师都具有的良好品质。看重问题本身的他们,总是在面对各种棘手时显得更加从容——是他们追着问题跑,而不是问题牵着他们的鼻子走。
引发失败
这是一个逆而行之的过程。想要成功,我们先引发失败,而在摸清失败的根源之后,创造出成功。这个道理是不难理解的。然而,我们怎么引发失败,尤其是引发对成功有益的失败?
但如何才能让他失败呢?一种简单的方法是进行一次内部预演,还有一种同样有效的方法是演示给未来的投资者。如果碰巧没有客户或投资者在现场,那么你就必须设法正常使用,并观察它是如何出错的。
我们往往需要遵循下面的流程,来将“引发失败”这个过程变成一次有趣且成效满满的探索。
回到开始 从最初的源头开始,而不是从某个看似无错的中断点开始,进行下一步的查错。
模拟失败发生的场景 每一个失败都有其发生的原因,但当我们了解它之前,它是隐藏的。我们如果要到达这个失败,就要通过各种途径去趋近失败。而模拟失败发生的场景,就是一种首要的途径去趋近失败。
初学者往往会将“引发失败”和“模拟失败”混淆。书中讲到很多例子去说明这个道理,而在此处,我对两者的区别做一个总结。
引发失败 通过模拟失败发生的场景,在不知道失败本身机理的情况下,让失败再次发生。
模拟失败 通过某种人为的而非原程序本意的方式制造表观相同的失败。这往往是一种拙劣的模仿,为达到失败而制造失败,为实现失败的表象去制造失败,而不是去将失败作为出发点,寻求程序中导致失败的漏洞。
仔细观察失败
你必须能看到失败。如果它不是每次发生,那么就必须忽略掉不发生的时候,而在每次发生时观察它。关键是在每次运行时捕捉相关的信息,以便在发生失败之后查看这些数据。方法就是让系统在运行的时候尽可能多地输出信息,并把它们记录到“调试日志”中去。
很多人在面对失败时都会过度相信自己的直觉,认为这个失败就是处于“某某原因”。也许,这个失败确实被修复了,但这种可能性非常小。更多时候,它只是一个表面上被修复的假象,即修复的是表层的现象而不是现象背后的本质。
仔细观察失败,就是要尽量避免自己直觉的干扰,让客观事实尽可能公正地展现在自己的面前,从而使下一步的判断更加准确。这个过程往往让初学者觉得重复和无意义,但如果坚持着去做,一定会避免将来数不胜数漏洞的发生。正所谓“欲进先退”、“欲擒故纵”,这是一种全局的把控能力在每个细节的展现。
【注:以上是本书前四章的内容,以后继续阅读,会不断补充】