オーバーエンジニアリングは、成果物において本来不要な機能を実装することを指します。気を利かせて開発したものの、過剰または非効率な設計となり、最短コースでプロジェクトを進められなくなる難点があります。本記事では、オーバーエンジニアリングの基本や回避する方法を解説します。【テック部門の用意ならテックユニット】月額契約で貴社専属の開発チームをご用意し、アジャイル開発でプロジェクトを推進します。従来の開発スタイル(一括請負)の課題を解決し、テック部門をすぐに設立できるテックユニットは、新しいプロジェクトから既存システムの改修まで対応できます。下記のような方におすすめできるサービスです。お気軽にご相談ください。・開発リソースの確保に困っている方・企業の新規事業ご担当者様・保守運用を移管したい方・開発の引き継ぎを依頼したい方>>テックユニット(月額制アジャイル開発)の詳細はこちらオーバーエンジニアリングとはなにかオーバーエンジニアリングとは、成果物において本来不要な機能を実装することです。Wikipediaにはありませんが、「製品に過剰な性能を与えること」または「非効率な設計を行うこと」がよくある事例です。必要以上の性能を装備させると、製品は複雑で使いにくいものとなります。エンジニアリングの基本としては、できるだけシンプルなロジックで書かれたコードが理想的です。オーバーエンジニアリングの何が悪い?オーバーエンジニアリングの最大のデメリットは、「時間とコストを無駄にかけること」です。一見すると高度で品質の高い製品を生み出すことができるかのように見えますが、余分な機能が増えたり、コスト過剰を引き起こしたりするなどし、プロジェクトの進行や成功に悪影響を与えることがあります。結果、開発・メンテナンスコストは増加しますから、価値が必要以上に高まれば価格の高騰による競争力の低下も引き起こします。オーバーエンジニアリングの原因は?オーバーエンジニアリングが起こる原因には、以下の4つが挙げられます。ソフトウェアの将来性を考えすぎる経験不足が不足しているアイデアを追加してしまう成功体験で次のバージョンを検討するソフトウェアの将来性を考えすぎるオーバーエンジニアリングは、将来性を考えすぎることで発生しやすくなります。将来必要となるかもしれない拡張性や柔軟性を求めたり、「不足」を心配するあまりに実装内容が過剰になったりすることがあるためです。ソフトウェア開発者は、製品を使いやすくするために、将来性(スケーラビリティ)を考慮して開発を行うことが重要です。開発プロセスを改善し、使いやすい製品を開発するために、過不足なく柔軟な開発手法を採用する必要があります。経験不足が不足しているオーバーエンジニアリングは、経験が不足している際にも起きやすくなります。先ほど触れたように不足を心配するあまり、必要な機能を取捨選択できず開発を進めるためです。また、開発者がプロジェクトを完成させるために必要な機能を見失ってしまう場合に加えて、シンプルに開発できる手法を知らずに「不要な機能を追加」してしまうといったことも発生します。オーバーエンジニアリングを防ぐためには、開発者がプロジェクトを完成させるために必要な機能を正しく把握し、取捨選択を行うことが重要です。アイデアを追加してしまう要件定義で決められた内容に加えて、アイデアが浮かんだときに「便利になる」と実装してしまうこともオーバーエンジニアリングの原因です。アイデアを形にするのは悪くないとしても、追加している時間とコストがかかるため、プロジェクトを適切な時間内に完了させることが難しくなります。ソフトウェアの将来性を考えた行動だとしても、プロジェクトで定められていないものは提案し、しっかりと必要性を多角的に考えてから実装する自制心が必要です。成功体験で次のバージョンを検討するオーバーエンジニアリングは、次のバージョンを検討した際に「最初のプロジェクトの成功体験」によって過剰化することも原因です。これは、セカンドシステム症候群と呼ばれ、システムの再設計や再構築の際に発生する、過剰な設計や機能の追加によって生じる問題として知られています。一定の成功を収めたが、その後の拡張や改良を繰り返した結果、システムが複雑化し、メンテナンスや開発が困難になってしまうのがよくある例です。ステークホルダーから次のバージョンへの期待があったとしても、シンプルで必要最小限の機能を持つシステムを目指すことを重視し、過去の問題を解決しようと必要以上に多くの機能や過度に複雑な設計を導入しない意識が大切です。オーバーエンジニアリングを回避する方法オーバーエンジニアリングを回避するためのポイントは、以下の4つです。適切に定義する要件の本質を理解する要件の意味を長期的な視野でとらえる開発者が自覚する適切に定義するオーバーエンジニアリングを回避するには、開発を細かく定義して曖昧さを排除することが大切です。SLO・SLIなどを活用した目標設定で、明確に定義しましょう。項目説明SLO (Service Level Objective)サービス品質を評価する指標で、一般的にはユーザーが望むレベルのサービス品質を保証するために設定されます。SLI (Service Level Indicator)SLOを測定するための具体的な指標で、一般的にはユーザーが体験するサービスの品質を測定するために使用されます。さらに、今後のサービスを拡張していくために必要な機能を今から定義しておくことで、不必要な開発を抑えられ、オーバーエンジニアリングのリスクを減らすことができます。要件の本質を理解するオーバーエンジニアリングを回避するには、UI(ユーザー・インターフェイス)とUX(ユーザー・エクスピアリエンス)の視点から、なぜその要件が必要なのかを考える必要もあります。ユーザーの目線で要件を明確化し、本質的な必要性を理解することが機能を絞り込む上で重要だからです。要件の本質が理解できていれば、取捨選択の段階で本当に必要な機能だけを絞り込めます。また、実際に必要となるまでは、余計な機能を追加しないことも大切です。要件の意味を長期的な視野でとらえる求められている要件の意味を、プロジェクトの全体像からできるだけ長期的な観点でとらえることがオーバーエンジニアリングの回避につながります。成果物において、その選択肢が本当に必要なのかを判断する際に、一つの基準として使えるためです。もし、要件の意味を短期的な視野で捉えた場合、将来的には必要となるが「今は不要」であるものにも着手してしまいます。時間とコストを無駄に使ってしまい、複雑化するのは目に見えているでしょう。開発者が自覚するオーバーエンジニアリングは、技術的な問題だけでなく、エンジニアの性格や自己肯定感の影響を受けて発生することがあります。例えば、自分のスキルや知識に自信を持っているエンジニアは、周りの人々を説得しやすくなる傾向があります。加えて成功体験がある場合、偏った視点から行動に移してしまってオーバーエンジニアリングを起こすといった形です。感情的に盛り上がった際にオーバーエンジニアリングを起こしやすくなるため、プロジェクトの品質や進行を確保するために、警戒心を持ち、冷静な判断が必要となるでしょう。【一言メモ】以下の格言はオーバーエンジニアリングを予防するためにも覚えておきましょう。原則特徴YAGNI原則実際に必要な機能以外は追加しないようにする原則、余計な機能や複雑さを避け、シンプルな設計を目指すKISSの原則シンプルで簡潔な設計を心がける原則、不必要な複雑さを避け、最小限の機能でシステムを構築するWorse is better単純で不完全な製品の方が良い場合があるという原則、必要最小限の機能に絞り、選択肢を少なくすることが重要オーバーエンジニアリングに関連するよくある質問オーバーエンジニアリングに関連するよくある質問へ回答します。ピザ2枚ルールとは?エンジニアリングの例は?ピザ2枚ルールとは?ピザ2枚ルールとは、プログラムを書く際に、1つの関数が受け取る引数の数が2つを超える場合、その関数は設計が不十分である可能性が高く、修正が必要であるとするルールのことです。引数が多い関数はテストや保守が困難になること、関数内でそれらの引数を処理するコードや処理内容が複雑化すること、のデメリットを解消するために設けます。対策として、2つの引数を超える場合には新しいオブジェクトを作成するか、引数の一部をグループ化して渡すように設計を見直しましょう。エンジニアリングの例は?エンジニアリングの例は、以下が挙げられます。分野内容ソフトウェアエンジニアリングコンピュータシステムやソフトウェアの設計・開発・テスト・保守を行い、高品質で効率的なソフトウェアを開発することが目的。機械エンジニアリング機械部品や装置、機械システムの設計・開発・製造・試験・保守を行い、高精度で高性能な機械を開発することが目的。電気エンジニアリング電気回路や電子部品、電力システムの設計・開発・試験・保守を行い、高効率で高信頼性のある電気システムを開発することが目的。建築エンジニアリング建築物や構造物の設計・施工・監理・管理を行い、安全で機能的で美しく、かつ環境に配慮した建築物を設計することが目的。化学エンジニアリング化学プロセスの設計・開発・改良・管理を行い、反応器設計やプロセスシミュレーションなどを活用して、高品質で低コストの製品を生産することが目的。これらのエンジニアリングは、それぞれの分野に特化した知識とスキルを必要とするため、高度な専門性が求められます。まとめオーバーエンジニアリングとは、成果物において本来不要な機能を実装すること。回避するためには、開発を細かく定義して曖昧さを排除し、要件の本質を理解して長期的な視野でとらえることが大切です。さらに開発者自身が自覚を持って冷静な判断をする必要があります。こうした取り組みにより、必要な機能だけにフォーカスでき、余計な開発を抑えられるでしょう。システム開発でお悩みのことがありましたら、ぜひお気軽にご相談ください。