面对Bug程序员能做点什么

简介: 我们程序不可避免的会出现bug,那么我们能做哪些事情,尽可能减少bug的产生

Bug之殇
所谓bug,就是程序当中的出现的缺陷或者错误,他们会导致程序出现一些不合预期的结果,甚至会导致崩溃。

1947年9月9日下午3点45分,格蕾丝·霍珀在她的记录本上记下了史上第一个计算机Bug——在Harvard Mark II计算机里找到的一只飞蛾,她把飞蛾贴在日记本上,并写道”First actual case of bug being found”。
image.png
历史上有一些后果非常严重的Bug。

宰赫兰导弹事件

1991 年 2 月第一次海湾战争期间,部署在沙特宰赫兰的美国爱国者导弹系统未能成功追踪和拦截来袭的伊拉克飞毛腿导弹。结果飞毛腿导弹击中美国军营。当场炸死28个美国士兵,炸伤100多人,造成美军海湾战争中唯一一次伤亡超过百人的损失。

时间计算不精确以及计算机算术错误导致了系统故障。从技术角度来讲,这是一个小的截断误差。当时,负责防卫该基地的爱国者反导弹系统已经连续工作了100个小时,每工作一个小时,系统内的时钟会有一个微小的毫秒级延迟,这就是这个失效悲剧的根源。爱国者反导弹系统的时钟寄存器设计为24位,因而时间的精度也只限于24位的精度。在长时间的工作后,这个微小的精度误差被渐渐放大。在工作了100小时后,系统时间的延迟是三分之一秒。雷达在空中发现了导弹,但是由于时钟误差没有能够准确地跟踪它,因此基地的反导弹并没有发射。

英特尔奔腾处理器

1994 年,英特尔的奔腾微处理器芯片的浮点计算单元出现了一个 Bug。对于精确计算,处理器将返回不正确的十进制值。当时有大概 500 万个缺陷芯片在流通,英特尔最终决定为所有投诉的人更换芯片。这之后,英特尔把他们的故障处理器做成了钥匙链。预计损失为4.75 亿美元

在奔腾浮点单元的分频器中有一个有缺陷的除法表,在约一千个条目中丢失了五条纪录。然而,这个错误在 90 亿随机浮点小数的除法中仅可能出现一次。例如,将 4195835.0 除以 3145727.0 得出 1.333739068902037589,而不是 1.333820449136241002,有 0.006% 的误差。

阿丽亚娜5型运载火箭

1996年6月4日,阿丽亚娜5型运载火箭的首次发射点火后,火箭开始偏离路线,最终被逼引爆自毁,整个过程只有短短30秒。

阿丽亚娜5型运载火箭基于前一代4型火箭开发。在4型火箭系统中,对一个水平速率的测量值使用了16位的变量及内存,因为在4型火箭系统中反复验证过,这一值不会超过16位的变量,而5型火箭的开发人员简单复制了这部分程序,而没有对新火箭进行数值的验证,结果发生了致命的数值溢出。发射后这个64位带小数点的变量被转换成16位不带小数点的变量,引发了一系列的错误,从而影响了火箭上所有的计算机和硬件,瘫痪了整个系统,因而不得不选择自毁,因此损失了3.7 亿美元。

Bug的分类与应对

美国计算机科学家、图灵奖获得者詹姆斯·尼古拉·格雷(Jim Gray),在他的著名的论文中首次提出了程序bug的类型,根据bug的出现情(如能否复现)况分成如玻尔bug(Bohrbug)、 海森堡bug(Heisenbugs)等

而然我还是希望能够从bug成因的角度进行分类,这样才能够好的避免bug,以下是大胡子的分类法以及应对方案:

算法Bug

成因:由于程序员对算法实现错误而产生的bug,如奔腾处理器的长除法问题。

应对方案:单元测试

算法Bug相对独立,可以通过对算法模块本身的充分测试来发现问题。这些测试通常都是比较容易自动化的,即通过程序定制输入,判断是否出能得到预期 的输出,来保证正确性。

回归Bug

成因:由于产品功能调整,版本更新,出现了原有的代码没有考虑到的情况,导致出现问题,阿丽亚娜5型运载火箭就属于这个问题。

应对方案: 回归测试

通过重新运行原有功能的测试case,保证以前的功能符合预期。

场景bug

成因:并非单个功能点有问题,而是由于使用的场景和用户的预期不符,导致输入错误,或者使用流程出现了没有考虑到的情况。比如支付宝的找回密码问题。这类问题通常并非全是程序员的原因,产品经理也对此负有责任。

应对方案:测试服务器/测试环境

复杂的bug很难通过简单的测试发现,需要一定的用户使用量,通常公司会采用一个测试环境邀请一批用户进行试用,从而尽可能的发现bug。比如著名的游戏公司暴雪,在更新他们所有的游戏版本之前,会先更新到测试服务器(即PTR服务器),这个服务器是公开的,通过这样的方式来收集用户的反馈。这已经是一个非常成熟的过程。

累计bug

成因:冰冻三尺非一日之寒,此类bug通常由于微小的错误累计而成,短时间内不易察觉,然而程序长时间运行后,可能会引起严重的后果,如:宰赫兰导弹事件中的bug,或者内存泄露,性能问题等

应对方案:测试服务器/压力测试

测试服务器是一个不错的方案,你可以在这里长期运行你的程序,从而发现问题。压力测试可以更有针对性的判断你的程序在一定的工作量情况下是否会产生问题。

以上,便是我对于程序bug的一些思考,希望对大家有所帮助。

目录
相关文章
|
7月前
|
设计模式 算法 程序员
程序员为何需要反复修改Bug?探寻代码编写中的挑战与现实
作为开发者,我们在日常开发过程中,往往会遇到反复修改bug的情况,而且不能一次性把代码写的完美无瑕,其实开发项目是一项复杂而富有挑战性的任务,即使经验丰富的程序员也难以在一次性编写完美无瑕地完成代码,我个人觉得一次性写好代码是不可能完成的事情。虽然在设计之初已经尽力思考全面,并在实际操作中力求精确,但程序员仍然需要花费大量时间和精力来调试和修复Bug。那么本文就来分享程序员需要反复修改Bug的原因,以及在开发中所面临的复杂性与挑战。
177 1
程序员为何需要反复修改Bug?探寻代码编写中的挑战与现实
|
缓存 JavaScript 小程序
接手前同事代码,特别烂,各种BUG,看麻了。。。
接手前同事代码,特别烂,各种BUG,看麻了。。。
|
机器学习/深度学习 人工智能 自然语言处理
AlphaCode 能替代人类程序员吗?网友:被替代也挺好,这样就可以少写代码多开会了
DeepMind 是最新的人工智能研究实验室。它推出了一个可以生成软件源代码的深度学习模型,成果令人印象深刻。该模型被称为 AlphaCode,基于 Transformer,与 OpenAI 在其代码生成模型中使用的架构是一样的。
170 0
AlphaCode 能替代人类程序员吗?网友:被替代也挺好,这样就可以少写代码多开会了
|
设计模式 IDE 测试技术
你是一名努力工作的程序员,还是懒惰的程序员?
当人们在进行一项体力工作时,你很容易评估他们工作的努力程度。你可以看到他们的身体动作,看他们流了多少汗水。也可以去看他们的工作成果:砖墙越砌越高,地上的洞越来越大。对努力工作的认可和奖励是人类一个非常基本的本能,这也是为什么我们对耐力运动如此着迷的原因之一。然而,在管理一些技术创造型的员工时,这种对体力上的努力工作的本能欣赏却变成了一个问题。高效率的知识工作者通常看起来并不像是在努力工作。
120 0
你是一名努力工作的程序员,还是懒惰的程序员?
|
存储 程序员 C++
如果当初学习编程时能有人给我这些忠告该多好
Cecily Carver 是多伦多的一位程序媛,和 Jennie Faber 一起创办了一个游戏制作工作室。她喜欢歌剧、舞蹈和弹钢琴。Cecily 在这篇文章分享她在编程道路上的所感所想,给出很多值得思考的编程箴言以及一些思想误区,比如在你学习编程之前思考一下你的目标、编程不是什么神秘的东西、坚持比方法更重要等,可以让我们在编程路上少走一些弯路,从而有更多的时间学习技术让自己变的越来越强大。
227 0
|
Dubbo Java 应用服务中间件
面对枯燥的源码,如何才能看得下去?
一个软件开发人员,工作到了一定的年限(一般是3、4年左右),如果他还没学会阅读源码,那么他就会遇到瓶颈。因为到了这个时候的开发,他应该不仅仅只会做那些 CURD 的业务逻辑,而应该会根据公司的实际情况去写框架。
769 0
|
程序员 SQL Java
程序员最头疼的七件事
懂点技术,瞎指挥 有人说不懂技术的瞎指挥很可怕,我倒是觉得懂点技术,然后指手画脚更可怕! 有个国企的项目,甲方负责人李总是个局里的二把手,不知道什么时候了解了一点编程的技术, 每次开需求会都是和我们大谈如何开发软件,他的口头禅就是: 这个需求,用个SQL从数据库一选不就出来了?!你们怎么得开发一周?!别想蒙我! 唉,他怎么能考虑到用SQL的like是效率极低的, 数据量大了是要崩溃的,我们得建立全文索引,需要用一套基于搜索的解决方案才行。
1015 0
|
Java 程序员 应用服务中间件
影响程序员生涯的三个错误观念,你千万不要犯!
程序员在社会上,到底是怎样一个生活群体?是否能找到自己方向?其实,路一直都在那里,只是你看不到而已! 当初的你,可能一直被一些技术牵着鼻子走,并不是自己在做着自己想做的,而是被技术推到了现在这样子。
1244 0
|
程序员
程序员听到bug后的N种反应,哈哈哈戏精上身了
当出现bug时,程序员的N种反应
1534 0
|
测试技术
测试十年-我难以逾越的困惑和痛苦和思考
很久没写文章了,之前的测试三年,测试六年都写了blog来记录自己的测试生涯和思考,这次测试10年肯定不会错过了,当然了,YY比较多,干货也不多,反正纪念下,或许我很难写测试15年的文章了。大家有任何问题,欢迎讨论,欢迎吐槽。   --- 10年测试的困惑和痛苦 转眼间参加工作10年了,也就是意味着干软件测试10年了,经历过3家公司,都有一些感悟,也难以相信我能在淘宝坚持了这么久,7
2746 0

相关实验场景

更多