🎈

ソフトウェアの複雑さに立ち向かうアイディア

2022/04/10に公開

最近考えていることをメモ書き程度に。

構造がシンプルで認知負担が低い

シンプルであれば、人間はシステム1で思考でき素早く把握し素早く判断ができる。
https://uxdaystokyo.com/articles/glossary/system1-system2/
https://asu-yoku-laboratory.com/behavioral-economics-system1-system2
シンプルであれば1人の頭脳でも巨大なシステムを理解することができる。すべてを把握できればどこにどの機能を追加すべきか、どこにバグの原因がありそうか理解できる。

エントロピー増大則のように、すべてのコードは何も努力しなければ自然と複雑になっていく。シンプルは努力の結果生まれるもの。

シンプルを言語化する。

  • 理解しやすい言葉で構成されている
  • 余分な情報を削ぎ落としたインターフェース(これは抽象化のいち側面)
  • 機能と責務がはっきりしている抽象化
  • 程よい抽象化の粒度
  • 対称性をもっている
  • マクロからミクロに倍率を変えても似たような構造になるフラクタル構造(これは対称性の一部)

http://www.gaia.h.kyoto-u.ac.jp/~fractal/detail/41.html

対称性とは、例えばModel - View - Controller パターンのように、1つのリソースが表示されるまでに、3つの役者が出てくるとか、お決まりパターンがあることや、ディレクトリ構造が決まっていることなど。他にもDBのデータの持ち方が似たようなリソースであればだいたい同じなど。

フラクタルな構造は、軍隊における5人組が組み合わさって100人組になり、更にそれが組み合わさって1000人組になるという自己の形をコピペしていく構造。必ずしもすべてがフラクタルになることはないが、もし実現できればシンプルかつグロースしやすい構造を作ることができる。

グロースしやすい

ソフトウェアの大きさに対応するには、

  • よく設計された小さなコンポーネントを組み合わせることによる組合せ爆発を利用
  • コアはシンプルに保ち、周辺部は多様にする、ツリー型のワークフロー
  • すべてをやる万能型システムを作らずに、それぞれの役割をうまくやり、それぞれとコミュニケーションを取り合うモジュール型の構造

を作る。例えば人間の体は小さな細胞が組み合わさって、それぞれの臓器を形作り(モジュール化)複雑な機能を実現している。

コアはシンプルに保ち、周辺部は多様にする、ツリー型のワークフローを実現するには

  • なるべく内部の処理に条件分岐を含めず、インターフェース(IOという意味)の多様性でカバーする。
  • 似たようなワークフローがあればインターフェース(抽象化という意味)を共通化できなか考える。

Discussion