アジャイル開発を初めて学んだので、まとめてみた

#本記事の目的
アジャイル開発についての本[1]を読み終えたので、自身の備忘録として
アジャイル開発の概要などをまとめました。
具体的なアジャイル開発の手法などは次回に書きます。

誤り等ございましたら、ご指摘いただけますと幸いです。

#アジャイル開発とは

**短期間**でソフトウェアの**要件定義からリリースまで繰り返す**ような**開発方法の総称**です。また、このような開発方法に共通する考え方や哲学を示す言葉でもあります。

##アジャイル開発のメリット
アジャイル開発は、ソフトウェアの重要度の高い機能から順に開発していき、短い期間で何度もリリースしては顧客からフィードバックをもらいます。これにより、より正確に顧客の要望が反映され、顧客に**高い価値を素早く**、そして**変化にできるだけ柔軟に対応**しながら提供することが可能になっています。

##アジャイル開発の背景
アジャイル開発は、1990年代後半に従来行われていたプロセス重視の重い管理手法のアンチテーゼとして生まれました。
2001年に**[「アジャイルソフトウェア開発宣言（アジャイルマニュフェスト）」](https://agilemanifesto.org/iso/ja/manifesto.html)**が発表されて以降、多くの人々に受け入れられ、”アジャイルソフトウェア開発” という言葉が定着しました。
アジャイルマニュフェストには、アジャイル開発におけるマインドセットが書かれていて、[「アジャイル宣言の背後にある原則」](http://agilemanifesto.org/iso/ja/principles.html)とセットになっています。「アジャイル宣言の背後にある原則」は、アジャイルマニュフェストに書かれている4つの価値を実現するために、従うことが望ましい12個の原則を記したもので、こちらもアジャイルマニュフェストととも遵守していくべきものです。


###[アジャイルソフトウェア開発宣言（アジャイルマニュフェスト）](https://agilemanifesto.org/iso/ja/manifesto.html)
2001年2月にアメリカ合衆国のユタ州にて、様々なアジャイル開発手法を実践していた17名が、それぞれの手法の共通部分を見出すべく議論し、「アジャイルソフトウェア開発宣言（アジャイルマニュフェスト）」を発表しました。
「アジャイルソフトウェア開発宣言」には、アジャイル開発において大切な**4つの価値**が記されています。ここで注意するべきところは、左の価値も認めながらも、右の価値をより重視しているということです。
<img width="955" alt="スクリーンショット 2020-04-25 17.18.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256703/32033ea8-9413-41e7-7581-b280cf9cae38.png">
図1 アジャイルソフトウェア開発宣言


一つ目の「*プロセスやツールよりも個人との対話を*」では、
**個人を何よりも尊重して、Face to Faceで対話をする**ことが最も効果的なコミュニケーションであり、より良いチームにするために重要であるということを述べています。

二つ目の「*包括的なドキュメントよりも動くソフトウェアを*」では、
**実際にソフトウェアを動かして確認する**ことで、正確で効率よく情報伝達ができるということを述べています。

三つ目の「*契約交渉よりも顧客との協調を*」 では、
**顧客と開発者が、お互いの立場を超えて協働する**ことで、効率的により良い価値を顧客に届けることができると述べています。

四つ目の「*計画に従うことよりも変化への対応を*」では、
**顧客の要求や環境などの変化に対応する**ことで、顧客満足度を向上させることに繋がり、より良い価値を生み出すチャンスであると述べています。

また、「アジャイル宣言の背後にある原則」の詳細については、下記PDFが分かりやすかったので、こちらをご参照ください。
[[2]IPA『アジャイル開発宣言の読み解き方』、2020](https://www.ipa.go.jp/files/000065601.pdf)

#アジャイル開発の特徴
アジャイル開発には以下の9つの特徴があります。([1]による)

1. 重要度の高い機能から優先的に開発する
2. 短期間繰り返し開発、動くソフトウェアで顧客と確認
3. 開発期間を固定する
4. 反復型開発期間を固定するが開発項目は固定しない
5. 開発対象の機能を1つの反復型開発期間内に収まるように分割
6. 全ての作業をチケット管理する
7. 顧客、チームメンバー間の直接対話
8. 自動化ツールの高度の活用
9. ドキュメントの作成を最小限にする

## 重要度の高い機能から優先的に開発する
アジャイル開発では、システム全体の機能を**ユーザーストーリー**と呼ばれる小機能に分割して、優先度をつけます。
ユーザーストーリーには、それぞれの機能についての要件を細かく明記する必要はなく、シンプルに、あくまでユーザー側の観点から記載されます。ユーザーストーリーのテンプレートは「*<ユーザーの種類>として、<フィーチャ（機能や性能など）>が欲しい。それは<ビジネス価値>のためだ。*」です。具体的に当てはめると、「本の購入者として、本の題名で本を探したい。それは探している本を見つけるためだ。」のようになります。
優先度は、**顧客にとってのビジネス的価値に基づいて設定**していき、優先度の高い順に開発(着手)します。優先度付け方法の一例ですが、機能と要求のマトリクスを作成し、要求に重み付けをすれば、機能ごとの優先ポイントを算出する事ができます。優先ポイントを元に優先度を決定することで、優先度の判断基準をより明確にする事ができます。


<img width="1022" alt="スクリーンショット 2020-04-26 16.07.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256703/8ac33faa-25aa-e98e-e425-9eecbd0682df.png">

図2　機能の優先度付けの例
(図2では優先度の根拠となる優先ポイントを表示し、機能ごとの分類分けを行っています。あくまで一例なので、チーム内で一番良いと思われる手段で優先度付けを実施する事が一番です。)

アジャイル開発では、優先度の高い機能から開発する為、**開発初期の段階から重要な機能を顧客に提供**し、その妥当性を検証します。これにより重要な機能の欠陥などがあった場合にも、早めに気づくことができ、**プロジェクト全体のリスクを低下させる**事ができるのです。
また、優先度付けした後も、常に機能の必要性について議論が行われ、必要性の低い機能は後回しにされます。結果的に開発されない機能が存在することもあります。
使われない機能があったとしても、最終工程で全ての機能が提供されるウォーターフォール型開発に比べて、**ROIの観点から、アジャイル開発は非常に有利**であると言えます。

## 短期間繰り返し開発、動くソフトウェアで顧客と確認
アジャイル開発では、全体の機能を小機能(ユーザーストーリー)に分割して、短期間で繰り返し開発を行います。この**反復型開発期間(イテレーション)ごとに、実際に動く機能を顧客に提供**して、その妥当性を検証します。
機能の動作の妥当性をドキュメントのみで検証することは難しく、実際に動かしてみて確認する方が、より正確に分かりやすく顧客に伝えることができます。検証の際に、機能の不適当な箇所を指摘された場合には、次のイテレーションでこれを修正します。

## 開発期間を固定する
アジャイル開発では、まずイテレーションの期間を固定し、**イテレーション内に最大限開発できるように開発対象を決めます**。開発が予定とずれそうな場合には、イテレーションの期間の調整は行わず、開発対象の削減、または追加を行います。
期間が固定されたイテレーションを何度も繰り返すことで、チームが1度のイテレーション内にどの程度開発できるのか把握できるようになり、チームのリズム（ハートビートと言います）を作ることができます。チームの許容量を知ることで、それ以降の開発の見積もりをより正確にし、長期の開発計画が立てやすくします。
また、イテレーションの長さは、開発対象にもよりますが、一般に2週間程度とされます。

## 反復型開発期間を固定するが開発項目は固定しない
アジャイル開発では、開発内容がプロジェクトの途中で変更されることを歓迎します。
その為、**開発項目は、開発途中で変更可能**であり、**変更に素早く対応**します。環境の変化やイテレーション毎の機能検証の結果などにより顧客の要望が変わることは当たり前であり、この開発内容の変更要請に対応可能であることは、顧客にとって大きなメリットとなります。

## 開発対象の機能を1つの反復型開発期間内に収まるように分割
アジャイル開発では、全体の機能をユーザーストーリーに分け、優先度の高い順に各イテレーション内に収まるように割り振られます。**ユーザーストーリーは、必ずユーザーから見える外部機能に基づいて分割**され、以下**6つの条件(INVEST)を満たす**ように気をつけます。
1. Independent：各々のストーリーが他のストーリーと独立している
2. Negitiable：実現手段が複数ある
3. Vakuable：顧客にとって価値がある
4. Estimable：見積もりが可能な程度に小さく明確である
5. Small：短期間に実現できる
6. Testable：テストができる（性能基準や機能が明確である）

その後、**ユーザーストーリーをさらに細かく分けて作業管理対象(開発対象)とします**。ユーザーストーリーや作業管理対象は後から変更される可能性をもつ為、プロジェクトの初めから全てのイテレーションのユーザーストーリｰを分割することはせず、実際に対象の機能を実装するイテレーションになってから、作業管理対象を明確にし、設計作業が行われます。

<img width="1024" alt="スクリーンショット 2020-04-26 16.06.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256703/d078b268-3b0c-ffa3-d198-d78d558e7fea.png">

ウォーターフォール型の開発では、上流工程で全ての機能についての開発計画(設計書)を作りますが、アジャイル開発では、作業の進捗に沿って必要な計画が進められます。**計画作成作業が時間軸上で分散されている**イメージです。短期間で、設計だけではなく機能を実際に実装し動作させることが求められる為、**非常に厳しく綿密な計画作業**が要求されます。
## 全ての作業をチケット管理する
アジャイル開発では、どんなに軽微であっても、**全ての作業をチケットで管理**します。
チケットには、*チケットID、作業内容概要(1行)、その他*が記述されています。開発作業ではなく、調査作業でもチケットを割り当てるので注意が必要です。
あらゆる作業がIDを持つことで、**IDをキーとした集計が、各イテレーションの作業全体の実態を表します**。チケットの集計ツールなどは、チーム全体で共有し、各作業の進捗状況などをメンバー全員が把握でき流ようにします。

## 顧客、チームメンバー間の直接対話
アジャイル開発では、顧客も含めたチームのメンバー間の直接対話を非常に大切にします。極めて大切なことですが、対話を行う際には、なるべく「対立」を避け、相互に尊敬し信頼しあうことを念頭におきます。
また、効率的にコミュニケーションを行うために、必ず**Face to Faceにて、定期的(毎朝、イテレーション毎など)、非定期的な短い会議を開催**します。顧客こそが、真の要求仕様を知っているため、**定期的な会議には、必ず顧客も参加する**ようにします。ただし、顧客は、「協調的で、権限を持っており、任されていて、知識を持っている」人物であるとします。
顧客との対話の中で、最も重要なのは、イテレーションの開始時と終了時の対話です。イテレーションの開始時には、そのイテレーションで開発する機能項目(ユーザーストーリー)の妥当性と、優先度について再度議論し、場合によってはユーザーストーリーを変更します。イテレーションの終了時には、その期間で開発したソフトウェアを動作させながら顧客がレビューを行います。
チームのメンバーは、必ず同じ部屋で仕事を行い、毎朝(または終業前)行われるデイリー会議で、毎日の進捗状況と、進捗上の課題を共有します。15分程度を目安に以下３点をチームの全員（顧客は含まない）が話します。この時、無駄な話は一切行わず、作業はIDで報告するようにします。

1. この24時間でやったこと
2. この24時間でやること
3. 作業上の問題点

デイリー会議など定期的に行われる会議の他にも、必要であれば5分から10分程度の短い打ち合わせを臨時に開催します。メンバーは、打ち合わせの要請には気軽に応じる必要があります。

## 自動化ツールの高度の活用
アジャイル開発では、コーディング工程などで**自動化ツールを使用することが当たり前**となっています。
例えば、[XP(代表的なアジャイル開発手法の一つ)](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0%E3%83%BB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)では、コード分析・評価ツール、継続的インテグレーションCIツール、単体テスト支援ツールの活用を標準プロセスに組み込んでいます。
アジャイル開発では、製品の品質を保つために、単体テストが徹底して行われます。単体テストは、実装前に作成され、コードが変更される度に実行されることで、常にコードがテストをクリアしている状態であるか確認します([TDD](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA))。
このような動作はCIツールを用いて自動化され、より効率的な開発を可能にするのです。

## ドキュメントの作成を最小限にする
アジャイル開発では、動くソフトウェアを提供することに力を注ぎ、**ドキュメントの作成、保守にかかる工数を最小限にする**努力をします。ドキュメントを大量に作成するのではなく、コードのリファクタリングを繰り返して理解しやすいコードにしたり、TDDによりテストコードとプログラムをセットにしたりして、**コードから直接ソフトウェアを理解しやすくします**。
注意点としては、XPのように全くドキュメントを保持しないような手法もあれば、Agile ICONIXのように必要最低限のコンパクトなドキュメントであれば必要であると考える手法もあることです。

#最後に
いかがでしたでしょうか。
想定より長くなってしまい、具体的なアジャイル手法(スクラムやSAFeなど)について記載できませんでした...
特に上流工程を含めた拡張アジャイル開発は非常に面白いので、また次回に書きたいと思います。

#参考文献
本記事を書くにあたって下記文献を参考にしました。

[1] [(著)片岡 雅憲,小原 由紀夫,光藤 昭男 (編集) 日本プロジェクトマネジメント協会『アジャイル開発への道案内』近代科学社、2017](https://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%B8%E3%81%AE%E9%81%93%E6%A1%88%E5%86%85-%E7%89%87%E5%B2%A1-%E9%9B%85%E6%86%B2-ebook/dp/B075XC8K9P)
[2][IPA『アジャイル開発宣言の読み解き方』、2020](https://www.ipa.go.jp/files/000065601.pdf)