(点击上方公众号,可快速关注)
“这不可能啊”、“见鬼了”。。。这是每个程序员都听过或说过的迷之言语。这些话基本上说明有人已经“撞邪”了。编程实际上是一项复杂的系统性工程,包括构思、实际编码和测试等阶段,每一阶段都极有可能产生错误,而且本身计算机容错性是有限的,所以出现错误是再非常正常的,我想应该没有人编程没出过错吧。
背景
为啥要写这篇文章呢,这是因为最近一段时间碰到两个“不可思议”的bug,百思不得其解的那种。
第一个bug由删除一行代码导致。这行代码,我清晰地记得当时我想了很长时间最终并没有删除,但最后的提交却包含了删除改动。常常有人说鬼压床,我怎么感觉有鬼压delete键呢。
第二个bug也是由删除一行代码导致。有个功能要迁移到另一个服务,这个功能我是完全拷贝过去的,但是最后发现代码却少了一行,不是代码块的开头和结尾,而是中间的一行。这排除了我复制不全的可能,但又是怎么删除的代码呢?
原因分析
代码的bug虽然好找,但找到产生这些bug的原因却不容易,这往往跟个人的习惯强关联,所以回溯和反思自己的行为变得尤为重要。思来想去,产生以上bug的原因有以下可能:
当时头脑是混乱的
在大脑是混沌的状态很容易做出错误的决策,即使感觉当时是“清晰”的,但怎么能相信当时的大脑印象呢--你觉得没删,但实际上却删了。
当时可能有人打扰
这种情况很多见。思维的连续性能有效保证编码的质量,这已经是人人皆知的真理,但在实际工作中,这种环境却很难满足。一会这边找人查问题,一会来人谈需求,过会可能还会有人催进度,等等,甚至有时候同时处理多件事。为啥很多程序员喜欢大半夜工作,因为半夜安静更能集中自己的注意力,当然这是不好的习惯。在思维的切换过程中,丢掉一些信息点是很正常的。
不小心碰到了删除键
有可能你在“左手指月”的时候碰到了删除键,或者办公桌上的一些小物件倒了压到了删除键。。。虽然可能性看起来不高,但真的是很有可能的。
培养好的编码习惯
通过上面的原因分析,可以看到这个bug本身跟编码习惯息息相关。良好的编码习惯是驱除这些“邪门”bug的最佳途径。这些编码习惯包括:
放下傲慢,重拾敬畏
现实是很复杂的,一些“看起来正确”的推理是站不住脚的。比如,上面提到的第二个bug,如果简单的认为完全的拷贝代码而不需要检查,那就会出现上面的问题。实际上现实中还有很多奇怪的现象,比如,服务以前没问题,加了一行人畜无害的代码,服务竟然崩溃了。。。所以,我们要有敬畏之心,认真对待每次改动。
及时提交
这条主要为了减少后续代码出现异常改动的可能性。如果代码已经检查完毕,要尽快的提交,在前面的文章 【Git】怎么样才是好的提交 有提到这点。
不要一心二用
经过实践证明,一心二用是行不通的。当然有些人看起来好像挺享受一心二用,包括以前的我,之所以没出错,很可能是当前处理的事情的复杂度较低,或并行度不高。如果难度增大,没有人不出错。编程是一项复杂度高的系统工程,即使一心一用都可能导致出错,为何要进一步增加出错的概率呢?
严格执行代码审查
这一步是最重要的,是问题代码进入master分支的最后一步,一定要认认真真执行。如果工作配置不具备,自己可以执行,一行一行代码地审读。如果这一步我能做好,估计上面的两个bug就没有了。
鸣谢:封面图标来源Becris的作品。