ソフトウェアの複雑性と「銀の弾丸」

ある研究会で話す機会があった。ブルックスの「銀の弾丸などない」を素材に1990年代以降のソフトウェア開発の発展を語ってみた。要旨は以下の通りで、プレゼン資料はこちら


フレデリック・ブルックスは、1975年に刊行された著書『人月の神話』において、「遅れたソフトウェアプロジェクトに人員を追加投入すると、さらに遅れる」という法則を指摘した。既存メンバーと追加メンバーとのコミュニケーションが必要になり、人員追加の効果が相殺されてしまうためだという。

また、ブルックスは1986年に「銀の弾丸などない」という論文を発表し、ソフトウェア開発の生産性を劇的に改善する方法(狼男を鎮める銀の弾丸)はない、とも主張した。ソフトウェア開発の本質は抽象的な概念構造体の構築であり、技術的な改善が入り込みにくい領域だから、という。

ソフトウェアの特性としてブルックスは複雑性・同調性・可変性・不可視性の四つを挙げる。同調性や可変性は複雑性を増加させる要因とされているので、この四つの特性は実質的には複雑性と不可視性の二つに整理できる。

ブルックスの時代から現在まで、ソフトウェア業界はどのように変化してきたか。「銀の弾丸」は登場しただろうか。

■銀の弾丸

「銀の弾丸」がこれまでに飛んできた方向は大きく三つに分類することができる。開発プロセス、プログラミング技術、インターネットである。

(1) 開発プロセス

要件定義、設計、実装、試験という開発の工程をそれぞれ一回だけ実施する伝統的なウォーターフォール型に対し、全工程を何度も繰り返すインクリメンタル型が提唱された。これによりユーザーと開発者のコミュニケーションギャップを最小化し、フタをあけてみたら期待と全くちがうものが出てきた、などといったことがないようにする。

また、Linuxの開発プロセスを観察したエリック・レイモンドは、ソースコードを公開して優秀な開発者の協力を得る、という全く新しいバザール方式を発見した。

インクリメンタル型は、ブルックスが指摘したソフトウェアの可変性への対処として、いくらか有効と言える。バザール方式は特殊な条件の下でのみ成功するので評価が難しい。

(2) プログラミング技術

技術の面でもっとも重要な変化はオブジェクト指向プログラミングが普及したことだ。プログラムが処理するデータと手続きを一体化し、オブジェクトとするオブジェクト指向プログラミングは、C++やJavaとともに1990年代後半に普及した。プログラムの構成要素の独立性が高まり、変更の影響範囲を局所化することが容易になった。

オブジェクト指向プログラミングはソフトウェアの再利用を促進する結果にもなった。とくにJavaのクラスライブラリは膨大な規模になっている。アプリケーション全体の動作を共通化するフレームワークもよく使われるようになった。以前は自前で書いていた処理をライブラリに任せることができるようになったのは大きな進歩だ。

実装や単体試験に関しては自動化が進んでいる。設計書からソースコードを生成するツールや、作成したプログラムをテストプログラムによってテストするためのライブラリなどが登場した。ソースコードを生成するツールは、ソースコードと同じ細かさで設計書を書く必要が生じるため、あまり意味がない。しかしテストの自動化はある程度有効と言える。

設計図の標準として統一モデリング言語(UML)が使われるようになり、ソフトウェアの構造や振る舞いを視覚化する手段ができた。ただ、UMLはソースコードとのズレが生じることが多いため、無駄という意見もある。

(3) インターネット

1990年代にインターネットが一般に普及したことは、ソフトウェアの世界にも決定的な変化をもたらした。ソフトウェアのソースコードは公開すべきだ、という思想に基づくフリーソフトウェア運動は、Linuxの成功とともにソフトウェア業界の大きな潮流となった。AndroidのベースがLinuxであることを考えると、現在もっとも多く使われているOSはLinuxと言える。

インターネット上には技術者のコミュニティもたくさん生まれた。近年もっとも活発なのはQ&AサイトのStack Overflowで、プログラミングに関する質問を投稿すると誰かが答えてくれる場になっている。フリーソフトとあわせて考えると、現代のプログラマーは知識と成果物をグローバルに共有していることになる。

■狼男

以上のように様々な「銀の弾丸」が登場してきたが、一方で新たな「狼男」も現れた。

コンピュータ機器は多様化し、あらゆる電化製品がソフトウェアで制御されるようになった。これをソフトウェアの側から見ると、多様な機器に対応しなければならなくなった、ということになる。パソコンだけでなくスマートフォンやタブレットでも汎用のOSが動くようになり、近いうちにウェアラブル機器も登場する。

現代のコンピュータ機器はインターネットに接続できるのが当たり前になっている。しかし、単体で動作すればよい場合と、ほかの機器と通信しなければならない場合では、ソフトウェアの複雑性はまったく異なる。

通信機能と表裏一体の関係にあるのがマルチスレッド処理だ。マルチスレッドにより、プログラムの中で複数の処理を並行して動作させる。通信機能をつけた場合、相手がいつメッセージを送ってくるか分からないため、プログラムのどこが次に実行されるのか分からない。決まった処理を順番に実行して終わり、ではない。これは現代のソフトウェアにおいて一番やっかいな問題となっている。

■まとめ

「銀の弾丸」と評価できるかどうかはともかく、ソフトウェア開発の生産性を引き上げる方法はいろいろと登場した。しかし同時に、ソフトウェアに課される問題も高度化した。結果的にはソフトウェア開発の難しさはブルックスの時代とそれほど変わっていない。