読者です 読者をやめる 読者になる 読者になる

ソフトウェア開発は戦争だ

f:id:kuenishi:20091110225702j:image:w500
写真 by US navy:空中に発射された戦術ミサイルを模したデコイに対して、NATOのシースパローミサイルがジョージ・ワシントン(CVN73)から発射されるところ。かっこいいでしょ。

戦争今昔

三国志」「項羽と劉邦」などを読んでいると、アレクサンダー大王が「獅子に率いられた羊の軍は、羊に率いられた獅子に勝る」と言った(かもしれない)というのは、史実や原典などどうでもよくなってくるような重みを感じてくることがある。古代〜近世に至るまで、戦争においては魅力的で優秀な頭領こそが勝利(=成功)の決め手だったわけだ。そこでは、兵士個人の力量の平均値や、装備の強力さなどは、よほどの差がつかない限り、頭領の戦術とそれを実施する兵士のモチベーションこそが勝敗を決していたのである。
ところが、近世と近代の境目に産業革命が起こり、戦争の勝敗に技術力が大きく影響するようになってきた。つまり、一人の人間がボタンひとつで何万人も殺せるようになっているのだ*1。こうなってしまっては、戦争は優秀な幕僚はもちろんのこと、前線の兵士は高度な兵器を使いこなすために、これまでとは比べ物にならないほどの練度が要求されるようになる*2。戦闘機のパイロットなんかはその最たるものだろうし、アパッチヘリやP-3Cを運用するのは、鶴翼陣形を維持しながら敵軍に突撃するとか、銃剣を持って行軍するのとはワケが違う。で、こういう表がなんとなく作れると思う(大体、大体だよ)。

むかし いま
頭領の資質の影響 勝敗を決する(先天的な資質) 幕僚の質はそこそこ影響する(教育でも何とかなる)
兵士の練度の影響 大して影響しない(誰でも兵器を扱えるので)。とにかく目の前の敵を勇敢に倒せばよい 勝敗を決する(そもそも兵器を使えないので)。全体の戦略と周囲の戦術を見て協調した動作を個人が考える必要がある。瞬時の判断が全体の勝敗を決するかもしれない
軍需技術 大抵の兵器は網羅できる 網羅できないほど種類が増え過ぎ進歩しすぎ

ソフトウェア開発今昔

今とはいつなのか、昔っていつ頃のことを指すんだ?というのはここではとりあえず置いといて。まあIT革命(と言ってた頃もありましたね)以前、ハードウェアがとても高価で一般大衆にはとても触れなかった頃のことだと思う。エディタといえばEmacsかviかedか、Linuxなんか不安定で、SolarisがSunOS 4と呼ばれていてUNIXが憎まれていた頃。プログラマは大した武器なんか持っていなかった。大した開発キットもなかったし、使いやすいGUI開発フレームワークもなかった。Webブラウザが大して普及していなかったから、みんなmotifを使ってUIを書いていた。もっと昔でもいい。パンチカードを使ってプログラムを書いて、バグがあったらシールを貼って直していたり、って頃があったそうだ(私は当時を知る世代ではないので、知らない)。
こういう時代なら、人海戦術も有効だろうと思う。汎用機の巨大なマシン仕様なら、COBOLとかアセンブラを使ってOSを組んで*3とかやることになると思う。コンピュータのリソースが限られていたし、OSからアプリケーションまで全部渾然一体で作るので開発規模は馬鹿にならないだろう。開発規模が馬鹿にならない割に、持っている武器は限られている。Eclipseもなかったし、JavaJava APIもなかったし、Springもなかったし、Sun OSも機能(というかディストリビューションとかライブラリ)が限られていたし、OracleMySQLもなかったし、ちゃんとしたWebブラウザもなかったし、ロクなUIを持ったクライアントもなかった。なので、人を集めてとにかく全部作らなければならなかった。開発を指揮する人が、システムの全体を隅々まで把握していなければならなかった。実際、アセンブラやCPUの命令セットなど、覚えなければならないことは(比較的)少なかったのだと思う。まとめるとこういう表になると思う(これがネタで炎上したりして)。

むかし いま
リーダーの資質の影響 システムの成否を決する - リーダーが見切っていれば大丈夫 リーダーだけでなく、全員がシステムの詳細を知っていなければならない
メンバーの資質の影響 そこそこのスキルがあれば何とかなる - アセンブラやCだけ覚えておけば大丈夫。自分の目の前の部分的な仕様で作ればよい 高度なスキルとスピードが要求される - UNIX, Java, C/C++, LL, SMP, ネットワークなど。自分の目の前の部分的な仕様だけではなく、全体のアーキテクチャを見据えて最適なコードにしなければならない
ソフトウェア開発技術 シンプルなエディタ、紙、RCS Eclipse, Java API, Spring, SVN, Git, Rails, Linux, MySQL, AppEngine

まとめ

というわけで、旧石器時代の技術で人月のみに関心があるようなソフトウェア開発しているところがあったら、やめた方がいいと思うよ。いや単に例え話を思いついただけなんだけど。戦史とコンピュータの歴史を比べてみると面白いと思うんだよね。そしたら、これからが見えてくるというか…。

項羽と劉邦 (1) (潮漫画文庫)

項羽と劉邦 (1) (潮漫画文庫)


新訂 孫子 (岩波文庫)

新訂 孫子 (岩波文庫)

*1:いやもちろんボタンの向こうには沢山の人がいるんだけど

*2:この観点からも国民皆兵制なんてナンセンスなんだけどね

*3:COBOLってOS組んだりしなかったかも?