5亿欧元的炮仗
1996 年 6 月 4 日星期二,欧洲航天局计划首次发射新的阿丽亚娜(Ariane)5 型火箭。然而,就在起飞后短短 40 秒,阿丽亚娜 501 号就在发射区上空炸裂成无数金属残片和燃烧的碎块。
事故原因其实非常简单 :一个本可以轻松避免的编码 bug。这个 bug 来自一段死代码(即不产生实际作用的代码),属于近十年前阿丽亚娜 4 型火箭的遗留产物。
这个bug就是,一行代码尝试将 64 位浮点数转换成有符号整数,整数溢出结果被直接传递给主计算机。因为没有异常处理代码,主计算机将发来的数据解释成了真正的导航数据,认定火箭已经严重偏离航线。
主计算机意识到情况到了最危急的关头,于是决定触发自毁机制,把这枚当时造价约 5 亿欧元的火箭当成大炮仗给放了。
教训
我们能从价值5亿欧元的教训中学到什么?
- 阿丽亚娜 4 型火箭为什么没有出问题?bug的原因是什么?
- 既然是死代码,为什么还会执行?
报道中也给了相应解释:
- 因为没有完整地考虑系统升级后遗留代码的兼容性问题
同样的软件设计之前已经成功服务过多次发射,但那时候是在阿丽亚娜 4 型火箭上。4 型火箭体量较小,所以性能参数也远低于 5 型;新的阿丽亚娜 5 型火箭在显著升级之后,飞行速度超出了系统工程师当初编写代码时的取值区间。
- 一系列不当操作导致
这个 bug 来自一段死代码。因为这部分只是发射台对齐过程中的一部分,在起飞后就不再需要了。但当时一个小小的故障将发射延迟了几秒钟,为了避免重置整个系统,软件工程师决定额外把整个代码序列运行一遍……
这样还远远不够,进一步追问:
- 为什么没有考虑遗留代码的兼容性问题?
- 为什么不知道这样做可能存在风险?不知道会触发死代码,或者知道会触发死代码但并不担心?
这些问题的答案,也许只有工程师们自己才知道。
可能是,阿丽亚娜 5 型和4型的工程师不是一拨人,根本没有意识到兼容性问题。或者做了兼容性测试,但是测试地不够全面。又或者工程师对死代码的质量不够重视 …
不管具体原因是什么,我唯一可以肯定的是:根本原因是没有真正理解代码。
代码的本质
如何才能真正理解代码呢?
回答之前,先看一个关于Theory Building的说法(Theory Building直译为构建理论,可以理解为:奥秘理论)。
Theory(奥秘)是:
- 存在于我们头脑中的思想,它指导我们做某件事情
- 有一部分无法用任何方式表达(只可意会,不可言传)
举个做饭的例子:
- (动作)我会做蛋炒饭,我做的蛋炒饭非常好吃
- (语言)我教别人做蛋炒饭,向别人解释做蛋炒饭的步骤
- 然而,关于做蛋炒饭的奥秘,总有一些是无法用任何方式表达的(无论是动作还是语言),它只存在于我的头脑中
- 这就是为什么,不管是你观察我做,还是我教你做,你做的都没有我做的好吃
传授奥秘的唯一方法是:一遍一遍地向别人展示对于奥秘的表达(动作或者语言),直到他们建立起自己对奥秘的理解。尽管与我们的理解可能不一样。
回到代码的问题上来,代码究竟是什么?
代码是程序员的成果物,但不是真正的最终成果物,对解决方案深层次的理解(即解决方案奥秘)才是。
或者说,代码只是程序员关于解决方案奥秘的书面表达,并不是解决方案本身。
只有深刻理解解决方案背后的奥秘,才能:
- 从头构建代码
- 诊断并解决代码问题
- 很容易地修改代码
如何才能真正理解代码?
只能祈祷原作者有耐性一遍一遍地把代码背后的逻辑讲给你听,并且在你形成自己的深刻理解之前原作者没有跑路。
文档的作用
原作者跑路了,不是还有文档吗?
文档也只是解决方案的另一种书面表达。相比于代码,文档的准确性和质量存在更大风险。因此,文档只能起到补充和辅助性作用。
按照奥秘理论,解决方案总是有部分内容无法用任何方式表达。回想一下你是否遇到过以下问题:
- 即使你有完备的文档,修改一段代码的难度也不小(相对于原作者来说)
- 出现问题后,总是无法在文档中找到有价值的信息(即使原作者声称文档中有详细说明)
健康的团队
代码和文档无法表达解决方案本身,出现问题时,能否求助于团队的其他成员呢?这取决于团队的状态是否健康。
健康的团队:
- 有些人已经呆了很长时间,甚至从代码刚创建时就在
- 其他团队成员慢慢加入,并有机会与更有经验的人一起工作
- 聚焦领域没有改变,没有被重新分配到其他不相关的项目,或者被要求修复其他团队的代码
按照奥秘理论,只有团队中的“老人”,才有可能理解代码的奥秘。通过老带新的方式将奥秘传授下去,才能维持一个团队健康发展。
当所有理解代码奥秘的人离开团队之后,代码实际上已经“死了”,它们变成了遗留代码,时刻威胁着系统的安全。
这就是为什么,核心人员离开之后开源社区很难继续发展,外包项目效果如此糟糕,推倒重写代码比修改遗留代码更容易。
启示
对个人来说:
- 原作者永远是最佳的求助对象,无论他的水平怎么样
- 尽可能将自己的理解用合适方式表达出来,必要时多一些耐性
- 加入一个健康的团队
对软件公司来说:程序员才是最重要的。
专栏文章
- 2023年图灵奖揭晓,Avi Wigderson成为双冠王
- 成为程序员后我明白了什么?分享11条经验助你成功
- 0基础如何进入IT行业?带你一起发现秘密武器
- 速成软件书:真的是神器吗?让童话故事告诉你答案
- 程序员35岁会失业吗?这不是一个好问题!
如果喜欢这篇文章,请不要忘记关注、点赞和收藏哦!
您的鼓励将是我创作的最大动力!