作者: Jim Bird  来源: CSDN  发布时间: 2012-09-13 10:43  阅读: 4224 次  推荐: 18   原文链接   [收藏]  

  英文原文:Fixing
a Bug is Like Catching a Fish

经理:该Bug何时能得到修复?

经验缺乏的程序员:也许一个小时?最多两个小时!马上去做!

经验丰富的程序员:嗯,捉一条鱼需要多少时间呢

  在现实操作中,很难能明确知道一个软件缺陷需要多久可以修复,尤其是当你对代码不了解的情况下。James Shore在“敏捷开发艺术”一书中指出:“在你需要修复Bug时,你必须找到是哪里出错了?”,问题的关键是不能准确估算多久才能找出是哪里报错的。只有知道“病源”在哪?你才能准确估算修复的时间。但那为时已晚,根据Steve
McConnell

“发现缺陷——理解缺陷——通常占了工作的90%”。

  有许多缺陷只需要改一行代码就可以修复。时间都花在确定该行上面,就好像钓鱼的时候该把鱼钩放哪?何时何地鱼会上钩一样。每个Bug都有它们自己的性格特征,有些可能很容易被发现,而有些可能会跟你玩“捉迷藏”,并且容易发现的Bug不一定就很难修复,当然,那些擅长玩“隐藏”的Bug有可能很容易被修复。

  查找和修复

  下面让我们来看看如何发现并修复Bug。当调试时,Paul Butcher把每个步骤都进行了很好的描述。经验丰富的程序员会很熟悉这种结构化和纪律性的步骤要领。

  1. 确定查找目标,审查Bug报告,看看该Bug描述是否很合理并且提供了足够的信息去发现和重现。检查一下该报告以前是否遇到过,如果是,可以检查以前是如何处理的。
  2. 清理桌面——找到正确的代码并检查、清理工作空间。
  3. 设置与之匹配的测试环境。这可能是微不足道的,或者是不可能出现的,如果客户是在一个你无法访问的配置下运行。
  4. 对代码的理解已经毫无问题,并且通过现有的测试套件。
  5. 钓鱼的时间到了,重现并且诊断错误。如果你不能重现这个错误,那么就无法去修复。
  6. 写新的(失败的)开发测试报告或者修复现有测试报告来捕捉Bug。
  7. 进行修复——确定没有破坏其他功能模块。这里可能会包括,在修复之前对代码进行重构使代码更容易被理解,并且使整个修复更安全。在后面的回归测试中确保没有引入任何新的错误。
  8. 努力让代码更安全,更清洁,做一些循序渐进的重构确保代码更健壮并且易于维护的。
  9. 修复完成后,让他人进行审查,确保你没有做一些愚蠢的事情。
  10. 再次检查。
  11. 检查该Bug在其他分支中是否存在,如果你不是主线,你可以在里面进行合并,然后在代码里面进行处理,并且浏览所有相同的评论和测试报告。
  12. 结束并且进行思考和总结。明白是哪里出错了?为什么?是否真正理解自己的修复?在别的地方还会发现这个错误吗?在Pragmatic
    Programmer
    ,Andy Hunt和Dave Thomas也同样问了这样的问题:“如果你花了很长时间去修复这个Bug,问问自己,到底是为什么?”在将来,如何让该Bug更容易被发现和修复?如何提高修复方法或许是使用工具?思考的是否深入,要看这个Bug影响和所花的时间有多长?

  发现和修复需要多久

  设置测试环境所需的时间,重现一个Bug或者修复可能远远超过在代码中查找和修复的时间。但是对于那种小缺陷,在发现时即可修复。

  在软件开发中,关于大多数软件缺陷来自哪里?Dewayne
Perry解释到:发现一个Bug(理解并重现Bug)比多久去修复更难。研究发现,大多数Bug(几乎3/4)很容易被发现和理解,并且不会花多少时间去修复:5天或更少(这是在大型实时系统与一个重量级的SDLC中,经过大量检查和测试发现的)。这里有一个长期隐藏型Bug,可能需要花更长的时间修复,即使这个Bug微不足道:

发现/修复工作 小于5天修复 大于5天
缺陷可以重现 72.5% 18.4%
很难或者不能重现 5.9% 3.2%

  所以在你发现Bug的时候,可以和自己打赌,它很快就会被修复,这个命中率会很高。但是当打赌失败时,你可能会错很多,或者彻底来个大错特错。

修复Bug好比钓鱼的更多相关文章

  1. [课程设计]Scrum 3.5 多鱼点餐系统开发进度(修复Bug&美化页面)

    Scrum 3.5 多鱼点餐系统开发进度(修复Bug&美化页面) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅 ...

  2. [转载]基于TFS实践敏捷-修复Bug和执行代码评审

    本主题阐释了这些功能,以继续这一关注虚拟敏捷团队成员的一天的教程. Peter 忙于编写一些代码以完成积压工作 (backlog) 项任务.但是,他的同事发现了一个阻碍他们工作的 Bug,他想立即修复 ...

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

    到<Cordova webapp实战开发:(6)如何写一个iOS下获取APP版本号的插件?>为止,我们已经大体学会了如何使用Cordova了,那些都是使用Cordova的开发者必备的技能. ...

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

    [课程设计]Scrum 1. 9 多鱼点餐系统开发进度(最后页面完善&修复BUG&用户测试) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢 ...

  5. CloudStack修复bug

    CloudStack应用越来越广,但是随着测试也遇到了越来越多的bug. 不想等待新版本发布而且又急于修复某些bug的童鞋,可以参考下本文内容. CloudStack是java语言写成,发布时会发布为 ...

  6. 献身说法---修复bug时的一些小技巧

    最近,修复了项目当中的一些bug,觉着有些思路可以分享出来供大家借鉴. 场景一 开发环境中系统正常运行,测试环境中,部分机器未能正常运行. 解决过程:远程连接了测试环境中的机器,观察了系统的运行情况, ...

  7. 修复bug有哪些更快的技术?做好这6点就够了

    你有没有想过为什么有时修复错误似乎比它应该花费更长的时间?当你终于找到问题时,事实证明你所需要的只是一个小小的改变.然而,花了很多时间才能找到正在发生的事情.这种情况比我想象的更频繁. 另一方面,当您 ...

  8. 程序员:统治世界or修复bug?

    程序员:统治世界or修复bug? 时至今日,我们依然生活在一个市场和技术受到高度崇拜的世界里,但是历史演化的规律提醒着我们:当一个东西开始成为社会崇拜的对象时,其中暗藏的不利因素将悄然的进行着.有人认 ...

  9. 使用Git分支开发新特性或修复Bug与使用Git分支开发新特性或修复Bug

    使用Git分支开发新特性或修复Bug 通过分支,可以在不影响原有代码的前提下改变代码,主要用于开发新功能新特性.下 一代产品 为已经发布的正式版修复bug 团队开发时为每个人建立一个分支,从而避免相互 ...

  10. Git 之 修复bug

    前面介绍了Git版本控制,为我们省去了很多不必要的麻烦. 回滚 有没有想过,在我们开发过程中,修改需要是常有的事,如果我们现在不想要这个功能了,那么如何回到之前的版本呢?回滚,回到上一个版本. 那如果 ...

随机推荐

  1. 为什么MySQL 默认隔离级别是RR,又被阿里设置为RC

    我们知道,我们可以通过这个命令查看数据库当前的隔离级别,MySQL 默认隔离级别是RR. select @@tx_isolation; ANSI/ISO SQL定义的标准隔离级别有四种,从高到底依次为 ...

  2. 《SpringBoot事务》单机mybatis事务控制

    一.场景再现 我们同时操作两张表及以上,一张表操作成功后,第二张表操作失败,此时需要回滚上一次的操作. 或者两次操作都成功,但后续业务处理的时候异常,此时需要回滚前面的所有数据库操作. 二.代码 1 ...

  3. 单 log 实现 区间加减,查询区间 gcd

    主要是查询,要将 log 个区间拿出来依次求 gcd,当然如果是 O(1) gcd 的话可以直接求就是了.

  4. 用Python实现阿拉伯数字转换成中国汉字

    要将阿拉伯数字转换成中国汉字表示的数字,我们需要一个映射表来转换每个数字,并且处理不同位数的数字(如十.百.千.万等). 1. Python实现阿拉伯数字转换成中国汉字 下面是一个完整的Python代 ...

  5. 【SpringBoot Demo】MySQL + JPA + Hibernate + Springboot + Maven Demo

    主要包含:springboot+jpa+hibernate+mysql+lombok (两年前写过一个,现在重新记录一个) 1. 目录结构: 2. pom 文件 1 <?xml version= ...

  6. Identity – user login, forgot & reset password, 2fa, external login, logout 实战篇

    前言 之前写过一篇 Identity – User Login, Forgot Password, Reset Password, Logout, 当时写的比较简陋, 今天有机会就写多一篇实战版. 建 ...

  7. QT6框架也能开发Web浏览器应用程序:QT6框架如何编译运行测试WebAssembly应用程序?

    QT6框架也能开发Web浏览器应用程序:QT6框架如何编译运行测试WebAssembly应用程序? 简介 本文将介绍如何使用QT6框架开发Web浏览器应用程序,并介绍具体的编译运行测试WebAssem ...

  8. PHP面试,ES

    什么是Elasticsearch? Elasticsearch是一个开源的分布式搜索和分析引擎,用于存储.搜索和分析大量数据.它基于Lucene搜索引擎构建,可以快速地执行全文搜索.结构化查询.分析和 ...

  9. 内核级流量治理引擎Kmesh八大新特性解读

    本文分享自华为云社区<内核级流量治理引擎 Kmesh v0.5 发布!进击的Sidecarless服务网格>,作者:云容器大未来. 我们非常高兴地宣布 Kmesh v0.5.0 的发布.首 ...

  10. C# 并发控制框架:单线程环境下实现每秒百万级调度

    前言 在工业自动化和机器视觉领域,对实时性.可靠性和效率的要求越来越高.为了满足这些需求,我们开发了一款专为工业自动化运动控制和机器视觉流程开发设计的 C# 并发流程控制框架. 该框架不仅适用于各种工 ...