ソフトウェア開発は建築よりも複雑

Matz氏の「ソフトウェア開発における初心者」が私の感覚とは乖離しているのでそのずれについて考えてみる。
Matz氏はソフトウェア開発は建築と同じだとは言っていないが、あるコスト(例えば家一軒分)を払った場合に、建築の場合はある一定の水準が期待できるのに対して、ソフトウェア開発はそうではなく、「初心者」と「顧客の意識」に大きな問題があると述べている。
アーキテクチャ(architecture)とかビルド(build)など、ソフトウェア開発は建築由来の言葉が多い。符合する部分もいくらかはあるが、挙げていくと一致しないことの方が多い気がしてくる。例えば、


(1)工程。建築は調査→設計→建築確認→基礎工事→...とウォーターフォールで進む。ソフトウェア開発も昔はそうだったが、今はプロトタイプやスパイラルなど、ウォーターフォール以外も検討する。
(2)新規性。建築では「家を建てる」といった場合に、特殊なものや奇抜なものを求めない限り、ツーバイフォーなど構造や工法、部材までほぼ決まっている。一方ソフトウェア開発では、「在庫管理ソフトがほしい」といった場合に、既存のシステムとの兼ね合いやユーザーの要求によって、一見同じようなものでも、機能や構造が異なることが多々ある。(既存のものを買ってきて済ませる場合はソフトウェア開発は発生しないので、ここでは考えないことにする)
(3)コストのかけかた。建築のコストの多くはbuildの段階、すなわち後工程でかかる。ソフトウェア開発では、buildするまでが大変で、前工程に大きなコストがかかる。(そしてしばしば、buildしたあとのテストにも大きなコストがかかる)
(4)資格。建築の場合は建築士左官技能士など資格を持っていれば安心できる。一方ソフトウェア開発では、最もポピュラーな情報処理技術者試験は(国家試験ではあるが)資格ではなく、何の意味もないとさえ言われることがある。


など。それぞれ考えていくと、ソフトウェア開発は建築よりも複雑であるということが言えるんじゃないかと思う。
(1)事前の予測が困難なためにスパイラルが必要。ウォーターフォールで手戻りがない方が単純である。
(2)カスタマイズ項目が多いほうが複雑で、不具合も発生しやすい。型にはめられれば間違いも少ない。
(3)前工程に不具合(あるいは不具合の可能性)が多いほどコストがかかる。前工程で悩まなければ後工程にコストがかけられる。
(4)建築の場合はdesignとimplementationが分離されているが、ソフトウェア開発は両方必要で、その結果試験内容も広く薄く問うものになっている。
ネタとしてはdankogai氏の「建築士がプログラマーのごとく働かねばならぬとしたら」なんてのもあった。


何が言いたいかというと、問題は「初心者」だけではなくて、熟練者にとってもソフトウェア開発は複雑なものなんじゃないの?ということ。もう少し突っ込んで言えば、たとえば「ソフトウェアはもっとシンプルにできる」という説がある。「東大での講演」で出てきたような。極端に言えば、OSはlispインタプリタを提供するだけでよく、アプリケーションを全部lispで書けばいいじゃないか、というような話だ。個人的にはそういうものが大衆向けに開発されて普及する可能性は限りなく低いと思っていて、「極めてシンプルでひとつひとつが単純明快なインターフェースから構成されるシステム」といったものからは、非常に長大なコマンドラインの組み合わせを与える必要があり、一文字間違えるだけで破滅的な結果をもたらすCUIベースの「理想のシステム」を連想してしまう。


一方で、Windowsソースコードは一億行以上ある。優秀な人材を大量に集め莫大な資金を投入したWindowsにバグが存在するのは、スーパーエンジニアからすればレドモンドの連中が間抜けだからということになるのだろうが、私としてはMicrosoftにとってさえソフトウェア開発は複雑なものなのだ、という見方を採用したい。
そんなわけで、「ソフトウェア開発ではそれに近いことが平気でまかり通っている」という認識には同意しない。プロジェクトが火を噴くのはソフトウェア開発が本質的に複雑だからであって、初心者や向上心のない技術者のせいではないと思う。