以前、とあるシステムのソースコードを読む機会があったのだけどあまりにひどかった。あのひどいコードでまあまあまともに動いているというのが逆に信じられない。今日昼ご飯を食べながら少し話していたのだけど意外と知られていないようなので、話せる範囲でいかにひどいのか説明してみようと思う。

まず、ソースコードが大雑把に見積もって3750万行あるのだけど、その中でまともに機能しているコードは3%しかない。10分の1程度のソースコードで同程度の機能を実現しているシステムもあるのでほんとあのシステムのコードはゴミだと言っても過言じゃない(*1)

プログラマとしてはなんでそのプロジェクトはそんな状態になってしまったのか気になるところだけども、まあ多くのプロジェクト同様、真相を知る人は誰もいない。でもまあ、実際に機能しているコードのコピーみたいなものがあちこちに散らばっていることからしてコピー＆ペーストが盛んに行われていたのは間違いないと思う。それもゴミコードの40%くらいは「コピペして書き換えて新しい機能を実装」ですらない。とりあえずコピペだけして放置。全く役に立っていない。(*2)

Pythonのコードで説明すると

def func_a (...):

という関数があるところにコピペが行われて

def func_a (...): def func_b (...):

こんな状態になっていたりする。func_aとか例えていえばファイルを開いたけど読まないとか、SQLクエリを作ったけど発行しないとか、そういう役に立たないコードになっている。func_bの後半にくっついているAのコードに関してはBのコードの最後でreturnしているのでそもそも呼ばれすらしなかったりする。Pythonで書かれているわけじゃないんだけどこういうレベルのクオリティって話。まともに動いているのが信じられないよね。

なんでこれで機能停止せずに動き続けているかっていうと、まあ設計者が神がかっていたというかいかれてたというかフレームワークが「モジュール内の特定の条件を満たす関数を全部呼ぶ」という設計になっていて、壊れたAのコピーがあったとしても壊れていないAのコピーが1個でも残っていれば機能が失われないからなんだ。まあ100%安心ってことはないんだけどさ。で、そういう設計なので壊れて条件を満たさなくなった関数がゴロゴロしていても平気。ウェブアプリで言えば「/add_itemにアクセスするとアイテムの追加画面が出るんだけど、実は/append_itemにアクセスすると古い今では機能しない追加画面が出る」とかいう状況。

そうそう、ソースコードのバージョン管理もひどいんだ。っていうかバージョン管理してない。リポジトリがない。コードをいじりたかったらまず適当な人にコードをコピーしてもらう。で、いじる。いじって壊れて動かなくなっちゃったらデバッグできる人がいないから丸ごと削除して、また新しくコピーを貰う。そりゃー、重要なコードのコピーがあちこちにある方が壊れにくいから引き継がれやすいよね。なんか最近では「ソースコードはほぼ同じ内容のを2コピー持つ。引き継ぐときは二人の人から1個ずつもらうこと」なんて運用で致命的なバグを入れちゃう確率を下げているらしい。(*3) その貰った二つのコードセットをマージするところでまた適当にマージするもんだから同じものを2個入れてしまうとか逆になくしてしまうとかもよくやるらしい。ある機能に関してはもともと4タイプの入力フォーマットを受け付けていたのにいつの間にか2つに減ってしまって、仕方がないので1個コピーして3つ目を作っただの、ものによっては実は4つに戻ってるだのと…。(*4)

よくこれで動いていると思うよ。誰かリファクタリングしないのかなぁ。無理か。

参考文献