納涼!ほんとにあった怖いコードの話
納涼!ほんとにあった怖いコード(by CodeIQ×はてな)
システム開発の仕事を始めて、はや二十年。。。
ごく普通の退屈なおじさんエンジニアですが、
長年やっていると自然とこの手のお話はたまっていくものの様で。。。
今宵はいくつかご紹介しましょう。。。
■念のためロジック
今からおよそ20年程前。私が駆け出しだった頃のお話です。
当時のシステム開発といえば、大型のコンピュータで、COBOL(コボル)という
言語を使うものが主流でした。(多分 (^_^;)
COBOLのプログラムの特徴は、上から下へ長々と処理手続きを順番に書く。。。
サブルーチンという機能は有り、一部は使っていましたが、
基本的には上から下へ、長々と処理を書くというやりかたでした。
ある意味読みやすい、ある意味非効率な書き方でした。
1つのプログラムで、1000行2000行は当たり前、酷いものになると1万行以上
という、他の人から見ると何がなんだか分からない様なモノが一杯有りました。
当時私は、既存の銀行システムの一部を修正しました。
修正内容自体は簡単で、有る条件のデータが入ってきたら、出力ファイルの
エリアに有る値をセットするというものだったのですが。。。
或るプログラムで、その修正をして、テストをしてみた所、
出力ファイルが元のままで、修正した結果が出てきませんでした。。。
おかしいなぁ。。。
5000行もあるプログラムを紙に出力してみると、確かに私が直した所は
ちゃんと入っている。。。
良く良くソースコードを見てみると、私が書いたコードの暫く後に、
同じエリアに、元の値をセットし直している箇所がありました。。。
えっ?
あわてて、その処理を消して、もう一度書きなおしてテスト。。。
結果は同じでした。
ソースコードをもう一度出し直してみると、私が書いた後に、
更にそれを打ち消すコードが。。。 (^_^;
気をつけて全部見直すと、驚いた事に全く同じロジックが、
4箇所に書かれていました。。。
このプログラムの作者を探して、直接聞いてみました。
私「どうしてこんな事をしたんですか?」
担当者「いや、その。。。。念のため。。。(照れ笑い)」
私「。。。(^_^;」
このコードを私たちは「念のためロジック」と名付けました。。。
■恐怖のIF文
これも、「念のためロジック」と同じ頃のお話。。。
担当したオンラインプログラムが、余りに巨大なものでした。
(10万行ぐらいあった。。。(^_^;)
ソースコードを出力すると、行番号が桁あふれ(桁オーバー)して出力されず、
オマケに、コードが汚くて読めない状態でした。
(コメント(注釈文)が無かったり、ネストがメチャクチャだったり。。。)
なが〜いIF文が何重にもネストしてしまっていて、何をしたいのかサッパリ
だったので、仕方なくソースコードをキレイにするExcelマクロを作って、
実行してみたところ、暫くしてエラー。。。
私「ん?どうした?」
Excel「IFに対するEND IF が見つかりませんでした。」
私「?? まさか。。。マクロミスったかな??」
マクロを調べてみても、別段問題はありませんでした。
まさか。。。? いや、でも何十年も動いている銀行のオンラインシステムだよ、これ。
調べてみると、そのまさかでした。。。(^_^;
本当にIF文に対するEND IFが抜けていました。
調べてみると、他のプログラムでも出るわ出るわ。。。。(苦笑)
怖くなって、開発リーダに報告しました。
私「ど、どうしましょう?」
リーダー「。。。。と、とりあえず動いているから、そっとしておこうか(汗)」
私「は、はいっ!」
■愛の交換日記
これは15年位前のお話。
あるWebシステムを作っていた時、別システムのソースコードを見る機会がありました。
で、見たのですが。。。。 (^_^;
(コメント)◯◯さん、来週ヒマ?
(コメント)ええ、18時からなら空いています。
(コメント)じゃ、◇◇レストランで食事でもしない?
し、神聖なコードでナンパ(交換日記?)するなっ!(怒)
(ところで、返事は? (^_^;)
■開かずのプログラム
これも大手銀行のシステムでのお話。。。
先程書いた様に、私はCOBOLでプログラムを書いていたのですが、
ある日、リーダーに呼ばれて、直々の命令を頂きました。
リーダー「あのさ、このコードなんだけど、銀行の利息計算をする
超重要なプログラムなんだけど、誰も触れないんだよね。」
私「えっ?!」
リーダー「COBOLじゃなくて、FORTRAN(科学演算が得意なプログラム言語)
なんだよね。」
私「そ、そうなんですか。」
リーダー「これ、COBOLに直してくれないかな?」
私「分かりました。挑戦してみます。」
リーダー「あ、そう? 出来たらで良いから。無理しなくてもいいからね。」
貰ったプログラムをプリントアウトしてみて、ビックリ。。。
たったの15行でした。
こんなの楽勝じゃん♪
しかし。。。内容の解析に、丸々3日間かかりました。
このプログラム、要するに積分計算のプログラムで、
こんな感じの式をプログラムで解くもので。。。
要するに、xの値を、a〜bに値を変えて、f(x)の値をどんどん足していく
ものなのですが、0.000001(100万分の一)ぐらいづつxの値を増やして計算していて、
FORTRANの計算誤差と、COBOLの計算誤差が上手く合わなくて、
同じ結果にすることが出来ず。。。結局断念しました。
私「す、すみません、これは無理ですね。。。」
リーダー「そうか。ありがとう。
じゃあ、このプログラムはまた封印しておこうか。。。」
誰も触る事の出来なかった、あの「開かずのプログラム」。
今でもどこかで、人知れず生き続けている様な気がします。。。(^_^;