本日、レガシーコードに逢いました

ボクのような平凡な人間には一生お目にかかることはないと思っていた人に出会ったんだ。それもとびっきりのね。

ことの発端は、2年前にとある会社に外注したコードを機能拡張して欲しい、と言う依頼。久々のSKILL*1の仕事だと思ったら、出るわ出るわ、嫌な臭いが。。。

何がひどかったか

まず、コードが読みにくい。なぜ読みにくいか。

全てグローバル変数で定義

これが全てのガン。そもそもSKILLと言っても、Lisp何だから、letかprogでローカルな環境を作ってやればよいのに、なぜか全てグローバル変数を使っている。それも必要なグローバル変数だったら、まだいい。ほとんどがただの一時変数に過ぎないのに、なぜ、そんなライフタイムの長い変数を用意する!!

そして、グローバル変数にしているものだから、変数名の先頭にプレフィックスをつけてしまって、余計にコードが醜い。

仕方が無いので、リファクタしているのだが、コメント等が何も無いので、必要なグローバル変数かどうかをコードを追って、テストしないとわからない。

長すぎる関数

関数内には、一つの働きしか書かない、と言うのは、常識ではないのか? 違うのか?

そもそもSKILLと言っても、LISPの分布をCライクにしただけ。カッコの多さは変わらない。とすると、可読性に優れるのは、流れていくような構造をもったプログラムだと思うのだけど、幾つかの処理を関数内に入れ込んでいるので、そのような美しさは皆無。

意味不明な変数名

上のグローバル変数とも絡むけど、最初にプレフィックスがあるので、変数名が不要に長い。その割に、肝心な情報がなく、識別が全くつかない。

No Comment

僕自身は、コメントはなくてもいいと思っている。むしろ、誤ったコメントを書かれるぐらいならいらない。そのかわり、雄弁と語るようなコードじゃないとダメだ。変数名が意味不明では、語るどころか、こちらの意識まで吸い込まれてしまう。

文法的な問題

これは、SKILLの問題。いや、エディタがちゃんとサポートしていればいいのだが、その担当者はノートパッドで書いたのではないか、と思わせるぐらい、インデントが無茶苦茶だった。

以上、ただの愚痴ですが

ということで、久しぶりに放り投げたいプログラムに出逢いました。これが、社内のプログラマが書いたのであれば、担当者を注意するだけで良い。問題は、社外に発注して、納品としてこんなヒドイコードを受け取っている、と言う事実だ。確かに受け入れ検査が甘かったのだろう。おそらくは、ブラックボックスとして機能だけを見て、受入検査をやっているのだろう。

このコードを見て、ボクは新人が担当したのだと思った。しかし、当時の事情を知る人に聞いたところ、このプログラムを担当していたのは、それなりに(少なくともボクよりはよっぽど)SKILLでプログラミングをした経験があるらしい。

待て待て待て待て。そんな経験のある人間がこんなにヒドイコードを書くの? バカにしてるの?

今までのコードもそうなの?

その会社は、何もレビューしていないの?

こんなやっつけのようなコードを書くような仕事のやり方をしているの?

コードって面白いもので、その人の思想なりが見えてくる。このようにメンテナンスを一切考えない、バグが起きやすいコードを作る、抽象化を一切考えない、と言うのは、エンジニアとして失格でしょう。ボクもソフトウェアのマトモな講義なんて受けたことがない。しかし、それ以外の工学的な講義や、今までの経験などから、例えソフトウェアプラクティスを知らなくても、どのようにしたらバグが発生しにくいか、ぐらい想像がつくだろう。

この人には、プログラムだけでなく、そもそもモノを作る技量があるとは到底思えない。

確かに、うちも受け入れが甘かった。しかし、このような汚物に近いコードを平気で納品してくるような会社とは、ボクの目が黒いうちは、2度と取引をすることはないだろう。品質を一切考えないような会社とは。

さようなら。

*1:Cadenceのフレームワーク言語