ソフトウェアの「適切な構造」の構成要素とは?

いろんなところで主張してきたことの繰り返しになりますが、ソフトウェアの設計とは、「解きたい問題に対して適切な構造を与えること」だとわたしは考えています。

「解きたい問題に対して適切な構造を与えること」という以上、「解きたい問題」が変われば「適切な構造」も変化する、ということが言えるはずです。これは「まず問題を適切に捉えること」の重要性を示していると言えると思っています。しかし、そのことと同等に問題とされるべきは、「適切な構造は何によって構成されるか」であるとも思います。

わたしは、ソフトウェアの「適切な構造」を構成する二大要素は「関心の分割点」と「分割点によって分割された要素同士の依存関係」だと思っています。

つまり、ソフトウェア設計とは、「まず解きたい問題を理解し、その問題に応じて、適切な関心の分割点を見出し、見出された関心の分割点で分割された各要素に対して最も適切な依存関係を設定すること」だと、わたしは考えています。なお、「解きたい問題」は、時に「真に解くべき問題を見出す」という問題であることがあり(というか現代のソフトウェア開発においてはそういう問題が大多数を占める)、その場合は「探索的な問題を解くために必要なアジリティを確保できるような分割点と依存関係を見出すこと」が設計の勘所になってくる、という話になってくると思っています。

ちょっと抽象度が高い話をしたのでいつか機会があればもう少し具体的な事例を交えて書きたいかもしれない。ブログなので今日は雑に書いておしまいとする。