分析とは何か、設計とは何か?
ソフトウェア開発を「問題解決」、と見ると、
問題→解という活動だと考えられる。左の「問題」は、問題空間にあり、右の「解」は解空間にある。設計とは、このマッピングを行なう活動だと考える。では、分析とは何か。
実際には、(ソフトウェアでは特に)問題が複雑だったり曖昧だったりすることから、このままではうまく解けない(悪構造 ill-structured problem)。そこで、一旦、この「問題→解」という現実世界の問題をモデル化しよう、ということになる。「問題空間」、「解空間」という空間と直行する空間軸として、上下に「モデル空間」と「現実空間」を導入する。そうすると、4つの象限が現れる。その4つの象限に、現実空間の「問題」と「解」、そして、モデル空間の「分析モデル」と「設計モデル」を置く。ここで、分析モデル=モデル化された問題 、設計モデル=モデル化された解である。そして、問題→解という直線的な解き方ではなく、一旦モデル空間に上って遠回りをしてみる。
分析モデル→設計モデル
↑ ↓
問題 解
問題を一旦モデル化する活動を「分析」と呼ぶ。成果物は、「モデル空間上の問題」(分析モデル)だ。そして、モデル空間上で解決させる活動を、「設計」と呼ぶ。成果物は、「モデル空間上の解」(設計モデル)だ。最後に、モデル空間から現実空間へと逆変換する。これを実装と呼ぶ。成果物は解、すなわち(ソフトウェア開発であれば)動くコードである。
まとめると、設計とは、問題空間から解空間への変換である。ただし、一旦問題をモデル化し(分析)、それをモデルで解決する(設計)。つまり、モデル領域で変換する。そして、解のモデルを、再度現実領域にもどしてやる。これで最終的な現実世界の解にたどりつく。
最後のミッシングリンクは、現実領域での、問題と解との突合せ、すなわち「テスト」である。テストによって、「右回りの活動」がもともとの意図である「問題→解決」と合っていることを示す。そう、この「テスト」こそが、問題に対する解が正しいことの最終的保障になるのだ。
Thanks > ぁまんにょさん(このロジックは二人の共作)
実は、最後の一行は、「だから、ソフトウェア開発は「テスト」を第一級の概念として扱うべきなんだ。テストしやすい設計、は決して本末転倒ではない。 」という文がありました。ですが、ちょっと「落ち」として不適切だったので、取りました。
(この話は、verification/validationの話をちゃんとしないと誤解を生みそうなので)