ソフトウェア エンジニアは起きている時間の大半を、先任者が残したコードのぬかるみをかき分けながら進んでいる、と言っても過言ではありません。 過去のコードとの競合で事態が悪化する前に草原へと無事到達できることはまれで、たいていは戦いの最前線に放り込まれることになります。 サービス停止の砲弾があちこちで炸裂する中、塹壕から一歩も動けなくなるのも珍しくありません。 開発の現場では勇敢な戦いが繰り広げられていることもありますが、進捗は亀の歩みです。

そこへ現れるのが、百戦錬磨のベテランです。 彼らは致命的な攻撃に対応した話や虫退治の逸話を喜々として新人に語ります。 ベテランはみな、コードの書き方について個人として経験や学びを吸収してきました。業界もまた、大規模なソフトウェア開発についての経験と学びを集団として積み重ねています。 現場でバグに囲まれ、機能にまつわる炎上に対処しているときは、そのような大きな流れはなかなか感じにくいものです。

20 世紀の哲学者 George Santayana 氏は言いました。「過去を振り返らない者は、過去を繰り返すことになる」。 もちろん、この言葉はソフトウェア開発に向けられたものではありません。とは言え、彼は既に故人なので、私が本来の文脈から外れて引用しても大丈夫でしょう。 パブリック ドメインってすばらしいですね!

さて、この記事では、ウォーターフォール「Waterfall」とは何か?ウォーターフォールモデルの工程・開発手順、定義、メリットやデメリット、アジャイル開発との違いなどに関してわかりやすく説明します。

ウォーターフォールモデルとは?

ウォーターフォール(英語:Waterfall)とは、日本語で直訳すると「滝」を表しますが、ソフトウェアやハードウェア開発の現場で利用する一種のシステム開発手法であり、上流工程から下流にそって開発を進める手法です。ウォーターフォール開発モデルでは、外部(ユーザー)又は、内部の要求定義をまとめた上で設計や細かい工程を生み出していく必要があります。また、ウォーターフォールでのシステム開発では基本的に、工程をスキップして作業は行いませんが、隣り合った工程でちょっとした反復が行われることはあります。ですので、基本的にウォーターフォールでのシステム開発は前の工程を完全に終えてからでないと次の工程に進めない仕組みになっています。

ウォーターフォールとは?

ウォーターフォールの歴史としては、元々1986年に NATO Science Committee が、ドイツで開かれた国際会議にてソフトウェア開発を職人的手法から工業製品的手法に転換する方法として初めて「ウォーターフォールモデル」の原形が提案されました。その後、1970 年に Winston Royce (ウィンストン・ロイス) 情報工学博士が「Managing the Development of Large Software Systems (大規模ソフトウェア システムの開発管理)」(英語) という論文を発表しました。 この論文で提唱されたソフトウェア開発のプロセスは、ハードウェアの世界で広く使用されている手法に非常に似ていました (下図参照)。

ウォーターフォールモデルの参考図
別名 "SSAPCTO"

現在のソフトウェアやシステム開発では、アジャイル型開発モデルが頻繁に活用されますが、ウォーターフォール開発モデルは、システムの品質を重視する際や、大規模な開発に最適なシステム開発手法として頻繁に使用されています。

直線的で連続的な自然の美しさをご覧ください!

ウォーターフォール モデルに込められた意図は、不測の事態が生じない秩序だった製造サイクルを作ることでした。 ウォーターフォールの提唱者たちは、そのメリットを高らかに喧伝しました。曰く、ドキュメントをしっかり作り込んでからコードの記述を始められる、何を作るのかが事前にはっきり定義される、進捗状況を把握しやすい。 これらは理論上はどれもすばらしいメリットなのですが、ウォーターフォール型の開発をいざ進めてみると、そううまくはいきません。

覚えておきたいウォーターフォール型開発の主な工程・手順

ウォーターフォール型には読んでご覧の通り、システム開発を上から下に流れるようにプロジェクトを進めていく必要があります。基本的な工程の特徴としては、「要件定義・仕様」「外部設計」「内部設計」「開発・システム実装」「テスト」「運用」 を元に工程を順番ずつ進めていくのが特徴です。以下のセクションでは、重要なウォーターフォール型開発に欠かせない6つの工程をご紹介していきます。

① 要件定義を決める

要件定義では必ずシステムの要件をステークホルダーと決めましょう。この工程で注意するべき点としては、顧客とどのような機能を開発するかなどの打ち合わせを進めていくことがポイントです。

② 外部設計を行う

外部設計工程では、実際にソフトウェアやシステムのUIなどに関する打ち合わせや画面操作のイメージや流れ等の設定を行います。ここで活用できるのが、ワイヤーフレームやモックアップです。

③ 内部設計を行う

内部設計では、システム開発に必要な詳細を決めます。代表的な内部設計では具体的な処理の流れの設計を行います。

④ コーディングの開始

こちらの工程では実際にプログラムの作成を行う段階として、プログラマーがコーディングを開始します。

⑤ テストの実行

この工程では、作成したコードやシステムのテストを実行します。テストにはシステムテスト単体テスト結合テストを行いましょう。

⑥ 運用

リリース後に運用業務が必要になります。後に顧客のリクエストに合わせ追加機能の開発も必要になってくる場合もあります。

ウォーターフォール型開発が善意で動いていることは、今も昔も変わりません。ただ、ソフトウェア開発の最先端にあるとは言えないようです。 ウォーターフォールの原則を固持してプロジェクトを進めると、結果的に下流の作業が山積みになり、手に負えなくなってしまうケースが少なくありません。 ソフトウェアの世界で言えば、設計や計画に何か月も費やしてから、ようやくコードの記述が始まるような状況です。 開発が終わってみると、できあがった製品が構想当初とまったく別のものになってしまっていることさえありますので、覚えておきましょう。

ウォーターフォール開発手法のメリットとは?

ウォーターフォールモデルの主なメリットには、以下のものがあります。

  • 進捗状況やスケジュール管理の把握が楽に
  • 予算や限界、納期のわかりやすさ
  • 関係者や参加者の入れ替えが簡単
  • 品質の担保が楽になる
  • バグの発生率が少ない

また、ウォーターフォール型開発モデルでは、作成以外の作業を含まないので無駄無しにシンプルなシステム開発が行えるメリット等も含まれています。

ウォーターフォール開発手法のデメリットとは?

それでは、次にウォーターフォールのデメリットを確認しましょう。

  • 前提状況等が変更した場合には、計画を立て直す必要がある
  • 製品やサービスに対するテストが行えない
  • 顧客の意見を取り入れるのが困難になる

アジャイル開発とウォータフォールの違いとは?

数年前まで、ソフトウェアやプロダクト開発はウォーターフォール開発手法をベースとして管理されていました。ウォーターフォール開発モデルでは、各タスクは段階的に実行され作業が滝のように進行します。これらの各フェーズは個別のステップとして表され、次のステップを開始する前に、前のステップを完了する必要があります。ウォーターフォール型開発モデルの開発工程は、その性質上、一定の予算、限界、時間、品質で完了するというメリットがあります。しかし、現実には顧客から強い不満が寄せられるケースが多かったため、現在ではアジャイル開発手法が多く活用されています。

ウォーターフォールとアジャイルの違いとは?

ウォーターフォール開発手法とアジャイル開発手法の一番の違いは、予測型適応型かということにあります。

ウォーターフォール開発モデルは予測型であり、開発プロジェクトの最初の段階で完璧な計画を立て、プロジェクト開始後に計画を変えることはありません。これに対し、アジャイル開発モデルは適応型であり、計画をすべて事前に決めるのではなく、開発プロジェクトの実行結果に基づいて計画を柔軟に変えながらプロジェクトを進行させます。

予測型 適応型
ウォーターフォール アジャイル開発
開発プロジェクトに変更がないものと想定し、事前の計画通りに進める プロジェクト開発要件に変更があるものと想定し、事実を把握しながら開発プロジェクトを進行させる

ウォーターフォール以外のシステム開発の種類

システム開発には、ウォーターフォール開発手法以外にもいくつかの開発方法が存在します。以下では代表的なシステム開発モデルを以下でご紹介しています。

アジャイル型開発方法

アジャイル開発はエンジニアにも欠かせない一種のシステム開発手法として使われており、小規模な機能別に工程を分けて開発を行う手法です。一般的なアジャイル開発では、企画からリリースを繰り返し実施します。また、アジャイル開発では、リリース計画とイテレーションを普段二つの工程に分けることが一般的です。

プロトタイプ開発モデル

プロトタイプモデルは、AI開発・作成などに役立つシステム開発手法として知られており、要件定義が決まり次第、簡単なシステム開発を行い、その後ステークホルダーのレビューを元に本格実装に入るシステム開発モデルです。

スパイラル型開発モデル

スパイラルモデルでは、計画を最初に行い、その後すぐに簡単な機能(プロトタイプ)を最初に作成し、企画者やクライアントからのレビューと評価を受けながら改善していく開発モデルスタイルです。

その他にも、システム開発モデルには、V字モデル (V-model)や、DevOps などがあります。ウォーターフォール形開発モデルと「V字モデル」を活用すると品質レベルアップなどのメリットにも繋がります。開発の要件や場合によって開発モデルを変更する必要がある場合もありますので、全ての開発手法モデルを学ぶ事をお勧めします。

まとめ

ウォーターフォールモデルは、頻繁に活用されている手法であり、プログラム開発やシステム開発に欠かせません。但し、システム開発には多くの手法があるので、プロジェクト毎の状況によってシステム開発モデルの調整や他の手法を活用することを忘れずに心掛けていきましょう。また、コーディングやシステム開発の品質を向上させたい場合には、CircleCI などの CIツールを導入して、より良いコードとプロダクト開発を行いましょう。

開発に役立つ関連記事