オーバーエンジニアリング(過剰設計)とは
Over-Engineering / 過剰設計
現時点で必要な要件を超えて、将来の変更や拡張性を過度に見込み、必要以上に複雑な設計・実装をするアンチパターン
ひとことで言うと
「まだ使わない将来の要件」に備えすぎて、シンプルに作れるものを無駄に複雑にしてしまう設計上の失敗。
概要
オーバーエンジニアリングとは、現時点で必要な要件を超えて将来の変更や拡張性を過度に見込み、必要以上に複雑な設計・実装をするアンチパターンになる。 抽象化レイヤーの多用、汎用化しすぎた設定機構、使われる見込みの薄い拡張ポイントの用意などが典型で、開発初期の生産性低下・可読性の悪化・保守コストの増大を招く。 対義的な設計原則としてYAGNI(You Aren't Gonna Need It、それは必要にならない)やKISS(Keep It Simple, Stupid)が挙げられ、必要になった時点で拡張する漸進的な設計が推奨される。 AIコーディングエージェントが大量のコードを高速生成できる時代においては、エージェントが要求されていない抽象化や汎用機構を自発的に作り込んでしまうケースも指摘されており、レビューやプロンプトでの制約付けが必要な論点として議論されている。
利点
- (設計として意図された場合)将来の要件変化に備えた拡張が容易になる可能性がある
欠点
- 実装・レビューにかかる工数が増え、開発速度が落ちる
- 抽象化やレイヤーが増えることでコードの見通しが悪化し、可読性・保守性が下がる
- 使われない拡張ポイントや設定項目がテスト範囲や不具合の温床になる
- 見込んだ将来の要件が実際には発生せず、投資が無駄になることが多い
関連用語
よくある質問
オーバーエンジニアリングとYAGNIの関係は。
YAGNI(You Aren't Gonna Need It)は「今必要でない機能は作らない」という設計原則で、オーバーエンジニアリングを避けるための代表的な指針として引き合いに出される。
オーバーエンジニアリングとリファクタリングの違いは。
リファクタリングは既存コードの挙動を変えずに構造を改善する作業であるのに対し、オーバーエンジニアリングは設計・実装の時点で不要な複雑さを先回りして作り込んでしまう問題を指す。