lacolaco

Google Developers Expert for Angular / 技術的なことや技術的じゃないことを書きます

良い設計と平衡

免責事項: 思考過程のメモです

アプリケーションの設計とは

アプリケーションの設計とは、「空間を定義し」「問題を識別し」「解決手段を選択する」工程である。

空間の定義

システムの中で、設計の対象とする領域とそうでない領域を定義する。 システムへの要求により空間は大きくなる。フレームワークは空間を狭める効果がある。 システムの空間のなかで設計の対象範囲を広く定義するほど「設計の自由度が高い」とみなせる。 設計の自由度が高ければ選択できる解決手段も増えるが、同時に問題の量も増える。

問題と解決

設計空間の中で、問題を識別し、それを解決できる手段を選択する。

f:id:lacolaco:20190317214301p:plain

システムの問題を解決するためにはシステムに作用する必要があり、その作用により別の問題が発生することが常である。 トレードオフと呼ばれ、解決前の問題と解決後の問題の重みを比較し、どちらを受け入れるかを選択する。 結果として、問題と解決、それによる問題を補う解決、というようにネットワークがつながっていく。

f:id:lacolaco:20190317214659p:plain

問題を解決するための手段はほとんどの場合複数ある。 複数の問題を一挙に解決できる手段もある。 そして目先の問題を解決するための手段が連鎖の先で大きな問題を誘起することもある。 良い設計は、全体としてネットワークの分岐やサイズをコンパクトに抑える。

f:id:lacolaco:20190317214956p:plain

すべての問題が解決されることはない。ネットワークの末端や途中には未解決の問題が残る。

f:id:lacolaco:20190317215641p:plain

それらを解決することでさらにシステムを拡張する選択もあるが、解決しないという選択を取ることもできる。 それは仕様と呼ばれたりレガシーと呼ばれたり負債と呼ばれたり、認識はいろいろである。 その問題から先のチェーンをふるい落とし、システムをコンパクトに維持するための先送りである。

f:id:lacolaco:20190317215812p:plain

そのようにして設計されたシステムは、全体として釣り合いがとれた平衡状態になる。

f:id:lacolaco:20190317215933p:plain

システムは時間とともに外部からの刺激を受ける。 新しい機能の追加、仕様の変更、あるいはインフラ環境の変化など。 それらはシステムの中で新たな問題を生み出す。

f:id:lacolaco:20190317220409p:plain

新たな問題を解決するためにまたシステムに手を加える必要が生まれる。 良くない設計は、新たな問題に対して必要な変更が大きいシステムを生み出す。柔軟性が低く、衝撃を吸収できない。メンテナンス性が低いともいう。 新たな作用により既存の問題と解決に影響してしまうこともあり、ネットワーク全体で新しい平衡に達するまでに時間がかかる。

f:id:lacolaco:20190317220637p:plain

良い設計は新しい平衡に達するまでの時間が短い。 あらかじめ新たな問題の発生を予測してあるシステムは、解決のために既存のネットワークに加える変更が小さい。

f:id:lacolaco:20190317220918p:plain

どう設計すべきか

現在観測できる問題をスマートに解決できるシステムであっても、未来に受ける新たな外部刺激から生まれる問題に弱くては良い設計とは言えない。 かといって最初からあらゆる問題を想定することは早すぎる最適化のような別の問題も引き起こし、開発コストも増加する。 どこまでを現在の設計でカバーし、どこから先を未来の再設計に先送りするかの選択こそが必要である。それすらもトレードオフである。

良い設計を生み出すために磨くべき能力は

  • プロジェクト、チームメンバーなど外部要因に合わせた設計空間定義
  • 問題を見逃さない目。多くの問題は一般的に発生するパターンがある。
  • 解決手段の引き出し。より多くの選択肢の中から最良の決定をする。
  • 想像力。一度達した平衡が崩れる将来リスクを認識し、備える。