预防和修复软件bug

“我的余生将有很大一部分时间花在寻找自己程序中的错误上” -- 莫里斯.威尔克斯,计算机科学家。

概述

每年花在调试软件上的程序员工资成本高达3210亿美元,来自剑桥大学贾奇商学院的研究。
降低bug数量,尽快修复bug是在拯救全球经济。

一分预防胜过十分治疗

合理使用以下【软件工程】实践,避免bug进入代码。

  • 成熟缜密的设计
  • 结对编程
  • 代码评审
  • TDD测试驱动开发
  • 完全自动化的单元测试
  • 防御性编程
  • 代码覆盖工具

追踪 bug

  • 捕获错误:高效使用断言和日志。
  • 活用二分法:每次减半地缩小范围来定位问题点。
  • 软件考古:在版本控制系统中挖掘历史记录,确定bug时间点。
  • 测试,测试,再测试:未经测试的代码是bug的滋生地,而测试是“杀虫剂”。
  • 磨刀不误砍柴工:熟练掌握调试器,并在合适的时机使用。
  • 用排除法查找问题:删除或跳过与问题无关的代码,将注意力集中在错误代码上。
  • 保持清洁,预防疾病:尽快修复bug不要让它们堆积起来形成破窗效应。
  • 迂回策略:卡壳时稍事休息,讲给别人(或小黄鸭)听。
  • 不要急于离开:修复一个bug后要考虑是否在其他地方重复出现了。

不可复现的bug

  • 持续记录产生问题的相关因素,随着时间的推移,可能会发现一些规律,有助于识别问题的起因。
  • 在beta或release版本中添加更多日志记录和断言,帮助收集更多的信息。
  • 设置一个测试环境来运行渗透测试,以自动化的方式驱动系统运行,更快地捕捉问题。
  • 多线程代码:调试器/日志记录/编译器优化都可能更改线程的执行顺序并隐藏问题。
  • 网络交互:在网络上,故障和随机的延迟十分常见。
  • 存储设备之间的访问速度差异:慢转速磁盘或数据库操作也可能改变程序的行为。
  • 内存错误导致的崩溃:当异常代码破坏了内存中的栈或堆时,会产生无数无法重现的奇怪现象。
  • 全局变量:如果任何人随时都可以访问全局变量并进行调整,它就是不可预测行为的交换中心。
posted @ 2025-01-09 14:24  KevinAshton  阅读(72)  评论(0)    收藏  举报