システムの複雑さ

システムを作るときに、システムの複雑さは、そのシステムに存在するステートの数と、その連携に仕方よって決まる。こんへんは、テストでなぜ、単体テストを行った後に結合テストを行うかというのと理論的には似ている。


例えば、分岐が6個あるパーツAと分岐が4こあるパーツBをテストするとする。AとBを結合したものをCとしよう。そうしたときに、パーツAとパーツBがお互いに依存しあっていない場合にフルパスのテストを行うとパスの数は

6 + 4 = 10通り


となる。一方、パーツAの結果を使ってパーツBがうごく等の場合は

6 * 4 = 24通り※


※Bに4とおりパスが発生するよう、Aから出力が出ると仮定

となる。

つまり、システムの複雑さとは、ステートの個数と独立性によって決まるのだ。難しいシステムは、複数のステートがからみあっているものだ。だが、フルパスで絡み合っているわけでなく、そのパスは実は限られている。いわゆる、

  1. どのようなステートがそのシステムに存在するか見抜く
  2. ステート間でどのような依存性があるかを見抜く

というステップの作業が、いわゆる「要件定義」である。要件定義がこのようなステップである以上、システムの複雑さというのはこのフェーズで決まるのだ。そういう意味では、このステート(ワークフロー)とステートの発見という2つの命題に的を絞るのはすごいことだと思います。


特に、1つのステートだけでなく、複数の関連するステートを見える形で(要件定義と連動して)処理できるステートマシンが出来たらすごいかも。