2010年8月16日星期一

正确地对待bug的逻辑和态度

刚看了李笑来老师写的《关于举证责任》的系列短文,又联想到平时程序员在开发中常见的错误认识,结合自己的经验写一些总结。
以下内容不是讲调试和分析问题的技巧,而遇到bug时正确地对待问题的逻辑和态度。
  • 你写了一堆代码,不能因为别人没有证明你的代码有错误而认为自己的代码没有错误。
  • 自己要尽可能证明自己的代码没错误,这不是别人的责任。
  • 别人证明你的代码有错误的难度是很大的
    • 因为证明本身难度就很大,1000行的代码中有多少个可能的状态、条件变量有多少、它们之间的组合又有多少。
    • 多线程的偶然现象很难手工复现,往往需要编程来主动创造那种特殊的条件下才行,而这需要对复杂的代码有相当深入的整体和细节的掌握后才能做到。
    • 别人可能对你的代码实现一无所知,别人只是使用中发现了问题而已。
    • 出现问题后,如何复现问题往往很难。找到问题发生的条件,就像在一个巨大的状态空间中找到其中一点一样,可能需要做大量的实验。
  • 出现问题了就说明确实存在问题,只是还不清楚问题来自哪里,什么条件下发生的。不能因为没有找到复现问题的办法,而认为那个问题不存在。
  • 想办法复现问题、分析问题可能的情况(假设+求证)、定位问题、找到问题,这个过程往往是最费时间精力的事情。解决问题的主要工作量就在这里,而不是解决本身。
  • 找到问题后,解决问题往往很简单,可能就是1、2分钟的事情,甚至就是在找到问题的同时就解决完了。
  • 分析问题或证明问题不存在的责任在于程序的实现者,而不在于发现问题的人(尤其是普通用户)。
  • 发现问题的人最好能提供更多信息、最好能够说明问题复现方法、甚至最好能说明问题出在哪(但这个不太现实)。但反之,不能因为发现问题的人无法做到这些而否定问题。更不能要求别人把这个问题找到并且解决了,才承认有这个问题。
  • 最终找到的问题点可能离问题的表象很远,这也说明找到问题是不太容易的,也容易让人难于判断问题出在谁那里。
  • 做前端的人,往往首先承受了所有的问题,尽管问题很可能不在前端。因为程序的所有交互都要从前端进行,用户也只能看到前端的东西而看不到后台的东西。所以前端工程师往往要证明问题不是出在他这里,但也很难说出问题出在哪里,这等于要他来解决问题。
  • 问题最终可能不是出在你负责的这里,而是别的地方。
  • 程序员不应该推卸问题,尽管可能不是你的问题,但每个人都要积极的想协助解决问题。因为解决问题是整个团队的共同目标。
  • 自己写的简单测试没问题,并不能证明代码都没问题。因为测试代码只是证明给定那几个测试条件、数据下的结果是对的,既没有完整的覆盖所有情况(其它情况下是不是对的还不知道),也不能证明实现的过程是对的(结果对不一定过程对,可能碰巧、可能测试条件没有触发问题点)。
  • 代码测试覆盖率,你的测试覆盖了多少代码?如果非常低,那么隐藏问题的可能性很大;很高的覆盖率也很难做到,而且工作量很大。
  • 当你能够主动想到问题,而不是由别人告诉你哪里有问题的时候,你就已经提高一大截了。

没有评论: