【雑記】人間が扱える複雑度
ソースコードのリバースエンジニアリングをしていると、関数やソースファイル、フォルダの多さに圧倒される事が多々ある。
単に1機能だけ追いかけたいなら、ユーザー入力部から順に関数の呼び出しを追っていけば可能だ。
だが全体を把握するとなると極端に難しくなる。たとえ狭い担当範囲でもそれなりの数のソースファイル、フォルダ、関数、変数であることが多い。
このときふと疑問に思った。本質的に、その人間が扱える複雑度の上限はどのくらいのものなのか?またその上限は鍛えることで上げることが可能か?
私なりの結論から先に言う。
その人が脳内で一度に把握できる項目数をNとするとき、その人ひとりだけで構築できるシステム複雑度の上限はN^Nである。
「脳内で一度に把握できる項目数N」というのは例えばA4の紙1枚に書かれた箇条書きのリストだと思えばいい。
次にその項目1つあたり、別のA4の紙1枚の詳細資料があり、そこにもN個の項目があるとする。
そしてその項目1つあたり、また別のA4の紙1枚の詳細資料があり………
といったように入れ子状にN個の項目に分割されるものとする。
そして、この入れ子の深さだが、これもN階層までとする。
そうすると全体の項目数はN×N×…×N(NをN回掛け算)=N^N
たいてい、人間が一度に脳内で考えられる項目数はせいぜいA4の紙1枚程度、さらにせいぜい5〜8項目程度だと思う。
その項目の詳細ページに行くにしてもそこに小項目が1000個あったとしたら途端に迷子になる。そこでもせいぜい人間が一度に把握できる5〜8程度の項目に分類されている必要がある。
そしてその先の小々項目も5〜8程度……
と人間が一度に把握できる項目数で徐々に詳細化されていくのが理想である。
そしてその階層の数も人間が一度に把握できる5〜8階層で留まるべきである。
基本的にそのNを超えると把握が難しくなると考えると目の前の課題が自分にとって適切な粒度に分割されているか判断がつく、と個人的には思う。
さて、N^Nは実際、どの程度までおおきなかずなのか。
人間が一度に把握できる項目数Nが5〜8であるとする。簡単のために、ここでは多めに8だとしよう。
N=8の人間なら、
N^N=16,777,216(なんと1,600万!)
たったN=8だと思うかもしれないが、作りきれるシステムの大きさを考えると意外と莫大なものも可能なんだな、と分かる。
裏を返せば、複雑度1600万のシステムを作れ(or 資料整理をせよ)と言われたとしてもうろたえる必要はない。
N^N≈1600万 を満たすNで階層構造を作っていけば一番、少ない項目数と階層にして全体をハンドリングできる、ということだ。
逆に、この項目数や階層数がNに対してムラがあると、そこの部分での把握が難しくなる。そこの理解はブラックボックス化せざるを得なくなる。このNが均等になるように構成を考えるべきだということである。
結論:複雑な仕事に直面したとしても、大抵のことはN^Nの構造にすれば大丈夫!
以上!
