システムと呼ばれるものは、さまざまな要素の関係が複雑で、要素とその関係が変動し、予測が難しく、とらえにくいものである。
システムと呼ばれるものに取り組む時に、自分が意識している5つの視点を簡単にまとめてみた。
①文脈で考える
システムを取り巻く環境や、そのシステムがおかれた状況が、そのシステムのさまざまな特徴を生み出しているという、という捉え方。この環境や状況が、システムが存在し持続する文脈となる。
システムと環境は相互に作用する関係にある。つまり、環境が変わればシステムが変化し、システムが変われば、環境になんらかの変化が生まれる。
システムが人工物の場合、取り巻く環境を構成する要素は、三つに分類できる。
- その人工物を作る理由や目的
- その人工物を作るために利用可能な資源
- その人工物を作るうえでの制約
ソフトウェアシステムを設計する場合、文脈で考えるということは、ソフトウェアシステムの目的、利用可能な資源、作るうえでの制約を考えるということ。
②全体と部分で考える
システムは一つの全体であり、同時に、部分の集合である。
システムを捉える視点として、全体を見ることと、部分を見ることを組み合わせることになる。
意識的に(細部にとらわれず)全体を見る、あるいは、意識的に(全体から切り離して)部分を見る、ということが役に立つ。
無意識に部分だけを見る、ということが起きがちなので、意識的に細部にとらわれずに全体を見ることに重きを置くことが、結果として、部分を適切に扱うことにつながる。
全体を見るためのさまざまな視点の中で、文脈で考える視点がシステムを全体として捉え理解するために役に立つことが多い。
③関係で考える
個々の構成要素は、実体として、比較的、とらえやすい。それに対し、要素と要素がどういう関係にあるかは、とらえにくい。なんとなくつながりがありそうだと感じることと、そのつながりを分析し関係に名前をつけること(関係の言語化)との間には、大きな隔たりがある。
関係で考えることは難しい。だからこそ、関係で考えてみることが役に立つ。最初は見えていなかった関係があきらかになることで、システムの輪郭と構造が明らかになってくる。
全体と部分で考える時も、関係で考える視点が役に立つ。他の要素との関係を考えずに、個々の要素(部分)に注目しているだけでは、全体を見ることができない。要素間のつながりを考えてみることで、全体を見る手がかりが増えてくる。
文脈で考える視点とは、文脈と対象システムとの関係を考えることである。
④ネットワークで考える
要素と要素の関係を捉える時に、要素どうしを対等に考えると、その関係はネットワーク構造になる。
要素と要素の関係を包含関係や上限関係で考えると、その関係はツリー構造となる。
ツリー構造は、整理されているように見えるが、システムは基本的にツリー構造では整理できない。 もし、ツリー構造で整理することが効果的であるなら、整理の対象は、システムと呼ぶよりは、もっと単純で静的な存在としてとらえたほうがよいということ。
ネットワーク構造にもいくつかのパターンがある。 極端な例として、一つの中心となる要素に、他の要素がつながっている、周辺の要素どうしには関係がない、という一点集中型がある。 別の極端な例として、すべての要素がつながっている完全(?)なネットワーク構造がある。 また、複雑なネットワークモデルの一つに、要素間のつながりがランダムに(確率論的に)発生するというランダムネットワークモデルがある。
現実のシステムの構造としては、いずれも単純すぎる。
多くのシステムは、スケールフリーネットワークと呼ばれる特徴を持つ。 スケールフリーネットワークとは、簡単に言えば、ごく少数とつながる多数の要素と、多数の要素とつながるごく少数の要素で成り立つネットワーク構造である。
システムをこのスケールフリーネットワークとして捉えることが役に立つことが多い。特に、多数の要素がつながるごく少数の要素(ハブ)を特定することが、システムの特徴を捉え、構造を整理することにつながることが多い。
また、ハブと要素の間の属性、例えば距離やなんらかの重みなどを分析することが、システムの特性の発見につながることがある。
⑤プロセスで考える
システムは時間とともに変化する。完全に静止した構造物は、システムではない。
システムを捉える時に、ある時点での静的な構造を考えることは役に立つ。しかし、その静的な構造は、時間とともに変化するというシステムの本質的な特徴を見落とすことにつながる。
システムを捉える時には、時間とともに変化する進行過程で考えることが役に立つ。
進行過程のモデル化の技法としては、一連の活動としてモデル化、一連の出来事(イベント)としてモデル化、状態空間の遷移としてモデル化、などがある。三つのモデルは、活動の結果として出来事が発生し、出来事が状態を遷移させる、という関係になる。
まとめ
ここに書いたことは、アルゴリズムのような方法論ではない。
ソフトウェアシステムの設計のさまざまな失敗と成功から学んだ、私の経験則の言語化である。
システムを理解したり、システムを設計する時に、この5つの視点を意識して使ってみることで、複雑で、あいまいで、一見とらえどころのない対象を、モデル化し、構造を把握し、判断し、次の行動に進むという設計活動を効果的に行うことができるようになる。