【08】すべてのものは、かならずエラーを起こす

マイケル・ナイガード

 ハードウェアはエラーを起こす可能性がありますので、予備を用意しますよね。こうすれば、1 つのハードウェアが壊れても、システム全体を止めないようにすることができます。しかし、ハードウェアが増えていますから、システムの中でどれか 1 つのハードウェアが壊れている時間はかえって長くなります。

 ソフトウェアもエラーを起こす可能性があります。アプリケーションはソフトウェアによってできていますから、エラーを起こすことがあります。モニターを追加すればアプリケーションにエラーが起きたかどうかはわかりますが、モニターもソフトウェアですから、それ自身がエラーを起こすことがあります。

 人間も誤りを犯します。私たちもエラーを起こすのです。ですから、私たちは行動、診断、工程を自動化します。自動化すると、人が関わることによるエラーは減りますが、手数を省いたことによるエラーは増えます。人間よりも多様な状況に対処できる自動化システムはありません。

 そこで、自動化システムにもモニターを追加することになります。しかし、ソフトウェアが増えれば、エラーが起きる場所は増えてしまいます。

 ネットワークはハードウェア、ソフトウェア、非常に長いケーブルから作られています。ですから、ネットワークもエラーを起こす可能性があります。大規模ネットワークでは、それぞれの要素は実用的な目的でも、状態空間としては無限になるため、たとえ動いたとしても予測不能になります。個々の機器が確実に動いたとしても、全体としてはカオス的なふるまいを示すのです。

 エラーの影響を緩和するために何かを導入するたびに、それが新しいエラーを増やしていきます。たとえば、クラスタリングソフトウェアを導入して、障害を起こしたサーバーから稼働サーバーにアプリケーションを移せるようになっても、クラスタの代理機能が異常を起こしたときに「スプリットプレインシンドローム」が発生するという新たなリスクが生まれます。

 スリーマイル島事故が、圧力の異常な上昇を防ぐために開いた加圧器逃し安全弁の故障によって起きたことは忘れてはならないことです。

 システムは確実にエラーを起こすという現実の前で、私たちに一体何ができるのでしょうか。

 まず、システムがさまざまな形でエラーを起こすことを受け入れることです。エラーが起きないという前提に立つと、エラーを吸収、コントロールすることができなくなります。エラーが起きることを受け入れたら、特定のエラーに対するシステムの対応を設計できます。カーエンジニアが、衝突したときに先にくしゃくしゃになって乗っている人を守る衝撃吸収ボディ構造を採るのと同じように、ソフトウェア・アーキテクトはエラーを吸収し、正常な部分を保護するセーフモードを作ることができます。

 セーフモードを作らなければ、予測不能で危険なエラーによって立ち往生することになるでしょう。