ソフトウェアの複雑さ

結城さんが、「ソフトウェアは、私たちの想像よりもずっと複雑」と書かれている。ソフトウェアが想像よりも複雑という印象を与えるのは、以下の2点の原因によると思う。

  • 構成要素当たりで考えると、ソフトウェアは広義のハードウェアよりはるかに複雑な人工物である。
  • 認識能力の問題から、人間は過剰に単純化してものごとを考えやすい。

単純に比較することはできないが、構成要素当たりで考えると、ソフトウェアは広義のハードウェアよりはるかに複雑な人工物である。要求される厳密さなどを考慮にいれると、ソフトウェアは構成要素当たりで最も複雑な人工物だと言っていい。

広義のハードウェアは、物理的な制約から階層型の構造をもち、個々の構成要素はごく限られたインタフェースしかもたない。個々の構成要素は他のごく限られた構成要素にしか影響を与えない。例えば、クルマのクラッチやブレーキを設計する時に、エンジンのピストンのことを考える必要は無い。エンジンのピストンを取り替えたらクラッチやブレーキが故障した、というようなことは無い。ところが、ソフトウェアの個々の構成要素は、他の多くの構成要素に影響を与えうる。多くのソフトウェアは、ネットワーク型の構造になっているため、ある構成要素における変更が他の多くの構成要素に影響を与える。

人間の認識能力には限界があるので、人間は一旦ものごとを単純化して考える。複雑なものを複雑なまま考えるということはできない。一旦ものごとを単純化して考えるということは人間の能力上仕方が無いことだが、往々にして、単純化したままになったり、複雑さに対する考慮が不足したりしやすい。ソフトウェアにかぎらず、実際より単純なものとしてものごとを考えてしまいやすい。

ソフトウェアの構成要素当たりの複雑さと、過剰に単純化してものごとを考えやすい人間の性質とが、「ソフトウェアは想像よりも複雑」という結果をもたらすのだと思う。