TL;DR
- 最初に思いついた設計が最良であることは少ないので、少なくとも 2 つの設計を考えて比べる。
- 二度設計するコストは実装にかかる時間に比べて小さく、十分に元が取れる。
内容
なぜ二度設計するのか
ソフトウェア設計は難しく、最初に思いついた設計が最良であることは少ない。これは頭の良し悪しとは関係なく、「賢い人なら最初から正しく設計できる」というのは誤りである。複数の選択肢を検討することで、より良い結果が得られる。
そこで、とにかく二度設計する(design it twice)。「合理的なアプローチはこれしかない」と自信があっても、良くない設計になると分かりきっていても、別の案を考える。
比較のしかた
2 つの設計の長所と短所を書き出す。このとき最も重視するのは、上位のレイヤから見た使いやすさである。ほかにも次の点を比べる。
- A は B よりシンプルなインタフェースを持つか(簡潔さ)
- A のインタフェースは B より汎用的か(汎用性)
- A のインタフェースは B より効率よく問題を解決できるか(効率性)。問題を解くのに多くのメソッドを呼ぶ必要があるなら、効率的とはいえない
比較することで、最初の案、代替案、あるいは複数の案を組み合わせたもののうち、どれが良いかを見極められる。設計スキルの向上にもつながる。どの案も魅力的でなければ、元の案で見えた問題を手がかりに、追加の案を考える。
どこに適用するか
二度設計する考え方は、システムのどのレベルにも適用できる。モジュール設計では、どのインタフェースが適切か、どの実装が適切かを考える(第4章 Modules Should Be Deep)。実装の目標はインタフェースの目標とは異なり、実装にとってはシンプルさと性能が重要になる。ほかにも、UI の機能やモジュールの分割などに使える。
コストは小さい
二度設計するのに、それほど時間はかからない。クラスのような小さなモジュールなら、代替案を 1 つ考えるのに長くても 1〜2 時間である。実装に数日から数週間かかることを考えれば小さい。大きなモジュールでも、二度設計する時間は実装にかかる時間よりはるかに短い。費用対効果で十分に元が取れる。
キーワード
自分の理解
設計の上手さは頭の良し悪しではないという話から、経験に裏打ちされた根のある知識と、根無し草の知識の対比を思い出した。
実装にとってはシンプルさと性能が重要という話は、「モジュールにとっては、シンプルな実装よりシンプルなインタフェースのほうが重要」という前提があってのものだと思う(第8章 Pull Complexity Downwards)。
二度設計するのに時間がかからないというのは、あくまで実装にかかる時間と比べた相対的な話である。