计算机科学的趣味故事

Hacker News Top 新闻

摘要

这篇文章汇集了计算机科学和软件开发中引人入胜的历史故事和轶事,突出了著名的错误、失败和设计见解。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/08/18 00:56

# 计算机科学中的那些奇闻趣事 来源:https://inventwithpython.com/blog/intriguing-stories-in-cs.html 如今的我已届……某个年纪……在计算机科学和软件开发的历史中,我听过无数趣闻轶事,但总想知道是否还有更多。于是我借助大语言模型整理了一份清单(我已仔细审查并修正了部分链接)。其中许多故事我早有耳闻,有些则是首次听闻。若感兴趣可点击浏览,多数链接指向维基百科;我已确保链接至少不会导向低质内容农场网站。 我使用的提示词大致是:"托尼·霍尔对'null'有过评价,称其为'价值十亿美元的错误'。关于编程与软件设计还有哪些令人惊叹的正面或负面故事?"(虽然清单开头多是计算机故障案例,且逐渐偏向概念阐述而非叙事性故事。) 雷蒙德·陈是微软资深工程师,其博客《The Old New Thing》(https://devblogs.microsoft.com/oldnewthing/)(及同名著作)蕴含大量精彩故事。乔尔·斯波尔斯基的博客《Joel on Software》(https://www.joelonsoftware.com/)同样是故事与经验指导的经典源泉。 - 托尼·霍尔的“十亿美元错误”(https://en.wikipedia.org/wiki/Tony_Hoare#Research_and_career)——发明了空引用。 - 阿丽亚娜5号501航班(https://en.wikipedia.org/wiki/Ariane_flight_V88)——重用的整数转换溢出导致火箭摧毁。 - 火星气候轨道器(https://en.wikipedia.org/wiki/Mars_Climate_Orbiter)——公制/英制单位不匹配导致航天器失联。 - Therac-25放射治疗机(https://en.wikipedia.org/wiki/Therac-25)——竞态条件与不良安全设计导致致命辐射剂量事故。 - 奈特资本集团(https://en.wikipedia.org/wiki/Knight_Capital_Group#2012_stock_trading_disruption)——失败的部署在45分钟内造成约4.4亿美元损失。 - 爱国者导弹故障(https://en.wikipedia.org/wiki/MIM-104_Patriot#Failure_at_Dhahran)——累积的浮点计时误差导致28人死亡。本文还链接至维基百科的致命自主武器(https://en.wikipedia.org/wiki/Lethal_autonomous_weapon)词条。 - 奔腾FDIV漏洞(https://en.wikipedia.org/wiki/Pentium_FDIV_bug)——微小的查找表错误导致除法结果错误,引发史上首次全面芯片召回,损失4.75亿美元。 - 心脏出血漏洞(https://en.wikipedia.org/wiki/Heartbleed)——缺失边界检查导致服务器内存任意泄露。 - 莫里斯蠕虫(https://en.wikipedia.org/w/index.php?title=Morris_worm&utm_source=chatgpt.com)——自我复制软件实验意外瘫痪了早期互联网的大部分节点。 - AT&T 1990年通信中断(https://en.wikipedia.org/wiki/List_of软件_bugs#Telecommunications)——单一错误恢复路径引发电话交换机级联故障。(完整的软件缺陷列表(https://en.wikipedia.org/wiki/List_of软件_bugs)词条也颇具趣味。) - Cloudflare 2019年正则表达式故障(https://blog.cloudflare.com/details-of-the-cloudflare-outage-on-july-2-2019/)——灾难性回溯消耗了全网CPU资源。 - GitLab 2017年数据库事件(https://about.gitlab.com/blog/postmortem-of-database-outage-of-january-31/)——管理员在恢复过程中意外删除了生产数据。 - Unix管道(https://en.wikipedia.org/wiki/Pipeline_%28Unix%29)——道格·麦克罗伊提出的可组合性思想成为计算领域最持久的设计模式之一,亦称"Unix哲学"(https://en.wikipedia.org/wiki/Pipeline_%28Unix%29)。 - Unix“一切皆文件”(https://en.wikipedia.org/wiki/Everything_is_a_file)——这种简化抽象使得无关工具得以协同工作。 - C语言的`gets()`函数(https://man7.org/linux/man-pages/man3/gets.3.html)——该API固有安全性缺陷如此严重,最终被移出语言标准。 - Java受检异常(https://en.wikipedia.org/wiki/Exception_handling_%28programming%29#Checked_exceptions)——这一刻意的安全特性演变为该语言设计史最长的争议之一。 - JavaScript的10日诞生记(https://en.wikipedia.org/wiki/JavaScript#Creation_at_Netscape)——布兰登·艾奇(完整混蛋(https://en.wikipedia.org/wiki/Brendan_Eich#Appointment_to_CEO_and_resignation)且加密货币推销者(https://en.wikipedia.org/wiki/Brendan_Eich#Brave_Software))仓促的实现留下了影响Web数十年的特性怪癖。 - 浏览器“怪异模式”(https://en.wikipedia.org/wiki/Quirks_mode)——为兼容性刻意保留旧缺陷成为Web发展必需。 - 《Goto语句有害论》(https://en.wikipedia.org/wiki/Goto#Criticism)——迪杰斯特拉的短文点燃了结构化编程革命。 - 网景重写事件(https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/)——抛弃旧浏览器代码成为全面重写的经典警示案例。 - SQLite测试文化(https://sqlite.org/testing.html)——异常完备的测试体系奠定了其可靠性声誉的核心。 - Erlang的“任其崩溃”理念(https://en.wikipedia.org/wiki/Erlang_%28programming_language%29#%22Let_it_crash%22_coding_style)——基于故障而非杜绝故障来设计系统。 - Smalltalk的“消息传递”(https://en.wikipedia.org/wiki/Smalltalk#History)——面向对象编程源于比类与继承更丰富的思想体系。 - Lisp垃圾回收器(https://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29#Overview)——这项曾属激进的自动内存管理技术,数十年后成为主流。 - Algol 60报告(https://en.wikipedia.org/wiki/ALGOL_60)——异常精确的语言规范影响了数代编程语言设计。 - C++“零开销原则”(https://en.wikipedia.org/wiki/C%2B%2B#Language)——抽象不应产生超出手动编写底层代码的成本。 - Rust借用检查器(https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html)——将内存安全规则移入类型系统,挑战了系统编程的传统认知。 - 航天飞机软件(https://www.nationalacademies.org/read/5018/chapter/4#11)——以著名保守的工程方法实现了极低的缺陷率。《航天飞机飞行软件的遗产》(https://ntrs.nasa.gov/api/citations/20110014946/downloads/20110014946.pdf)是一份83页的文档。 - 丰田意外加速软件诉讼案(https://en.wikipedia.org/wiki/2009%E2%80%932011_Toyota_vehicle_recalls)——揭露嵌入式代码复杂化如何演变为安全问题。 - 千年虫问题(https://en.wikipedia.org/wiki/Year_2000_problem)——两位数年份简写在数十年后引发了大规模昂贵的维护作业。天啊,如今30岁的人已不记得Y2K了。我真是老了。 - 2038年问题(https://en.wikipedia.org/wiki/Year_2038_problem)——Unix的32位时间表示用不同整数重复着相同教训。 - 闰秒缺陷(https://en.wikipedia.org/wiki/Leap_second#Problems)——看似无害的时间假设多次导致大型系统崩溃。 - Debian OpenSSL漏洞(https://en.wikipedia.org/wiki/Random_number_generator_attack#Debian_OpenSSL)——移除看似异常的“未初始化”代码严重削弱了随机数生成能力。 - 苹果`goto fail`漏洞(https://en.wikipedia.org/wiki/Unreachable_code#goto_fail_bug)——重复的语句绕过了TLS证书验证。 - left-pad事件(https://en.wikipedia.org/wiki/Npm_left-pad_incident)——删除11行的npm包暂时破坏了JavaScript生态系统的大部分功能。 - Log4Shell漏洞(https://en.wikipedia.org/wiki/Log4Shell)——便捷的日志功能组合成了灾难性的远程代码执行漏洞。 - The DAO黑客事件(https://en.wikipedia.org/wiki/The_DAO)——软件行为覆盖了人类意图,迫使以太坊进行争议性分叉。 - Excel的1900闰年缺陷(https://en.wikipedia.org/wiki/Leap_year_problem#Occurrences)——为兼容Lotus 1-2-3而有意保留。 - Excel基因名转换错误(https://en.wikipedia.org/wiki/Microsoft_Excel#Conversion_problems)——自动日期转换静默修改了科学数据集多年。 - 海勒姆定律(https://www.hyrumslaw.com/)——用户基数足够大时,每个可观察行为都会成为某些人的依赖。当然,关于此概念有篇XKCD漫画(https://xkcd.com/1172/)。 - 波斯特尔法则(https://en.wikipedia.org/wiki/Robustness_principle)——“对接受的内容保持宽容”曾促进互操作性,后因安全原因引发争议。(我个人完全不赞同这种观点。) - 格林斯潘第十定律(https://en.wikipedia.org/wiki/Greenspun%27s_tenth_rule)——复杂程序往往偶然重新发明了半套Common Lisp。 - 康威定律(https://en.wikipedia.org/wiki/Conway%27s_law)——软件架构往往映射其组织的沟通结构。 - 盖尔定律(https://en.wikipedia.org/wiki/John_Gall_%28author%29#Gall's_law)——复杂可运行系统通常从简单可运行系统演化而来,而非源于宏伟设计。 - “更糟即更好”(https://en.wikipedia.org/wiki/Worse_is_better)——理查德·加布里埃尔主张实现简单性可能胜过理论完美性。维基百科词条还链接了《UNIX仇恨者手册》(https://en.wikipedia.org/wiki/The_UNIX-HATERS_Handbook)。 - 第二系统效应(https://en.wikipedia.org/wiki/Second-system_effect)——成功的工程师常过度设计下一个项目。 - 人月神话(https://en.wikipedia.org/wiki/The_Mythical_Man-Month)——向延期的软件项目增加人手可能使其更加延期。 - NASA“十的幂次方”准则(https://en.wikipedia.org/wiki/The_Power_of_10%3A_Rules_for_Developing_Safety-Critical_Code)——针对安全关键软件提出的极端编码限制。 - 《毁灭战士》源代码(https://en.wikipedia.org/wiki/Doom_engine)——紧凑务实的工程成为游戏系统架构的经典研究案例。让我想起CoRecursive播客的《DOOMed to Fail: A Horror Story》(https://corecursive.com/doomed-to-fail-with-burger-becky/)剧集,嘉宾是丽贝卡·海涅曼(安息)。 - 《雷神之锤》快速平方根倒数算法(https://en.wikipedia.org/wiki/Fast_inverse_square_root)——带有神秘魔法常数的传奇性位级优化。 - Git的诞生(https://git-scm.com/book/ms/v2/Getting-Started-A-Short-History-of-Git)——林纳斯·托瓦兹在失去BitKeeper访问权限后迅速构建了首个版本。 - Git的基于内容寻址设计(https://git-scm.com/book/en/v2/Git-Internals-Git-Objects)——通过哈希处理对象使分布式版本控制异常稳健。 - Plan 9操作系统(https://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs)——许多优雅的Unix思想被彻底重构,但商业采用率始终低迷。 - TCP拥塞崩溃(https://en.wikipedia.org/wiki/Network_congestion#Congestive_collapse)——互联网在范·雅各布森的拥塞控制算法出现前几近崩溃。 - 域名系统(https://en.wikipedia.org/wiki/Domain_Name_System)——用分布式层级系统取代集中维护的hosts文件,实现了互联网规模的命名体系。 - 亚马逊Dynamo系统(https://en.wikipedia.org/wiki/Amazon_DynamoDB)(及系统论文(https://www.amazon.science/publications/dynamo-amazons-highly-available-key-value-store))——接受最终一致性推动了现代分布式数据库设计的普及。 - 谷歌MapReduce框架(https://en.wikipedia.org/wiki/MapReduce)(及系统论文(https://research.google/pubs/mapreduce-simplified-data-processing-on-large-clusters/))——简洁的编程模型使海量分布式计算变得可行。 - 莱斯利·兰伯特的Paxos论文(https://en.wikipedia.org/wiki/Paxos_%28computer_science%29)——这一基础共识算法以令读者难以理解而闻名。 - Raft算法(https://en.wikipedia.org/wiki/Raft_(algorithm))(原始论文(https://raft.github.io/raft.pdf))——明确设计为在不显著削弱安全性前提下提升共识算法的可理解性。 - 拜占庭将军问题(https://www.microsoft.com/en-us/research/publication/byzantine-generals-problem/)——这一思想实验成为容错分布式系统的理论基础。 - CAP定理(https://en.wikipedia.org/wiki/CAP_theorem)——形式化了许多数据库设计此前非正式处理的不可避免的权衡取舍。

相似文章

一些有趣的软件趣闻

Hillel Wayne — Computer Things

一系列有趣且鲜为人知的软件趣闻,包括在康威生命游戏中实现的俄罗斯方块、Vim 的图灵完备性以及反斜杠字符的历史。

Unix中的古怪注释和奇怪行为

Lobsters Hottest

丹尼斯·里奇讲述了早期Unix源代码中一些古怪的错误信息和注释,包括著名的“values of β will give rise to dom!”以及那句不可思议的注释“You are not expected to understand this.”