エラーが出たときは、早めに異常終了させること

エラーが出たときは、早めに異常終了させること

この考え方は、トヨタでは、自働化と呼ばれているものであるが、
さまざまなところで有用だと思われる大切な考え方のひとつだと思う。

また、逆に上記が守られていないことで、いつも被害をこうむっている
事柄でもある。

1.被害例:秘文

先日、私のOutlookの大切なデータが3ヶ月分(6月〜8月)消えてしまった。
プロジェクトの終わりだったからまだよかったものの、メーラの復旧作業にかなり
時間がかかってしまった。
秘文という暗号化ソフトが、3ギガ以上のデータを暗号化解除時に壊して
しまったからだ。私はこまめにバックアップをとっていたのだが、いままでも
ずっと、外部保存時には3ギガを越えた時点から、データがこわれつづけており、
バックアップデータが取られていなかったということだ。

はっきり言って、こんなレベルのソフトを出荷していることが問題だが、
それでも、もし、ファイルを壊した時点で、エラーにさえなってくれれば、
こんなことはおきなかった。
秘文開発者に言いたいのだが、壊れてしまうのはいいから、障害把握時点で
せめて、たとえばファイルが壊れた旨エラーを出す仕様に早急に変更して
ソフトウェアのUPDATEを行えなかったのかといいたい。

それさえおこなわれていれば、こんなことはおきなかった。ファイルを
分割する方法はいくらだってあるんだから。


2.被害例:プロジェクト開発

デザインレビューが何個も通ってしまったが、終盤になってだめなことが
わかり大騒ぎになった某プロジェクト。なぜ、デザインレビューが
通ってしまっているのか、担当レベルは、皆、不思議がっていたようだ。
そして、問題が起きて、やっぱりと思ったそうだ。
そんなことってあちこちにある。

エラーが出たときは、早めに異常終了させることが大切なのだ。
早めに失敗すれば、全体として成功させることができる可能性がたかまるのだから。


3.成功例:ソフト開発のアサーション、テスト

私がソフト開発をするとき、あるいは、指導するとき、大切にすることの
ひとつが、なにか想定外のことがあったときに、早急に異常を発信させる
仕組み(コンパイルエラー・実行時エラー)を作ることだ。


たとえば、開発されていない箇所、開発途中の箇所にはかならず
throw new AssertionError();
を入れる。Eclipseはデフォルトで自動生成したメソッドに
//TODO this is auto genelated code (だったかな?)
というような文字を入れるが、私たちは、
throw new AssertionError();
をデフォルトで入れている。これは一例に過ぎないが、とにかく、徹底的に
何か異常があったらエラーが起きるようにしている。

単体テストや、静的解析ツールを頻繁に実行させることも、同じ観点から
大切にしている。

4.被害例:Swing(Java

上記は、ひとつの反面教師がいて、行っていることでもある。
JavaGUIフレームワークである、Swingは、ひとつの反面教師である。
Swingは、たしかに、それまでのGUIをくらべて革命的だったし、その点開発者には尊敬の念を
払いたいと思うが、いただけないのが、AWTを引き継いだ結果として、フレームワーク
の設計として、まずい形になってしまっており(これは下位互換性確保のために
しかたないと理解を試みることはできる)、まちがった使い方をしやすいように
なっているにもかかわらず、間違って使い方をしていてもなんとか動かして
しまうことである。
何とか動かしてしまうので、一見バグに気づかない。しかし、ちょっとした動作
不良が起きて、開発を続けていくうちに表面化してしまうことが多々あり、
そんなときは、長時間悩み続ける厄介なバグになってしまう。
自分も、苦しめられたが、他メンバから相談を受けた厄介なバグも、
原因が結局Swingのこの性質から来ているということが何回もあった。

ただ、そのたびにあるべき、フレームワーク像のあり方をメンバと話共有していく
ことができたのはよかったと思おう。フレームワークはまずい使われ方を
したら即座に異常終了すべきである。もちろん、丁寧なエラー文をだして
終了するべきであることはいうまでもない。


たとえば、運用オプションをつければ、運用時には、まずい書き方をしても、
何とか動かしてくれるのはありがたい。しかし、開発時には、まずい書き方を
したら即座にエラーを出して停止してもらいたいと思う。せめて、警告を
出してもらいたい。
そして、デフォルトは、即時エラーの振る舞いであるべきだと思う。

5.失敗例:友人の株

株で塩づけ担って大損してしまった友人がいる。
これも、はやめに異常終了させられなかったから起きてしまったのだと思う。
同時に、私の尊敬する友人たちが大損をしたということで
エラーが出たときは、早めに異常終了させるということがいかに
難しいかということも思い知らされた。



OUTLOOKの一件で、また苦しめられて、エラーが出たときは、
早めに異常終了させることをあらためて、心に誓った。
実際には難しいのだが、やっぱりやらなければならないのだ。