/note/tech

クソコードの思い出 in 2021

最近、クソコード話が少ない気がするので、直近のクソコード情報を提供する。

●出会い

昨年夏、新卒二年目にして初めてクソコードに出会った。

あれは、新しいチームに移動した初日のことだった。

ファイルを開いた瞬間、大量のDimと、画面から見切れている、自動生成みたいな長さの変数宣言の行が目に飛び込んできた。

初めて見たクソコードのあまりの衝撃に、私は言葉を失った。ありえない。しかし、同時に興奮していた。これが俗にいうクソコードか...本当に存在していたんだ...と。

気を取り直して変数宣言のすぐ下にある関数の中身を確認する。MainProcess()と名付けられた15,000行の関数は、GUIの制御と入力値のバリデーションと業務ロジックの制御と処理結果の出力を司っていた。共通化できそうな処理は当然のようにコピペで済まされていた。

コピペの山を越えると、今度は、50~100行程度の関数たちが現れ始めた。どうやら、複雑な業務ロジックを小分けにしてくれているらしかった。ただ、そのどれも引数を持たず、他の関数とのやり取りはすべてグローバル変数で行っていた。

結局、上司に渡されたそのプログラムは、600個のグローバル変数と、15,000行のMainProcess()関数と、引数を持たない無数の関数群(合計10,000行くらい)でできていた。VBSだった。

●動作環境

このクソコードは、その業界向けのニッチな統合環境上で動いていた。これまで改修してきたチームメンバは、その環境上のエディタでプログラムを編集していた。ただ、私たちに与えられているのは評価版らしく、デバッガが動かなかった。さすがお客様、節約上手!

さすがにやってられないので私はVSCodeでデバッグを試みたが、ダメだった。クソコードはニッチな統合環境が提供するライブラリに依存しきっており、そこから切り離したら全く動かなかった。

●名前空間

VBSは名前空間がない。ついでに大文字、小文字の区別もない。クソコードの内包する、全ての関数名とグローバル変数名が予約語だった。

i, j, k, count, valueのような簡単な名前はすべてグローバル変数として宣言されていたので、私たちはすべてのローカル変数にl_というプレフィックスをつけるコーディング規約で何とかしのいでいた。

また、ニッチな統合環境のライブラリが提供する100を超える関数、変数も、全てグローバル空間に放たれていた。

それを知らずに私が関数名にgetfilenameと名付けたら、ライブラリが提供するグローバル関数名と衝突して障害を引き起こしてしまったのは、今となってはいい思い出だ。

●修正されないバグ

そのクソコードと付き合いが長くなるにつれて、いくつかバグを発見した。その中には、プログラムの出力結果が全く違うものになってしまうような、致命的なミスもいくつか含まれていた。

私はそれを正直に上司に伝えたけれど、上司は適当にはぐらかして、結局直さなかった。チームメンバ曰く、「今までの結果全部間違ってました、ってなったら大問題でしょ?そんな責任負えないんでしょうね。」とのことだった。このプログラムは、間接的にではあるけれども、数値のちょっとした間違いが、人の生き死にを左右する可能性があるものだったが、だれも気にしていないようだった。職業倫理の欠如、ここに極まれり。

●結局

結局、そのチームでの半年間、私にできたのは、顧客が要求した機能のために、グローバル変数を一切使わない、副作用のない関数をいくつか追加することだけだった。

正直、経験が浅く、ほかのクソコードを見たことがないので、これがどれほどのレベルなのかはわからないが。

なんにせよ、今はただ、一刻も早くあのクソコードが使われなくことを祈るばかりである。