Engineer's Codex 讲述了现实世界软件工程的实践课程和故事。
1990 年 1 月 15 日,AT&T 新泽西运营中心检测到广泛的系统故障,网络显示屏上出现大量红色警告。
尽管尝试纠正这种情况,但网络在 9 个小时内仍然受到损害,导致呼叫连接失败率达到 50%。
AT&T 输了 6000万美元 结果是 超过 60,000 名美国人的手机完全断开。
此外, 500个航班延误,影响85,000人。
AT&T 的长途网络被认为是效率的典范,通过其先进的电子交换机和信号系统处理了全国大部分的电话。 该系统通常在几秒钟内完成呼叫路由。
然而就在这一天,源自纽约一台交换机的故障在网络中蔓延。 这是由于最近更新中的软件错误造成的,其中包含影响网络 114 台交换机的严重错误。 当纽约交换机自行重置并发出信号时,这个错误引起了多米诺骨牌效应,导致大范围的网络中断。
这个软件补丁已经经过层层测试,没有被发现。 这一事件尤其令人惊讶,因为 AT&T 以其严格的测试而闻名。
要成为一名出色的软件工程师,您需要了解很多。 但你如何知道你不知道的事情呢?
瑞典测验 包含 500 多个问题的资源,可揭示您在软件领域知识方面的差距,例如 数据库, 缓存, 和 联网。 其中许多问题都是经过验证的概念,在 Meta、Apple、Airbnb、Google 等公司的采访中都被提出过。
SWE 测验还有 结构化路线图 用于学习重要的软件概念。
根本原因可追溯到网络交换机上实施的软件更新中的编码错误。
C 程序中的错误涉及错误的位置 休息 嵌套条件语句中的语句,导致数据覆盖和系统重置。
伪代码:
1 while (ring receive buffer not empty
and side buffer not empty):
2 Initialize pointer to first message in side buffer
or ring receive buffer
3 get copy of buffer
4 switch (message):
5 case (incoming_message):
6 if (sending switch is out of service):
7 if (ring write buffer is empty):
8 send "in service" to status map
9 else:
10 break // The error was here!
END IF
11 process incoming message, set up pointers to
optional parameters
12 break
END SWITCH
13 do optional parameter work
问题:
-
如果 环写缓冲区不为空,然后第 7 行的 `if` 语句被跳过,并且 休息 相反,第 10 行的语句被命中。
-
然而,为了使程序正常运行,应该点击第 11 行。
-
当。。。的时候 休息 语句被命中,而不是处理传入消息并将指针设置为可选参数,然后数据(应该保存的指针)被覆盖
-
纠错软件识别出数据覆盖并启动开关关闭以进行重置。 这个问题变得更加复杂,因为这个有缺陷的软件存在于网络上的所有交换机中,导致重置的连锁反应,最终瘫痪整个网络系统。
尽管拥有一个专为弹性而设计的网络, 一行代码就能瘫痪该国一半的主干线。
工程师们花了 9 个小时才让 AT&T 的系统完全恢复在线。 他们主要通过将开关回滚到以前的代码工作版本来做到这一点。
实际上,软件工程师花了两周时间进行严格的代码阅读、测试和复制才能真正了解错误所在。
不幸的是,对于 AT&T 来说,这甚至不是他们 90 年代最严重的系统崩溃。 在这十年的后期,他们遇到了更多问题。
事实上,并不是一行代码导致系统瘫痪。 这是流程上的失败。
如今的公司拥有更好的流程,但即便如此,错误也可能会被忽视。 谷歌写了一篇很棒的回顾 20 年站点可靠性工程经验,他们回顾了 2016 年 YouTube 首次全球中断的情况。
对于企业来说,停电的规模是巨大的,每次停电都可以吸取教训。 然而,对于大多数人来说,中断归结于人为错误和流程缺陷。
资料来源:
https://users.csc.calpoly.edu/~jdalbey/SWE/Papers/att_collapse
https://telephoneworld.org/landline-telephone-history/the-crash-of-the-att-network-in-1990/
https://www.mit.edu/hacker/part1.html
https://prezi.com/qxeu8iayvwpu/1990-att-long-distance-network-crash/