预防和修复软件bug
“我的余生将有很大一部分时间花在寻找自己程序中的错误上” -- 莫里斯.威尔克斯,计算机科学家。
概述
每年花在调试软件上的程序员工资成本高达3210亿美元,来自剑桥大学贾奇商学院的研究。
降低bug数量,尽快修复bug是在拯救全球经济。
一分预防胜过十分治疗
合理使用以下【软件工程】实践,避免bug进入代码。
- 成熟缜密的设计
- 结对编程
- 代码评审
- TDD测试驱动开发
- 完全自动化的单元测试
- 防御性编程
- 代码覆盖工具
追踪 bug
- 捕获错误:高效使用断言和日志。
- 活用二分法:每次减半地缩小范围来定位问题点。
- 软件考古:在版本控制系统中挖掘历史记录,确定bug时间点。
- 测试,测试,再测试:未经测试的代码是bug的滋生地,而测试是“杀虫剂”。
- 磨刀不误砍柴工:熟练掌握调试器,并在合适的时机使用。
- 用排除法查找问题:删除或跳过与问题无关的代码,将注意力集中在错误代码上。
- 保持清洁,预防疾病:尽快修复bug不要让它们堆积起来形成破窗效应。
- 迂回策略:卡壳时稍事休息,讲给别人(或小黄鸭)听。
- 不要急于离开:修复一个bug后要考虑是否在其他地方重复出现了。
不可复现的bug
- 持续记录产生问题的相关因素,随着时间的推移,可能会发现一些规律,有助于识别问题的起因。
- 在beta或release版本中添加更多日志记录和断言,帮助收集更多的信息。
- 设置一个测试环境来运行渗透测试,以自动化的方式驱动系统运行,更快地捕捉问题。
- 多线程代码:调试器/日志记录/编译器优化都可能更改线程的执行顺序并隐藏问题。
- 网络交互:在网络上,故障和随机的延迟十分常见。
- 存储设备之间的访问速度差异:慢转速磁盘或数据库操作也可能改变程序的行为。
- 内存错误导致的崩溃:当异常代码破坏了内存中的栈或堆时,会产生无数无法重现的奇怪现象。
- 全局变量:如果任何人随时都可以访问全局变量并进行调整,它就是不可预测行为的交换中心。

浙公网安备 33010602011771号