TL;DR
- ソフトウェア開発の限界は、作っているシステムを理解する能力で決まる。複雑さはその理解を妨げるので、複雑さの軽減がソフトウェア設計で最も重要である。
- 設計は開発の初期に終わるものではなく、開発の間ずっと続くプロセスである。
内容
複雑さがすべて
プログラマに必要なのは、創造的な頭脳と、考えを整理する能力である。ソフトウェアを書く上での限界は、自分たちが作っているシステムを理解する能力で決まる。複雑さはこの理解を妨げる。複雑さは、コンポーネント間の依存関係が積み重なって生まれる。そのため、複雑さを軽減することがソフトウェア設計で最も重要である。
優れたツールは次々に登場しているが、ツールだけでは限界がある。結局は、システムをシンプルにするしかない。
複雑さを減らす 2 つの方法
複雑さを減らす方法は 2 つある。1 つは、コードをよりシンプルで分かりやすくすることである。もう 1 つは、複雑さをカプセル化することである。後者がモジュール設計で、ソフトウェアをクラスのようなモジュールに分割し、他のモジュールの詳細を知らなくても実装できるようにする。
設計は継続的なプロセス
ソフトウェアの設計は、物理的なシステムと違って継続的なプロセスである。ウォーターフォールモデルでは、設計がプロジェクトの初期に集中し、各フェーズの担当者も別々であることが多い。しかし、大規模なソフトウェアシステムを事前にすべて見通すことはできない。初期の設計には多くの問題があり、それらは実装が進んでから表に出てくる。
今日、ウォーターフォールモデルはほとんど使われず、アジャイル開発のようなインクリメンタルなアプローチが主流である。インクリメンタルなアプローチでは、設計に終わりがない。開発者は常に設計を意識し、改善の機会をうかがう必要がある(継続的な再設計)。設計で重要なのは複雑さの軽減なので、常に複雑さについて考えることが大切である。