Hatena::ブログ(Diary)

西尾泰和のはてなダイアリー

2009-01-31

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

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


まず、ソースコードが大雑把に見積もって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

bak_a_monobak_a_mono 2009/02/01 10:34 そもそもソースコードぢゃなくて、disk dumpを適当な2人からもらってシステム再編成してるから、inodeの欠落とかもう訳わかめwwww

bravobravo 2009/02/02 00:07 CCFinder (http://www.ccfinder.net/ccfinderx-j.html) とかつかったなあ...

Ouch-Ouch-OuchOuch-Ouch-Ouch 2009/02/02 08:55 参考文献が遺伝子関連というところが面白いと思いました。ヒトゲノムと同様97%ジャンクのコードならば、あるコメントを突然変異(うっかり編集ミスとか)させると全く違う振る舞いをするようになって、面白いですよね。でも、もともとある目的に最適化するようにプログラムって作るモノだから、結果よりよくなることはなくて、ボロボロになるんでしょうけど。ただ、人工生命(遺伝的プログラミング)的には多様性を含むおもしろいコードだと思いますw

hitujihituji 2009/02/02 15:44 ああ、このシステムの話ぼくも聞いたことがあります。たぶん同じやつだと思う。
設計者って言われてる人はほんとマルチにすごい人らしいんですけど、いっつも連絡がつかなくて皆困ってるらしいですねー

mwadamwada 2009/02/02 21:07 ある意味では永続型無計画リファクタリングプロジェクト。
今となっては利用者が開発者でその上オープンテスター・・・いつまでたってもベータテスト?
世界最大規模の人的(?)リソースを投入し続けるオバケプロジェクト。
そもそも何が目的のプロジェクトだったのか・・・引き継ぐこと、動き続けること自体が目的?
(感想:おもしろかったー!)

nishiohirokazunishiohirokazu 2009/02/03 15:24 >いっつも連絡がつかなくて皆困ってるらしいですねー

以前、息子が代理で来てたけどあんまりデスマなんで帰っちゃいましたねー(ぇ

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証