当Bug A遇到Bug B
2002年的Bug A与2008年的Bug B同时穿越到2013年,并在某个场合相遇了。
上周六,项目组本应以一个愉快的心情结束一天的工作的,但一个2002年的Bug A与另外一个2008年的Bug B同时穿越时空来到了2013年,并且恰恰在那时那刻(下班前)相遇了,于是项目组由放松变成了忙碌,由愉快变成了紧张,17:30的下班点也因此延迟到了凌晨1:30。
Bug A来源于2002年我们发布给客户的一版客户端API,严格来说称其为Bug不免有些冤,它只是遇到Bug B时才会被触发,其只是在处理机制上缺少一些容错的考虑罢了。Bug B才是名副其实的Bug,居然明目张胆地违反协议,擅自在登录应答包的Body尾部补了一个字节的“脏数据“,导致使用我们客户端API的某企业短信通知系统出现故障。
关于这次的“故障”,我想感慨的不是这次的Bug有多么的诡异难找,而是下面这几点:
* 生产环境中场景的复杂性与多样性
任你用例再多,测试人员经验再丰富,脑力再强大,也很难设想出如此之情形。往往我们在模拟环境中测试的都很好,开发和测试人员都手拍胸脯保证说:“没问题了”。但一到生产环境中,问题就像滚雪球一样越来越多,弄得大家焦头烂额。究其源头还是在开发人员这里,开发人员是第一责任人。已经离职的制造出这两个Bug的“前辈们“肯定不会想到,他们的Bug居然穿越到2013年相遇了,否则我相信他们在当时一定会认真对待代码的。
* Bug是藏不住的
通过此例可以让我们看到:Bug终有一天是会暴露的,是藏不住的。这“潜伏”了10多年的问题不也在这次事件中暴露出来了吗。所以说我们写代码的时候,一定要心中有“追求0bug”的理想和目标,严格要求自己和自己的代码,采用各种手段,如代码评审、单元测试、持续集成、自动化的模拟环境验收测试等对所写代码进行“残酷”的打磨和考验,让Bug遛到生产环境的机会尽可能地小。
* 版本的变更管理有漏洞
这又是一次在产品升级后导致的“故障”,原因在于没能完整的识别出这次升级带来的所有软件变更。其少引发Bug B的那行代码的“作用”没能识别出来。这的确是个难题,如果不是原开发人员或评审人员“自发”上报此处的变更,这个变更太容易淹没在代码海洋中而丢失了。目前似乎也没有太好的办法。如果未来能有一种自动识别版本间代码不同且能识别出差异代码的语义变更的工具,那么我相信这款工具一定大卖。
评论