前言
Bug,又名程序缺陷或者程序漏洞,是每个程序员每天都回避不了的东西。程序员对 Bug 的感情可谓是五味杂陈:一方面 Bug 非常可恶,尤其是一些偶现的 Bug,它强大到可以摧毁一个优秀程序员的意志;另一方面很多 Bug 又是程序员自己亲手写下的,无奈之余只能自嘲一句:不写 Bug 我们就要失业了!
作为一名职业程序员,每天写 Bug 解 Bug 几乎是日常。作为一个善于思考和总结的技术人员,既然不能阻止 Bug 的产生,那就总结一点 Bug 的修复技巧,让 Bug 消失得更快点吧!
1. Bug 修复的生命周期
中医讲究'望闻问切',其实修复一个 Bug 就像给病人看病,本质上是相通的。
当我们遇到一个 Bug(问题)的时候,一般我们需要经历如下 6 个步骤:
- 了解 Bug:首先需要知道出了什么 Bug,现象是什么,怎样发生的。
- 复现 Bug:在了解了 Bug 的大致情况之后,需要能够找到复现的路径,这就为后面 Bug 的定位提供可靠的依据。
- 定位 Bug:当有了稳定的复现途径之后,要做的就是打断点、打日志进行调试,来一步一步分析和定位 Bug,到底是哪块代码导致的错误。
- 确认 Bug:当我们定位到 Bug 出错的地方之后,就需要分析这到底是不是 Bug。如果是 Bug,那么这个 Bug 出现的根源是什么,到底能不能解决。
- 修复 Bug:在明确了 Bug 的根本原因之后,下面就需要发挥我们的聪明才智去修复这个 Bug 了。
- 验证 Bug:并不是每次我们修复完 Bug 之后就可以万事大吉了,此时还需要去重现 Bug 以确保 Bug 被真正修复。除此之外,有条件的还需要去验证相关场景,以保证修复该 Bug 不会引入其他 Bug。
以上可以总结为 12 字方针——'了解、复现、定位、确认、修复、验证'Bug。一般在稍微大一点的公司,都会有对应的流程对 Bug 的修复进行流程控制,最终形成闭环。
可以看到的是,其实修复 Bug 只是解决一个 Bug 的 6 个步骤中的其中一步。很多刚刚参与工作的程序员经常犯的错误就是一遇到 Bug,就开始漫无目的地看代码或者是上网各种瞎搜索,又或者各种无脑问,最后搞了一圈可能连自己要解决的 Bug 到底是什么都不知道,这样解决 Bug 的效率可想而知。
2. 解决 Bug 的艺术
在我看来,修复一个 Bug 是相对容易的。因为修复一个 Bug 的方法可能有很多种,但是如何从根本上解决一个 Bug,并保证这个 Bug 下次不再复现的话,其实是非常难的,这就需要我们学习一下解决 Bug 的艺术。
2.1 了解 Bug
俗话说,知己知彼百战不殆。Bug 修复的第一步当然是先了解 Bug 了。
了解 Bug 是解决 Bug 最重要的一步,它直接决定了后面五步执行的效率和质量。糟糕的错误报告和不负责任的问题描述都是埋葬程序员修复 Bug 意志的罪魁祸首。
在了解 Bug 之前,我们需要收集足够的信息,了解它产生的现象、描述、复现步骤、以及解决后的预期是什么等等。那么我们应该怎么做才能更加全面地了解它呢?
2.1.1 观察现象
光凭文字说明是无法准确领悟到 Bug 的精髓的。因为每个人思考问题的角度以及文字表达描述都是千差万别的。
如果说这个时候能提供一段出错的视频或者问题截图,又或者能够现场演示错误的话,这样观察现象,然后再结合问题描述之后,一定能够帮助你快速地了解这个 Bug。
2.1.2 询问相关人员
这里你询问的可以不仅限于发现 Bug 的人(一般是测试人员),当然你首先应当询问的还是这个发现 Bug 的人。
这里你需要着重询问 Bug 报告上你觉得迷惑的点,比如出现 Bug 的应用版本、设备型号、Bug 出现的频率、Bug 产生的步骤和恢复的途径、Bug 修复的预期效果等。这里你需要进行刨根问底地询问,因为可能 Bug 发现人觉得一些无关紧要的细节,对你来说却是至关重要的点。
问完发现 Bug 的人之后,我们还可以向 Bug 对应模块的负责人(测试、开发、产品)询问该模块的业务逻辑,说不定能够获取到有价值的信息哦。
2.1.3 提供 Bug 报告模板
一份优秀的 Bug 报告模板,可以让程序员直接跳过 Bug 修复的前三步,直接进入到 确认 Bug 步骤,从而能够极大地提高 Bug 修复的效率。那么一份优秀的 Bug 报告模板应当具备哪些内容呢?
- Bug 的标题和问题描述
- 出现 Bug 的应用版本
- 出现 Bug 的设备信息(型号、版本等)
- Bug 产生相关的视频、截图和错误日志


