1から書き直すことが、いつだって間違っている理由

最初に

ろくにドキュメントが整備されていなくて、わけのわからないソースだらけの巨大なソフトウェアがある時、1から作り直した方がいいって思う人はたくさんいる。
自分も昔はそうだった。でもいくつかの1から作り直すプロジェクトに参加して、それがいつだって間違っている事に気づいた。そのことについて。

意外とみな気づいていないこと

何百ページもある本を熟読するさまを想像してみて欲しい。そして、1ヶ月ほどでその本を読み終わったとしよう。

そして読み終わった後、本の内容を思い出しながら書き出してみると、どの位の量を書き出せるだろうか?

実際にやってみると、ほとんどの人は、数ページぐらいしか書き出すことが出来ない。A4レポート用紙一枚も埋められないアホもいる(これは私のことだ) 

実はこれが、「1から書き直すソフトウェア開発」で起こっている事なのだ。あらゆる人たち(もちろんプログラマも含めて!)が、「1から書き直せば簡単だ!」とわめき散らすのに、やってみるとなぜかうまくいかない理由はここにある。実際の仕様は何百ページ分もあるのに、みんな数ページ分の仕様しか思い出せないのだ。だから1から書き直すなんて、すぐ出来るような気がする。

現実

でも1から書き直し始めて、しばらくすると、思い出せなかった部分(≒仕様書になっていなかった部分)が、だんだんその姿を現してくる。

同僚との会話の中(例:ねえそういえば、データを保存するサーバをメンテナンスする時はどうするの?)で、記憶が浮かび上がってくることもあるし、必要に迫られて(例:ファイルを読み込みにいくのだが、時々別のプロセスがそのファイルをおかしな形にしている瞬間がある)考えざるを得なくなる場合もある。どうあれ最終的には、捨てた(はずの)ソースに書かれていることの、全ての内容を網羅しないといけなくなる。

全てを網羅できないなら、1から書き直すことで、機能を減らしたってことになる。

結末

なんてことだろう。1から書き直せば、短い時間で、綺麗な、同じ機能のソフトウェアが手に入ると思ったのに。汚らしい古いプログラムでは出来ていたことが、1から書き直したプログラムでは出来ていないケースのあまりの多さに愕然とするのだ。

そしてプロジェクトが(スケジュール的に)終盤にさしかかる時になってやっと、1から書き直し始めた時には考えてもいなかった仕様について決めて、今プログラムを書いているメンバーにそれを伝えて、スケジュールが迫っているから兎に角急いで実装してくれという話がプロジェクトのあちこちで見られるようになったとき、そのプロジェクトを立ち上げた人はこう思うようになる。ドキュメントがなくて、クソみたいなプログラムしかないから1から書き直したのに、今では似たようなドキュメントのないクソプログラムになりつつある・・・ そして本当にそうなる。

結論

以上の経験からわかったのは、1から書き直したからといって、以前に書いた時よりも素早く、綺麗なソフトウェアが手に入る合理的な理由はないということだ。仕様書が充実していて、エラー処理などを含む必要な機能をちゃんと定義できていれば、もしかしたら上手く作れるかもしれない。しかしそれでも、びっくりするほど素早くソフトウェアを作れる理由にはならない。

それに、そもそも1から書き直したい理由の1つは、仕様書が貧しくて、かつ既存のソースがよく分からないからだったはずだ。

だから1から書き直したくなった時、本当に必要なのは1から書き直す時間ではない。
ひどいソースを理解する時間や、足りない仕様書を書く時間や、リファクタリングする時間や、バグ対応する時間が必要だ。
これらは1から作り直すことに比べて、ずっと作業時間の見積もりがし易く、現実的なスケジュールを立てることが出来る作業だ。

補足

この話に例外があるとすると、それは仕様が本当に数ページしかない場合だ。たとえば画期的なアルゴリズムが発明されて、そのアルゴリズムはいくつかの数式で表されていて、それを実証するプログラムが自分の手元にあるとしよう。そういうものを理解するには、自分で書き直してみる事が一番冴えたやり方かもしれない。でもそんな場合は、1から書き直すべきだ、なんてわざわざ主張することもないだろう。

あと移植作業のことを「1から書き直す」作業ととらえる人もいるようなのだが、もちろんそういうのはこの話には含まれない。そういう作業をするプログラマは、移植前と移植後のコードが機能的に等価であることを保証するのは当然だと認識し、最初からそのように取り組むだろうから。