そろそろ例のプロジェクトについて言及するか

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


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


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


Pythonのコードで説明すると

def func_a(...):
    # code of A
    # code of A
    # code of A

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

def func_a(...):
    # code of A
def func_b(...):
    # code of B
    # code of B
    # code of B
    # code of A
    # code of A

こんな状態になっていたりする。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)


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



参考文献
  • 1:「ヒトゲノムのおよそ97%は"ジャンク"であることが示されている。 これとは対照的にトラフグ(Fugu rubripes)のゲノムサイズは人間の1/10程度しかないが、ゲノムの1/3に有効な遺伝子としてコードされており、ほぼヒトと同数の遺伝子をもっていると考えられている。」ジャンクDNA - Wikipedia
  • 2:「トランスポゾン (Transposon) は細胞内においてゲノム上の位置を転移 (transposition) することのできる塩基配列である。」「ゲノムプロジェクトの進行により、ヒトやマウスのゲノムにおいてタンパク質をコードする領域は 1% 以下であり、残りの 40% 以上はトランスポゾンが占めていることがわかってきた。」トランスポゾン - Wikipedia 「レトロトランスポゾンの転移では、DNA 配列の複製が起こる。」「LTR 型レトロトランスポゾンは、ヒトゲノムの約8% 」「ヒトゲノムは、約 500,000 の LINE を含むが、これは、ゲノム全体の 21% にあたる。」「SINE は、ヒトゲノムの 13.5% を占める。」
  • 3: 「ソースコードはほぼ同じ内容のを2コピー持つ。引き継ぐときは二人の人から1個ずつもらうこと」という運用: 有性生殖 - Wikipediaのこと。
  • 4:「哺乳類が本来あった 4 色型色覚のうち 2 種の視物質を喪失した後に、L 錐体の特性を僅かに変えることで M 錐体を得て、一度失った 3 色型色覚を再獲得したものと考えられている。」「ヒトや近縁の霊長類は通常3種類の錐体細胞を持ち、3色型色覚であるが、 ヒトにおいては4種類の錐体細胞を持った4色型色覚の女性が生まれうる[1]。世界の女性の2〜3%は4色型色覚であると発表されている[2]。だが別の研究によれば女性で50%、男性で8%もの人々が4色の光色素を持つだろうという[1]。」色 - Wikipedia