14 bug的反复出现重蹈覆辙与吸取教训.pdfVIP

  • 13
  • 0
  • 约7.05千字
  • 约 7页
  • 2021-01-24 发布于北京
  • 举报

14 bug的反复出现重蹈覆辙与吸取教训.pdf

2018/9/3 极客时间 | 程序员进阶攻略 讲堂 程序员进阶攻略 文章详情 14 | Bug的反复出现:重蹈覆辙与吸取教训 2018-09-03 胡峰 14 | Bug的反复出现:重蹈覆辙与吸取教训 朗读人:刘飞 13′35′′ | 6.23M Bug 除了时间和空间两种属性,还有一个特点是和程序员直接相关的。在编程的路上,想必你 也曾犯过一些形态各异、但本质重复的错误,导致一些 Bug 总是以不同的形态反复出现。在你 捶胸顿足懊恼之时,不妨试着反思一下:为什么你总会写出有 Bug 的程序,而且有些同类型的 Bug 还会反复出现? 1. 重蹈覆辙 重蹈覆辙的错误,老实说曾经我经历过不止一次。 也许每次具体的形态可能有些差异,但仔细究其本质却是类似的。想要写出没有 Bug 的程序是 不可能的,因为所有的程序员都受到自身能力水平的局限。而我所经历的重蹈覆辙型错误,总结 下来大概都可以归为以下三类原因。 1.1 粗心大意 人人都会犯粗心大意的错误,因为这就是 “人” 这个系统的普遍固有缺陷(Bug)之一。所 以,作为人的程序员一定会犯一些非常低级的、因为粗心大意而导致的 Bug。 /column/article/14668 1/7 2018/9/3 极客时间 | 程序员进阶攻略 这就好比写文章、写书都会有错别字,即使经历过三审三校后正式 的书籍,都无法完全避免 错别字的存在。 而程序中也有这类 “错别字” 类型的低级错误,比如:条件if 后面没有大括号导致的语义变 化, 、 和 的数量差别,++ 或-- 的位置,甚至 ;的有无在某些编程语言中带来的语义 差别。即使通过反复检查也可能有遗漏,而自己检查自己的代码会更难发现这些缺陷,这和自己 不容易发现自己的错别字是一个道理。 心理学家汤姆·斯塔福德(Tom Stafford)曾在英国谢菲尔德大学研究拼写错误,他说:“当你 在书写的时候,你试图传达想法,这是非常高级的任务。而在做高级任务时,大脑将简单、零碎 的部分(拼词和造句)概化,这样就可以更专注于更复杂的任务,比如将句子变成复杂的观 点。” 而在阅读时,他解释说:“我们不会抓住每个细节,相反,我们吸收感官信息,将感觉和期望融 合,并且从中提炼意思。”这样,如果我们读的是他人的作品,就能帮助我们用更少的脑力更快 地理解含义。 但当我们验证自己的文章时,我们知道想表达的东西是什么。因为我们 这些含义都存在,所 以很容易忽略掉某些感官(视觉)表达上的缺失。我们眼睛看到的,在与我们脑子里的印象交 战。这,便是我们对自己的错误视而不见的原因。 写程序时,我们是在进行一项高级的复杂任务:将复杂的需求或产品逻辑翻译为程序逻辑,并且 还要补充上程序固有的非业务类控制逻辑。因而,一旦我们完成了程序,再来复审写好的代码, 这时我们 的逻辑含义都预先存在于脑中,同样也就容易忽略掉某些视觉感官表达上的问题。 从进化角度看,粗心写错别字,还看不出来,不是因为我们太笨,而恰恰还是进化上的权衡优化 选择。 1.2 认知偏差 认知偏差,是重蹈覆辙类错误的最大来源。 曾经,我就对 Java 类库中的线程 API 产生过认知偏差,导致反复出现问题。Java 自带线程池 有三个重要参数:核心线程数(core)、最大线程数(max)和队列长度(queues)。我曾想 当然地以为当核心线程数(core)不够了,就会继续创建线程达到最大线程数(max),此时 如果还有任务需要处理但已经没有线程了就会放进队列等待。 但实际却不是这样工作的,类库的实现是核心线程(core)满了就会进队列(queues)等待, 直到队列也满了再创建新线程直至达到最大线程数(max)的限制。这类认知偏差曾带来线上系 统的偶然性异常故障,然后还怎么都找不到原因。因为这进入了我的认知盲区,我以为的和真正 的现象之间的差异一度让我困惑不解。 /column/article/14668

文档评论(0)

1亿VIP精品文档

相关文档