- 設計の話が、なぜ噛み合わないのか
- 「良い構造」を真似ても、うまくいかない理由
- 設計とは、何をしている行為なのか
- 判断は、コードのどこに現れるのか
- 判断が「にじみ出る」と何が起きるか
- 「閉じ込める」という発想
- この本で扱わないこと
- まとめ
設計の話が、なぜ噛み合わないのか
設計の話をしているはずなのに、会話がどこか噛み合わない。 そんな経験はないだろうか。
「このクラス、責務が重くないですか?」 「ここ、MVVM 的におかしくない?」 「もう少し共通化できそうですよね」
言っていることは、どれもそれなりに正しい。 しかし次の瞬間、場の空気は微妙になる。
- なぜそれが“悪い”のか、うまく説明できない
- 相手もなんとなく納得していない
- 結局「今回はこのままで…」となる
設計の議論が難しいのは、知識が足りないからではない。 多くの場合、話題にしているレイヤがズレているだけだ。
私たちは「構造」について話しているつもりで、 本当はそこに含まれている 判断 について語れていない。
「良い構造」を真似ても、うまくいかない理由
世の中には、良いとされる設計がたくさんある。 レイヤードアーキテクチャ、MVVM、Clean Architecture、DDD。
それらを学び、 「正しい形」に沿ってコードを書いたはずなのに、 しばらくするとシステムはまた苦しくなる。
- 変更のたびに広範囲を確認する必要がある
- 触ってはいけない雰囲気のコードが増える
- なぜこの構造なのか、誰も説明できない
これは「構造の選択を間違えた」から起きているのではない。
問題はもっと単純で、 その構造が前提としている判断と、現実の判断が一致していなかっただけだ。
設計はレシピではない。 同じ構造でも、 どんな判断を閉じ込めるために使うかによって、結果はまったく変わる。
設計とは、何をしている行為なのか
ここで、本書における設計の定義をはっきりさせておきたい。
設計とは、 不確実な判断を、どこに、どの強さで閉じ込めるかを決める行為である。
判断とは、次のようなものだ。
- 将来、変わるかもしれない決定
- 特定の文脈に強く依存した選択
- あとから「間違っていた」と分かる可能性があるもの
設計が難しいのは、 これらの判断が 必ず間違える前提 で存在しているからだ。
設計の仕事は、 判断をなくすことではない。
判断が壊れたときに、 被害がどこまで広がるかを制御することにある。
判断は、コードのどこに現れるのか
「判断」と聞くと、 if 文や分岐ロジックを思い浮かべるかもしれない。
しかし実際には、 判断はコードのあらゆる場所に現れる。
- クラスを分けたという事実
- ファイルを分けたという事実
- 名前を付けたという事実
- 共通化した、しなかったという決定
たとえば、2 つのクラスを別々にした瞬間、 あなたはこう判断している。
「この 2 つは、将来別々に変わる可能性がある」
構造とは、 判断を固定化した結果の集合体 にすぎない。
判断が「にじみ出る」と何が起きるか
判断が一箇所に閉じ込められていれば、 修正は比較的容易だ。
しかし判断がにじみ出ると、状況は一変する。
- 同じ前提が複数箇所に散らばる
- どこを直せばよいか分からなくなる
- 修正のたびに全体確認が必要になる
設計が壊れるのは、 新しい判断をしたときではない。
古い判断が、どこにあるか分からなくなったとき だ。
「閉じ込める」という発想
本書では、 判断を扱う方法として「閉じ込める」という言葉を使う。
閉じ込めるとは、 隠すことでも、押し込めることでもない。
- 境界を作ること
- 触っていい場所を決めること
- 触ってはいけない場所を決めること
つまり、 判断に責任を持つ場所を明確にする ということだ。
もちろん、閉じ込めすぎれば身動きが取れなくなる。 このバランスについては、後の章で詳しく扱う。
この本で扱わないこと
本書は、次のようなことを目的としていない。
- 最新フレームワークの解説
- 正解のアーキテクチャ提示
- テンプレート設計の紹介
本書が扱うのは、 設計の 答え ではなく、 判断の 考え方 だ。
まとめ
- 設計は構造の話ではない
- 設計は判断を扱う技術である
- 問題は判断が存在することではない
- 問題は判断が制御されていないことだ
次章では、 なぜ判断がシステムを壊すのか を、 もう一段深く掘り下げていく。