アポロ11号の「月面着陸シーケンス」をMermaid.jsで完全再現してみた
人類史上最も複雑で、失敗が許されないワークフロー。NASAのフライトプランをMermaidのState Diagramに書き起こして分かった「堅牢性」の秘密。
「失敗は選択肢にない(Failure is not an option)」
NASAのフライトディレクター、ジーン・クランツの言葉として有名ですが、実際のシステム開発において「絶対に失敗しない」ことは至難の業です。
しかし、1969年。我々は当時の貧弱なコンピュータ(スマホの数千分の一の性能)で、月面着陸を成功させました。
なぜ可能だったのか? その秘密は**「徹底的に設計されたステートマシン(状態遷移)」**にあります。
この記事では、アポロ11号の全行程をMermaid.jsの stateDiagram で再現し、その堅牢な設計美学に迫ります。
再現:アポロ11号フライトプラン
打ち上げから月面着陸、そして地球帰還まで。 一つのミスが命取りになる、緊張感あふれるシーケンスです。
%%{init: {
'theme': 'neutral',
'themeVariables': {
'fontFamily': 'Courier New',
'fontSize': '14px',
'stateBorder': '#333',
'stateBackground': '#f9f9f9'
}
}}%%
stateDiagram-v2
direction TB
[*] --> Launch: T-0 Liftoff
state "Phase 1: Earth Ascent" as P1 {
Launch --> Stage1_Sep: "+2:42"
Stage1_Sep --> Stage2_Ig: Ignition
Stage2_Ig --> Stage2_Sep: "+9:12"
Stage2_Sep --> Stage3_Ig: Ignition
Stage3_Ig --> EarthOrbit: "Parking Orbit (1.5 revs)"
}
P1 --> TLI: "Trans-Lunar Injection"
state "Phase 2: Translunar Coast" as P2 {
TLI --> CSM_Sep: Separation
CSM_Sep --> Docking: "Transposition & Docking"
Docking --> Extract_LM: "Extract Lunar Module"
Extract_LM --> Correction: "Midcourse Correction"
}
P2 --> LOI: "Lunar Orbit Insertion"
state "Phase 3: The Landing" as P3 {
LOI --> Undocking: Eagle Separates
Undocking --> DOI: "Descent Orbit Insertion"
DOI --> PDI: "Powered Descent Initiation"
PDI --> Approach: "High Gate / Low Gate"
state "Terminal Descent" as Landing {
Approach --> BoulderField: "Alarm 1202"
BoulderField --> ManualControl: "Armstrong Takes Over"
ManualControl --> Contact: "Contact Light"
Contact --> EngineStop: "Shutdown"
}
}
P3 --> Surface: "The Eagle has Landed"
Surface --> EVA: "One Small Step"
EVA --> Sleep: "Rest Period"
Sleep --> Ascent: "Lunar Liftoff"
state "Phase 4: Return" as P4 {
Ascent --> Rendezvous: "Docking with Columbia"
Rendezvous --> Jettison_LM: "Goodbye Eagle"
Jettison_LM --> TEI: "Trans-Earth Injection"
}
P4 --> Splashdown: "Pacific Ocean"
Splashdown --> [*]
分析:1202アラームと手動オーバーライド
図中の “Terminal Descent” (最終降下フェーズ)にご注目ください。
stateDiagram-v2
direction TB
state "Terminal Descent" as Landing {
Approach --> BoulderField: "Alarm 1202"
BoulderField --> ManualControl: Armstrong Takes Over
ManualControl --> Contact: "Contact Light"
Contact --> EngineStop: "Shutdown"
}
着陸直前、アポロ誘導コンピュータ(AGC)は処理落ちを起こし、悪名高い “1202 Alarm” を発しました。通常のソフトウェアならここでクラッシュするか、再起動ループに陥って墜落していたでしょう。
しかし、AGCは違いました。 **「優先度の低いタスクを捨て、姿勢制御とエンジン噴射だけを維持する」**という設計になっていたのです。
さらに、アームストロング船長は即座に**Manual Control(手動操縦)**に切り替えました。予定されていた着陸地点が岩だらけ(BoulderField)だと気づき、燃料ギリギリまで飛行して安全な平地を探したのです。
現代のシステムへの教訓
| 項目 | アポロ11号 | 現代のシステム |
|---|---|---|
| 状態管理 | 明確なフェーズ分け(State Machine) | 状態が曖昧(Stateful/Statelessが混在) |
| エラー処理 | 重要機能のみ維持(Graceful Degradation) | 全体停止(Crash) |
| 人間介入 | 最終判断は人間(Human-in-the-loop) | 自動化過信(Human-out-of-the-loop) |
[!TIP] アポロの成功は、完璧な機械があったからではなく、**「機械の限界を知り、人間が補完するワークフロー」**が設計されていたからです。 これは現代のAIエージェント設計(Human-in-the-loop)にも通じる真理です。
結論:ステート図を描こう
複雑なワークフローを設計するとき、私たちはつい「ハッピーパス(成功ルート)」だけを考えがちです。 しかし、アポロのエンジニアたちは、ありとあらゆる失敗ルートを想定し、それをステート図に落とし込みました。
Mermaid.jsを使えば、この「状態遷移」を簡単に可視化できます。 あなたのシステムには、“1202 Alarm” が鳴ったときの脱出口は用意されていますか?
“Here men from the planet Earth first set foot upon the Moon. We came in peace for all mankind.” — Apollo 11 Plaque