zoukankan      html  css  js  c++  java
  • 《调试九法》读书笔记

    《调试九法》

    读书笔记

     娄雨禛 PB16060356

     

    理解问题本身,远比解决问题更加重要

      “人们想要掌握本书中的所有有用知识也并非完全不可能,事实上我就是尽全力这样做的。”

    ——福尔摩斯 《杀人的五个橘核》

      我们总是惊叹福尔摩斯的能力,将其归于惊人的天赋。殊不知惊人的天赋总是扎根于辛勤的努力,辛勤的努力总是体现在日常一点一滴的积累。

      抛开小说中虚幻的情节,回到我们的主题。我们所得出的结论是,尽我们所能地去深入地了解问题本身,得到的收获将超出想象。这个道理在软件工程之中尤为体现。

      “理解问题本身”要求我们,在遇到每一个新的系统时,先去全面了解它——了解为什么会有这么多系统问题发生,了解是怎样的构造和原理导致了问题的发生。而备受初高中老师推崇的“快速解决问题”的能力,则被列为下等。其原因很简单:不理解问题,何谈解决问题?即使解决的,也一定是不彻底的解决,不能保证以后不会再次发生。

      “求源”精神 “遍历”精神,是每一位优秀工程师都具有的良好品质。看重问题本身的他们,总是在面对各种棘手时显得更加从容——是他们追着问题跑,而不是问题牵着他们的鼻子走。

    引发失败

      这是一个逆而行之的过程。想要成功,我们先引发失败,而在摸清失败的根源之后,创造出成功。这个道理是不难理解的。然而,我们怎么引发失败,尤其是引发对成功有益的失败?

      但如何才能让他失败呢?一种简单的方法是进行一次内部预演,还有一种同样有效的方法是演示给未来的投资者。如果碰巧没有客户或投资者在现场,那么你就必须设法正常使用,并观察它是如何出错的。

      我们往往需要遵循下面的流程,来将“引发失败”这个过程变成一次有趣且成效满满的探索。

      回到开始  从最初的源头开始,而不是从某个看似无错的中断点开始,进行下一步的查错。

      模拟失败发生的场景  每一个失败都有其发生的原因,但当我们了解它之前,它是隐藏的。我们如果要到达这个失败,就要通过各种途径去趋近失败。而模拟失败发生的场景,就是一种首要的途径去趋近失败。

      

      初学者往往会将“引发失败”和“模拟失败”混淆。书中讲到很多例子去说明这个道理,而在此处,我对两者的区别做一个总结。

      引发失败  通过模拟失败发生的场景,在不知道失败本身机理的情况下,让失败再次发生。

      模拟失败  通过某种人为的而非原程序本意的方式制造表观相同的失败。这往往是一种拙劣的模仿,为达到失败而制造失败,为实现失败的表象去制造失败,而不是去将失败作为出发点,寻求程序中导致失败的漏洞。

     

    仔细观察失败

      你必须能看到失败。如果它不是每次发生,那么就必须忽略掉不发生的时候,而在每次发生时观察它。关键是在每次运行时捕捉相关的信息,以便在发生失败之后查看这些数据。方法就是让系统在运行的时候尽可能多地输出信息,并把它们记录到“调试日志”中去。

      很多人在面对失败时都会过度相信自己的直觉,认为这个失败就是处于“某某原因”。也许,这个失败确实被修复了,但这种可能性非常小。更多时候,它只是一个表面上被修复的假象,即修复的是表层的现象而不是现象背后的本质。

      仔细观察失败,就是要尽量避免自己直觉的干扰,让客观事实尽可能公正地展现在自己的面前,从而使下一步的判断更加准确。这个过程往往让初学者觉得重复和无意义,但如果坚持着去做,一定会避免将来数不胜数漏洞的发生。正所谓“欲进先退”、“欲擒故纵”,这是一种全局的把控能力在每个细节的展现。

    【注:以上是本书前四章的内容,以后继续阅读,会不断补充】

  • 相关阅读:
    Salesforce的数据权限机制
    Java并发编程:Java内存模型和volatile
    Java并发编程:synchronized和锁优化
    权限控制和OAuth
    MySQL explain详解
    ConcurrentHashMap源码阅读
    HashMap源码阅读
    领域驱动设计的基础知识总结
    Chris Richardson微服务翻译:重构单体服务为微服务
    Chris Richardson微服务翻译:微服务部署
  • 原文地址:https://www.cnblogs.com/RainLou/p/8718217.html
Copyright © 2011-2022 走看看