• <读书笔记>软件调试之道 :问题的核心-诊断


    声明:本文档的内容主要来源于书籍《软件调试修炼之道》作者Paul Butcher,属于读书笔记。

    不要急于动手!

    尽管可以利用各种工具和技术以及软件自身查找缺陷,但是你最重要的财富是你的智慧

    • 一种调试方法

    提出假设->设计实验->假设不成立,重新开始

    • 采用不同类型的实验

    进行几种不同类型的实验,但是每种实验必须有一个明确的目标。比如软件内部运行状态、软件的输入参数、本身编码逻辑。

    • 实验必须起到验证的作用

    实验是一种达到目的手段,而不是目的的本身。可以通过实验用来证明或者推翻假设。

    • 一次只做一次修改

    设计实验的规则之一,你每次只能做一个修改。此规则适用于任何修改,令人大跌眼镜的是,该规则经常被人忽略!虽然一次修改几个地方看起来省时间,实际上可能得到的只是无效的结果。不要再犯这种错误

    • 记录你所做过的调试

    在长期调试时,由于做过多种实验,最后可能忘记自己做了哪些工作,并且在已经得到证明的问题上重复浪费时间,甚至进入死胡同。因此应该做调试记录,理想情况是每个实验都都消除一些可能原因,最终找到根本原因。

    • 不要忽略任何细节

    凡是你不明白的都是潜在的缺陷,因此即使莫名其妙的现象,也往往对发现问题本身非常有价值。弄清楚意想不到的运行状况可以为你节省大量跟踪缺陷的时间。

    相关策略

    • 插桩

    留意海森堡定律,其本身不应该影响软件本身的运行,有充足的利用把插桩留到代码中,从而编写出自调试软件。

    • 分而治之

    也就是二分法,这种方法可以排除很多错误的情况,提高效率,但是对减小工作量、提高效率,其并非唯一。

    • 利用源码控制工具

    利用源码控制系统,可以进行有效的回归跟踪,它可以有效的告诉你哪个变化导致了这些问题。

    • 聚焦差异

    问题是否只在特定环境下重现?是否在大量数据输入情况下重新?

    • 向他人学习

    许多缺陷只存在于代码中,因此只有你和合作者才能解决它们。但有时其设计到特定的算法、库文件等,这种情况可能其他人已经遇到过同样的问题。

    陷阱

    下面这些是从实战中来之不易的经验教训

    • 你做的修改正确吗

    如果修改没有起到任何效果,那么你并没有改到点子上。这个陷阱很容易掉进去,又让人摸不着头脑,唯一的防御措施是时刻提高警惕。

    • 验证假设

    假设会带来盲点,要了解你正在做什么样的假设,以及何时对它进行严格的检验。

    • 多重原因

    这种情况比较难,最富有成效的解决多原因缺陷的办法是对问题进行隔离,并找到一个方法来重现缺陷。另外一个方法是先找寻同一区域内其它明显的缺陷并处理。

    • 流沙

    实证方法的基础是,可以一次一次的重现问题,并且每次获得相同的结果,但是如果没有了这种确定性,想取得改进就变得极为困难。如果自己遇到了这种问题,那就立即停下来,继续进行只会陷入更大的麻烦。此时的主要目标是准确的找到是什么在变化,以便你能控制它。

    思维游戏

    调试是艰苦的,有时简直苦不堪言,别灰心 ,我们都遇到过。这正是软件开发工作的 一部分,如果你遇到这种情况,下面的技巧会帮你解决这些问题。

    • 旁观调试方法

    最有效的一个策略就是向人求助,人多力量大,问题可能很快得到解决。做过这项工作的人都知道,往往只要把问题再解释一遍的简单行为也能激发灵感。因此实在找不到人,对着橡皮鸭或者纸人都可以做。

    • 角色扮演

    在解释和探讨问题时非常有用,特别是涉及到系统之间的数据交互时。

    • 换换脑筋

    当自己变得沮丧或者超负荷时,休息一会,看问题的角度可能就大不相同。

    • 做些改变

    当做实证实验陷入困境之中时,做一点改变是必要的,任何改变都可以,也需不会告诉你任何东西,但是有时会给你带来惊喜。

    • 福尔摩斯原则

    当你排除了一切不可能,无论剩下的是什么,他也一定是真相!

    • 坚持

    在绝望时,请记住总有一个办法能帮你解决问题,只要有足够的时间、付出足够的精力和决心,你一定会解决问题。

    验证诊断

    我们人类是多才多艺的,其中才能之一就是自欺欺人。考虑到这一点,花时间验证你的诊断是很值得的。

    • 向他人讲述你的诊断

    他们可能会发现一个缺陷,即使是旁观者效应也能帮助你达到这样的效果。

    • 检查源码原始副本

    从一个已知没有问题的版本重新验证你编程时的思考。

    • 多和他人讨论

    假设你是错误的,知道你犯过什么错误了吗?

  • 相关阅读:
    python的性能了解
    工作记录01/17/11
    继承或者重写django的user model?
    dunder=double underscore
    ipython应该是个好的命令行式的python ide,不过现在没时间折腾。
    django的settings如何在不同环境下进行切换
    pythonic实践
    关于递归函数的简单认识
    数据结构(C语言版)链表相关操作算法的代码实现
    数据结构(C语言版)顺序栈相关算法的代码实现
  • 原文地址:https://www.cnblogs.com/shuolang/p/5476429.html
Copyright © 2020-2023  润新知