ウォーターフォール開発とアジャイル開発についてのまとめ

# はじめに
この記事では自分がウォーターフォール型開発とアジャイル型開発のメリット・デメリットを調べた時に作成したメモです。
2つの開発手法の概要について簡単に把握する際にお役に立てばと思い公開します。


# ウォーターフォール開発の基本的な流れ
ウォーターフォール開発における主なステップについては以下の流れとなる。
上流となる要件定義からシステムテストを順番に実施する開発方式になる。

**ウォーターフォールのステップ**
- 要件定義
- 基本設計（外部設計）
- 詳細設計（内部設計）
- 開発
- 単体テスト
- 総合テスト
- システムテスト

## ウォーターフォール開発の各工程での主な内容
ウォーターフォール開発における各工程の主な内容についてまとめる。

### 1. 要件定義 
**目的:** 
- システムが解決するべき課題や実現する機能を明確に定義する。

**主な活動:**
- 発注者が解決したい課題とシステムで実現したい内容についてを洗い出す。
- システムに必要な機能や性能、制約条件を洗い出します。
- 主な成果物として要件定義書がある。
- 要件定義書には、発注者が実現したい内容を中心に機能要件（システムが提供するべき具体的な機能）と非機能要件（性能、セキュリティ、可用性など）を記載する。


### 2. 基本設計（外部設計）
**目的:** 
- システム全体の構造や外部とのインターフェースを設計する。

**主な活動:**
- システム全体のアーキテクチャを決定し、どのように要件を実現するかを設計する。
- ユーザーインターフェースの概要設計を行い、ユーザーがどのようにシステムを操作するかを決める。
- データベースの設計（ER図の作成、スキーマ定義など）や外部システムとの連携仕様を定義。
- 基本設計書（外部設計書）を作成し、上記の内容をまとめる。
- 詳細設計のベースとなる。


### 3. 詳細設計（内部設計）
**目的:** 
- 基本設計を基に、システムを実装するにあたり必要な詳細な部分を設計する。

**主な活動:**
- プログラムやモジュールごとの設計を詳細に行い、クラス図、シーケンス図、フローチャートなどを作成する。
- 各モジュールのアルゴリズムやデータフローを定義し、具体的なコーディング仕様を決定する。
- 詳細設計書（内部設計書）として上記の内容をまとめたものを作成する。
- 開発の指針になる


### 4. 開発 
**目的:** 
- 詳細設計に基づいてプログラムのコーディングを行う

**主な活動:**
- プログラマーが設計書に基づいてコードを記述し、システムを実装する。


### 5. 単体テスト
**目的:** 
- 個々のモジュールが詳細設計どおりに機能するかを確認する。

**主な活動:**
- 各プログラムやモジュールに対してテストケースを実行し、正確に機能するか、バグがないかを確認する。
- テストの結果を評価し、必要に応じて修正する。


### 6. 総合テスト
**目的:** 
- 複数のモジュールが統合され、基本設計の機能通りに正しく動作するかを確認する。

**主な活動:**
- モジュール同士を組み合わせ、基本設計で定義したインターフェースやデータのやり取りが正しく行われるかをテストする。
- モジュール間の依存関係、データフロー、機能の整合性を確認し、全体としてシステムが正しく動作することを確認する。
- 総合テスト計画書を作成し、計画に基づいてテストを進める。


### 7. システムテスト
**目的:** 
- システム全体が設計どおりに動作し、要件を満たしているかを確認します。

**主な活動:**
- システム全体の機能を総合的にテストし、要件定義で定められたすべての要件が満たされているかを確認する。
- 性能テスト、負荷テスト、セキュリティテスト、ユーザビリティテストなど、システムの品質を確保するための多角的なテストが実施する。
- テスト結果をドキュメント化し、システムが運用に適していることを確認する。



----

# アジャイル開発の基本的な流れ
迅速かつ柔軟に変化に対応することを重視している開発手法。
アジャイル開発は、大規模なプロジェクトを小さな単位に分割し、それぞれの単位を短期間（通常は2～4週間）で開発することで、段階的にソフトウェアを完成させていく方法。
短期間の開発を反復し、「計画」→「設計」→「実装」→「テスト」のような開発工程を小さな機能開発ごとに進める。


アジャイルの開発のフレームワークの例として以下のものがある。（GPTに出力してもらった。）
- スクラム
    - Scrumは最も広く使われているアジャイルフレームワークです。プロジェクトをスプリントと呼ばれる短期間のイテレーションに分割し、各スプリントの終わりに機能の完成を目指します。チーム内には、プロダクトオーナー（顧客代表）、スクラムマスター（プロセス管理者）、開発チーム（実装担当者）の3つの主要な役割があります。
- カンバン
    - Kanbanは視覚的なタスク管理を重視するフレームワークです。タスクをカードにしてボードに貼り付け、進捗状況を「To Do」「In Progress」「Done」などのステータスで表します。タスクの流れを制限し、ボトルネックを特定しやすくすることが目的です。
- Extreme Programming (XP)
    - XPは品質と迅速なフィードバックを最優先に考えるフレームワークです。テスト駆動開発（TDD）、ペアプログラミング、リファクタリングなど、コードの品質向上に重点を置いたプラクティスを取り入れています。

etc...

## スクラムの基本的な流れ
スクラム開発では、「スプリント」と呼ぶ、短い開発サイクルを繰り返す。
スプリントには、1か月以内の短い期間（2～4週間）を設定する。
そして各スプリントの終わりに、その成果となるプロダクトをプロダクトオーナーに提示して評価をもらう。

**スプリントのステップ**
スプリントの大まかな流れは以下のとおり
- バックログの作成と更新
- スプリントプランニング
- スプリント
- スプリントレビュー
- スプリントレトロスペクティブ(振り返り)


**スプリントの成果物**
スクラムの成果物として以下の3つの内容が定義されている。

- プロダクトバックログ
  - プロダクトに必要な機能や改善の要望を一覧でまとめたもの
- スプリントバックログ
  - 開発者がスプリントで⾏う作業を一覧でまとめたもの
- インクリメント
  - 具体的な成果物

**スクラムの役割り分担**
スクラムの役割り分担は以下の内容になっている。
それぞれの役割りの立場は対等な立場であり、責任の範囲が違うだけだと考える。

- プロダクトオーナー
  - 作成するプロダクトの責任者。
  - ステークホルダーもプロダクトオーナーの決定を尊重することでプロダクトオーナーが正しく責任を持てる。

- スクラムマスター
  - プロジェクトを円滑に進めるための調整役。
  - スプリントの進捗を妨げる障害を取り除くなど、さまざまなかたちでプロダクトオーナーと開発メンバーを支援する。

- 開発メンバー
  - 実際に開発を行うメンバー。
  - 成果物に対して責任を持つ。

## スクラムでの各工程での主な内容

### 1. プロダクトバックログの作成と更新
**目的:**
- 開発すべき機能や改善点を整理し、優先順位をつけることで、プロジェクトの全体像を把握し、計画を立てる基盤を作る。

**主な活動**:
- プロダクトオーナーがユーザーストーリーやタスクを洗い出す。
- 優先順位を設定し、バックログを更新する。


### 2. スプリントプランニング
**目的**: 
- スプリントの期間中に達成すべき目標を設定し、作業計画を具体化することで、スプリントの方向性と範囲を明確にする。
**主な活動**:
- スプリントゴールを設定する。
- プロダクトバックログからスプリントバックログにタスクを選択する。
- 選択したタスクを詳細化し、実行計画を立てる。


### 3. デイリースクラム（デイリースタンドアップ）
**目的**: 
- チームの進捗状況を共有し、障害を早期に発見・解決することで、スプリントゴールに向けた効果的な作業を支援する。

**主な活動**:
- 各メンバーが前日の作業、当日の計画、直面している課題を報告する。
- 障害がある場合、解決策を検討する。


### 4. スプリントの実行
**目的**: 
- スプリントプランで定めたタスクを完了し、スプリントゴールを達成することで、価値あるインクリメント（作業成果）を生み出す。
**主な活動**:
- チームがスプリントバックログに従って作業を進める。
- 必要に応じてタスクを調整し、障害を克服する。


### 5. スプリントレビュー
**目的**: 
- スプリントの成果物をステークホルダーに示し、フィードバックを受けることで、次のスプリントへのインプットを得る。
**主な活動**:
- 完了したインクリメントをデモンストレーションする。
- ステークホルダーと完成物の評価と改善点を議論する。


### 6. スプリントレトロスペクティブ
**目的**: 
- スプリント全体を振り返り、作業プロセスやチームの協力体制を改善するためのアクションを決定する。
**主な活動**:
- チームメンバーがスプリントの成功点と問題点を共有する。
- 改善すべき点を特定し、次のスプリントでの改善策を策定する。


---
参考：
https://service.shiftinc.jp/column/4983/