修复bug的12个关键步骤

boss:那么,你需要多长时间来修复这个bug?

没有经验的程序员:给我一个小时?最多两个小时?我能马上搞定它!

有经验的程序员:这么说吧,钓到一条鱼要多久我就要多久?!

  要多少时间才能修复bug,事先是很难知道的,特别是如果你和这些代码还素不相识的话,情况就更加扑朔迷离了。James Shore在《The Art of Agile 》一书中,明确指出要想修复问题得先知道问题的所在。而我们之所以无法准确估计时间是因为我们不知道需要多久才能发现症结的所在,只有清楚这一点,我们才能合理估计修复bug所需要花费的时间。不过,这个时候恐怕黄花菜都凉了。 Steve
McConnell曾说过:

“发现问题—理解问题—这就是程序员90%的工作。”

  很多bug都只需改动某一行代码即可。但是需要投入大量时间的是,后面还得指出怎么样才是正确的——就像我们在钓鱼的时候,得知道往哪里下诱饵,什么时候鱼儿容易上钩等等。话说bug有四种类型:第一种易寻易修复,第二种难寻易修复,第三种易寻难修复,第四种难寻难修复。最悲剧的就是最后一型的,不但“寻寻觅觅,凄凄凉凉戚戚”,哪怕终于千辛万苦滴水穿石,也只能在那边不由自主地抓耳挠腮,无奈叹一句“路漫漫其修远兮”。可以这么说,除非是新鲜出炉的代码,不然让你找bug就跟瞎子摸象一样——糊里糊涂,不知道归属于哪种bug类型。

<!--[if !supportLists]-->一、        <!--[endif]--> 查找和修复bug

  你知道“查找和修复bug”意味着什么吗?没错,就是调试!不断的调试,无数次的调试!Paul Butcher通过大量工作,总结出以下结构化的步骤:

1.明确目的。仔细查阅异常报告,确定是否是个bug,找出各种有用的信息发现问题的症结,予以重现。再次检查是否与报告发生重复。如果发生重复,那看看曾经的相关人员是如何处理的。

2.准备工作——找出正确的代码,用排除法清理工作区域。

3.匹配测试环境。如果客户正在操作计算机配置,那么此过程可以跳跃。

4.明确代码的用途,确保现有测试工具一切正常。

5.好了,现在可以出发钓鱼去咯——重现和诊断错误。如果你不能做到重现,那你就不能证明你已经完成修复工作。

6.编写测试案例,或者通过现成的测试案例来捕获bug。

7.进入修复模式——请务必确保不会影响到其他任何部分。但是,在开展修复工作之前,可能你还要包揽重构工作,因为只有这样,你才能无所顾忌地捣鼓代码。而且事后回归测试,还能确保你不会加入任何新的bug。

8.整理代码。通过一步一步重构,让你的代码更易于理解,更安全。

9.找别人来审查一下,当局者迷旁观者清。

10.再次检查此修复过程。

11.试着不从主线出发,以检查这些bug是否会影响其他支线。合并这些变化,处理代码中的差异,回顾所有的审查和测试等工作。

12.思考。好好想一想哪里错了以及为什么错了?为什么你的修复会起效?这种类型的bug还会出现在哪里?在《 The Pragmatic Programmer》一书中,Andy Hunt 和Dave
Thomas也如是指出“如果一个bug需要耗费你很多时间,那么一定要好好弄清楚原因”。此外,还需要思考的是,怎么做才能吸取经验教训,将来在类似的问题上不再栽跟头?以及,我们采用的方法、使用的工具是否还有可以改进的地方?以及这些bug的影响和严重程度。

<!--[if !supportLists]-->二、        <!--[endif]--> 找到bug,还是修复bug,哪个需要更多时间?

  或许建立一个测试环境、重现问题和测试bug所需的时间,要远远多于找到bug和修复bug的时间。不过对于一小部分显而易见的bug,找到它们很简单——不过修复起来可能就不尽如人意了。

  在《Making Software》一书中,有一章主要是探讨“大部分的软件漏洞的来源”,Dewayne Perry分析认为,相较于修复,发现bug(包括理解bug和重现bug)所需时间更长。有研究表明,大多数的bug(差不多有3/4)既易于发现又易于修复:5天或许更少(这是基于大规模实时系统通过重量级SDLC、大量审查和测试得出的数据)。但是也有很恶心的bug,即便你可以轻轻松松揪到它,还是还得“呕心沥血”才能修复好。


发现/修复


修复时间<=5天


修复时间>5天


能重现问题


72.5%


18.4%


难以重现或根本没法重现


5.9%


3.2%

  所以如果你打赌说你能很快修复bug,大多数情况下你还真没说错。不过当你打赌输了的时候,那么,嘿嘿,就意味着你有大麻烦了,顺便介绍个不错的平台—DevStore,源码下载,第三方服务,很实用。

  所以,下次,boss再问什么时候能修复bug,别再傻乎乎地回答“马上就能搞定”了。

  原文:Fixing a Bug is
Like Catching a Fish
 翻译:codeceo – 小峰

时间: 2025-01-11 23:59:56

修复bug的12个关键步骤的相关文章

修复bug的12个关键步骤:

1.明确目的. 2.准备工作. 3.匹配测试环境. 4.明确代码的用途. 5.重现和诊断错误. 6.编写测试案例. 7.进入修复模式. 8.整理代码. 9.找别人来审查一下. 10.再次检查此修复过程. 11.试着不从主线出发. 12.思考.

Cordova webapp实战开发:(7)如何通过简单的方法做到,不重新发布APP来修复bug、增加功能、或者躲开苹果的一些严格审核?

到<Cordova webapp实战开发:(6)如何写一个iOS下获取APP版本号的插件?>为止,我们已经大体学会了如何使用Cordova了,那些都是使用Cordova的开发者必备的技能.今天我们要说一下开发者应该具备的一些额外经验,这些经验简单有效,如果希望要更系统更好的方法,那就持续关注本系列文章吧,与敏捷个人一起成长. 本次练习你能学到的 学习如何动态不发布APP来修复bug 学习如何动态增加功能 学习如何躲开苹果的一些严格审核 如何动态不发布APP来修复bug 做过网站的都知道,修复b

两千年来巨富们发家的秘密与关键步骤:4星|《财富的本质》

基本是经济学家+历史学家的风格,对历史的概括,有严谨的细节,又有深入的洞察,还有历史书.传记书中很难找到的巨富们发家的秘密与关键步骤. 共7章,第1章前言,第7章总结,中间5章.中间5章讲5类代表性的巨富们的致富秘密和关键步骤:第2章:古罗马巨富克拉苏的故事.他利用政治斗争把富人列为公敌,然后攫取他们的财产.他的致富秘密是:改变游戏规则:第3章:美国镀金时代.这个时期发生了很多企业合并,由此产生了一批巨富.他们的秘密是:公司越大,成本越低且竞争越小:网络效应:自然垄断:第4章:美国金融业.这个行

文案写作有哪些关键步骤?

从事网络运营工作,文案写作是必不可少的环节,那文案写作中有哪些注意事项,有哪些关键步骤呢,本文就和大家一起来扒一扒. 文案归根结底是产品(品牌)战略的终端艺术展示,卓越的文案离不开对战略思想的彻悟,对产品的用心体验.对用户的感同身受. 我以前面试高级运营候选人时,经常会使点小坏心眼: 先跟候选人谈生活谈理想让他极度放松跟我称兄道弟以为Offer十拿九稳的时候,漫不经心的抛出一个烧脑的开放型问题,比如: "假如你现在运营共享雨伞app,要在地铁投放一期广告,文案你打算怎么写?" 大部分人

软件工程腾讯QQ (1)优点:聊天功能比较强大。同时提供安全登陆通道,保障了用户信息的安全性。应用的人群范围比较广 缺点:要展示的信息量太多,用户个人信息容易泄露。有一些弄虚作假通过其欺骗用户上当。 (2)有使用需要自己下载 (3)版本更新修复bug,定期更新版本

1.软件工程未来的发展方向是什么? 2.编程基础不好,我能学习好软件工程吗? 3.软件工程跟物联网之间的区别与联系是什么? 4.软件工程在现实生活中有哪些应用? 5.在软件工程的分类中,如何选择一个适合自己的? 6.软件工程的学习中最难克服的阶段是什么? 7.怎样学好软件工程? 腾讯QQ (1)优点:聊天功能比较强大.同时提供安全登陆通道,保障了用户信息的安全性.应用的人群范围比较广 缺点:要展示的信息量太多,用户个人信息容易泄露.有一些弄虚作假通过其欺骗用户上当. (2)有使用需要自己下载 (

CentOS 5 CentOS 6 启动流程及关键步骤

CentOS 5 CentOS 6 启动流程及关键步骤 1.加电自检:当打开主机电源时,主机会唤醒cpu,使其运行CMOS中的BIOS, BIOS检查必要的硬件是否存在(内存.硬盘等) BIOS其实是一个小型系统,可以完成一些像检测这样的任务. 自检若不通过,关机 2.BIOS查找可启动设备 自检通过,根据BIOS设定的启动顺序(一般有硬盘启动.光盘启动.移动设备启动.以及网络启动等,这个设定值可通过人工干预修改以使加载不同的系统)找到第一个具有引导程序(bootloader)即为要加载的设备,

Camera实现照相功能的关键步骤

Camera类用于设置图像采集相关设置,开始/停止预览,拍照,检索编码视频帧.该类是 Camera 服务的客户端,管理真实的 camera 硬件. 要访问camera设备,必须在 Android Manifest中声明 CAMERA 权限.还要保证包含 <uses-feature> manifest 元素声明你的应用程序使用的相机功能.例如,如果是使用 camera 和 auto-focus(自动对焦)功能,你的 Manifest 中应该包含以下: <uses-permission an

修复bug的流年

工作的过程中,总是会遇到莫名其妙的错误.bug,由于记忆力有限,用一篇文章记录所遇到的bug及解决过程,解决的过程总是痛苦与欢乐.还有一丝丝的无奈,或许这才是真实的生活. 在VS的项目属性"生成事件"标签页中有"生成后事件命令行",可在这里输入比如: copy $(TargetDir) "C:\Program Files\MailSetup" 这样编译成功后会将生成的文件拷贝到C:\Program Files\MailSetup 这里有两点注意:

[课程设计]Scrum 1. 9 多鱼点餐系统开发进度(最后页面完善&amp;修复BUG&amp;用户测试反馈)

[课程设计]Scrum 1. 9 多鱼点餐系统开发进度(最后页面完善&修复BUG&用户测试) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系统WEB 5.Sprint 1时间:11.14-11.23 重案组成员   姓名 学号 博客链接 Github链接 队长 黄冠锋 201406114134 http://www.cnblogs.com/hgf520/ https://github.com/crow