最近、クソコード話が少ない気がするので、直近のクソコード情報を提供する。
●出会い
昨年夏、新卒二年目にして初めてクソコードに出会った。
あれは、新しいチームに移動した初日のことだった。
ファイルを開いた瞬間、大量のDimと、画面から見切れている、自動生成みたいな長さの変数宣言の行が目に飛び込んできた。
初めて見たクソコードのあまりの衝撃に、私は言葉を失った。ありえない。しかし、同時に興奮していた。これが俗にいうクソコードか...本当に存在していたんだ...と。
気を取り直して変数宣言のすぐ下にある関数の中身を確認する。MainProcess()と名付けられた15,000行の関数は、GUIの制御と入力値のバリデーションと業務ロジックの制御と処理結果の出力を司っていた。共通化できそうな処理は当然のようにコピペで済まされていた。
コピペの山を越えると、今度は、50~100行程度の関数たちが現れ始めた。どうやら、複雑な業務ロジックを小分けにしてくれているらしかった。ただ、そのどれも引数を持たず、他の関数とのやり取りはすべてグローバル変数で行っていた。
結局、上司に渡されたそのプログラムは、600個のグローバル変数と、15,000行のMainProcess()関数と、引数を持たない無数の関数群(合計10,000行くらい)でできていた。VBSだった。
●動作環境
このクソコードは、その業界向けのニッチな統合環境上で動いていた。これまで改修してきたチームメンバは、その環境上のエディタでプログラムを編集していた。ただ、私たちに与えられているのは評価版らしく、デバッガが動かなかった。さすがお客様、節約上手!
さすがにやってられないので私はVSCodeでデバッグを試みたが、ダメだった。クソコードはニッチな統合環境が提供するライブラリに依存しきっており、そこから切り離したら全く動かなかった。
●名前空間
VBSは名前空間がない。ついでに大文字、小文字の区別もない。クソコードの内包する、全ての関数名とグローバル変数名が予約語だった。
i, j, k, count, valueのような簡単な名前はすべてグローバル変数として宣言されていたので、私たちはすべてのローカル変数にl_というプレフィックスをつけるコーディング規約で何とかしのいでいた。
また、ニッチな統合環境のライブラリが提供する100を超える関数、変数も、全てグローバル空間に放たれていた。
それを知らずに私が関数名にgetfilenameと名付けたら、ライブラリが提供するグローバル関数名と衝突して障害を引き起こしてしまったのは、今となってはいい思い出だ。
●修正されないバグ
そのクソコードと付き合いが長くなるにつれて、いくつかバグを発見した。その中には、プログラムの出力結果が全く違うものになってしまうような、致命的なミスもいくつか含まれていた。
私はそれを正直に上司に伝えたけれど、上司は適当にはぐらかして、結局直さなかった。チームメンバ曰く、「今までの結果全部間違ってました、ってなったら大問題でしょ?そんな責任負えないんでしょうね。」とのことだった。このプログラムは、間接的にではあるけれども、数値のちょっとした間違いが、人の生き死にを左右する可能性があるものだったが、だれも気にしていないようだった。職業倫理の欠如、ここに極まれり。
●結局
結局、そのチームでの半年間、私にできたのは、顧客が要求した機能のために、グローバル変数を一切使わない、副作用のない関数をいくつか追加することだけだった。
正直、経験が浅く、ほかのクソコードを見たことがないので、これがどれほどのレベルなのかはわからないが。
なんにせよ、今はただ、一刻も早くあのクソコードが使われなくことを祈るばかりである。