ウォーターフォール開発とアジャイル開発
その特長と、組み込みソフトウェアへの応用
ソフトウェア開発には、プロジェクトを効率よく進めるために、さまざまな手法が存在します。その中でも代表的なのが「ウォーターフォール開発」と「アジャイル開発」です。
組み込みソフトウェア開発の現場では、製品の特性やプロジェクトの要件に応じて、これらの開発手法を使い分けることが求められます。
組み込みソフトウェアエンジニアを目指す方に向けて、ウォーターフォール開発とアジャイル開発の基本と、それぞれの特徴について解説します。
ウォーターフォール開発とは
ウォーターフォール開発は、ソフトウェア開発において最も歴史ある、基本的な開発手法の一つです。1970年に発表されたコンピュータ学者、ウィンストン・W・ロイスの論文がもとになったとされ、その後、長年にわたって世界中で採用されてきました。ウォーターフォール(Waterfall)という名前は、この開発手法が滝のように「上流から下流へと水が一方向に流れること」から名付けられています。
ウォーターフォール開発の基本的な流れ
ウォーターフォール開発では、開発プロジェクト全体を明確な工程に分割し、各工程を順番に完了させながら進めていきます。一般的な工程は以下の通りです。
要件定義 → 基本設計 → 詳細設計 → 実装(プログラミング) → 単体テスト → 結合テスト → システムテスト → 運用・保守
それぞれの工程は、前の工程が完全に完了してから次に進むという特徴があります。要件定義が100%完了しなければ基本設計には進まず、基本設計が完了しなければ詳細設計には進みません。滝の水が上に戻らないように、ウォーターフォール開発では基本的に前の工程に戻ることを想定しません。
組み込み開発におけるV字モデル
組み込みソフトウェア開発では、ウォーターフォール開発の改良形である「V字モデル」がよく採用されます。V字モデルは、ソフトウェアの開発工程と、それに対応するテスト工程の関係性を、下記のように「V」の字で図式化したものです。
Vの字の左側、下降部分が開発工程(要件定義→基本設計→詳細設計→プログラム設計)で、右側の上昇部分がテスト工程(単体テスト→結合テスト→システムテスト→運用テスト)を表します。各設計段階に対応するテスト工程が明確に定義されているため、ハードウェアとの連携が重要な組み込み開発では、各段階でこまめな検証を行うことが必要です。
ウォーターフォール開発のメリット
ウォーターフォール開発には、次のようなメリットがあります。
①プロジェクト全体の見通しが立てやすい
プロジェクトの開始時に全体の要件を定義するため、必要な開発期間、必要な人員、予算などを事前に算出することができます。組み込み開発では、ハードウェアの製造スケジュールとの調整が必要になることも多いため、事前に全体スケジュールが明確になることは大きな利点です。
②進捗管理がしやすい
各工程が明確に区切られているため、現在どの工程にいて、全体の何パーセントが完了しているかを把握しやすくなります。プロジェクトマネージャーにとっては、チーム全体の状況を管理しやすい手法といえます。
③品質を担保しやすい
各工程で成果物(仕様書や設計書など)を作成し、その成果物を厳格にレビューしてから次の工程に進むため、仕様通りのシステムを構築しやすくなります。特に組み込みソフトウェアでは、自動車や医療機器など人命に関わる製品も多いため、事前に綿密な設計を行い、確実に品質を確保することが重要です。
④引き継ぎがしやすい
各工程で詳細なドキュメントを作成するため、開発途中でメンバーが入れ替わった場合でも、ドキュメントを読めば前任者の作業内容を理解することができます。
ウォーターフォール開発のデメリット
一方で、ウォーターフォール開発にはデメリットも存在します。
最大のデメリットは、仕様変更への対応が困難という点です。開発途中で要件の変更が必要になった場合、すでに完了した工程に戻ってやり直す必要があります。これを「手戻り」と呼びますが、手戻りが発生すると、開発期間の延長やコストの増加といった大きな影響が出てしまいます。
合わせて、近年では機能が非常に多くなっているため、開発の初期にその仕様の全てを決めると、非常に時間がかかったり、そもそもそれが困難だったりすることも増えてきました。そういった状況では、ウォーターフォール開発で進めることが事実上困難な場合もでてきています。
また、実際に動作するソフトウェアが完成するまで時間がかかるという点もあります。すべての工程を終えてからソフトウェアがリリースされるため、実物での動作を確認できるのはプロジェクトの最終段階です。そのため、実装段階になって初めて「想定していた通りに動かない」「思っていた仕様や動作と違う」といった問題が発覚することもあります。
組み込み開発においては、ハードウェアの仕様変更などが原因で、実機テストで予期しない問題が見つかることも少なくありません。そのような場合に柔軟に対応しにくいという課題があります。
アジャイル開発は「素早く」「機敏」が特長
アジャイル開発は、2001年に17名の技術者やプログラマーがアメリカのユタ州に集まり、議論をして生まれた開発手法です。その議論の成果として「アジャイルソフトウェア開発宣言」がまとめられ、これがアジャイル開発の公式な定義となっています。
アジャイル(Agile)とは「素早い」「機敏な」という意味で、変化の激しい環境に迅速に対応できることを重視した開発手法です。ウォーターフォール開発の課題を解決するために考案されたという側面もあります。そのため、ウォーターフォール型のメリットとデメリットが反対になっているような特徴を持っています。
アジャイル開発の基本的な流れ
アジャイル開発では、最初から厳密な仕様を固めるのではなく、おおよその仕様や要求をまとめた上で開発をスタートします。そして、「計画→設計→実装→テスト→リリース」という一連の開発工程を、機能単位の小さなサイクルで繰り返していきます。
この短期間の開発サイクルは「イテレーション」または「スプリント」と呼ばれ、通常は1週間から2週間程度の期間で設定されます。各イテレーションが終わるごとに、実際に動作する機能をリリースし、顧客やユーザーからフィードバックを受けます。そのフィードバックをもとに次のイテレーションで改善や新機能の追加を行い、徐々にシステム全体の完成度を高めていくというアプローチを取ります。
アジャイル開発のメリット
アジャイル開発には、次のようなメリットがあります。
①仕様変更に柔軟に対応できる
小さなサイクルで開発を繰り返すため、イテレーションごとに優先度や要件を見直すことができます。市場の変化や顧客からの新しい要望があっても、次のイテレーションで対応することが可能です。
②早い段階から動作するソフトウェアを確認できる
イテレーションごとに実際に動く機能をリリースするため、開発の初期段階からユーザーが実物を確認し、フィードバックを提供できます。これにより、最終的な成果物がユーザーの期待と大きくずれてしまうリスクを低減できます。
③チーム全体で協力しながら開発を進められる
アジャイル開発では、開発メンバー全員が設計から実装、テストまでの全工程に関わります。これにより、メンバーの多能工化が進み、チーム全体の生産性向上につながります。
アジャイル開発のデメリット
一方で、アジャイル開発にもデメリットがあります。
最も大きな課題は、全体のスケジュールや予算の見積もりが難しいという点です。最初から厳密な仕様を決めないため、プロジェクト全体でどれくらいの期間や費用がかかるかを正確に予測することが困難です。特に、納期や予算が厳格に決まっているプロジェクトでは、この点がネックになることがあります。
また、開発の方向性がブレやすいという課題もあります。柔軟に対応できる反面、明確なゴールが定まっていない場合、開発が迷走してしまう可能性があります。プロジェクトを成功させるには、経験豊富なプロジェクトマネージャーや、チーム全体の高いコミュニケーション能力が必要です。プロジェクトマネージャーにとっては管理をしにくい手法と言えるでしょう。
さらに、ドキュメントが軽視される傾向があるという点も注意が必要です。アジャイル開発では「動くソフトウェア」を重視するため、詳細な設計書などのドキュメント作成が後回しにされることがあります。組み込み開発では、製品の長期的な保守やトラブルシューティングのために、しっかりとしたドキュメントが必要になる場合も多いため、この点は課題となりえます。
組込み機器は、長期間にわたって使用される機器も多くあります。開発が終わって数年たってからメンテナンスをするような場合、ドキュメントが正しく作成されていない、といったことが問題になることがあります。
組み込みソフトの最適な開発手法の選び方とは
組み込みソフトウェア開発では、製品の特性やプロジェクトの性質によって、ウォーターフォール開発とアジャイル開発のどちらが適しているかが変わってきます。
ウォーターフォール開発が適している場合
組み込み開発においてウォーターフォール開発が適しているのは、要件が明確で変更が少ないプロジェクトです。例えば、すでに仕様が確定している既存製品のリプレースや、法規制で厳格に仕様が定められている製品などが該当します。
また、高い安全性や信頼性が求められる製品でも、ウォーターフォール開発が選ばれることが多くなります。自動車のブレーキ制御システムや医療機器など、人命に関わる製品では、事前に綿密な設計とテストを行い、確実に品質を担保する必要があります。このような場合、V字モデルを採用して各工程でしっかりと検証を行うアプローチが有効です。
さらに、ハードウェアとの連携が密接な部分では、ウォーターフォール的なアプローチが適していることがあります。ハードウェアの設計や製造スケジュールは簡単には変更できないため、ソフトウェアもハードウェアの仕様に合わせて計画的に開発する必要があるからです。
アジャイル開発が適している場合
一方、アジャイル開発が適しているのは、要件が不確定で変更の可能性が高いプロジェクトです。例えば、IoT機器のユーザーインターフェースや、クラウド連携機能など、ユーザーの反応を見ながら改善していきたい領域に適しています。
また、新しい技術や機能を試験的に導入する場合にも、アジャイル開発は有効です。プロトタイプを素早く作成して動作を確認し、問題があれば早期に修正できるため、技術的なリスクを低減できます。この手法を取り入れることで、動作仕様を満たすために必要なハードウェアのリソースを見極めたり、そのハードウェア上での性能の実現可能性を確認することを先行して行う、といった工夫をすることで開発効率や開発の見通しを上げることもできます。
近年では、組み込み開発の分野でも、製品のネットワーク対応やソフトウェアアップデート機能の搭載が進んでいます。このような場合、リリース後も継続的に機能を追加・改善していくことが求められるため、アジャイル的なアプローチが取り入れられるケースが増えています。
両者の「いいところ取り」ハイブリッド開発
実際の組み込み開発の現場では、ウォーターフォール開発とアジャイル開発を組み合わせた「ハイブリッド開発」が採用されることも多くあります。
例えば、ハードウェア制御部分や安全性が重視される基本機能はウォーターフォール開発で確実に作り込み、ユーザーインターフェースやアプリケーション層の機能はアジャイル開発で柔軟に対応するといった使い分けです。このように、プロジェクトの特性に応じて最適な開発手法を選択・組み合わせることが、成功への鍵となります。
まとめ
組み込みソフトウェア開発の現場では、製品の安全性や信頼性を重視する観点から、従来はウォーターフォール開発が主流でした。しかし、近年ではIoT化やネットワーク対応が進んでいることに加え、製品の機能が以前よりも多くなっています。また、多くの製品に継続的な機能追加や、改良が求められるようになったことから、アジャイル開発の導入も進んでいます。
これから組み込みソフトウェアの世界でキャリアを築いていく方は、両方の開発手法の特徴を理解し、プロジェクトの性質に応じて最適な手法を選択できる力を身につけることが、優れたエンジニアになる条件といえるでしょう。
