揭秘代码背后的奥秘:探索编程世界的终极真相!


5亿欧元的炮仗

在这里插入图片描述
1996 年 6 月 4 日星期二,欧洲航天局计划首次发射新的阿丽亚娜(Ariane)5 型火箭。然而,就在起飞后短短 40 秒,阿丽亚娜 501 号就在发射区上空炸裂成无数金属残片和燃烧的碎块。

事故原因其实非常简单 :一个本可以轻松避免的编码 bug。这个 bug 来自一段死代码(即不产生实际作用的代码),属于近十年前阿丽亚娜 4 型火箭的遗留产物。

这个bug就是,一行代码尝试将 64 位浮点数转换成有符号整数,整数溢出结果被直接传递给主计算机。因为没有异常处理代码,主计算机将发来的数据解释成了真正的导航数据,认定火箭已经严重偏离航线。

主计算机意识到情况到了最危急的关头,于是决定触发自毁机制,把这枚当时造价约 5 亿欧元的火箭当成大炮仗给放了。

一行代码引发的“血案”:价值 5 亿欧元的火箭,发射 40 秒爆炸


教训

我们能从价值5亿欧元的教训中学到什么?

  1. 阿丽亚娜 4 型火箭为什么没有出问题?bug的原因是什么?
  2. 既然是死代码,为什么还会执行?

报道中也给了相应解释:

  1. 因为没有完整地考虑系统升级后遗留代码的兼容性问题

    同样的软件设计之前已经成功服务过多次发射,但那时候是在阿丽亚娜 4 型火箭上。4 型火箭体量较小,所以性能参数也远低于 5 型;新的阿丽亚娜 5 型火箭在显著升级之后,飞行速度超出了系统工程师当初编写代码时的取值区间。

  2. 一系列不当操作导致

    这个 bug 来自一段死代码。因为这部分只是发射台对齐过程中的一部分,在起飞后就不再需要了。但当时一个小小的故障将发射延迟了几秒钟,为了避免重置整个系统,软件工程师决定额外把整个代码序列运行一遍……

这样还远远不够,进一步追问:

  1. 为什么没有考虑遗留代码的兼容性问题?
  2. 为什么不知道这样做可能存在风险?不知道会触发死代码,或者知道会触发死代码但并不担心?

这些问题的答案,也许只有工程师们自己才知道。

可能是,阿丽亚娜 5 型和4型的工程师不是一拨人,根本没有意识到兼容性问题。或者做了兼容性测试,但是测试地不够全面。又或者工程师对死代码的质量不够重视 …

不管具体原因是什么,我唯一可以肯定的是:根本原因是没有真正理解代码


代码的本质

如何才能真正理解代码呢?

回答之前,先看一个关于Theory Building的说法(Theory Building直译为构建理论,可以理解为:奥秘理论)。

Theory(奥秘)是:

  • 存在于我们头脑中的思想,它指导我们做某件事情
  • 有一部分无法用任何方式表达(只可意会,不可言传)

举个做饭的例子:

  • (动作)我会做蛋炒饭,我做的蛋炒饭非常好吃
  • (语言)我教别人做蛋炒饭,向别人解释做蛋炒饭的步骤
  • 然而,关于做蛋炒饭的奥秘,总有一些是无法用任何方式表达的(无论是动作还是语言),它只存在于我的头脑中
  • 这就是为什么,不管是你观察我做,还是我教你做,你做的都没有我做的好吃

传授奥秘的唯一方法是:一遍一遍地向别人展示对于奥秘的表达(动作或者语言),直到他们建立起自己对奥秘的理解。尽管与我们的理解可能不一样。

在这里插入图片描述

回到代码的问题上来,代码究竟是什么?

代码是程序员的成果物,但不是真正的最终成果物,对解决方案深层次的理解(即解决方案奥秘)才是。

或者说,代码只是程序员关于解决方案奥秘的书面表达,并不是解决方案本身

只有深刻理解解决方案背后的奥秘,才能:

  • 从头构建代码
  • 诊断并解决代码问题
  • 很容易地修改代码

如何才能真正理解代码?

只能祈祷原作者有耐性一遍一遍地把代码背后的逻辑讲给你听,并且在你形成自己的深刻理解之前原作者没有跑路。


文档的作用

原作者跑路了,不是还有文档吗?

文档也只是解决方案的另一种书面表达。相比于代码,文档的准确性和质量存在更大风险。因此,文档只能起到补充和辅助性作用。

按照奥秘理论,解决方案总是有部分内容无法用任何方式表达。回想一下你是否遇到过以下问题:

  • 即使你有完备的文档,修改一段代码的难度也不小(相对于原作者来说)
  • 出现问题后,总是无法在文档中找到有价值的信息(即使原作者声称文档中有详细说明)

健康的团队

代码和文档无法表达解决方案本身,出现问题时,能否求助于团队的其他成员呢?这取决于团队的状态是否健康。

健康的团队:

  • 有些人已经呆了很长时间,甚至从代码刚创建时就在
  • 其他团队成员慢慢加入,并有机会与更有经验的人一起工作
  • 聚焦领域没有改变,没有被重新分配到其他不相关的项目,或者被要求修复其他团队的代码

按照奥秘理论,只有团队中的“老人”,才有可能理解代码的奥秘。通过老带新的方式将奥秘传授下去,才能维持一个团队健康发展。

当所有理解代码奥秘的人离开团队之后,代码实际上已经“死了”,它们变成了遗留代码,时刻威胁着系统的安全。

这就是为什么,核心人员离开之后开源社区很难继续发展,外包项目效果如此糟糕,推倒重写代码比修改遗留代码更容易。


启示

对个人来说:

  1. 原作者永远是最佳的求助对象,无论他的水平怎么样
  2. 尽可能将自己的理解用合适方式表达出来,必要时多一些耐性
  3. 加入一个健康的团队

对软件公司来说:程序员才是最重要的


专栏文章

如果喜欢这篇文章,请不要忘记关注、点赞和收藏哦!
您的鼓励将是我创作的最大动力!

  • 30
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构师昌哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值