だいだひろ
朝,出勤中に車で橋を渡ります。早起きして車を降りて,この橋で日本海をボーっと眺めながらコーヒーを飲むのが私のリフレッシュ法。ありきたりですが,この業界にいるとこんな自然とのふれあいが力をくれるものです。こんな感じでSHIHOのヨガDVDも買って,すっかり浮世離れを気取っている私です。情けない。。。

 題名に気をつけていただきたい。「Microsoftのバグとの戦い」ではない。「Microsoftのバグ」との戦いだ。つまり「これはMicrosoftのバグだ!」という言いがかりとの戦いである。こう聞くと,「あぁ,駄目エンジニアとの戦いか」と思うあなたは,きっと高スキルエンジニア。そういう人ばかりだと助かる…わけではない。なぜなら,「これ,Microsoftのせいでしょ」と言いがかりをつけるのは,現場ではそれなりに権威のあるエンジニアであることも多いからだ。

 今回はこの辺のMicrosoftへの言いがかりが発生する構造を見ていきたいと思う。

finallyを通った後の例外です

 まずはわかりやすく駄目エンジニアから。

 これはもう数年前のお話し。.NETが出始めた頃で,最近サポートが切れて大騒ぎになっているVisual Basic(VB)からの移行を行っていた。今ならASP.NET AJAXとかもあるけど,このころは普通?にVisual Basic .NETでの実装に切り替えることに決まっていた。

 私がこのプロジェクトに参加したのは,システムをリリースした後,毎日定時になると処理が落ちるとの連絡を受けたからだ。設計段階の仕事を中座してこのトラブルの対策会議に出席した。トラブルが発生して半年たっても解決できなかったので,お客様の逆鱗に触れているとのこと。まずはトラブルの内容確認,ということで開発者にヒアリング。そうするとベンダー様の開発担当者が「.NET Frameworkのバグだ!こんなのをリリースするなんて信じられない」と絶叫している。どうしてそう思うのかを聞いて我々はのけぞった。

 なんとfinallyブロックを通過して処理が終了した後で例外が発生し,アプリケーションが落ちていると言う。発生している例外は,あるモジュールから呼び出されたモジュール内で発生し,その後で呼び出し元に戻り,アプリケーションが終了するとの説明。「そりゃー,大変だ。半年も解析できないわけだ」と思い,障害が発生している部分の処理フローを説明してもらい,そのあとソースコードを読んでみた。すると,このコードでどんな例外が発生するかを見るために「Exception」をcatchブロックで捕捉しているコードがあった。しかしここでExceptionを捕捉するcatchブロックを通らずに呼び出し元が終了するので,finallyブロックを処理した後に例外が発生したと解釈していたのだ。

 ところがこのソースコード。呼び出されたモジュールには「普通に」エラーコードを受け取るコードが実装されていた。しかもこのエラーコード。ファイル操作を再帰で実行しているコードでエラーが発生するとリトライし,正常終了するまで繰り返すのだが,そのリトライ数をエラーコードとして戻していた。「ん,呼び出されたモジュールでエラーコードを返しているだけではないんですか?」と指摘するには半年の解析期間は長すぎる。「またまた~」と自分を戒め,まじめに解析を始めるのだが上記以外の理由が見つからない。

 そこで「なんで例外が起こっていると思うんですか?」と開発者に質問すると「アプリケーションが終了するからです」との回答。そこでめげずに「じゃ,アプリケーションに正常終了以外のエラーコードが戻ったらどうなるんですか?」と聞いたら「終了します」との返事を聞いたときから,雲行きは怪しくなってきた。エラーコードが戻っただけ,という私の仮説を説明すると「そんなはずは無い!Microsoftのバグだ!」を繰り返す。

 しようがないのでエラー発生時にログに記録を残すコードを追加して経過観測をしたところ,ログに記録が残ったときにのみアプリケーションが終了していることが確認できた。つまりもともと例外など発生しておらず,実装のロジックどおりにエラーが起こったらアプリケーションが終了していただけだったのだ。例外が発生していないのだから当然Exceptionを捕捉するcatchブロックを用意しようと通るわけが無い。バグがあったのは.NET Frameworkではなくベンダー社員の頭だった,とは言い過ぎだろうか?とにかく,この件はアプリケーションコードの修正で終わった。

 後日談だが。解析期間中,さんざん「Microsoftのバグだ!」と大騒ぎしていた開発担当者は自分のミスを棚に上げて「いや~,Microsoftを使ったら痛い目にあっちゃってさ~」とまわりに繰り返し,自分のミスへの照れ隠しをしていたそうだ。そして「アンチMicrosoft」な方々が「それみたことか」と事実も知らずに「ま,Microsoft使ったんならしようがないよ」とサポートしてくれるので,ますます調子に乗って「そういえば,○○トラブルもMicrosoftのせいでおこっちゃってさ~」と,多くのトラブルをMicrosoftのせいにして責任逃れする。こうやってMicrosoftは不当に失敗の原因にされているのだ。