【47】現実の世界にようこそ

グレガー・ホープ

 エンジニア、特に 0 と 1 の世界に住んでいるソフトウェアエンジニアは、正確さを好みます。彼らは 1 か 0、真か偽、イエスかノーの 2 分法に慣れています。すべては明快で一貫性が取れており、その正しさは外部キー制約、アトミックなトランザクション、チェックサムによって保証されています。

 しかし、現実の世界はそうすっぽりとは割り切れません。発注したかと思うとすぐ後で取り消す顧客がいます。小切手は不渡りになりますし、手紙はなくなります。支払いは遅れ、約束は守られません。データ入力エラーは、非常に頻繁に起きます。長ったらしい 1 次元的な「プロセス」に機能をまとめればプログラムしやすく、多くのデベロッパーにはより「論理的」に見えるかもしれませんが、ユーザーはそのようなものではなく、同時に多くの機能にアクセスできるユーザーインターフェイスを好みます。ユーザーは、プログラムのフロー制御をコールスタックに任せるのではなく、自ら介入しようとするのです。

 さらに悪いことに、広い範囲に分散したシステムは、まったく新しいタイプの不一致を相手にしなければなりません。サービスにアクセスできなかったり、あらかじめ通知せずに変更が行われたり、トランザクションの保証が得られなかったりすることが平気で行われます。数千台のマシンでアプリケーションを実行すると、エラーは「もし」の問題ではなく「いつ」の問題になってしまいます。これらのシステムは疎結合で非同期的に並行実行されており、従来のトランザクションのセマンティックスには従わないのです。きっと現実逃避に走りたくなるはずです。

 コンピューター科学者のすばらしき新世界が崩壊しようとしている今、私たちはどうすればよいのでしょうか。こういう場合の常として、解決のために大きな 1 歩を踏み出すためには、まず問題を意識することです。古き良き予測可能なコールスタック・アーキテクチャーには、もうさよならしましょう。必要に応じてコンテキストを回復しながら、いつでもどんな順序でもイベントに応答できるようにするのです。メソッドを 1 つずつ呼び出すのではなく、非同期で並行的にリクエストを発行しましょう。完全なカオスになってしまうのを避けるために、イベント駆動型プロセスチェーンまたはステートモデルを使ってアプリケーションをモデリングします。失敗を埋め合わせたり、もう 1 度やってみたり、試験的な処理をしてみたりして、エラーと折り合いをつけるのです。

 想像以上に恐ろしい世界でしょうか? しかし、現実の世界は、ずっと前から同じ問題に取り組んできているのです。遅れた手紙、破られた約束、行き違いになったメッセージ、間違った口座への支払いなど、例を挙げればきりがありません。それに合わせて、人々は手紙を送り直したり、不良債権を償却したり、「すでに支払いを済ませている場合には支払いの催促を無視してください」というメッセージを入れたりしなければなりませんでした。ですから、あなたの頭痛のために現実世界をただ非難するのではなく、解決方法を探す場所として現実世界を活用してください。いずれにしても、スターバックスは 2 フェーズコミットなどしません。現実の世界へょうこそ!