跳到主要内容

保持敬畏,保持严谨

· 阅读需 4 分钟
Software Engineer

码者,国之大事,死生之地,存亡之道,不可不察也。

程序这东西,是极其严谨和死板的,一丝一毫的松懈都有可能为以后埋下祸患,本周遇到了2件事情,让我觉得特别羞愧,值得一记。

专业人员不能不严谨

第一件事是这样的,有一个技术指导要上网刷新老版本,而就在前一天晚上,一线在使用老版本的时候发现了一个新问题,于是我和另一名开发同事迅速定位修改了这个问题,也做了初步的自验证,确保正常流程是OK的。由于服务要求的时间很紧迫,我不建议再转一轮测试,担心交付时间延期影响一线的进度。而同事建议我和版本经理说一下,让他来决策,于是我们最后还是紧急转了一轮测试。这不转不要紧,一转吓一跳,测试测出来了3个问题,1处是指导书的问题,2处是代码的问题。虽然问题都很简单也很好修复,但是一旦上网大规模铺开使用,到时候再出问题后果就严重了。想到这里我觉得特别惭愧和后悔,身为一名专业的开发人员,怎么能抱有如此的随意的想法。质量是我们的生命线,也是我们的尊严,如果仅仅是因为担心时间紧而忽视了质量,那么谁还敢相信我们的代码?

事后来看,我觉得有以下几点非常关键:

  1. **开发人员必须做好充分的自验证。**软件质量维护的成本是前期低后期高,而开发的阶段是整个阶段中最低的也是最值得投入的。如果在开发阶段就没有摆正好态度,没有进行充分的验证,那么一方面会增加后期反复测试的工作量,另一方面也容易把一些难以测试的问题放跑到发布之后,到时候再修正的代价就更高了。开发人员对程序拥有绝对的掌控,他知道代码流程是什么样的,知道每一个场景的处理逻辑,知道每一处细节的差异,那他自然也就知道几乎所有的使用场景,知道怎么做才能充分验证。而当软件走到测试那里时,他面对的则是一个灰盒甚至是黑盒了。虽然测试人员拥有更加专业的测试方法,也可能考虑到开发人员考虑不到的场景,但他对代码细节是不清楚的,一些在开发那里很容易发现的bug到了测试这里可能就要费一番周折甚至会被漏掉了。所以,当代码还在开发手里时,请一定要好好蹂躏它,不要给测试留下一滴水分。
  2. **在权衡时间和质量时,优先考虑质量。**很多时候,我们都会在交付时间和质量上做权衡,尤其是交付时间紧张,外部压力较大的情况下。我们为了按时交付功能,往往会在其他地方做一些短时的舍弃,比如缩短自验证的时间,仅测试最基本和有限的用例,过度简化流程以节约时间。所有这些省下来的时间,起初可能看上去完成了我们交付的计划,但是很容易在后期为我们制造大量的债务,吞噬我们更多的时间和精力。程序是很严谨的一个东西,它没有感情, 没有妥协,说一不二,如果你不严谨,那它必定会找你麻烦。不管时间有多紧张,也要保持敬畏的心态,保持理性的思考,拉通开发、测试、版本经理一起为质量护航,争取尽可能多的资源和时间在保证质量的活动上,不管是自验证也好,覆盖更多的测试用例也好,顶住周边的压力争取时间也好,只有我们的产品是高质量的,发出去的东西才有价值。
  3. **一定要尊重流程。**在软件开发的初期,没有流程,没有规范,一切都是手工作坊式的开发。随着经验的积累,才慢慢出现了流程,出现了规范,出现了checklist,把大家遇到的共性问题通过固定的方式给阻截掉,使得每个人可以聚焦自己擅长的活动。所以在我们日常的开发活动中,一定要尊重这些前人留下的宝贵财富,尊重流程,站在巨人的肩膀上往前走。不要想当然地跳过某个步骤,等到bug在上网后爆发了或者收到投诉了再扼腕叹息那就晚了。

修改代码时刻保持敬畏

第二件事则是踩到了一个已经埋下的地雷。

一个月前在做安全整改时,曾经因为一条告警动了一行代码,当时大致看了下流程,觉得应该不会有问题,修改后没有构造出合适的场景验证,代码检视阶段大家也没发现问题,就这么合入了主干,结果在产品的测试那里爆了雷。

修改代码容易引入问题,这是大家都心知肚明的事情,因此也想了一些办法,比如代码检视,实时修改实时验证等。但是问题还是不止一次地在不止一个人修改的代码里发生了,这是关键的地方。我们或许可以参考飞行员在起飞前对照飞行员手册和checklist做检查一样认真审阅代码、充分进行测试,我们或许也可以像外科医生一样在对代码进行手术前认真梳理、考虑修改的影响范围。这样的方法我们可以想出来很多,而且总会探索出来适用于整个团队的好方法,但比方法更重要的,是我们面对代码的态度。

或许有人会说,不就是几行代码吗,很容易改的。可现实经验可以充分告诉我们,很多问题往往就是一两行代码引起的。通过日志、堆栈等信息,推断、还原犯罪现场,往往大部分的代码都很正常,而恰恰是某个字段或者某个只有一行的处理逻辑导致了“血案”的发生。

再者,当我们以为简单的一两行的修改好像就解决了一个严重问题的时候,新的问题很可能就在此时埋下了祸根。毕竟,水可载舟亦可覆舟,修改代码可以解决问题,同样也可以引入问题。

不管怎样,面对代码,我们都要保持一颗敬畏之心,保持严谨的态度,甚至要像教徒一样虔诚。要知道手下的代码会影响成百上千人的生活,甚至有可能会影响某个人的生命,Therac-25事件亚利安五号原型爆炸事件已经足以为我们警钟长鸣了,希望在你我的手下不要出现下一个。