修复bug的12个关键步骤

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

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

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

查找和修复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的影响和严重程度。

找到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,大多数情况下你还真没说错。不过当你打赌输了的时候,那么,嘿嘿,就意味着你有大麻烦了。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java JUC工具类--Master-Worker

Master-Worker Master-Worker模式是常用的并行计算模式。它的核心思想是系统由两类进程协作工作&#xff1a;Master进程和Worker进程Master负责接收和分配任务&#xff0c;Worker负责处理子任务当各个Worker子进程处理完成后&#xff0c;会将结果返回给Master&#xff0c;由Ma…

python 基础知识点整理 和具体应用

Python教程 Python是一种简单易学&#xff0c;功能强大的编程语言。它包括了高效的高级数据结构和简单而有效的方法&#xff0c;面向对象编程。Python优雅的语法&#xff0c;动态类型&#xff0c;以及它天然的解释能力&#xff0c;使其成为理想的语言&#xff0c;脚本和应用程序…

使用postman模拟百度通用文字识别

1&#xff0c;登录百度AI开放平台 百度AI网站新手指南链接在顶部导航栏中&#xff0c;找到控制台选项&#xff0c;输入账号和密码&#xff0c;进入管理中心页面在管理中心页面中&#xff0c;找到文字识别的选项找到创建应用的选项&#xff0c;进行ocr项目的创建需要输入应用的…

Java调用百度OCR文字识别的接口

调用百度OCR文字识别的接口&#xff0c;来自于百度官网&#xff0c;亲测可以使用 跳转链接FileUtil的下载链接Base64Util下载链接HttpUtil下载链接GsonUtils下载链接Accurate.java文件 package com.baidu.ai.aip;import com.baidu.ai.aip.utils.Base64Util; import com.baidu.…

Redis Cluster集群模式

Redis Cluster 它是Redis的分布式解决方案&#xff0c;在Redis 3.0版本正式推出的&#xff0c;有效解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时&#xff0c;可以采用Cluster架构达到负载均衡的目的。数据分布理论: 分布式数据库首要解决把整个数据集按照…

Redis整合Springboot实现数据共享

代码的整体结构 RedisSessionConfig.java package com.cc.springbootredissession.config;import org.springframework.context.annotation.Configuration; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;Configuration E…

Redis整合Springboot实现单机配置

整体结构 配置文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/…

Redis整合springboot实现哨兵模式

整体结构 RedisConfig package com.cc.springredis.config;import com.cc.springredis.RedisUtil; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.R…

Redis整合springboot实现集群模式

整体结构 Redis.config package com.cc.springredis.config;import com.cc.springredis.RedisUtil; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection…

Redis整合springboot实现消息队列

publisher消息的发出 代码整体的结构 publisherConfig package com.cc.springbootredispublisher.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.conne…

Redis数据缓存

代码的整体结构 配置文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apac…

hevc/265 开源项目及相关

1.X265 个是有两个版本&#xff0c;一个是国内人搞的&#xff0c;是国外公司搞的 1.国外公司版本 只是一个编码器&#xff0c;目前没有支持解码 开发语言 c web url: www.x265.org source url: https://bitbucket.org/multicoreware/x265 x265 is an open-source projec…

IPFS星际文件系统的简介

IPFS简介 IPFS&#xff08;InterPlanetary File System&#xff09;叫星际文件传输系统&#xff0c;本质是一个基于点对点的分布式超媒体分发协议&#xff0c;它整合了分布式系统&#xff0c;为所有人提供全球统一的可寻址空间&#xff0c;因为他具有良好的安全性、较高的传输…

ARM和NEON指令 very nice

在移动平台上进行一些复杂算法的开发&#xff0c;一般需要用到指令集来进行加速。目前在移动上使用最多的是ARM芯片。 ARM是微处理器行业的一家知名企业&#xff0c;其芯片结构有&#xff1a;armv5、armv6、armv7和armv8系列。芯片类型有&#xff1a;arm7、arm9、arm11、corte…

IPFS下载安装和配置

参考链接 因为这个网站访问速度很慢&#xff0c;我提供了IPFS的MAC版本。有需要的查看我的资源下载。 大致流程 安装 $ ls go-ipfs_v0.4.10_darwin-amd64.tar.gz $ tar xvfz go-ipfs_v0.4.10_darwin-amd64.tar.gz x go-ipfs/build-log x go-ipfs/install.sh x go-ipfs/ipfs…

arm 开发工具比较(ADS vs RealviewMDK vs RVDS)

ADS REALVIEW MDK RVDS 公司 ARM Keil&#xff08;后被ARM收购&#xff09; ARM 版本 最新1.2 ,被RVDS取代 最新4.0 是否免费 破解情况 有 有 工程管理 CodeWarrior IDE nVision IDE Eclipse/ CodeWarrior IDE 编译器 ARM C compiler for AD…

解决macOS Catalina(10.15)解决阻止程序运行“macOS无法验证此App不包含恶意软件”

在终端里面输入如下命令 sudo spctl --master-disable 下面图片对比执行命令前后&#xff0c;安全性与隐私 界面上显示的差异&#xff1a;使用命令之后&#xff0c;界面变了

MAC版 的最新Docker 2.2版本配置国内代理的解决办法

点击Docker图标&#xff0c;选择Preference选项&#xff0c;进行国内代理的问题 输入内容如下 {"experimental": false,"debug": true,"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.…

《算法的乐趣》作者王晓华访谈:多看、多做、多想是秘诀

摘要&#xff1a;王晓华是一位热衷于算法研究的程序员&#xff0c;他是CSDN算法专栏的超人气博主&#xff0c;也是《算法的乐趣》一书的作者。近日&#xff0c;笔者采访了王晓华&#xff0c;请他分享算法的经验之道。 王晓华是一位热衷于算法研究的程序员&#xff0c;他是CSDN…

基于Mac环境搭建以太坊私有区块链进行挖矿模拟

第一步&#xff1a;相关软件的安装 go-ethereum客户端安装Go-ethereum客户端通常被称为Geth&#xff0c;它是个命令行界面&#xff0c;执行在Go上实现的完整以太坊节点。Geth得益于Go语言的多平台特性&#xff0c;支持在多个平台上使用(比如Windows、Linux、Mac)。Geth是以太坊…