たった一つのハイフンの欠落が、打ち上げからわずか数秒後に数百万ドル相当のロケットを破壊しました。丸め誤差が証券取引所の開場をほぼクラッシュさせるところでした。ソフトウェアの歴史上最も高くついたバグは、ほとんど決してドラマチックで複雑な誤りではありません — それらは小さく見逃しやすい誤りが、たまたま正確に最悪の場所にあったものです。
GCSE基礎
マリナー1号:ロケットを犠牲にしたハイフン
1962年、NASAのマリナー1号探査機は、その誘導ソフトウェアが極めて誤った操舵指令を出し始めた後、打ち上げからわずか5分足らずで地上管制によって破壊されました。根本原因は、手で書き写された誘導方程式の中のたった一つの文字の欠落にまで遡ります — 小さなセンサーの変動を平均化することを意図した平滑化の式が、代わりに一つ一つの小さな変動を本物で緊急の軌道修正として扱ってしまい、ロケットを予定された経路から逸脱させました。
一つの文字の欠落が、平滑化の式を、センサーのわずかな変動をすべて本物の操舵指令として読み取ってしまうものに変えました — わずかな違いが壊滅的な結果をもたらしたのです。
なぜ小さなバグが最大の大災害を引き起こすのか
大きく明らかなバグは通常すぐに見つかります — プログラムが即座にクラッシュするか、テスト中に誰かが明らかに間違った答えに気づきます。実際の被害を引き起こすバグは、ほとんど常にテストを生き延びて本番環境に届くほど微妙なものです:ループの中の一つずれた誤り、通常でない値でしか壊れない丸めの前提、99.9%の時間は正しく残りの時間は壊滅的に間違っている条件などです。誤りが小さく目立たないほど、隠れられる場所が多くなります。
試験形式の問題
あるプログラマーが、リストの10個すべての項目(インデックス0から9)を処理するためのループを書こうとしたが、「for i in range(0, 10)」の代わりに「for i in range(1, 10)」と書いてしまった。これがどのような種類のバグであり、その影響がどうなるかを説明しなさい。 [3点]
模範解答と採点基準を表示
- これはオフバイワンエラー(off-by-one error)である (1点)
- インデックスは0から始まるため、書かれた通りのループは1から始まり、インデックス0の項目を決して処理しない — リストの最初の項目が気づかれずにスキップされる (1点)
- 最後の項目(インデックス9)はrange(1, 10)に9が含まれているため、依然として正しく処理される — プログラムはクラッシュせずに実行され、ただ静かに不完全な結果を生成するだけである (1点)
採点者が重視する点: 「オフバイワンエラー」の一般的な定義を述べるだけでなく、意図した範囲と実際に書かれた範囲を比較して、正確にどのインデックスが欠落しているかを突き止めること。
よくある間違い: プログラムがクラッシュすると仮定すること、または最後の項目がスキップされると仮定すること — この特定のバージョンでは最初の項目がスキップされ、クラッシュせずに実行される。これこそがオフバイワンエラーを危険にしている理由である:それらは必ずしも自ら知らせてはくれない。
こうした故障が実際に何を変えたのか
マリナー1号の故障はソフトウェア工学教育における標準的なケーススタディとなり、ミッションクリティカルなコードがどうレビューされるかに直接影響を与えました — 一つの書き写しの誤りが二度目の確認なしにいつか実際の誘導システムに届いてしまうかもしれないという考えこそ、現代のコードレビュー、自動化されたテスト、形式的検証が防ぐために存在するものです。すべての有名な歴史的バグは、ある本当の意味で、特定の工学的安全対策が今日存在する理由です。デバッグ、テスト、ソフトウェア工学の実践を、単なる試験内容ではなく本物の専門技能として説明してもらう必要があるなら、それはまさに私たちのGCSE情報科学の家庭教師が行っていることです — 完全な学習の道筋はこちらからご覧いただけます。
よくある質問
マリナー1号のハイフンのバグは本当にたった一文字だったのですか?
この話で最も繰り返し語られるバージョンは、誘導方程式の中のハイフンの欠落(あるいは元のFORTRAN記法ではオーバーバーの欠落)で、これによりロケットの誘導ソフトウェアが式を誤って解釈し、誤った操舵指令を出しました — ロケットは有人地域に墜落するのを防ぐため、打ち上げからわずか5分足らずで意図的に破壊されました。一部の歴史家は正確な技術的詳細について議論していますが、中心的な教訓 — 小さく見逃しやすい誤りが壊滅的な故障を引き起こす — はよく文書化されています。
なぜ「一つずれる」誤りはこれほど頻繁に起こるのですか?
コードの中で数を数えることはしばしば1からではなく0から始まるからです — リストの最初の要素は通常位置1ではなく位置0にあります — そして、ある方向かその逆に、ちょうど一つの位置分ずれたループや条件を書いてしまうのは極めて簡単です。これはプログラミング全体で最もよくあるバグのカテゴリーの一つです。まさに誤りがこれほど小さく、気づかずに犯しやすいからです。
今日、このようなバグが本番環境に届くのを実際に何が防いでいますか?
自動化されたテスト(コードを既知の期待される結果と照らし合わせて実行してから配布する)、コードレビュー(統合される前に別の人が論理を確認する)、そしてプログラムが実行される前でさえいくつかのカテゴリーの誤りを捕捉する、より厳密に型付けされた言語です。これらのどれも、ゼロバグを保証するものではありませんが、最も有名な歴史的な故障を引き起こしたこの種の小さな見逃しやすい誤りの圧倒的多数を捕捉します。
読者からの評価とレビュー
この記事を複数の観点から評価してください — あなたの意見は他の読者の助けになり、私たちの改善にもつながります。
この記事は役に立ちましたか?
ご感想をお聞かせください — 修正点、未解決の疑問、次に取り上げてほしいトピックなど。
直接話したいですか? ご都合のよい時間に無料のビデオ通話を予約できます。短い質問は15分、その他は30分です。時間はお住まいのタイムゾーンで表示されます。

著者について
Sudershan Soni
Mostak Servicesの創業者兼主任講師 — 数学・理科・情報科学・STEMの修士号を持つ講師であり、20年以上のプロフェッショナルとしての経験を持ちます。11+やGCSEからA-Levelおよびそれ以降まで、世界中の生徒をオンラインで指導しています。
プロフィール全文を読む