「大規模プロジェクトではどうするか」を考えるより、「大規模にしないためにはどうするか」を考えよう

はっきり言おう。大規模プロジェクトは存在自体が悪

 続けて同氏は、ケーパース・ジョーンズ氏の著書「Patterns of Software System Failure and Success」から調査結果を引用し、大規模プロジェクトになればばるほど、当初の見積もりとは大きくかい離したものになり、かつ失敗する可能性が高いことを示した。「(一般的なプロジェクトも含めた調査結果でさえこれなのだから)デスマーチについては推して知るべし」とヨードン氏。

エドワード・ヨードン、デスマーチを成功に導く対症療法を説く - ITmedia エンタープライズ

(強調は筆者による)

うむ。言っていることはごくあたりまえのことではあるが、ヨードン氏が言うと説得力がある。

調査結果の抜粋。FP(ファンクションポイント)はジョーンズ氏が定義している単位で、1FPが100行程度のコードであるという。1FPであればほぼ納期を守れているが、1000万行規模のコードが求められるプロジェクトでは、納期を守れるのは14%程度で、しかも65%近くがプロジェクトのキャンセルにつながっていることが分かる。

エドワード・ヨードン、デスマーチを成功に導く対症療法を説く - ITmedia エンタープライズ

『1FPが100行程度のコード』はちょっとはしょりすぎの感もあるけど、まあいいか*1

とにかく、規模が大きければ大きいほど、プロジェクトが失敗する可能性は急速に高まる。
だから、プロジェクトを成功させようと思ったら、まずは規模を小さくすることを考えなければいけない

しかしこの業界はまったく学習してなくて、いまだに大規模であるほど偉い、あるいは大規模こそ正義、みたいなバカが多くて困る。
よく、「私は100万行のソフトウェア開発を指揮していました」とか、「私は2000人月のプロジェクトのマネージャをしてました」とかいう人がいるんだけど、それってプロジェクトを小さくする努力をしていなかった、あるいはプロジェクトの規模を小さくする才能がなかった、ということを意味しているわけだから、恥じることはあっても自慢するようなことじゃないよね。
でも転職する人(おもにPMという種類の人たち)の話を聞くと、自分が関わったプロジェクトがいかに大規模であったかを語ってばっかり。
しかもたちの悪いことに、採用する側もそれを望んでいるだよね。大規模プロジェクトの経験がある人間を採用したがる。
ほんと、採用するほうもされるほうも、バカばっかり。自慢するなら、いかにユーザの役にたったかを自慢すべきだよな。


同じようなものを作っても、リーダーのセンスでどれだけ規模に差がでるか。
たとえば Web アプリケーションフレームワークでいうと、Struts が約 30 万行、Click が約 3 万行弱。同じようなものを作っても、設計センスでこれだけの差が出る。しかも Click のほうがわかりやすくて使いやすい。
あるいは、Smartyとかね。Smartyソースコードは約1万行あるけど、生PHPをテンプレートとして使えば、この1万行はまったくいらない。しかも、生PHPのほうがずっと速いし、機能も豊富で、おまけに学習コストも低い。

たかがフレームワークやライブラリでもこんなに差がでるんだから、システム全体に目を渡せば、より大きな差がでるであることは想像に難くない。
名著『Cプログラミング診断室』では、ヘタクソで長ったらしいコードが著者の手によって簡潔で短いコードに変わるさまが記載されているけど、同じことがプロジェクト単位でも起こっているわけだ。
バカが作ったら100万行になるコードでも、まともなリーダーが指揮すれば数万行で済むなんてことは十分あり得る。
100万行のプロジェクトは失敗する可能性が高いけど、数万行なら成功率はかなり高い。だから後者のリーダーのほうが優れているのは火を見るより明らか。
しかしマーケットで評価されるのは、100万行のほうなんだよね。失敗するほうが評価されるという、何この矛盾感。


まあしかし、大規模なプロジェクトほど儲かるという SIer の構造が変わらない限り、この現状は変わらんだろう。
規模に関係なく、システムがどれだけ役に立ったかで顧客がお金を払ってくれればいいけど、今もこれからも顧客は「行数」や「人数」にお金を払うだろうから、そこが変わらない限り、規模を小さくしようとする incentive は SIer には働かんわな。
やっぱ世の中を変えるのは、理想論じゃなくてカネだよ、カネ。


参考例:

古いJavaアプリ(Tomcat以前のJ2EE直呼び、およびJBoss利用)をRailsで書き換えるというプロジェクトがあったのだけど、コードの行数は一桁(二桁減に近い、一桁)減ってしまった。減った行数もすごいけど、冗長性がほとんどなくなったことのほうが嬉しかった。その分、テスト負荷がへるわけだし、保守性も向上する。

COBOL屋の呪縛 - サンフランシスコ出羽守手記(masayangの日記

これだけ見ると、JavaRubyで書き直したらコード行数が数十分の一になった、と勘違いしそうだが、そうじゃなくて設計をやり直したからそこまで減らせることができた、ということだと思う。
いくらRubyが簡潔に記述できるからといって、Javaの数十分の一まで行数が減らせるわけがない。

...あ、でもRails使ってるのか。なら行数が『二桁減に近い、一桁』減ることはそう変でもないか。

*1:実は自分もよくわかってない。