1. 設計とは何か
設計とは、クラスの構成やコンポーネントの関係、全体のアーキテクチャなど、何をどう作っていくかの方針やルールを定めたものです。
設計の例えとして、家の建築がよく挙げられます。家を建てるとき、設計無しにただ好きなように部屋や廊下を組み合わせてしまっては家として正しい形にはなりません。まず最初に家全体の形を決め、様々な制約に基づいて間取りや配線、配管などを決めていくことで、初めて家としてその役割を果たすものが完成します。ソフトウェアも同じで、コードを書く前にクラスの責務や関係を整理し、全体の方針を決めることで破綻を防ぎます。
設計の目的は、システムの開発・保守・運用にかかるコストを最小限にすることです。早い話が、クソコードに振り回されずに開発や仕様変更ができるようにすることです。しかしここで難しいのが、設計には万能の正解が存在しないということです。
銀の弾丸などない
(No Silver Bullet)
Frederick Brooks
設計のどんな手法にも必ずメリットとデメリットが存在します。なので、我々はそれを自分のプロジェクトに合わせて柔軟に取捨選択することが求められます。例えば、春ハッカソンの30時間のためにゴリゴリにハイレベルな設計をしたところで、大した利益は得られないばかりか、設計がメンバーの手に負えず開発は頓挫するでしょう。それよりは、多少汚くても一気にガッと作ってしまう方が合理的です。
しかしだからといって設計を捨てていいわけではありません。設計を捨てて得られる短期的な開発速度は、直後に訪れる莫大な保守コストに押し潰されます。ここで言いたいのは、あくまで状況に応じて開発コストを最小限にする設計をしろということです。何も考えずに設計を捨てるのと、あえて低レベルな設計を採る判断をするのとでは雲泥の差です。
設計を死守するのが我々開発者の使命です。安易に設計を捨てるという選択を取らないようにしましょう。