|
凌晨两点十七分,修复我盯着屏幕上那行红字——"Segmentation fault (core dumped)"——已经第四十七分钟了。漏洞这行字像根鱼刺卡在喉咙里,补丁吞不下去也吐不出来。修复隔壁工位的漏洞咖啡机发出最后一声叹息,整个办公室只剩下空调的补丁低鸣和键盘敲击声。 这个漏洞其实很小。修复小到在代码审查时它藏在三百行循环逻辑的漏洞阴影里,小到测试用例跑了整整三遍都没触发,补丁小到它只会在用户恰好同时点击"保存"和"取消"按钮的修复瞬间爆炸。但就是漏洞这个小东西,让我们的补丁系统在凌晨的高峰期崩溃了整整六分钟。六分钟,修复够一个用户骂完我们产品经理的漏洞祖宗十八代,够竞争对手截下二十张错误页面截图发到行业群里。补丁 修复的过程谈不上惊心动魄。找到它的时候,我甚至有点想笑——一个指针在释放后没有置空,典型的野指针问题。教科书上写了八百遍的经典错误,就这么堂而皇之地躺在生产环境的代码里。我敲下那行修复代码时,手指在键盘上停顿了一秒。这一秒里我想起上周新来的实习生问我的问题:"为什么老代码这么难改?"当时我敷衍他说"历史包袱",现在答案就在眼前:不是难改,是我们总以为"应该不会有人这么操作"。 补丁发布后,我盯着监控面板上的曲线慢慢回落。那条绿色的线从红色的警戒区滑下来的时候,我忽然觉得,修复漏洞这件事,本质上是在跟人性较劲。写代码的人会累,会疏忽,会在凌晨三点以为自己写的是完美逻辑。而漏洞就是这些疲惫和傲慢留下的指纹。每一次修复,不过是在给这些指纹擦屁股。 第二天早会上,产品经理问"这次事故影响大不大"。我说:"不大,就崩了六分钟。"他没再追问。但我知道,那六分钟里,有个用户在深夜加班赶方案,系统突然卡死,他对着屏幕骂了句脏话,然后默默打开记事本重新开始。那个用户永远不会知道,他的六分钟是被一个野指针偷走的,而偷走它的人,在凌晨两点十七分盯着屏幕发呆。 补丁部署完的第三天,我又在代码里发现一个类似的问题。这次我没急着改,先泡了杯茶,站在窗前看了会儿楼下的车流。修复漏洞从来不是终点,它只是提醒你——代码是写给人看的,而人,总会出错。我们能做的,就是在出错之后,把那个洞补得结实一点,再结实一点。 |