「Microsoftのバグ」との戦い2008.08.25コピーしましたPRだいだひろ朝,出勤中に車で橋を渡ります。早起きして車を降りて,この橋で日本海をボーっと眺めながらコーヒーを飲むのが私のリフレッシュ法。ありきたりですが,この業界にいるとこんな自然とのふれあいが力をくれるものです。こんな感じでSHIHOのヨガDVDも買って,すっかり浮世離れを気取っている私です。題名に気をつけていただきたい。「Microsoftのバグとの戦い」ではない。「Microsoftのバグ」との戦いだ。「これはMicrosoftのバグだ!」という言いがかりとの戦いである。聞くと,「あぁ,駄目エンジニアとの戦いか」と思うあなたは,きっと高スキルエンジニア。いう人ばかりだと助かる...わけではない。,「これ,Microsoftのせいでしょ」と言いがかりをつけるのは,現場ではそれなりに権威のあるエンジニアであることも多いからだ。今回はこの辺のMicrosoftへの言いがかりが発生する構造を見ていきたいと思う。finallyを通った後の例外ですまずはわかりやすく駄目エンジニアから。これはもう数年前のお話し。Basic(VB)からの移行を行っていた。.NETでの実装に切り替えることに決まっていた。私がこのプロジェクトに参加したのは,システムをリリースした後,毎日定時になると処理が落ちるとの連絡を受けたからだ。設計段階の仕事を中座してこのトラブルの対策会議に出席した。トラブルが発生して半年たっても解決できなかったので,お客様の逆鱗に触れているとのこと。トラブルの内容確認,ということで開発者にヒアリング。Frameworkのバグだ!こんなのをリリースするなんて信じられない」と絶叫している。してそう思うのかを聞いて我々はのけぞった。なんとfinallyブロックを通過して処理が終了した後で例外が発生し,アプリケーションが落ちていると言う。発生している例外は,あるモジュールから呼び出されたモジュール内で発生し,その後で呼び出し元に戻り,アプリケーションが終了するとの説明。半年も解析できないわけだ」と思い,障害が発生している部分の処理フローを説明してもらい,そのあとソースコードを読んでみた。すると,このコードでどんな例外が発生するかを見るために「Exception」をcatchブロックで捕捉しているコードがあった。ここでExceptionを捕捉するcatchブロックを通らずに呼び出し元が終了するので,finallyブロックを処理した後に例外が発生したと解釈していたのだ。ところがこのソースコード。呼び出されたモジュールには「普通に」エラーコードを受け取るコードが実装されていた。ファイル操作を再帰で実行しているコードでエラーが発生するとリトライし,正常終了するまで繰り返すのだが,そのリトライ数をエラーコードとして戻していた。「ん,呼び出されたモジュールでエラーコードを返しているだけではないんですか?」と指摘するには半年の解析期間は長すぎる。「またまた~」と自分を戒め,まじめに解析を始めるのだが上記以外の理由が見つからない。そこで「なんで例外が起こっていると思うんですか?」と開発者に質問すると「アプリケーションが終了するからです」との回答。そこでめげずに「じゃ,アプリケーションに正常終了以外のエラーコードが戻ったらどうなるんですか?」と聞いたら「終了します」との返事を聞いたときから,雲行きは怪しくなってきた。エラーコードが戻っただけ,という私の仮説を説明すると「そんなはずは無い!Microsoftのバグだ!」を繰り返す。しようがないのでエラー発生時にログに記録を残すコードを追加して経過観測をしたところ,ログに記録が残ったときにのみアプリケーションが終了していることが確認できた。例外など発生しておらず,実装のロジックどおりにエラーが起こったらアプリケーションが終了していただけだったのだ。例外が発生していないのだから当然Exceptionを捕捉するcatchブロックを用意しようと通るわけが無い。Frameworkではなくベンダー社員の頭だった,とは言い過ぎだろうか?とにかく,この件はアプリケーションコードの修正で終わった。解析期間中,さんざん「Microsoftのバグだ!」と大騒ぎしていた開発担当者は自分のミスを棚に上げて「いや~,Microsoftを使ったら痛い目にあっちゃってさ~」とまわりに繰り返し,自分のミスへの照れ隠しをしていたそうだ。「アンチMicrosoft」な方々が「それみたことか」と事実も知らずに「ま,Microsoft使ったんならしようがないよ」とサポートしてくれるので,ますます調子に乗って「そういえば,○○トラブルもMicrosoftのせいでおこっちゃってさ~」と,多くのトラブルをMicrosoftのせいにして責任逃れする。やってMicrosoftは不当に失敗の原因にされているのだ。現場の負担軽減を!医療界でのAWS活用法500万社が導入。情報銀行の成り立ち、事例、現状課題やその行方を網羅。経営戦略である以上、「会計」の知識やスキルが欠かせません。