アジャイルのデメリットを理解して、使いこなす方法

## はじめに
アジャイルのメリットについては、既にご存じの方は、多いと思います。しかしながら、**デメリット**について、熟知した上で、対応しているかと問われると？如何でしょうか？デメリットについて、説明する事が出来て、デメリットに陥らないように、運用する自信は、ありますでしょうか？今回は、あえて、デメリットに注目し、解説を行いたいと思います。

## そもそものアジャイル
__プロセスやツールよりも個人と対話を、__
(効果的なコミュニケーションがプロジェクトの成功に不可欠です。)
__包括的なドキュメントよりも動くソフトウェアを、__
(最終的には動作するソフトウェアが価値を提供します。)
__契約交渉よりも顧客との協調を、__
(顧客との協力関係を築くことが重要です。)
__計画に従うことよりも変化への対応を、__
(ビジネス環境や顧客のニーズに柔軟に対応することが求められます。)

https://agilemanifesto.org/iso/ja/principles.html

### アジャイル開発の特徴

| 特徴 | 説明 |
| --- | --- |
| **短い開発サイクルでイテレーションを繰り返す** | 1～4週間程度の短い期間（スプリントと呼ばれる）で、機能開発、テスト、リリースを行う。開発サイクルごとに顧客からのフィードバックを取り込み、必要に応じて計画を修正する。 |
| **顧客との密接な連携** | 定期的に顧客とのミーティングを行い、開発状況や仕様変更などを共有する。顧客のニーズを常に把握し、開発に反映させる。 |
| **チームワークを重視** | 職種や役割を超えたチームで開発を進める。コミュニケーションを密にし、協力して問題を解決する。 |


### メリット

| メリット | 説明 |
| --- | --- |
| **変化への対応力が高い** | 顧客からのフィードバックや市場の変化に迅速に対応できる。 |
| **高品質なソフトウェアを開発できる** | 顧客のニーズを常に把握し、必要な機能を開発できる。定期的にテストを行うことで、品質の高いソフトウェアを開発できる。 |
| **顧客満足度を向上できる** | 顧客と密接に連携することで、顧客のニーズを満たしたソフトウェアを開発できる。 |
| **開発期間を短縮できる** | 必要な機能を優先的に開発することで、開発期間を短縮できる。 |




# 特徴

| 特徴 | 説明 |
| --- | --- |
| **短い開発サイクルでイテレーションを繰り返す** | 1～4週間程度の短い期間（スプリントと呼ばれる）で、機能開発、テスト、リリースを行う。開発サイクルごとに顧客からのフィードバックを取り込み、必要に応じて計画を修正する。 |
| **顧客との密接な連携** | 定期的に顧客とのミーティングを行い、開発状況や仕様変更などを共有する。顧客のニーズを常に把握し、開発に反映させる。 |
| **チームワークを重視** | 職種や役割を超えたチームで開発を進める。コミュニケーションを密にし、協力して問題を解決する。 |

### 代表的な手法

| 手法 | 説明 |
| --- | --- |
| **スクラム** | 最も代表的なアジャイル開発手法。チームを「スクラムチーム」と呼ばれる小規模なチームに分け、役割を明確にして開発を進める。 |
| **カンバン** | タスクを可視化し、ワークフローを管理する手法。開発状況を常に把握し、必要に応じてタスクの優先順位を変更できる。 |
| **リーンアジャイル** | ムダをなくし、価値を生み出すことに重点を置いたアジャイル開発手法。顧客にとっての価値を常に意識し、必要最低限の機能を開発する。 |
| **エクストリームプログラミング（XP）** | テスト駆動開発やペアプログラミングなどの手法を取り入れたアジャイル開発手法。 |

## デメリット
これを理解していないと、小手先での対応になってしまうと思います。

### 概要
| デメリット | 説明 |
| --- | --- |
| **計画が立てにくい** | 顧客からのフィードバックや市場の変化によって、計画が変わる。 |
| **チームワークが重要** | チームメンバー間のコミュニケーションが不足していると、何をやっているんだかわからなくなる。 |
| **熟練したスキルが必要** | 成功させるためには、チームメンバーがアジャイル開発に関する知識と経験を持っている必要がある。 |

### 詳細

### 1. **スコープの不確実性**
アジャイル開発では、要件が頻繁に変更されることが前提となっているため、プロジェクトのスコープが不確実になることがあります。これにより、プロジェクトの全体像や最終的な成果物が明確でない場合があります。

**欲張ると、際限なく、やる事が出てきてしまい、結果として、「何も解決しなかった」となります。**

### 2. **ドキュメント不足**
アジャイル開発では、動作するソフトウェアを重視するため、ドキュメントの作成が後回しになることがあります。これにより、後続のメンテナンスや新しいチームメンバーのオンボーディングが難しくなることがあります。

**最初に、共通のドキュメントを作成するのを忘れてしまうと、後から作るのがかなり大変な事になるので、ラフで構わないので、用意しておくことをお勧めします。**

### 3. **チームの依存度**
アジャイル開発は、チームの協力とコミュニケーションに大きく依存しています。チームメンバーが分散している場合や、コミュニケーションがうまく取れない場合、アジャイルの効果が減少することがあります。

**バックグラウンドの違うエンジニアが集まると、言葉がかみ合わないことがあります。チームメンバー全員が理解するのを待って、タスクを進めようとすると、いつまでもタスクが進まないような事態になる可能性があります。**

### 4. **顧客の関与が必要**
アジャイル開発では、顧客やステークホルダーの頻繁なフィードバックが求められます。顧客が十分に関与できない場合、プロジェクトの方向性が不明確になり、期待に応えられない可能性があります。

**顧客の意見を全て聞いていると、本当に聞きたい事と聞いてもあまり意味がない事全てを聞く事になりかねません。もし、顧客が作業を進めるために必要な知識を持ち合わせていない場合は、要点を確認し、不要な話に逸れないようにする工夫が必要です。**

### 5. **スケジュールの管理が難しい**
アジャイル開発では、スプリントごとに成果物をリリースするため、全体のスケジュール管理が難しくなることがあります。特に大規模なプロジェクトでは、全体の進捗を把握するのが難しくなることがあります。

**アジャイルが向いているのは、あくまで小規模なプロジェクトです。大規模なプロジェクトでは、プロジェクトを細分化し、アジャイル出来るレベルまで、管理できる規模を小さくする工夫が必要です。**

### 6. **技術的負債の蓄積**
アジャイル開発では、迅速なリリースを重視するため、技術的負債が蓄積されることがあります。これにより、後続の開発やメンテナンスが困難になることがあります。

**迅速なリリースを重視するため、既にリリースしてしまったものをもとに戻すのが困難になってしまう場合があります。そのため、リリースしたものをバージョン管理し、後日、戻せるようにする工夫が必要です。**

### 7. **適用が難しいプロジェクト**
アジャイル開発は、すべてのプロジェクトに適しているわけではありません。特に、規制が厳しい業界や、明確な要件が必要なプロジェクトでは、アジャイルの適用が難しいことがあります。

**アジャイルでは、当初の要件が、やっているうちに変わってしまう事が良くあります。明確な要件を最初に決めた場合、無理やり要件につじつまを合わせるような事態になってしまい、ちゃぶ台をひっくり返す事態になりかねません。**

### 8. **チームのスキルと経験に依存**
アジャイル開発は、チームメンバーのスキルと経験に大きく依存します。経験の浅いチームでは、アジャイルの原則をうまく適用できず、プロジェクトが失敗するリスクがあります。

**アジャイルという形から入ってしまうと、アジャイルの部分活用になってしまい、結果として、中途半端なものをアウトプットとして提示する事態になりかねません。**

### 9. **リソースの過負荷**
アジャイル開発では、短期間での成果物のリリースが求められるため、チームメンバーに過度な負荷がかかることがあります。これにより、バーンアウトや生産性の低下が発生する可能性があります。

**成果を意識し過ぎて、誰かに過度な負荷がかかることがあり、特定の誰かが燃え尽きたり、プロジェクトから離脱したりするような事態があり得ます。**

### 10. **長期的な計画の難しさ**
アジャイル開発では、短期的なスプリントに焦点を当てるため、長期的な計画や戦略が見えにくくなることがあります。これにより、プロジェクトの全体的なビジョンや目標が不明確になることがあります。

**やっているうちに目的が変わるため、当初考えていた事や想定していたことから逸れて、「結局、何がやりたかったんだっけ？」という事態になる事があります。**

これらの**デメリットを理解し、適切な対策を講じること**で、アジャイル開発の効果を最大限に引き出すことができます。アジャイルがすべてのプロジェクトに適しているわけではないため、プロジェクトの特性やチームの状況に応じて適切な開発手法を選択することが重要です。