最难解决的Bug是什么?
“呦,又加班写Bug呢?” 看似程序员间的调侃,却是非常的现实。代码写的越多,Bug自然也越多,所以没必要惧怕写出Bug,但太基础的Bug是要尽量避免的,毕竟技术是程序员的脸面,别被打的太疼。
根据我十多年的程序员经验,逻辑问题都好查找和解决。最难问题是不能稳定复现的问题,也就是俗称的“灵异Bug”。有的时候分人、有的时候分电脑、有的时候分时间,总之就是让你摸不清头绪,不知道什么时候就冒出来。
这种Bug一定要解决吗?我可以很负责任的告诉你,这种问题上线前一定要解决。千万不要当做偶然事件,觉得线上没问题。只要测试环境出现过,生产大概率会出现。如果不想熬夜解决线上问题,被扣奖金,那么一定要把这种bug扼杀在上线前。
“灵异 Bug”的解决思路
我把“灵异Bug”分为两大类。
一、找不到复现逻辑的 Bug
第一类的前提是环境无关,单纯找不到复现条件。这种问题一般出现于业务逻辑比较复杂,链条又很长的业务中。 由于操作的组合千变万化,不知道什么样的组合就中了大奖。这种情况我们首先应尽量回忆出问题的操作有何不同,然后从可疑点入手,进行重试、分析。 如果回忆不起来,或者可疑点通过了验证,事情就变得难办起来。我们也只能冷静下来、抽丝剥茧的进一步分析。如果时间还比较充裕,我们可以尽量多的加入 log,期待下次出现问题时拿到更多的数据帮助我们找到问题。
二、无关业务逻辑的 Bug
第二大类是在不同环境、客户端、用户的情况下,无法稳定复现。我们要分析的是复现和不能复现间的差异,下面我列举了一些。
- 数据差异。输入数据是一样的,但计算过程中用到的数据可能是不同的。
- 机器差异。测试和生产环境的机器是否完全一样。例如操作系统、权限等等。
- server上安装的类库差异。所以依赖的类库版本是否一致。
- 代码差异。部署的服务代码版本是否一致?所依赖的其他系统版本是否一致。
- 服务器网络环境差异。防火墙策略,网络连通性。
- 中间件差异。中间件的大小版本、安装时选择的参数是否一致。例如数据库的版本和编码方式。
- 时区差异。国际化的系统,复现时选择的时区是否和出问题地区一致?环境间的时区设置是否一致。
- 用户权限差异。复现的用户角色和拥有的权限是否和Bug描述中完全一致。
- 并发的差异。测试环境一般没有并发,有些问题在并发时才会出现。
- 客户端的差异。客户端使用的浏览器会造成很多兼容性的问题。
- 网速差异。有些Bug在弱网环境下才会出现
如果你经验很丰富,那么上面这些情况已经在你的脑子里了。当你看到问题,你会关联到上述原因中的某几类。然后逐步去摸清是否存在差异,如果存在差异,那么调整为一致,再去复现。直到你能稳定复现。
其实很多时候,当你能稳定复现时,解决问题的方法也有了。例如防火墙问题,那么调整规则就可以了。
这也是这类问题的特点:找起来很费时间,但改起来反而比较容易。
以上我列举的问题原因肯定是不全面的,大家有好的经验欢迎留言补充。最后住大家码到成功,永远没Bug!