一个小Bug找了6个月,你知道程序员的难了吧

我曾经为一家美国著名的国防承包商工作过。我很高兴我做到了,因为它是我一直的梦想;但我也很高兴有机会继续前进。我学到了很多,遇到超多了不起的家伙,而且只要我活着,就永远不会缩写另外一个变量。

我效力过一个隐形飞机的项目,这里不提它的名字,它主要负责制造雷达接收器。你可以能会问,“为什么隐形飞机还需要雷达接收器?”这主要有两个原 因。这些接收器是定制的,专门用来接收和识别地理位置以及敌方系统发射雷达脉冲的国籍。首先,知道敌方雷达的地理位置,可以帮助你避免意外飞过他们的上空 (如果你的影子飞过敌方空军基地上空,却没有被雷达发现,那是极好的)。第二,它让你分析敌方在哪里寻找你(比如在一个山头上出现了一个俄国的防空导弹基 地,上个月还没有呢,那你就知道一定有些东西在上面)。

6 个月才解决了这个小 Bug0

当接收器在测试实验室的时候,你经常会看到 20~30 磅的精美的航空级铝,里面塞满了 10~20个 定制的电子卡,上面运行着价值 50~100 万美元的软件。移动接收器很容易,绝大多数我在实验室里处理的,都是空军部队在使用中遇到某些问题的。本质上,99.9% 的这些问题都是电子问题,我们不得不欺骗这个盒子,让它认为自己飞在空中,并接受敌方的雷达脉冲。测试仪器和软件在当初采购时,可能是很先进的,在合同获 准后都维持不变。然而,因为它们是上世纪 90 年代获准的,你可以想象我们20年后还不得不处理这些遗物。以 MHz 计量的古老 CPU,比我还要老的操作系统,软件的用户友好特性根本无从谈起。我工作的一部分是执行新的合同,负责将升级原有测试仪器以及在上面运行的软件。接下来, 有趣的事情发生了。

这项宏大的任务有很多层,我负责的一层是在同一个接收器上运行新旧两个测试,看结果有什么不同,找到软件的问题,然后修正它。因为有很多小问题要处 理,所以事情进展地相当缓慢但是还算稳定,但是 SlowPOP 给我留下的印象却挥之不去。SlowPOP,也被称为“慢上升时间的脉冲叠加”,这项测试用来保证在接收到两个叠加的雷达脉冲,而且脉冲的上升、下降时间 比正常时间要慢很多的情况下,接收器还能正常工作。这些细节不但枯燥而且还属于机密,所以可以这么说,结果相当糟糕。输入参数稍有调整,测试就可以通 过……差不多是这样……但是这仍旧不太正常,后面调整的参数和原始参数并不是很接近,这让我很不舒服。

我不停地重启,重新校准,重新安装(软件),重新测试、测试、不停地测试。

我不断地询问,调查,请求,追问,推测。

随后几个月,我们发布了其它可以通过测试的版本。

有趣的是,每当我问到 WaveGenAPI 函数的时候,每个人都说“那个函数不可能有问题,其他 80% 的测试都在使用它,而且它也正常工作一年多了。”

最后在检查所有可能后,我知道必须要检查 WaveGenAPI 了。

当我研究 WaveGenAPI 函数代码时,经过几天的努力,我找到一些线索。有一行代码看上去不太对。它添加了一堆术语,其中有一个术语看上去不太对。我请 WaveGenAPI 的作者(他有令我羡慕的 26 年经验)下到实验室,和我一起看结果。他沉默地盯着那行代码差不多有半个小时,只问了这个问题的基本信息,包含了基本的检查和可能性。最终他只说了一句 “做得好”,然后我们握手,他就离开了。

问题找到了:一个文件 → 一行代码 → 一个术语 → 一个变量 → 一个字母

当时,这位资深程序员接受的训练就是要限定变量名的长度,他在实际工作中使用的变量名长度都不会超过 8 个字符。在这个案例中,有问题变量的含义是脉冲“下降沿十分之一高度的时间”。这个术语应该缩写成 “Ttpfe”,但是他错误地把它命名成“Ttpre”,而它却正好代表相反的含义,即“上升沿”。“Ttpre” 这个术语也存在了,所以这个拼写错误才不会造成“undefined”错误。而且除了 SlowPOP 以外,所有测试的时间差异都在1个皮秒内(译注:1皮秒等于百万分之一微秒)。发现和修订这个错误,是对我六个月工作的最高嘉奖,并且是迄今为止我职业生 涯中找到最让人满意的 bug。

这就是为什么,只要我活着,就永远不会缩写变量名。

简而言之,我花费了 6 个月的时间去查找一个错误的字母,而它是一个比我多 26 年工作经验的工程师所犯的输入错误。

你也许感兴趣的:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注