- 壊れない設計を目指すと、判断は過剰に固められる
- 壊れる設計と、壊してよい設計は違う
- 「直しやすさ」は、後から付け足せない
- 壊れやすい場所は、あらかじめ弱くしておく
- 判断の強度を揃えないという選択
- 設計は、未来の自分への引き継ぎである
- 壊すことを恐れなくなると、設計は楽になる
ここまでの章では、
- 設計とは判断を閉じ込める行為であること
- 判断は必ず変わること
- 壊れやすい設計は、判断の偏りから生まれること
を見てきました。
ここで、設計に対する前提を一段階更新します。
設計は、壊れないようにする行為ではありません。 壊れることを前提に、回収できる形にしておく行為です。
この章では、 「壊れる前提」を受け入れたときに初めて見えてくる設計の姿を掘り下げます。
壊れない設計を目指すと、判断は過剰に固められる
壊れない設計を目指すと、 設計者は無意識に、判断を強く閉じ込めようとします。
- 将来の変更を想定しすぎる
- 例外ケースをすべて先取りしようとする
- 型や抽象で厳重に縛る
一見すると堅牢そうに見えますが、 ここには大きな落とし穴があります。
それは、 想定が外れた瞬間に、全体が一気に硬直する ということです。
壊れないように固めた設計ほど、 壊れたときの修復コストは高くなります。
壊れる設計と、壊してよい設計は違う
「壊れる前提」と言うと、 雑に作ってよい、という意味に受け取られることがあります。
しかし、それは違います。
- 無秩序
- 無境界
- 無責任
な設計は、単に放棄です。
ここで言うのは、 壊れる場所が分かっている設計 です。
- どこが変わりやすいか
- どこは変わりにくいか
- 壊れるとしたら、どこからか
これが説明できる状態を作ることが目的です。
「直しやすさ」は、後から付け足せない
よく、次のような言葉を耳にします。
- まずは作って、あとで直せばいい
- 動くものを早く出そう
これはスピードが求められる場面では正しい判断です。
ただし、 直しやすさを設計せずに作ったものは、後から直しにくい という事実もあります。
直しやすさとは、
- 境界があること
- 責務が分かれていること
- 判断が局所化されていること
の積み重ねです。
直すという行為は、何かを後から付け加えることではありません。 すでに存在するコードを修正し、置き換え、削る行為です。 そのため、どんなに小さな変更であっても、既存の判断や構造に多かれ少なかれ影響を与えます。
壊れやすい場所は、あらかじめ弱くしておく
壊れやすい場所を、 あえて「弱く」設計するという考え方があります。
- 差し替えやすい
- 捨てやすい
- 影響範囲が小さい
こうした性質を持たせることで、 壊れたときに迷わず手を入れられます。
これは、
- 抽象を増やすこと
- レイヤを増やすこと
とは限りません。
むしろ、 壊れる前提の場所ほど、構造はシンプルな方がよい 場合も多くあります。
判断の強度を揃えないという選択
すべての判断を、 同じ強度で閉じ込める必要はありません。
- 型で完全に縛る判断
- 境界として分ける判断
- コメントやドキュメントに留める判断
これらはすべて、 判断をどの強さで残すか の違いです。
壊れる前提で設計するとは、 判断ごとに強度を変えることだとも言えます。
設計は、未来の自分への引き継ぎである
壊れたときにコードを触るのは、 未来の自分か、別の誰かです。
その人が、
- どこを疑えばいいか
- どこを壊していいか
- どこは触らない方がいいか
を判断できるようにすること。
それが、 壊れる前提で設計するということです。
設計は、 未来への説明責任 でもあります。
壊すことを恐れなくなると、設計は楽になる
壊れることを前提にすると、 設計は少し楽になります。
- 完璧を目指さなくてよくなる
- 想定外を過剰に恐れなくてよくなる
- 判断を置く場所に集中できる
設計は、 当てるゲームではありません。
選び直せる状態を作るゲームです。
次の章では、 判断を「コードとして残す」具体的な方法、 つまり名前・型・境界の話に進みます。
ここから先は、 設計が目に見える形になる章 です。