山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

死ぬはずのプログラムを無理に生かしておいていてはいけない

プログラマが知るべき97のこと」を読んでいます。あるあるネタっぽいものや、達人たちの教訓が書いてあり、読み物として非常に面白いです。
タイトルはエピソード27の見出しで、ライブラリの作成を担当していた著者がtry~catch節を別のcatch節に含めて、ヌルポが発生しようが0割が発生しようが絶対にとまらないプログラムを書いたそうです。そのときの反省を込めて、エッセイとしてあります。


これを読んで僕も若いころのエピソードを思い出しました。

まだ新人だったころ、先輩社員と2人で客先に常駐し、VB5を使ってWindowsアプリケーションを作っていました。
ある程度動くようなアプリが出来上がったころ、先輩は「いいか山崎ようく聞け。本番では絶対にとまってはいけないんだ。そう、、、絶対にだ。。。」その後、先輩は信じられない言葉を吐きました。「だから、すべてのモジュールでOn Error Resume Nextを入れる。」。エラーが発生したらその次の処理に制御が移る、あの「On Error Resume Next」です。

さすがの新人の僕でも、「それはないわ・・・」と先輩のセンスのなさがわかったのですが、抗弁すると口をとんがらせて真っ赤になって怒ることをそれまでの経験で知っていたので(自分の中では「ゆでだこ」と呼んでいました。)、「そ、そうですか」としかいえませんでした。

もちろん、本番では突然アプリが落ちたり、「0x01251d1cの命令が0x00000000のメモリを参照しました。メモリが「read」になることはありませんでした。」のポップアップがあがるなど、不可思議な動作が起こります。

本番で、エラーを起こしてはいけないのはわかります。多分、ゆでだこも若いころ先輩にそういわれたことがあるでしょう。だけどそれは、エラーを握りつぶすのではなく「十分なテストをして、本番までにバグを全部つぶすように」という意味です。それでもおきてしまったエラーは、ユーザに迷惑をかけることになったとしても、システムエラーメッセージを出し、ログにエラーの詳細を出し、アプリは動きを止めるべきでしょう。

いま、たとえば会社の後輩が、このようにエラーは握りつぶすという実装をしようとしていたら「ふざけるな」とその理由を小一時間説明することになるでしょう。だけど先輩やお客さんに「落とさないために握りつぶせ」などと指令がきた場合、どのような対処がいいのでしょうか?

客先の若手「山崎さん。本番では絶対に落ちないように実装してくださいよ。そのために例外処理ができるようになっているじゃないですか。必ず大元のメソッドはtry~catchで囲んで、Exceptionをスローすることは無いようにしてください。」

まあこんな感じで言われたらなんて返すかな?

俺「確かにそうですね。ただ、後ろのデータベースが何かしらの原因で落ちていたり、ネットワークケーブルが外れたりしていたときも、登録処理が完了している感じをユーザに与えてしまいそうです。また、万が一プログラムの不具合で問題が発生した場合には、再現させることが難しく、原因の特定が10倍から100倍に長引きます。」

これで納得させるには、まだ弱い気がします。

調べたら、アンチパターンのひとつになっているようだから、あわせてwikiも見せることにします。

wikiお「エラーの隠蔽(Error hiding)」ってやつなのですが、日本語版がなぜか消えてしまいました(2014/2/7現在)。英語版は残っているので誰か訳しておいていただけると、いざというときに役立ちます。


プログラマが知るべき97のこと

プログラマが知るべき97のこと