ウォーターフォール型開発とは?ウォーターフォール型開発(英語:Waterfall type development)とは、上流工程から下流工程へと順番にプロセスを進めていく開発方法のことです。システム・ソフトウェア開発を進めるための手法の1つとして位置付けられています。初期に多くの時間をかけて、サービス・開発の範囲をすべて企画・定義したうえで設計・実装・テスト・納品を行い、リリースを目指していく点が特徴的です。基本的にウォーターフォール型開発では、1つのフェーズが終わらない限り次のフェーズが開始されず、前の工程に戻ることもありません。また、クライアント(発注側)が開発プロセスにそれほど関与しない点も特徴のひとつです。ウォーターフォール型開発の工程システム・ソフトウェア開発を行う際は多くのプロセスを経る必要がありますが、ウォーターフォール型開発では上から順番に工程を進めていくため、開発手順が非常にシンプルでわかりやすいです。ウォーターフォール型開発の大まかな手順を紹介すると、システムに搭載する機能や細かな仕様をすべて決めたうえで開発に着手します。その後、1つ1つの工程をしっかりと完了させながら、開発を進めていくという流れです。こうしてすべての工程が完了すると、システム・ソフトウェアがリリースされる仕組みです。具体的には、導入(リリース)まで以下の手順で開発を進めていくことが多いです。要件定義外部設計内部設計開発(プログラミング)単体テスト結合テスト総合・受入テスト導入(リリース)それぞれのプロセスを順番にわかりやすく解説します。①要件定義要件定義とは、本格的なシステム・ソフトウェア開発工程に進む前のフェーズにおいて、発注側の要望を叶えるために必要とされる機能・性能・品質などをまとめる作業のことです。要件定義を行うことで、発注側の要望を念頭に、システム・ソフトウェア開発における設計・プログラミング・テスト・導入などの各工程を進められるようになり、発注側と開発側の間で成果物に関する認識のズレが生じることを防げます。要件定義を行う際は、発注側の解決すべき課題をもとに、システムに求める以下の条件を定義し、要件定義書に落とし込んでいくのが一般的です。システム要件:システム化すること、しないことを決める機能要件:システムに必要な機能を決める非機能要件:パフォーマンスや拡張性などの要素を決める技術要件:開発に用いるプログラミング言語やミドルウェアを決めるそのほか、開発するシステム・ソフトウェアの使用者や使用場面、価値・情報提供の内容といった開発物の概要も決めます。②外部設計外部設計とは、要件定義で決めた機能・性能・品質・制約条件などをベースにシステムの基本となる設計を行う作業のことです。別名「基本設計」とも呼ばれています。外部設計では、操作画面・操作方法・データ出力など、ユーザーの立場から見たインターフェース部分の仕様を決めたり、セキュリティ・運用規定・システム開発のスケジュールや費用を設計したりと、ユーザーに向けた仕様を設計するのが一般的です。具体的には、以下のような作業を行います。要件を満たすソフトウェア(ミドルウェア)やハードウェアを明確化させるシステムに必要な機能を整理し、それぞれの役割を明確化させる機能間の関連性・データの種類や流れ・全体的な業務の処理方法を明確化させる取り扱う情報の管理方法やデータベースの形式・項目を決めるデータやり取りの方法・連携画面を決める(既存システムとの連携が必要な場合)外部設計では外部設計書(基本設計書)を作成し、発注側からのフィードバックや修正を経たうえで、次の工程に移行します。③内部設計内部設計とは、外部設計において固めていたシステムの全体像を、具体的な機能に落とし込んでいく作業のことです。別名「詳細設計」とも呼ばれています。内部設計をおろそかにすれば、後々になって「機能を実装できない」「実装したい機能が曖昧で、ニーズに応えられているかわからない」といったトラブルが発生するおそれがあります。外部設計と同様に内部設計も、クライアントにとって満足いくシステムを開発するうえで必要不可欠なプロセスです。内部設計では、プログラマーへの指示書となる「内部設計書(詳細設計書)」を機能ごとに作成します。また、内部設計書をもとにプログラマーが作業を進めていくため、クラス設計書・コード設計書・コーディング規約・単体テスト仕様書なども作成するのが一般的です。なお、内部設計ではプログラムの設計書を作成するため、発注側にSEや情報システム部門の担当者などレビューを行える人がいればチェックが実施されることもあります。④開発(プログラミング)前ステップで作成した内部設計書をもとに、実際のシステムを開発する工程です。このフェーズでプログラミング言語をはじめ、作業に必要な設計書や情報がすべて揃うため、機能ごとに開発を着々と進めていきます。開発からテストまでの工程は、プログラマーが担うことになります。⑤単体テスト単体テストとは、開発の完了した機能ごとに実施されるテストのことです。内部設計で作成した単体テスト仕様書をベースに、プログラミングの対象単位(モジュール)ごとに動作テストを実施します。例えば、「ユーザーの情報入力必須項目を空欄にした状態でユーザーが会員登録や資料請求などを行った場合に、登録せずユーザーに対してエラーメッセージを表示できるか」といった内容をチェックしていきます。こうした観点でテストを行い不具合が発見されれば、不具合がなくなるまで修正と再テストを繰り返します。なお、システム・ソフトウェア開発では、「V字モデル」でテスト工程を進めていくのが一般的です。システム・ソフトウェア開発ではさまざまなテストが実施されますが、開発工程とテスト工程をV字に配置することで、どの作業に対してどのテストを行うかが分かりやすくなります。一般的には、開発工程とテスト工程を以下のように対応させます。単体テストで内部設計の内容をチェック結合テストで外部設計の内容をチェック総合テストで要件定義の内容をチェック⑥結合テスト結合テストとは、各モジュールを結合してテストを行う作業のことです。複数のプログラムを組み合わせた状態で、それらがうまく機能するかを検証します。具体的には、実際の業務と同じようにプログラムを走らせ、想定通りのアウトプットが得られるかどうかをチェックします。例えば、データの受け渡しの際にプログラム同士が正しく連携するかをテストします。単体テストと同様、このフェーズで不具合が見つかれば、不具合がなくなるまで修正と再テストを繰り返します。⑦総合・受入テスト総合テストとは、結合テストをクリアしたシステムを発注側と同じ環境で使用しチェックする作業のことです。機能要件のほか、パフォーマンス・障害時の処理・外部システム連携といった非機能要件もチェックします。総合テストをクリアしたシステムは実際に発注側に使用してもらい、「要件を満たしているか」「使用感に問題はないか」などをチェックしてもらいます。この工程を、受入テスト(別名:ユーザーテスト)と呼んでいます。⑧導入(リリース)ここまでのプロセスに問題がなければ、完成したシステム・ソフトウェアを導入・リリースします。なお、新規のシステム開発・導入ではなく、旧システムからのリプレース案件の場合、ここでデータ移行をはじめとする移行作業が求められます。ウォーターフォール型開発のメリット・デメリットウォーターフォール型開発には多くのメリットが期待できる一方で、少なからずデメリットも存在するため、その双方を実施前に把握しておくことが大切です。本章では、ウォーターフォール型開発のメリットとデメリットを順番に解説します。メリットまずは、ウォーターフォール型開発の選択で期待されるメリットの中から、代表的な内容を2つピックアップし、順番に解説します。スケジュールの策定・管理がしやすいウォーターフォール型開発を選ぶ最大のメリットは、プロジェクト全体のスケジュールの策定と管理がしやすい点にあります。ウォーターフォール型開発では、プロジェクトの開始とともに要件定義を行い、外部・内部設計に取り組んでいくため、早いタイミングで各担当者の「やるべきこと」を明確にできます。要件定義が完了したタイミングで、エンジニアはシステムの全容や各工程にかかる工数を見積もれるため、計画通りに開発を進めやすいです。また、前の工程を完了させた後で次の工程に進むうえに、各工程のタスクが事前に割り振られていることから、プロジェクト途中で担当者が変更された場合でも引継ぎをスムーズに進められ、その後のスケジュールに及ぼす影響を抑えられます。予算策定・SEの手配をスムーズに実施できるウォーターフォール型開発では、プロジェクトの開始当初に見積もった計画に沿って各工程を遂行していきます。そのため、計画策定後は、開発にかかる費用やSE・プログラマーの必要人数などが予測しやすくなります。システム・ソフトウェア開発を進めるにあたって、社内でSE・プログラマーなどの人員が不足している場合、パートナー企業や外部企業などから派遣してもらい、リソースを確保しなければならないことがあります。このときに適任者を早いタイミングで見つけるためにも、必要な人員数を事前に把握しておくことが大切です。デメリット続いて、ウォーターフォール型開発の選択によって発生するおそれのあるデメリットの中から代表的な内容を2つピックアップし、順番に解説します。進行中の計画・仕様の変更に対応しにくいウォーターフォール型開発では、プロジェクト開始時にのみ要件定義が実施されるのが一般的であり、プロジェクト進行中や成果物のチェック時などに発注側による仕様変更が生じた場合、大きな手間がかかってしまいます。基本的にウォーターフォール型開発では、テストの工程に進むまで発注側が実物をチェックする機会がないことから、後々になって仕様変更が生じる可能性は決して低くありません。前のフェーズの成果物をベースに開発を進めていくため、手戻りが発生した場合は各工程をさかのぼってやり直す必要があります。つまり、現在のフェーズのみをやり直す選択肢がありません。さかのぼる工程が多ければ多いほど、最終的な成果物の納品が遅れてしまいます。成果物作成やリリースに多くの時間がかかりやすいウォーターフォール型開発では、要件を詳細な設計書に落とし込みながら工程を進めていくため、アウトプットとしての成果物(ドキュメント)を大量に作成しなければなりません。これは下流工程の作業をスムーズに進められるメリットがある一方で、開発者に大きな負荷がかかるという側面ではデメリットだと考えられます。プロジェクトの規模が大きければ大きいほど、作成するドキュメントの量は膨大になります。手戻りが生じれば、ドキュメントを作り直す必要があるでしょう。こうした特徴から、リリースまでに多くの時間がかかりやすい点もデメリットといえます。中には数年単位のプロジェクトもあり、完了までに多くの時間がかかるため、顧客ニーズや市場動向などが変化してしまうアクシデントが発生しやすくなります。ウォーターフォール型開発とアジャイル型開発との違いかつてシステム・ソフトウェア開発では、ウォーターフォール型開発が主流の手法とされていました。しかし、現在は発注側のニーズを柔軟に叶える目的で「アジャイル型開発(英語:Agile development)」の手法を採用するケースが多くなっています。ウォーターフォール型開発とアジャイル型開発の最も大きな違いは、予測型か適応型かという点にあります。ウォーターフォール型開発は予測型とされ、開発プロジェクトの最初のフェーズで完璧な計画を策定し、基本的にプロジェクト開始後に計画が変更することはありません。これに対して、アジャイル型開発は適応型に位置付けられます。「プロジェクト開発要件に変更が生じる」という想定のもと、計画をすべて事前に策定しておくのではなく、開発プロジェクトの実行結果にもとづいて計画を柔軟に変えながらプロジェクトを進行させていく点が特徴的です。ウォーターフォール型開発が向いている/いないシステム開発例アジャイル型開発と比較したときに、「ウォーターフォール型開発は時代遅れ」と考える意見も一部でありますが、決して前時代的な開発方法ではありません。ウォーターフォール型開発であれアジャイル型開発であれ向き不向きというものがあり、個々のシチュエーションに応じて相性の良い開発方法を採用することが大切です。そこで本章では、ウォーターフォール型開発の採用が向いている(いない)システム開発の例を順番に解説します。向いているシステム開発例ウォーターフォール型開発は、手戻りをしないことが前提となるため、仕様変更がない(少ない)システム開発に向いています。また、要件定義で全工程のスケジュールを決めたうえで開発を進めていくため、綿密に品質を担保しなければならない開発プロジェクトや、煩雑になりやすい大規模なプロジェクトなどにも向いているでしょう。そのほか、予算・人員・開発期間などプロジェクト全体の見通しが立てやすいことから、クライアントのシステム開発を一貫して請け負うSIerでも、ウォーターフォール型開発を採用するケースが多く見られます。以下に、ウォーターフォール型開発に向いているシステムの例をまとめました。組込系ソフトウェア(例:家電や自動車など)銀行の基幹システム携帯キャリアの通信システム など向いていないシステム開発例ウォーターフォール型開発が向いていないケースとして、ターゲットとする市場やニーズの変化がスピーディーな場合や、ユーザーからのフィードバックを取り入れながら開発を進めていかなければならないプロジェクトなどが挙げられます。開発期間途中で変更が多く発生するシステム開発を行う場合、ウォーターフォール型開発は向いていないと一般的に考えられています。こうしたシステム開発を行う際は、ウォーターフォール型開発ではなく、アジャイル型開発の採用を検討しましょう。アジャイル型開発アジャイル型開発とは、設計・企画・テスト・実装を短期間で行い、その一連のサイクルを繰り返しながらリリースを目指していく開発方法のことです。ウォーターフォール型開発とは異なり、発注側が開発プロセスに積極的に関与するため、開発途中でも要望・仕様の変更が発生した場合でも柔軟に対応してもらえます。なお、システム・ソフトウェア開発においてアジャイル型開発を採用する場合は、ラボ型開発の形態で進められることが多いです。ラボ型開発とは、一定期間にわたり専属チームを確保して発注側の指示で開発を行うことです。ラボ型開発は、オフショア開発(海外の国・地域の企業や法人に対して、システム・ソフトウェアの開発業務を委託する手法)の一種でもあります。ラボ型開発を活用することで得られる主な効果としては、契約期間終了までエンジニアを確保できたり、自社にシステム・ソフトウェア開発の経験・ノウハウを蓄積できたりする点が挙げられます。ラボ型開発およびオフショア開発について、さらに理解を深めたい場合には、以下の記事をご確認ください。ラボ型開発をメインに日本企業の成長を支援させていただいている弊社の知見や実体験をベースにわかりやすく執筆しています。ラボ型開発とは?メリット・デメリット、請負型との違い、注意点を解説オフショア開発とは?活用される背景や目的、メリット・デメリットを解説ウォーターフォール型開発以外のシステム開発方法システム開発には、ウォーターフォール型開発以外にも多種多様な開発方法が存在します。本章では、前述したアジャイル型開発を除いた代表的なシステム開発方法を紹介します。プロトタイプ型開発プロトタイプ型開発とは、要件定義が決まり次第、簡単なシステム開発を行い、その後にクライアントやユーザーからのフィードバック・レビューをもとに本格実装に入っていくシステム開発方法です。AIの開発・作成などに役立つシステム開発方法として知られています。プロトタイプ型開発の大きな特徴はシステムのイメージを早い段階で確認できる点にあり、完成イメージをクライアントと共有しながら進めることで、プロジェクト進行中の要件変更に伴うスケジュール遅延やコストオーバーなどを防ぐことが可能です。スパイラル型開発スパイラル型開発とは、システムの開発工程を機能ごとに分けて、重要な機能から開発していく開発方法のことです。機能ごとに要件定義・設計・開発・テスト・評価・改善の工程を繰り返しながら、プロダクトの完成度を徐々に上げていきます。この繰り返しの様子を螺旋にたとえ、スパイラルという名が付けられました。以上、代表的なシステム開発方法を解説しました。開発の要件や自社の置かれた状況によって適した開発方法は異なるため、それぞれの開発方法の特徴を把握しておきましょう。まとめウォーターフォール型開発とは、上流工程から下流工程へと順番にプロセスを進めていく開発方法のことです。プロジェクトの初期に多くの時間をかけて、サービス・開発の範囲をすべて企画・定義したうえで設計・実装・テスト・納品を行い、リリースを目指していきます。ウォーターフォール型開発では、スケジュールの策定・管理がしやすかったり、予算策定・SEの手配をスムーズに実施できたりするメリットがあります。その一方で、進行中の計画・仕様の変更に対応しにくかったり、成果物作成やリリースに多くの時間がかかりやすかったりする点はデメリットとして考えられています。また同時に開発期間が長い中で、プロジェクト状況を一番よくわかっているメンバーの離脱等によるダメージは比較的大きくなります。ウォーターフォール型開発とアジャイル型開発の最も大きな違いは、予測型か適応型かという点にあります。プロトタイプ型開発やスパイラル型開発の特徴も把握したうえで、自社の状況に適した開発方法を採用しましょう。