1999 年“火星气候卫星” 因导航出现重大错误而坠入火星大气层。从Peter Norvig(在NASA 工作的时候参与了调查)在coders at work的问答中,我们可以看到一个大略的错误发生过程:
1) 软件外包公司对于 mission-critical 的软件模块有很完备的检查和测试,但是对于其他模块则没有完备的管理。
2) 程序员写了一个不重要的log 功能,其中用英制 (磅* 英尺) 表示力, 但是 NASA 用“牛顿”= 千克*米/(秒*秒)
3) 外包公司接到一个新的工程,他们进行了软件重用,log 功能中记录的力被重用为导航功能的输入参数,成为 mission-critical 的模块。 //错误: 一个模块从 non-mission-critical 变成 mission-critical 没有经历必要的复审和测试。
4) 这个新的工程由发包公司 Lockheed (洛克希德公司) 交给了客户 JPL (喷气推进实验室)
5) 火箭带着卫星发射了,在10个月的飞行中,JPL 可以每天两次启动小推进器,来调整太空船的航向,在这一过程中,有人发现了导航功能的一些不正常现象, 于是 -
a. JPL 发邮件给 Lockheed, 说 – 这个模块有些参数看起来好像不正常…
b. Lockheed 回邮件...
c. JPL 再发邮件…
d. 最后没有人再发邮件了
e. JPL的同志认为, Lockheed 的同志们估计已经搞定了。
f. Lockheed 的同志认为, JPL 的同志们没再追问这个问题,可能已经不是问题了。
错误: 这个问题从来没有收录到NASA 的错误跟踪系统 (Bug tracking system),只是在email 中交流,导致最后没有人对这个问题负责。在错误跟踪系统中,总得有一个人“拥有”这一个bug,这样可以避免推诿责任。
十个月之后, 1999年9月23 日,卫星抵达火星大气层,错误的导航参数造成卫星坠入大气层烧毁。 单单卫星的造价就高达一亿两千五百万美元。
==========================================
质量控制不好,小毛病也会酿成大问题!