6th 7月 2011

PETAPETAからリブログされた。リアクションが122件

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

まず、ソースコードが大雑把に見積もって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: 有性生殖 - Wikipediaのこと。
* 4:「ヒトや近縁の霊長類は通常3種類の錐体細胞を持ち、3色型色覚であるが、 ヒトにおいては4種類の錐体細胞を持った4色型色覚の女性が生まれうる[1]。世界の女性の2〜3%は4色型色覚であると発表されている[2]。だが別の研究によれば女性で50%、男性で8%もの人々が4色の光色素を持つだろうという[1]。」色 - Wikipedia

出典: ishida

  1. kkura01413knpetapetaからリブログしました
  2. imanoipetapetaからリブログしました
  3. ojarusskamioからリブログしました
  4. takimaisunshinerecorderからリブログしました
  5. sunshinerecorderpetapetaからリブログしました
  6. sunshinerecorderpetapetaからリブログしました
  7. 75hzpcatanからリブログしました
  8. coak34petapetaからリブログしました
  9. watarukkiri2からリブログしました
  10. daizydaizynashi-kyoからリブログしました
  11. makinamipetapetaからリブログしました
  12. sohjupcatanからリブログしました
  13. kkj114petapetaからリブログしました
  14. untiemepetapetaからリブログしました
  15. yysypetapetaからリブログしました
  16. cliqueclogspetapetaからリブログしました
  17. tofoopetapetaからリブログしました
  18. johndoe17petapetaからリブログしました
  19. nknhpapapantuからリブログしました
  20. y-upapapantuからリブログしました
  21. straycat74kiri2からリブログしました
  22. nashi-kyopetapetaからリブログしました
  23. dogcaravan0817petapetaからリブログしました
  24. snjxpetapetaからリブログしました
  25. papapantukiri2からリブログしました
  26. vivavivaldipetapetaからリブログしました
  27. yqlpetapetaからリブログしました
  28. rockmanjunopetapetaからリブログしました
  29. kiri2skamioからリブログしました
  30. mg00npetapetaからリブログしました
  31. yoruyorupcatanからリブログしました
  32. spkepetapetaからリブログしました
  33. sinryukapetapetaからリブログしました
  34. ch624petapetaからリブログしました
  35. skamiotra249からリブログしました
  36. pcatanpetapetaからリブログしました
  37. tra249petapetaからリブログしました
  38. gosunatxreapetapetaからリブログしました
  39. atm09tdpetapetaからリブログしました
  40. petapetapetapetaからリブログしました
  41. sjmpgkojayからリブログしました