科学・技術
コンピュータサイエンスにおける興味深い物語
Intriguing Stories in Computer Science (inventwithpython.com)
要約
コンピュータサイエンスとソフトウェア開発の歴史における数多くの逸話を紹介しています。Tony Hoareの「10億ドルの間違い」であるnull参照の導入から、Ariane 5の事故、Mars Climate Orbiterの単位ミス、Therac-25のレースコンディション、Knight Capitalの損失、Patriotミサイルの失敗など、バグや設計ミスに起因する破滅的な出来事、そしてUnixパイプやErlangの「let it crash」のような革新的な設計思想まで、幅広い事例が網羅されています。
全文翻訳
私は今…ある年齢になりました…そして、コンピュータサイエンスとソフトウェア開発の歴史には、私が聞いたことのない多くの逸話があります。もっとあるのではないかと思いました。
LLMにリストを作成させました(慎重にレビューし、多くのリンクを修正しました)。これらの多くは以前に聞いたことがありましたが、いくつか新しいものもありました。
興味があればクリックしてみてください。
ほとんどのリンクはWikipediaに飛びますが、少なくともスラップコンテンツファームのウェブサイトには行かないようにしました。
私が使用したプロンプトは、大まかに言うと、「Tony Hoareは「null」について、それは彼の10億ドルの間違いだというコメントをしています。プログラミングやソフトウェアデザインに関する、肯定的または否定的な、他に興味深い物語はありますか?」というものでした(ただし、リストの冒頭はコンピュータのグリッチの話に支配されており、物語よりも概念に逸れていくようです)。
Raymond Chenは、Microsoftのベテランエンジニアであり、彼のブログThe Old New Thing(および同名の書籍)には、たくさんの素晴らしい物語があります。
Joel SpolskyのブログJoel on Softwareも、物語とガイダンスの古典的な情報源です。
Tony Hoareの「10億ドルの間違い」— null参照の発明。
Ariane 5 Flight 501 — 再利用された整数変換オーバーフローがロケットを破壊しました。
Mars Climate Orbiter — メートル法とヤードポンド法の単位の不一致により宇宙船が失われました。
Therac-25 — レースコンディションと不十分な安全設計により、致死的な放射線過剰投与を引き起こしました。
Knight Capital — デプロイの失敗により、45分で約4億4000万ドルを失いました。
Patriotミサイル失敗 — 浮動小数点演算のタイミングエラーの蓄積が28人の死につながりました。
この記事は、Wikipediaの致死性自律兵器の記事にもリンクしています。
Pentium FDIVバグ — 小さなルックアップテーブルのエラーにより、不正確な除算結果が生じ、コンピュータチップの最初の完全リコールにつながり、4億7500万ドルの費用がかかりました。
Heartbleed — バウンズチェックの欠落により、サーバーメモリが任意に公開されました。
Morris worm — 自己複製ソフトウェアの実験が、初期のインターネットの大部分を誤って麻痺させました。
AT&Tの1990年の障害 — 1つの誤った復旧パスが、電話交換機の連鎖的な障害を引き起こしました。
(Software bugsのリスト全体が興味深いです。)
Cloudflareの2019年の正規表現障害 — 壊滅的なバックトラッキングにより、ネットワーク全体でCPUが消費されました。
GitLabの2017年のデータベースインシデント — 管理者が復旧中に本番データを誤って削除しました。
Unixパイプ — Doug McIlroyのコンポーザビリティのアイデアは、コンピューティングで最も永続的なデザインパターンの1つとなり、「Unix哲学」としても知られています。
Unixの「すべてはファイルである」— 無関係なツールが連携できるようにした、単純化された抽象化。
C言語のgets() — あまりにも本質的に安全でないAPIであり、最終的に言語標準から削除されました。
Javaのチェック例外 — 言語で最も長く続く設計論争の1つとなった、意図的な安全機能。
JavaScriptの10日間の作成 — 完全なクソ野郎で暗号通貨の詐欺師であるBrendan Eichの急いで実装した結果、ウェブの形成に数十年間影響を与えた奇妙な癖が残りました。
ブラウザの「quirks mode」— 意図的に古いバグを保持することが、ウェブの互換性のために必要になりました。
Gotoは有害と見なされる — Dijkstraの短い手紙は、構造化プログラミング革命を燃え上がらせるのに役立ちました。
Netscapeのリライト — 古いブラウザコードを捨てることが、完全なリライトに関する代表的な警告となりました。
SQLiteのテスト文化 — 異常に徹底したテストシステムが、信頼性に対するその評判の中心となりました。
Erlangの「let it crash」— すべての障害を防ごうとするのではなく、障害を中心にシステムを設計すること。
Smalltalkの「メッセージパッシング」— オブジェクト指向プログラミングは、クラスや継承よりもはるかに豊かなアイデアから生まれました。
Lispのガベージコレクタ — 自動メモリ管理は、かつては急進的でしたが、数十年の後に主流になりました。
Algol 60レポート — 異常に正確な言語仕様は、世代のプログラミング言語設計に影響を与えました。
C++の「ゼロオーバーヘッド原則」— 抽象化は、手書きの低レベルコードがかかるコスト以外には何もかからないはずです。
Rustのborrow checker — メモリ安全性のルールを型システムに移行させることは、システムプログラミングに関する仮定に疑問を投げかけました。
スペースシャトルソフトウェア — 有名な保守的なエンジニアリングにより、異常に低い欠陥率を達成しました。
「スペースシャトル飛行ソフトウェアの遺産」は83ページの文書です。
トヨタの意図しない加速ソフトウェア訴訟 — 組み込みコードがいかに絡み合い、安全性の問題になりうるかを明らかにしました。
Y2K問題 — 2桁の年表記のショートカットが、数十年にわたる巨大で高価なメンテナンス作業を生み出しました。
ああ、神様、今日30歳の人はY2Kを覚えていません。ああ、神様、私はとても年を取りました。
2038年問題 — Unixの32ビット時刻表現が、異なる整数で同じ教訓を繰り返します。
うるう秒のバグ — 時間に関する無害に見える仮定が、繰り返し大規模システムをクラッシュさせてきました。
DebianのOpenSSLバグ — 「初期化されていない」コードを削除したことで、乱数生成が大幅に弱体化しました。
Appleのgoto failバグ — 重複した行がTLS証明書の検証をバイパスしました。
Left-pad — 11行のnpmパッケージを削除したことで、JavaScriptエコシステムの大部分が一時的に壊れました。
Log4Shell — 便利なロギング機能が、壊滅的なリモートコード実行脆弱性に組み込まれました。
DAOハック — ソフトウェアの動作が人間の意図を上回り、Ethereumに論争の的となるフォークを強いました。
Excelの1900年うるう年バグ — Lotus 1-2-3との互換性のために意図的に保持されました。
Excelの遺伝子名破損 — 自動日付変換が、長年にわたり科学的データセットを静かに変更しました。
Hyrumの法則 — 十分なユーザーがいれば、あらゆる観察可能な動作が誰かの依存関係になります。
もちろん、この概念に関するXKCDコミックがあります。
Postelの法則 — 「受け入れることには寛大であれ」は相互運用性を助けましたが、セキュリティ上の理由から論争の的となりました。(私は個人的に、その考えに全く同意しません。)
Greenspunの第10法則 — 複雑なプログラムは、しばしばCommon Lispの半分を誤って再発明します。
Conwayの法則 — ソフトウェアアーキテクチャは、組織のコミュニケーション構造を反映する傾向があります。
Gallの法則 — 複雑で機能するシステムは、通常、壮大な設計からではなく、単純で機能するシステムから進化します。
Worse is Better — 実装の単純さが理論的な完璧さよりも優れているというRichard Gabrielの議論。
Wikipediaの記事は、The UNIX-HATERS Handbookの記事にもリンクしています。
Second-System Effect — 成功したエンジニアは、しばしば次のプロジェクトで過剰設計します。
The Mythical Man-Month — 遅れているソフトウェアプロジェクトに人員を追加すると、さらに遅れる可能性があります。
NASAの「Power of Ten」ルール — 安全性が重要なソフトウェアのために提案された極端なコーディング制限。
Doomのソースコード — コンパクトで実用的なエンジニアリングは、ゲームシステムアーキテクチャの古典的な研究となりました。
CoRecursiveポッドキャストの「DOOMed to Fail: A Horror Story」エピソード(ゲストはRebecca Heineman RIP)を思い出させます。
Quakeの高速逆平方根 — 神秘的なマジックコンスタントを持つ、伝説的なビットレベルの最適化。
Gitの作成 — Linus Torvaldsは、BitKeeperへのアクセスを失った後、最初のバージョンを迅速に構築しました。
Gitのコンテンツアドレス指定設計 — オブジェクトをハッシュで扱うことで、分散バージョン管理が異常に堅牢になりました。
Plan 9 — 多くのエレガントなUnixのアイデアがクリーンに再考されましたが、商業的な採用はごくわずかでした。
TCP輻輳崩壊 — Van Jacobsonの輻輳制御アルゴリズムが登場する前に、インターネットはほぼ溶けていました。
DNS — 中央管理されていたhostsファイルを分散階層システムに置き換えることで、インターネットスケールの命名が可能になりました。
AmazonのDynamo(およびシステムに関する論文)— 結果整合性を受け入れることで、現代の分散データベース設計が普及するのを助けました。
GoogleのMapReduce(およびシステムに関する論文)— 単純なプログラミングモデルにより、巨大な分散計算が管理可能になりました。
Leslie LamportのPaxos論文 — 基礎的な合意アルゴリズムは、読者にとって理解が非常に困難であることが有名でした。
Raft(元の論文)— 合意を大幅に弱めることなく、理解しやすくするために明示的に設計されました。
ビザンチン将軍問題 — 思考実験が、耐故障分散システムの基礎となりました。
CAP定理 — 多くのデータベース設計が以前に経験していた、避けられないトレードオフを形式化しました。