怖くないほうに倒す

プログラムを書いてなにかを自動化しようとするとききは、正常な動作だけでなく、異常があったときに何が起こるかもあらかじめ想定します。何の異常も起こりえないほど理想的な制作ができるのが理想ですが、必ずしもそうはいきません。何より、このプログラムに何を入力されるか、どんなデータが与えられるか、といった条件は完全にはコントロールできませんので、どんな場合においても、なんらかのエラーが発生する想定は欠かせません。

数字であるべき場所に数以外の文字が入ってきた、というのが例えば予想されるエラーですが、こういうときにどう振る舞って欲しいかは、そのプログラムで自動化した仕事がどういう性質のものかによります。たぶん、許されないデータを検出した時点で、「このデータにエラーがあるので、前の段階からやりなおしてください」といったエラーメッセージを表示して、実行が中断されてしまうべき、というあたりが最もありそうなところです。データの中でもそれほど重要でない部分なら、代わりにゼロが入ってきたものとみなして処理を続行する、なんて対処も、候補に入るかもしれません。

他にも、結果を出力しようとした場所がすでに容量オーバーだとか、作業中にメモリがいっぱいになってしまうとか、通信すべき相手が返事を返してくれないとか、あらかじめ何もかも想定しておくには困難なくらいに、色々な種類の異常が起こりえます。また、実行した人がこれを無理矢理「閉じるボタン」で終了させてしまう、というのもありえます。ともかく、こういった状況が起これば、プログラムはやむを得ず終了するのですが、そのときにも、あとで回復するときに困らないように設計しておくよう努めています。

異常な終了をしたせいで、すでに正常に作られたデータが巻き添えで消失してしまった、とか、データベースが中途半端に更新されて不整合な状態になってしまった、とか、最悪のパターンではデータベースが壊れてしまった、とか、そういうのが起こることを避けないといけません。「倒れるかもしれないけど、最悪ではない方向に倒れるようにしておく」ということです。そういうことを実現するための実装上のテクニックが色々と存在するのですが、こうすれば万全、みたいな公式があるわけではないので、何が起こりうるか、何が起こったら困るか、というのをよく想像しながら設計することが必要となります。

ちっとも関係ない話になってしまいますが、インスタントコーヒーを作るとき、適量よりたくさんのパウダーを入れてしまうと、苦くてまずいコーヒーができあがります。筆者は薄いほうがまだマシだと思っているので、パウダーを目分量で入れるときには、直感よりも2割減くらいの量にします。もし失敗するにしても、コーヒーが濃すぎて台無しになってしまう、という方向に倒れないようにしています。これは別に賢明なことをしているという話ではなくて、ちゃんと計ってパウダーと熱湯を入れなさい、という指示を守らずサボっているだけですね。