More Effective Agile

## More Effective Agile
[本書](https://www.amazon.co.jp/Effective-Agile-%E2%80%9C%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC%E2%80%9D%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE28%E3%81%AE%E9%81%93%E6%A8%99-Steve-McConnell-ebook/dp/B089KFKB5H/ref=sr_1_1?adgrpid=101671923982&dchild=1&gclid=CjwKCAjw4qCKBhAVEiwAkTYsPDEUNv3kEz_OEY6kE572gYvUi2NWkpHqD2Uzf7EW5dP9NvIwlb0DTRoC9cgQAvD_BwE&hvadid=448950155922&hvdev=c&hvlocphy=1009252&hvnetw=g&hvqmt=e&hvrand=4255757438438181077&hvtargid=kwd-812981934415&hydadcr=28606_10649943&jp-ad-ap=0&keywords=more+effective+agile&qid=1632144005&sr=8-1)はアジャイルを正しく行う方法ではなく、各自の業務に適したアジャイルプラクティスからできるだけ大きな価値を引き出す方法について書かれている。構成としては、まずは背景状況から始まり、次に個人とチームが率いる作業、そして組織についても書かれている。本記事では、アジャイルとは何かといった基礎的な部分、効率的にアジャイルを進めていく方法（スクラム）についてまとめようと思う。


## アジャイル開発とは
直訳すると「素早い」「頭の回転が速い」という意味である。アジャイルはシステムやソフトウェア開発におけるプロジェクト開発手法の一つであり、大きな単位でシステムを区切るのではなく、機能単位の小さなサイクルで計画から設計、開発、テストまでの工程を繰り返す。

### シーケンシャル開発との違い
 * リリースサイクル
 アジャイル：動くソフトウェアを数日または数週間のサイクルで開発する
 シーケンシャル：数か月、数半期に及ぶ
 
 * バッチの大きさ
 アジャイル：要求獲得から、設計、コーディング、テスト、文書化まで小さいバッチで実行する
 シーケンシャル：プロジェクト全体に相当する要求獲得、設計、コーディング、テストを大きなバッチで実行する

 * プランニング
  アジャイル：事前の大まかなプランニングとジャストインタイムの詳細なプランニング
  シーケンシャル：事前の詳細なプランニング

 * 要求獲得
  アジャイル：事前の大まかな要求獲得とジャストインタイムでの要求の詳細化
  シーケンシャル：事前の詳細な要求獲得


 * 設計
  アジャイル：設計作業の細かな部分を必要になるまで先送りし、事前のアーキテクチャをほとんど重視しない創発的な設計
  シーケンシャル：事前にかなり詳細な設計


 * テスト
  アジャイル：開発に統合される（コーディングと並行もしくはテストファーストでテストを書く）。またアジャイルではテストを自動化することで、より多くの人がより頻繁にテストを実行できることに重点を置いている。
  シーケンシャル：開発とは別の作業として行う。通常は開発の後に行われる


### シーケンシャル開発との共通点
徹底された管理、顧客とのハイレベルな協力関係、高品質な要求、設計、コーディング、テスト、に重点的に取り組んでいる。

### アジャイル開発のメリット
 * リリースサイクルが短い：  
 欠陥を見つけたそばから小さなコストで修正できる。そのため行き詰って身動きが取れなくなる時間が少なくなる。
 * 小さいバッチで実行：  
 リリースサイクルが短いメリットとほぼ同じでエラーの検出と修正をより迅速により低いコストで行える。
 * ジャストインタイムのプランニング：  
 詳細な計画作成に費やす時間を減らす効果がある。詳細な設計はあとで無視されたり、捨てられることがある。
 * ジャストインタイムの要求：  
 事前の要求獲得に費やす作業が少なくなる。要求獲得を入念に行っても後から要求が変更になれば結局は無駄になる。
 * 創発的な設計：  
 あとから変更される要求に対する事前の設計に費やす作業量が少なくなる。
 * 開発チームに統合された継続的な自動テスト：  
 欠陥の修正コストを削減し、コード品質を高めることができる。

## スクラムとは
スクラムとはチームのワークフローを管理するための規律的な手法である。スクラムはチーム内での作業の流れを定義し、チームが用いる具体的な役割（ロール）と作業を調整するプラクティスを規定している。書籍、トレーニングコース、ツールが最も揃っているのはスクラムであり、うまくいくことも実証済みである。

## スクラムの基本
スクラムはイベント（ミーティング）、役割、作成物、それらを結びつけるルールで構成されるとよく言われている。スクラムはまずプロダクトバックログで始まる。プロダクトバックログを作成するのはプロダクトオーナー（スクラムにおいて要求に対して責任を負う人物）である。
### プロダクトバックログ
スクラムチームが提供できるかもしれない一連の要求、仕掛の要求、フィーチャー、機能、ストーリー、機能拡張、修正をまとめたものとなる。プロダクトバックログではありとあらゆる要求をすべてリストアップするのではなく、重要性と緊急性が
最も高く、投資利益率が最も高い要求に焦点を合わせる。

### スプリント
スクラムチームの作業はスプリントで行われる。スプリントは1～4週間の時間ベースのサイクル（イテレーション）である。次世代給与チームでは2週間のスプリントである。スプリントの期間が長くなるとそれだけリスクが高くなり、改善の機会が制限されることがわかっている。そのため、一般的にも2週間のスプリントが多い。

#### スプリントプランニングミーティング
各スプリントはスプリントプランニングミーティング（次世代給与チームではイテレーションプランニング）で始まる。このミーティングでは、スクラムチームがプロダクトバックログを見直し、スプリントバックログに取り込む作業を選び出し（次世代給与チームではTLの方等に事前に選び出していただいている）、スプリントの終わりまでに提供するスプリントバックログのアイテムを確認する。また、チームはスプリントゴールも定義する必要がある。スプリントゴールとはスプリントの目標を簡単にまとめたものである。

### スクラム作業の流れ
まずはスプリントプランニングミーティングを行い、チーム全体が設計に取り組む。これによりチームが設計について正しい判断を下すために必要な専門知識が揃う。ミーティングを効率的なものにするためには、参加する前に要求や設計を十分に細かく検討する。チームが各スプリントの終わりに提供する機能はインクリメントと呼ばれる。スプリントの期間中、スプリントバックログは閉じた箱として扱われる。つまりは、プロダクトオーナーがスプリントを中止して最初からやり直すことに同意しない限り、スプリントゴールにぶれが生じるような要求の追加、削除、変更を行うことはできない。スプリント期間中は、スプリントの最初と最後の日を除いて毎日行われるデイリースクラム（次世代給与チームでは朝会）のためにチームが集まる。この15分間のミーティングはスプリントゴールへの進捗の検査を目的とし、以下の3つの質問に答える。

 * 昨日は何をしたか
 * 今日は何をするのか
 * 進行を阻んでいるのは何か

これら3つの質問以外の話し合いはデイリースクラムが終わった後に回される。スクラムチームは、デイリースクラム、日次作業、デイリースクラム、日次作業という基本なリズムをスプリント全体にわたって繰り返す。
チームの作業品質はスプリントが終了するまでに、チームの完成の定義を満たす「リリース可能な（次世代給与チームではデプロイ）」水準に達していなければならない。スクラムチームはスプリントの終わりに作業の具体的なデモをする。このミーティングはスプリントレビュー（次世代給与チームでは受入テスト、有識者フィードバックがこれにあたりそう）と呼ばれる。チームは共通の視点に立った上でフィードバックを提供してもらうために、プロジェクトのステークホルダーをデモに招く（次世代給与チームではUXチームの方やPMの方に受入テストをしていただいた）。スプリントレビューで得られたフィードバックに基づいてプロダクトを改善するだけではなく、そのプロセスやプラクティスも改善する。
各スプリントの最後のイベントはスプリントレトロスペクティブ（ふりかえり）である。チームがスプリントの成功と失敗を確認する（次世代給与チームではKPTを使用）。チームは以前に行われた変更をすべて検討し、それぞれの変更を維持するのか、元に戻すのかを判断する。また次のスプリントで実施するプロセスの新たな変更点についても合意する。

### スクラムロール
スクラムではプロジェクトのワークフローをサポートする役割（ロール）を3つ定義している。

 * プロダクトオーナー
 スクラムチームとステークホルダーとの橋渡し役を務める。プロダクトオーナーの具体的な役割としてはプロダクトバックログの定義とプロダクトバックログアイテムの優先順位付けである。スクラムチームによって提供される価値が最大になるような方法でプロダクトを定義するという重要な役割を担っている。

 * スクラムマスター
 スクラムの実施に責任を負う役割である。スクラムマスターはチームやそれよりも大きな組織がスクラムの理論、プラクティス、全体的なアプローチを理解できるように手助けをする。また、プロセスを管理し、必要に応じてプロセスを実行に移し、妨害を取り除き、スクラムチームの他の役割の指導と支援を行う。

 * 開発チーム
 機能横断的なメンバーで構成される。開発チームのメンバーはそれぞれバックログアイテムを実装するために作業を行う。一般的なスクラムチームは3～9人の開発メンバーとスクラムマスターとプロダクトオーナーで構成される。

スクラムロールはあくまでも役割であり、職位を表すとは限らない。

### 成功するスプリント
成功するスプリントはスクラムの一番の目標である「できるだけ価値の高いプロダクトを提供する」に向かって進む。以下の5つの目標が達成できればスプリントは成功する。

 1. スプリントにおいて、実際に使用できる有益なインクリメントを提供する。このインクリメントは完成の定義を完全に満たしたものとなる。
 1. スプリントごとにインクリメントの価値が1つ前のスプリントよりも高くなる。
 1. スクラムチームのプロセスが1つ前のスプリントよりも改善される。
 1. スクラムチームが自分たちのチーム、仕事、プロダクト、または顧客について何かを学ぶ。
 1. スクラムチームのモティベーションが1つ前のスプリントの終わりと同じか、それよりも高くなっている。