近年、モバイルファーストの流れによってアジャイル開発が一般的になりつつあります。一方、長く使われてきたソフトウェア開発手法であるウォーターフォール開発は「現在の開発スピード感のもとではあまり使えない」「時代遅れ」といったややネガティブなイメージを持たれることが多いようです。
ウォーターフォール開発は、1970年代に誕生してから現在まで、特に日本においては幅広く利用されている開発手法です。ここでは、あらためてウォーターフォール開発のメリットとデメリットについて検証していきます。
また、アジャイル開発とウォーターフォール開発を組み合わせた「ハイブリッド開発」についても解説しています。
- もくじ
1.ソフトウェア開発におけるウォーターフォール開発の進め方
ウォーターフォールモデルを日本語に直訳すると、「滝の水型」ということになります。
文字どおり、ソフトウェア開発の各プロセスにおいて、流れる川にある滝の水が上流から下流へ流れ落ちるように、あらかじめ決めた順番に従い着実に各工程の開発を進めていく手法です。そのため開発の前工程に後戻りすることはありません。
ウォーターフォールモデルは、①要件定義⇒②設計⇒③実装⇒④テスト⇒⑤リリース~保守・運用という基本的な流れで進められます。
そして開発を確実に進めるために各工程で中間成果物をレビューして確認する点が大きな特徴になります。以下、システム開発を例に各工程について見ていきましょう(図1)。
図1 ウォーターフォールモデル
①要件定義
どのような開発でも、要件定義が当然ながら必要です。発注側で求める要件を開発側とすり合わせ、「開発目的」「開発期間」「機能」「導入・運用方法」などを整理して要件定義書としてまとめます。
ここでスムーズな開発を行うために、要件定義書をしっかり作ることがポイントになります。
なお、類似のものとして提案依頼書「RFP」(Request for Proposal)がありますが、これは発注側の企業がSIerやベンダーに対し、実現したいことや解決すべき課題を明らかにして、必要な要件を示すものです。要件定義はシステム設計の基本となるもので、基本的にはRFPよりも詳細な内容が記載されます。
②設計(基本設計、詳細設計)
次に、要件定義書に基づいて設計に着手します。
ここでいう「設計」は、コーディングする際にプログラマーが参考にする「基本設計」と、動作・機能・データベースなどに対する「詳細設計」に分ける考え方に基づいて作成します。
インターフェイスを決める基本設計を行ったのち、これをベースにプログラマーが詳細設計書を作成します。
③開発(実装)
いよいよ、ここからが実装、すなわち開発段階に入ります。詳細設計書を確認しながら、プログラマーが実際にコーディングします。
④テスト(単体テスト、結合テスト、システムテスト)
ここでは出来上がったアプリケーションのテストを実施します。テストにはいくつかの種類があります。
たとえば、実装した各機能と性能を確認する「単体テスト」や、単体テストでパスした機能を連携(結合)させて上手く動くかどうかを確認する「結合テスト」、さらに全体の機能を連結させた「システムテスト」を行います。もしここでエラーが出たら、また前行程に戻って原因を追及し解決する必要があります。
以上のテストをすべて通ったら「受け入れテスト」を実施します。
ここでは本番環境で実際にプログラムを走らせ、エラーがないかをチェックします。当初の要件定義の内容が満たされているのかを、ユーザー目線で検証していきます。
⑤リリース~保守・運用
システム開発の場合、完成品をリリースする際に新規案件でなければ、以前より稼働しているシステムからの移行となります。仕様の変更で何らかのトラブルが起きても、影響の出ない時間内に確実に移行していく必要があるからです。
もちろんリリース後の運用と保守も大切です。必要に応じてトラブルシュートや改修、アップデートをしていくことになります。
2.ウォーターフォールモデルと関係が深い「V字モデル」
ウォーターフォールモデルを理解する場合、「V字モデル」との関わりを知っておくと役立つでしょう。
V字モデルとは、開発工程から後のテスト工程をV字型に折り返したモデルで、開発工程とテスト工程をリンクさせた形です(図2)。
図2 V字モデル
上図のように、V字の左側が開発工程、右側がテスト工程になります。
基本的に開発の流れはウォーターフォールと同じですが、V字モデルの特徴は図のように開発工程とテスト工程の各作業が破線で結んだようにリンクさせることです。
工程ごとにテストを行う場合に、検証作業を効率よく実施できます。そのため品質を高める手法としてV字モデルが広く採用されています。
なお、V字モデルをさらに発展させたW字モデルもあります。これはV字モデルの流れに加えて、開発工程とテスト工程を同時に行うための手法です。
開発工程の結果をテスト工程で検証するだけでなく、開発工程の中でも、それぞれ検証を行います。
3.ウォーターフォール開発のメリットが発揮できる開発シーン
冒頭でも触れたようにウォーターフォール開発は、少々古臭いと思われるかもしれませんが、まだメリットを十分に発揮できる開発アプローチといわれています。
たとえば以下のような状況の開発の場合、現在でも十分通用するといえるでしょう。
①大規模システム開発の人的リソース・工程管理に対応できる
ウォーターフォールモデルは、仕様を途中で変更しないように、最初の段階で綿密に要件定義を行います。
要件定義に従ってプロジェクトを進められれば、スケジュールのズレも生じにくくなり、人的リソースや工程の管理がしやすくなります。
そのため大規模な開発プロジェクトに向いているといるでしょう。
②機能・予算・納期が明確になり、プロジェクトを安定的に進められる
同様の理由で、要件定義をしっかり行うことになるため、あらかじめ開発に何が必要で、何が求められるのかが分かり、開発スケジュールや内容も明確になります。
もし開発者の交代があった場合でも引き継ぎがスムーズに行えます。
そのためプロジェクトをストップせずに安定的に進めていくことが可能です。
③高品質を保ちやすく、多くの開発ベンダーが対応できる
ウォーターフォールモデルは、各工程の進捗に応じて目標や基準が明確に設定されています。
そのため設計段階で設定された高い品質を保ちやすいというメリットもあります。
また古くから使われている標準的な手法なので、多くの開発ベンダーが対応できます。
4.なぜ、敬遠されるのか? デメリット・弱点
ここまでウォーターフォール開発のメリットを見てきました。ではなぜ敬遠されてしまうのでしょうか。
ウォーターフォール開発のデメリット・弱点を解説していきます。
①手戻りが発生すると工数が増える
ウォーターフォールモデルのメリットとして最初の段階で要件定義を綿密に行うと書きました。しかし、これは諸刃の剣にもなります。
どんなに綿密に要件を定義しても、設計時に何らかの「抜け」が発生しないとは保証はできないからです。
もし「抜け」があってそれに対応するために仕様を変更すると、その部分に手戻りが発生することで全体の計画が狂い、逆に必要な工数が増えてしまうリスクもあります。
②開発途中で要件や仕様を変更しにくい
ウォーターフォールモデルは上流工程から下流工程に向けて確実に進めていくように計画されているため、開発途中でクライアントからの変更や追加の要望に応えることが難しいです。
実際の成果物と、最終的にユーザーが求めているイメージが異なってしまう可能性もあります。
これらのリスクを避けるためには、やはり最初の要件定義の段階でユーザーと十分に検討し、互いに認識を一致させたうえで、要件漏れがないように細心の注意をはらう必要があります。
ウォーターフォールモデルは、とにかく要件定義が「命」です。
5.ウォーターフォール開発とアジャイル開発の違い
近年、ソフトウェア開発のアプローチとしてアジャイルが主流になりつつあることは冒頭で触れたとおりです。では、ウォーターフォール開発と手法が異なるアジャイル開発について、あらためて具体的にどのような点で違いがあるのか見てみましょう。
アジャイル開発は、ソフトウェアの開発とリリースのサイクルを早めたいというニーズに応える開発手法です。
開発中に仕様の変更が発生、あるいは追加が予想されるようなプロジェクトに向いているといわれています。アジャイル(Agile)には「素早い」「機敏」「頭の回転が速い」といった意味があります。
最初に要件をきっちりと定義し、計画に従って開発・実装していくウォーターフォール開発に対し、アジャイル開発は、あまり厳密な要件を定義せず、機能と仕様を大雑把に決めていくアプローチです。変更に臨機応変に対応できるのが大きなメリットといます。
アジャイルでは、スプリント(sprint)、イテレーション(iteration)という小さな単位で「計画」→「設計」→「実装」→「テスト」の反復サイクルを繰り返します。スプリント・イテレーションの期間は約1週間から2週間ほどで、短期間に機能をリリースして、ユーザーの反応を見ながら、また改善して品質を高めます。小さなサイクルで動くため、修正や仕様の変更にも柔軟に対応できる半面、開発期間全体の厳密なスケジュール管理が難しいというデメリットもあります。
6.いま、注目の「ハイブリッド開発」
ウォーターフォール開発もアジャイル開発も一長一短があるため、最近では両者の良いところ取りをした「ハイブリッド開発」も注目を集めるようになりました。
ハイブリッド開発では、ウォーターフォール開発の「プロジェクトの計画をしっかり立てること」と、
アジャイル開発の「細かい単位で開発期間を区切り、レビューを行いながらユーザーニーズも取り込む」ことを行います。
これにより後工程での認識の齟齬を削減することができます。その一方で、結合テストやシステムテスト以降の検証工程は、ウォーターフォール開発に準じることで、品質を担保します。
ウォーターフォール開発とアジャイル開発、それぞれの良い点を取り入れたハイブリッド開発も開発手法の一つになっています。
まとめ
ウォーターフォール開発は、どちらかというと旧世代の開発手法というイメージがありますが、開発プロジェクトの規模や内容によっては採用するメリットがあります。
例えば、ウォーターフォール開発はプロダクト開始後の変更が少なく、品質を担保しやすいことから、変化の少ない開発プロジェクトの場合には有効です。
現在は、ソフトウェアの目的も用途も多様化しています。そのため、開発案件によって、アジャイル開発の手法を選んだり、あるいはハイブリッド型で開発したり、どれが最適なアプローチなのかを決定することが求められます。