Skip to main content
感谢您的访问 — 欢迎随意浏览,或告诉我们您的想法。服务博客联系我们注册 Mostutor — 前1000名可获3个月免费
GCSE与A-Level计算机科学

捉虫记:那些造成数百万损失的著名代码错误

Sudershan Soni作者: Sudershan Soni 28 July 2026 7分钟阅读

一个缺失的连字符,在发射后仅仅几秒钟,就摧毁了一枚价值数百万美元的火箭。一个舍入误差差点让证券交易所的开盘崩溃。软件历史上最昂贵的错误几乎从来不是戏剧性、复杂的错误——它们是微小、容易被忽视的错误,恰好出现在最糟糕的位置。

GCSE核心

水手1号:那个摧毁了一枚火箭的连字符

1962年,NASA的水手1号探测器在其制导软件开始发出极其错误的转向指令后,发射不到五分钟就被地面控制中心摧毁。根本原因可以追溯到一个手写誊抄的制导方程中缺失的一个字符——一个本应对微小传感器变化取平均值的平滑公式,反而把每一个微小的波动都当作真实、紧急的轨道修正来处理,把火箭送出了预定的轨道。

DO 5 I = 1.10intended: DO 5 I = 1,10 (a loop) — one typo (. instead of ,)DO5I = 1.10read as: create a variable and assign it 1.10 — no loop at all

一个缺失的字符,把一个平滑公式变成了一个把每一个微小传感器波动都读作真正转向指令的东西——一个微小的差异,带来了灾难性的结果。

为什么小错误会造成最大的灾难

一个大而明显的错误通常很快就会被发现——程序立即崩溃,或者产生一个在测试中显而易见错误的答案,有人会注意到。真正造成实际损害的错误几乎总是那些足够微妙、能挺过测试并进入生产环境的错误:循环中的一个差一错误,一个只在不寻常值上才会出错的舍入假设,一个99.9%的时间是正确的、其余时间却灾难性地错误的条件。错误越小、越隐蔽,它能藏身的地方就越多。

考试式问题

一位程序员编写了一个循环,原本打算处理列表中全部10个项目(索引为0到9),但写成了「for i in range(1, 10)」而不是「for i in range(0, 10)」。解释这是哪种类型的错误,以及它会产生什么影响。 [3分]

显示范例答案与得分点
  1. 这是一个差一错误(off-by-one error) (1分)
  2. 由于索引从0开始,按此写法的循环从1开始,永远不会处理索引为0的项目——列表中的第一个项目被悄无声息地跳过了 (1分)
  3. 最后一个项目(索引9)仍然会被正确处理,因为range(1, 10)确实包含9——程序不会崩溃地运行,只是悄悄地产生一个不完整的结果 (1分)

考官关注的重点: 通过比较预期的范围和实际写出的范围,准确找出遗漏了哪个索引,而不是只给出「差一错误」的笼统定义。

常见错误: 假设程序会崩溃,或者认为被跳过的是最后一个项目——这个特定版本跳过的是第一个项目,并且不会崩溃地运行,这正是差一错误之所以危险的原因:它们并不总会自己暴露出来。

这些故障真正改变了什么

水手1号的故障成了软件工程教学中的一个标准案例,并直接影响了任务关键代码的审查方式——一个誊抄错误可能有一天在没有二次检查的情况下进入实际制导系统的这种想法,恰恰是现代代码审查、自动化测试和形式化验证存在的目的,正是为了防止这种情况。每一个著名的历史性错误,在某种真实的意义上,都是某个特定工程安全措施今天存在的原因。如果调试、测试或软件工程实践需要作为一种真正的专业技能来解释,而不仅仅是考试内容,这正是我们GCSE计算机科学个别指导所做的事情——请在这里查看完整的学习路径。

常见问题

水手1号的连字符错误真的只是一个字符吗?

这个故事最常被重复的版本是,一个制导方程中缺失了一个连字符(或者按最初的FORTRAN记法,是一条上划线),这导致火箭的制导软件误解了一个公式,发出了错误的转向指令——这枚火箭在发射后不到5分钟就被故意摧毁,以防止它坠入人口稠密的地区。一些历史学家对确切的技术细节存在争议,但核心的教训——一个微小、容易被忽视的错误导致了灾难性的故障——是有充分记录的。

为什么“差一”错误发生得这么频繁?

因为在代码中计数常常从0开始,而不是从1——一个列表的第一个元素通常在位置0,而不是位置1——而在某个方向上恰好偏差一个位置,写出这样的循环或条件是极其容易的。这是整个编程领域中最常见的错误类别之一,恰恰因为这个错误如此微小,而且很容易在不知不觉中犯下。

今天究竟是什么在阻止像这样的错误进入生产环境?

自动化测试(在交付代码之前,对照已知的预期结果运行它)、代码审查(在合并之前由第二个人检查逻辑),以及类型更严格的语言,它们甚至能在程序运行之前就捕捉到某些类别的错误。这些都不能保证零错误,但它们能捕捉到导致那些最著名历史性故障的这类微小、容易被忽视的错误中的绝大多数。

读者评分与评价

从多个维度为这篇文章打分——您的评价既能帮助其他读者,也能帮助我们不断改进。

内容
图片
排版呈现
语言清晰度
实用性

0/3000

这篇文章对您有帮助吗?

告诉我们您的想法——可以是需要更正的地方、尚未解答的问题,或您希望我们接下来讲解的主题。

想直接沟通吗? 在方便的时间预约免费视频通话:简短问题15分钟,其他问题30分钟。时间以您所在的时区显示。

Sudershan Soni

关于作者

Sudershan Soni

Mostak Services 的创始人兼首席导师——拥有硕士学位的数学、科学、计算机科学与 STEM 导师,拥有超过20年的职业经验,通过在线授课为全球从 11+ 和 GCSE 到 A-Level 及更高阶段的学生提供教学。

阅读完整履历

想学习能建立真正理解的计算机科学吗?

个别指导培养真正的调试能力,而不仅仅是死记硬背语法。预约免费咨询,我们会向您展示方法。