来源:18 Lessons From 13 Years of Tricky Bugs

1. 写代码时遇到的问题

1.1 事件的顺序。处理事件时需要关注这些:事件是否会以不同顺序到达?是否可能收不到事件?同一个事件发生两次会怎样?

1.2 过早发生的事件。比如,信号消息在配置和启动完成之前被接收,会导致一些奇怪的行为。又比如,一个连接在被放入等待列表之前被标记为断开。

1.3 悄然发生的故障。出错时不抛出错误会导致难以解决的 bug。

1.4 复杂的 if 语句。

1.5 else 语句。最好每个 if 语句都带有 else 语句。如果在某个 if 分支里设置了某个变量,那么最好在别的分支里也设置这个变量。

1.6 改变假设。不同时间写的不同部分的代码如果基于对事件的不同假设,会导致问题。

1.7 要记录日志。

2. 测试阶段的问题。

2.8 测试零、空情形。

2.9 测试新特性的加入、以及新特性的移除。

2.10 错误处理。想办法让错误处理代码在测试阶段能够真的被执行。

2.11 随机输入。通过随机输入来发现 bug。

2.12 保证不应该出现的情形真的不会出现。

2.13 自制测试工具。

3. 找 bug

3.14 与别人讨论

3.15 核实细节,尽量少假定。

3.16 从最新的变动开始找。

3.17 认真对待用户报告的错误。

3.18 对 bug 修复进行测试。