晚上调试修复了一个线上的小 BUG, 花了2个小时, 加上昨天花费的时间, 总共大概3个小时。
BUG 是这样的: 一个 API 返回的 JSON 串是一个对象数组 [{field1: 'xxx', field2: 'xxx', 'source_cidr_ip': 'xxx'}, {'field1': 'xxx', 'field2': 'xxx', 'source_group_no': 'xxx'}] , 有一个字段名称是可能变化的, 大多数时候是 source_cidr_ip, 极少数时候是 source_group_no , 所采用的 JSON 解析库是 JACKSON-lib , 这个库对要填充的对象定义有一些要求: 所声明的对象的属性必须包括所有 JSON 串中的字段, 若少了则会报错, 若多了则会填充为 null. 而我定义的对象中只包含了 field1, field2, source_cidr_ip 三个字段, 忽略了 source_group_no , 结果当返回含有 source_group_no 字段的 JSON 串时, 就会出现解析异常。
为什么花了这么长时间呢? 按理来说, 这样的 BUG 只要查看一下日志, 是很容易定位的; 原因可能有如下三个方面: 1. 返回含有 source_group_no 的 JSON 串出现的概率非常低, 也许只是最近才出现, 否则应该早就报出异常了; 2. 出现 BUG 的时间距离开发的时候已经过去了近 7-8 个月了, 料想到是这些细节坏事还真是不容易; 3. 这个解析异常可能被多线程中的代码“吃”掉了(切忌把异常捕获了却什么都不处理!), 以至于没有看到。
令我痛心的是, 这样一个小 BUG 就耗费了大概3个小时! 如果把调试时间加到开发时间上, 那么这个小小的展示功能实际上是耗费了4-5个多小时! 由此, 我想到了, 程序员, 时间都上哪儿了 ?
BUG, BUG! 无休无止的 BUG! 程序员就要和BUG 相亲相爱了。BUG 是无法避免的, 然而, 如果在开发时能够更加仔细一些, 更加苛刻一些, 是不是可以减少调试时间? 减少这些不必要的调试, 是不是可以节省出更多时间,用于更有意义的事情上? 扪心自问, 是不是花了 1个小时开发, 又花了2个小时(常常是一点一点地累积出来的)不断地调试和修复?
那么, 如何减少调试和定位BUG的时间呢?
(1) 在开发时尽量苛刻一些, 充分测试, 对代码质量充分重视,勿急勿快;多花时间开发和测试,比多花时间调试可要有趣得多。
(2) 开发时考虑可扩展性和可变性,做好防御措施;比如上述就可以采用更好的库或方法,屏蔽掉未预料字段的影响。
(3) 仔细做好关键日志记录,在出问题时有关键线索可以快速定位问题所在;切忌认为不可能出问题而不作记录。
(4) 已知小BUG及早修复,避免在未来不恰当的时候放大成更大的麻烦。
从另一个角度来说, 程序员应当对自己的时间非常敏感, 毕竟, 技艺永恒, 生命短暂; 多留点时间给所爱的人!