在怀疑第三方产品之前,先怀疑一下自己


今天继续聊debug。
通常情况下,我们的项目会用到很多第三方的产品(数据库、框架、中间件、SDK)。程序也运行下特定的环境下(操作系统、命令库、编译器)。
当程序出问题的时候,这些第三方产品和环境出问题也是有可能的,但它不应该是第一个考虑的方向。

作者也特意讲到一个故事,说他们的程序有一次出了问题,然后一个高级工程师就坚信是Unix的select命令出了问题。大家从各方面劝都没有把他劝服。
然后他花了几个星期的时间来写变通的方案,出于一些奇怪的原因,他的方案并没有起作用。

于是,他不得不静下心来阅读select的文档,然后发现了问题所在,几分钟之后问题就解决了。
所以,之后作者就用“select”没有坏,来提醒自己,不要首先怀疑其他人的问题,先考虑自己的问题。

我也遇到过类似的问题,有一次在请求ebay接口的时候,它的accesstoken不到5分钟就失效了。但根据文档的说明,它的有效期应该有2个小时才对。
但是,代码已经很久没有动过了,不大可能是代码的问题。于是,我们想当然地认为是ebay那边出了问题。

但后来发现,可能是数据库那台服务器中了病毒,accesstoken那个字段的值,没过几分钟就会自己多出几个字符,导致token失效。

后来,临时弄了一个数据库,使用这个新的数据库,问题就不再出现了。

虽然这一次确实也是第三方的产品(数据库)出现了问题,但说到底还是我们自己的问题,因为运维水平不够,导致服务器的安全等级太低。

所以,不要轻易地怀疑第三方的产品,特别是大范围公开的产品。如果出了问题,大概率是自己的使用不当。
倘若真的是产品本身出了问题,我们大概率会收到通知,或看到新闻。不至于毫无音讯,毕竟是一个很多人使用的产品。

但,同时,不要轻易怀疑,不代表不用怀疑。
一个运行了很多年,都没有出问题的代码,不代表它就不可能有bug。
就像上面我的那个例子,正常情况谁也不会想到某个数据行会自己改变。
这个问题的发现,也不是因为我对这件事,产生了怀疑。只不过是想对比一下,两次请求的token是不是一模一样。然后无意间发现的问题。

所以,不要假设某个东西一定没有问题。虽然怀疑所有地方,不是一件优先级很高的事情。但到了不得已的时候,也不得不怀疑一下。通过测试来证明它真的没问题,才是真的没问题。

不要假设,要证明。
最后,如果你改变了一个地方,导致了程序出错。

不论你改的地方是什么,无论它和错误之间的关系显得多么的薄弱。无论这个理由显得多么地离谱。它都一定是你的第一怀疑对象。
最后的最后,问题解决后,事情并没有完全结束。还有两件事要做。
其一,想一想这个地方的错误,可能还会影响到哪里,一并解决了。不要偷懒,现在不解决,迟早也要解决的。到那个时候,可能会更麻烦。
其二,思考一下,有没有什么办法可以防止它再次发生。至少,增加检测手段,当它再次发生的时候,你能够第一时间知道。

今天,就是debug这个话题的收官了,希望你也能有启发。

字数:986

耗时:1小时20分


··················END··················


发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章