プログラマのための IT 教科書

アジャイルとチーム開発

この部の 7 / 9 章 ・ 全体で 19 / 76 章 ・ 読了目安 35 分

この章を読むとできるようになること
  • なぜ計画通りに作れないのかを説明できる
  • 見積もりが外れた時にいつ何を報告すべきか判断できる
  • スクラムの各儀式が何のためにあるか説明できる

前の章で、1つの機能が世に出るまでの流れを見ました。 この章では、それをチームで、繰り返し回すための仕組みを扱います。

先に結論を書きます。この章で一番大事なのはスクラムの用語ではありません。 「詰まった時にいつ声を上げるか」です。 新人が評価を落とす原因の第1位は、技術力不足ではなく報告の遅れだからです。

なぜ計画通りに作れないのか

ソフトウェア開発では、見積もりが当たりません。これはあなたが未熟だからではなく、 作ってみるまで分からないことが多すぎるからです。

  • 既存コードが想像より複雑だった
  • 外部 API の仕様が書いてある通りではなかった
  • 3件だけだと思っていたケースが実は12件あった
  • ライブラリのバージョンが上がらず、依存が芋づる式に壊れた

家を建てるのと違い、ソフトウェアは同じものを二度作りません。 毎回が初めての作業なので、経験から時間を正確に読むことができません。

この「不確実性」をどう扱うかで、開発の進め方が変わります。

ウォーターフォールとアジャイル

ウォーターフォール
  要件定義 ─→ 設計 ─→ 実装 ─→ テスト ─→ リリース
  (最初に全部決めて、順番に作る。戻らない前提)

アジャイル
  ┌→ 計画 → 実装 → 確認 → 学ぶ ┐
  └───────────────────────────┘
  (小さく作って出し、学んだことを次に反映する。これを繰り返す)
どちらが偉いという話ではない

新人向けの記事では「アジャイルが正しい」と書かれがちですが、正確ではありません。

選択の基準は「不確実性の量」です。

  • 仕様が動かない・後戻りのコストが極端に高い(ロケット、医療機器、法対応) → ウォーターフォール的に、先に固める価値がある
  • 何が正解か分からない・作って反応を見ないと決められない(Web サービスの多く) → アジャイル的に、小さく出して学ぶ方が速い

Web アプリの世界では後者が多いので、アジャイルが主流になっています。

スクラムの仕組み

アジャイルの進め方の中で、最も広く使われている型がスクラムです。 用語が多くて最初は戸惑いますが、それぞれに目的があります。目的だけ覚えてください。

登場人物

役割何をする人か
プロダクトオーナー(PO)何を作るかの優先順位を決める人。要望の窓口
開発チーム実際に作る人たち。どう作るかは開発チームが決める
スクラムマスター進行を助け、チームの障害を取り除く人

「何を作るか」は PO、「どう作るか」は開発チーム、という分担が基本です。 実装方法を PO が指定してくる場合、それは越境なので相談していい部分です。

繰り返しの単位: スプリント

1〜2週間の固定期間です。この単位で計画し、作り、振り返ります。

第1週                                        第2週
├─ スプリント開始 ───────────────────────── 終了 ─┤
│                                                  │
├ プランニング                          レビュー ─┤
│              リファインメント(途中で)  レトロ ─┤
└─ 毎朝デイリースクラム ───────────────────────────┘

会議とその目的

まず全体像です。「なぜその会議があるのか」が分かると、出席の仕方が変わります。

スクラムガイドが定める公式のイベントは、スプリントそのものを含めて5つです。

スプリント(1〜2週間の器)
 ├ スプリントプランニング
 ├ デイリースクラム
 ├ スプリントレビュー
 └ スプリントレトロスペクティブ

これに加えて、リファインメントという継続的な活動があります。 公式のイベントではありませんが、会議として時間を取るチームが多いので、ここでは一緒に扱います。

会議いつ目安の時間一言でいうと
リファインメントスプリントの途中週1〜2時間次に着手するものを分かる状態にしておく
スプリントプランニング開始時2〜4時間何を・なぜ・どうやるかを決める
デイリースクラム毎朝15分目標に届きそうかを見て、その日の動きを調整する
スプリントレビュー終了時1〜2時間動くものを見せて、次に何を作るかを決め直す
レトロスペクティブ終了時1時間前後やり方を1つ改善する

時間は1〜2週間スプリントの目安です。スプリントが短ければ、会議も比例して短くします。

以下、1つずつ見ていきます。

リファインメント — 着手できる状態にしておく

「バックログリファインメント」「グルーミング」とも呼ばれます。

やること

□ プロダクトバックログの上から順に、内容を詳しくする
□ 大きすぎるものを、1スプリントに収まる大きさに割る
□ 受け入れ条件を書く(どうなったら完成か)
□ 見積もる(ストーリーポイント)
□ 「これ、そもそも何のため?」を潰しておく

なぜ必要か

これをやらずにプランニングを迎えると、こうなります。

「このチケット、何をすればいいんでしたっけ」
「仕様は誰が決めるんですか」
「これ、調べてみないと見積もれません」
   ↓
プランニングが仕様検討会になり、3時間経っても何も決まらない

プランニングで議論しないために、事前に済ませておくのがリファインメントです。

リファインメントは公式のイベントではない

スクラムガイドは、リファインメントをイベントではなく「継続的な活動」 として位置づけています。 だから、会議としてやるかどうかはチーム次第です。週1で時間を取るチームもあれば、 Slack と PR のコメントで随時やるチームもあります。

形式はどうあれ、着手前に「分かる状態」にする作業は必ず存在します。

新人はリファインメントで質問すると価値が出る

「分かっている人だけで話が進む」状態は、実は危険信号です。

新人が 「これはどういう時に使われるんですか」「この場合はどうなりますか」 と聞くと、 チームが暗黙に前提していた条件が表に出てきます。

新人の素朴な質問が、仕様の穴を見つける——これはよくあることです。 分からないまま黙って持ち帰るより、その場で聞くほうが全員の得になります。

スプリントプランニング — 何を・なぜ・どうやるか

スプリントの最初にやります。決めることは3つです。

決めること中身
なぜ(Why)このスプリントで何を達成したいか=スプリントゴールを1つ決める
何を(What)ゴールのために、バックログからどれを取るか選ぶ
どうやるか(How)選んだものを、実際の作業に割る(設計・実装・テスト・レビュー)

流れ

1. PO が「今回はここを達成したい」と背景を説明する
2. 開発チームが、直近の実績(ベロシティ)を見て入る量を決める
3. 1つずつ、作業レベルまで分解する
4. 「これは入らない」を全員で確認する      ← ここが最重要
「入りません」と言えないと、全部が遅れる

新人がやりがちなのが、量を詰め込まれても黙っていることです。

✕ (多い気がするけど、経験が無いから何も言えない……)
○ 「これは初めて触る領域なので、調べる時間を含めると倍かかるかもしれません」

見積もりが外れること自体は問題ではありません。 問題は、外れそうだと分かった時に誰も知らないことです。

プランニングは「約束させる場」ではなく、 現実的な量を全員で確認する場だと考えてください。

スプリントゴールがあると、判断が速くなる

途中で割り込みが来た時、 「これはゴールに必要か?」の一言で判断できます。

ゴールが無いと、タスクの寄せ集めになり、 何かを削るときに何を削っていいのか誰にも分からなくなります。

デイリースクラム — 15分で舵を切る

毎朝、同じ時間・同じ場所で15分やります。時間を延ばしません。

目的は進捗報告ではなく、「スプリントゴールに届きそうか」の確認と、その日の調整です。

デイリーを「進捗報告会」にしない

新人が最も誤解するのがデイリーです。 「昨日やったこと、今日やること」を読み上げる場だと思われがちですが、違います。

本題は3つ目の「困っていること」です。

昨日: 検索APIの実装を進めた
今日: 続きをやる
困っていること: Spanner のクエリが想定より遅く、原因が分かっていない

この3行目があるかどうかで、デイリーの価値が変わります。 「特にありません」と毎日言い続けているなら、それは何かを見落としています。

15分で終わらない話は、その場でやらない

デイリーで込み入った議論が始まったら、「あとで」と切り上げるのが正しい運用です。

「その話、デイリーのあとで◯◯さんと3人でやりましょう」

これをパーキングロット(駐車場)と呼びます。 全員を15分以上拘束しないための仕組みで、切り上げるのは失礼ではありません。

スプリントレビュー — 動くものを見せて、次を決める

スプリントの終わりに、関係者(PO・企画・営業・カスタマーサポートなど)を招いて行います。

やること

□ このスプリントで完成したものを、実際に動かして見せる
□ 完成しなかったものと、その理由を正直に共有する
□ 使う側からのフィードバックを受ける
□ それを踏まえて、次に何を作るかを話す
レビューは「発表会」ではない

スライドで説明する場ではありません。実際に動くものを触ってもらう場です。

✕ 「実装が完了しました」とスライドで報告する
○ 画面を触ってもらい、「ここ、こうなっていると助かる」を引き出す

そして、この会議の成果物はプロダクトバックログの更新です。 「見せて終わり」ならやる意味がありません。

なお、未完成のものを完成したことにしないでください。 バレるからではなく、それをやると計画が全部ずれるからです。

新人が最初に成果を実感できる場

自分が書いたコードを、使う人が触っている場面を見られる数少ない機会です。

「この画面、毎日使うことになるんです」と言われると、 コードの意味が変わって見えます。できるだけ出席してください。

スプリントレトロスペクティブ — やり方を1つ直す

スプリントの最後にやります。振り返る対象は成果物ではなく、やり方です。

□ 人・関係・プロセス・道具、そして「完成の定義」がどうだったか
□ うまくいったこと(続けたいこと)
□ うまくいかなかったこと
□ 次のスプリントで試す改善を、1つ決める      ← ここが本体

よく使われる型が KPT です。

Keep     続けたいこと
Problem  困ったこと
Try      次に試すこと
Try を10個出しても、1つも実行されない

レトロで最も多い失敗が、改善案を出して満足することです。

✕ Try を10個出す → 次のスプリントで誰も覚えていない
○ Try を1〜2個に絞る → 担当と期限を決め、次のスプリントのタスクに入れる

やり方の改善も「作業」です。 バックログに載せて初めて実行されます。

人を責める場にしない

レトロはプロセスを直す場であって、犯人を探す場ではありません。

✕ 「◯◯さんの実装が遅れたから間に合わなかった」
○ 「レビュー待ちで2日止まっていた。レビュー担当を先に決めておく?」

人ではなく仕組みを直す——これが守られないと、 誰も本当のことを言わなくなり、レトロが形式だけの30分になります。

新人であっても、「ここが分かりにくかった」は最も価値のある情報です。 チームが慣れきって見えなくなっているものが見えているからです。

バックログ

やることリストです。2種類あります。

  • プロダクトバックログ — やりたいこと全部。優先順位つき。PO が並べ替える
  • スプリントバックログ — そのスプリントでやると決めたぶん

ユーザーストーリーと受け入れ条件

チケットは、こういう形式で書かれることがあります。

[ユーザーとして] 商品を探している購入者は
[〜したい]      商品名を正確に知らなくても目的の商品を見つけたい
[なぜなら]      商品名の表記が出品者ごとにばらばらだから

「誰の、どんな困りごとを解決するのか」 を先に書く形式です。 これがあると、実装で迷った時に「購入者が探しやすいのはどっちか」で判断できます。

受け入れ条件

そして、何ができたら完成なのかを具体的に書きます。

- 商品名の部分一致で検索できる
- 説明文にキーワードが含まれる商品も結果に出る
- 検索結果は関連度順に並ぶ
- 該当0件のときは「見つかりませんでした」と表示する
- 検索の応答は 200ms 以内
受け入れ条件が書かれていなければ、自分で書いて確認する

新人でもできる、評価の上がる動き方です。

「チケットの受け入れ条件がなかったので、私の理解を書きました。 これで合っていますか?」

と箇条書きを添えて聞くと、認識のズレがその場で潰せます。 これは仕様確認であると同時に、あなたが仕様を理解していることの証明にもなります。

見積もり

なぜ「時間」で見積もらないのか

多くのチームでは、時間ではなくストーリーポイントという相対値を使います。

この作業は、あの作業(3ポイント)と比べてどれくらい?
  → 同じくらい大変 → 3
  → 倍くらい大変   → 5 か 8

理由は2つです。

  1. 人によって作業時間が違う(ベテランなら1時間、新人なら1日)。 でも「難しさ」は同じくらいに見える
  2. 時間で言うと約束に聞こえる。「8時間です」と言うと、8時間で終わらないと嘘になる

数字はフィボナッチ数列(1, 2, 3, 5, 8, 13)を使うことが多いです。 大きくなるほど不確実性が増すので、細かい区別に意味がなくなるからです。

見積もりは外れる。それは問題ではない

外れること自体は誰も責めません。 全員が「外れるもの」と分かっています。

問題になるのはこれです。

外れたことを、締め切り直前まで言わないこと

ここが新人の評価を最も左右する

「3日でできます」と言って5日かかるのは、普通のことです。

「3日でできます」と言って、Day 3 の夕方に「まだできていません」と言うのが問題です。 Day 1 の時点で「これは想定より複雑そうです」と気づいていたのに黙っていた場合、 チームは2日ぶんの対応の機会を失っています。

遅れそうだと分かった瞬間が、報告のタイミングです。

詰まった時にどうするか

この章で最も伝えたい部分です。

30分ルール

30分考えて進まなければ、人に聞いてください。

これはこの教科書の使い方でも書きましたが、繰り返す価値があります。 なぜなら、新人はほぼ全員これができないからです。

「こんなことも分からないのかと思われたくない」 「自分で解決するのが仕事だと思う」 「先輩は忙しそうだから」

気持ちは分かります。でも、チームから見た計算は逆です。

あなたの行動チームへの影響
30分で聞く先輩の5分 + あなたの30分 = 35分の消費
3日粘るあなたの24時間 + 遅れによる計画修正 = 数日の損失

聞くことは、チームのコストを下げる行為です。

時系列で見る

【悪い例】
Day 1  詰まる。「もう少し考えれば分かるはず」
Day 2  まだ分からない。「今さら聞きづらい」
Day 3  分からない。デイリーでも「順調です」と言ってしまう
Day 4  スプリントレビュー前日。「実はできていません」
       → チームは代替案を検討する時間がゼロ。信頼が下がる

【良い例】
Day 1  10:00 詰まる
       10:30 Slack で聞く「〜を試したが〜というエラーが出ます。〜が原因かと思っていますが…」
       10:35 先輩「それは〜の設定が必要です」
       10:40 解決。実装に戻る
       → 消費は40分。信頼は下がらない(むしろ状況を共有できる人と見られる)

悪い例のポイントは、Day 3 のデイリーで嘘をついたことです。 ここで「実は詰まっています」と言えていれば、まだ間に合いました。

聞き方のテンプレート

丸投げの質問は答えづらく、返事が遅れます。この4点を添えてください。

【やろうとしていること】
ローカルで API サーバーを起動しようとしています。

【起きていること】
起動時に以下のエラーで落ちます。
(エラーメッセージを全文そのまま貼る)

【試したこと】
- ポートが使われていないか lsof で確認 → 使われていませんでした
- .env の DATABASE_URL を README の通りに設定 → 変わらず

【聞きたいこと】
このエラーの原因として、他に確認すべき箇所はありますか?
この形式には副次的な効果がある

書いている途中で自己解決することがよくあります(ラバーダック効果)。 そして解決しなくても、あなたが何を試したかが残るので、 同じ問題を次の人が踏んだ時の資料になります。

Slack のパブリックチャンネルで聞くのが基本です。DM で聞くと、 その知識はあなたと相手の2人にしか残りません。

チームでの振る舞い

分報(times チャンネル)

多くの Web 系企業には times-あなたの名前 のような個人チャンネルがあります。 そこに作業中の独り言を書きます。

10:00 検索APIの実装開始
10:30 Spanner のクエリが遅い。EXPLAIN を見てみる
10:45 インデックスが効いてないっぽい?
11:00 → 主キーの順序が原因だった。解決

これは日記ではなく、非同期の助けを呼ぶ仕組みです。 通りかかった先輩が「それインデックスの順序では」と教えてくれることがよくあります。

新人ほど書く量を多めにしてください。 何に時間を使っているかが見えると、周りは助けやすくなります。

会議で分からない単語が出たら

聞いてください。「すみません、SLO というのは何ですか」と。

新人が聞くと、実は他の人も分かっていなかったことが判明する場面がよくあります。 分からないまま議事録を書くと、間違った内容が残ります。

その場で聞けなかったら、あとで調べてメモに残してください。

最初の1ヶ月でやるべきこと

やることなぜ
詰まった箇所を全部メモする環境構築・用語・暗黙のルール。次の新人への財産になる
README を直す PR を出す最初の貢献として最適。小さくて確実に価値がある
用語集を自分で作る社内固有の略語は必ずある。誰も教えてくれない
毎日 times に書く助けてもらいやすくなる

ケーススタディ: 3日黙った新人

C さんは「決済のリトライ処理を実装する」チケットを受け取り、3日で終わると見積もりました。

Day 1  外部決済APIの仕様書を読む。リトライの条件が書いていないことに気づく
       → 「たぶんタイムアウトの時だけだろう」と自分で判断して実装を進める
Day 2  実装するが、テストでどう再現すればいいか分からない。悩む
Day 3  デイリーで「順調です」と報告。実際は8割の確信もない
Day 4  レビューで「冪等性は考慮していますか?」と指摘される
       → 冪等性を知らなかった。設計からやり直し
Day 7  完成。スプリントには間に合わず、次に持ち越し

分岐点は Day 1 でした。 仕様書にリトライ条件が書いていないと気づいた時点で、

決済APIの仕様書にリトライ条件の記載が見つかりません。 タイムアウト時のみリトライする想定で進めようと思いますが、認識は合っていますか? (リトライ時の二重決済が心配なので、そこも確認したいです)

と聞いていれば、Day 1 で冪等性の話が出て、正しい設計から始められました。

C さんの技術力に問題はありません。 確認をしなかったことだけが問題です。

ケーススタディ: 良いレトロ

スプリントの最後にレトロ(振り返り)をします。よく使われる KPT という型があります。

内容例
Keep続けたいことPR を小さく分けたらレビューが速くなった
Problem問題だったことステージング環境が2日壊れていて確認できなかった
Try次に試すことステージングの死活監視を入れる
レトロで人を責めない

「D さんの PR が大きすぎた」ではなく、 「PR が大きくなりがちだった。分割の基準をチームで決めよう」と書きます。

責めるのは人ではなく、やり方です。 人を責めるレトロが1回でもあると、次から誰も本音を言わなくなり、 レトロが形骸化します。

新人でもレトロで発言していいです。むしろ新人にしか見えない問題があります。

  • README 通りにやっても環境構築できなかった
  • この用語がドキュメントのどこにも定義されていない
  • チケットの受け入れ条件が空欄のことが多い

これらは、慣れた人には見えなくなっている問題です。

実務の落とし穴まとめ

  1. 詰まったことを言わない — 最も評価を落とす。30分ルールを守る
  2. デイリーで「順調です」と言い続ける — 困りごとを言う場だと理解する
  3. 仕様の不明点を自己判断で埋める — 確認は5分、手戻りは3日
  4. 見積もりが外れそうなのを直前まで報告しない — 外れること自体は問題ではない
  5. DM で質問する — パブリックチャンネルなら知識が残り、他の人も助かる
  6. 分からない単語を分からないまま流す — 他の人も分かっていないことが多い

まとめ

  • 見積もりが当たらないのは、毎回が初めての作業だから。あなたのせいではない
  • ウォーターフォールとアジャイルは優劣ではなく、不確実性の量で選ぶ
  • スクラムの各会議には目的がある。特にデイリーは困りごとを出す場
  • 見積もりは外れる。問題なのは報告が遅れること
  • 30分詰まったら聞く。聞くのはチームのコストを下げる行為
  • 質問には「やろうとしたこと・起きたこと・試したこと・聞きたいこと」を添える
  • 新人にしか見えない問題がある。レトロで言っていい

公式ドキュメント

迷ったら一次情報に戻ってください。

対象リンク
スクラムガイド(日本語 PDF)https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf
アジャイルソフトウェア開発宣言https://agilemanifesto.org/iso/ja/manifesto.html
宣言の背後にある原則https://agilemanifesto.org/iso/ja/principles.html

章末問題

実装を始めて1時間、エラーの原因が分かりません。あなたはどうしますか。

「3日でできます」と見積もった作業が、Day 1 の時点で想定より複雑だと分かりました。正しい行動は?

レトロ(振り返り)で、あるメンバーの PR が大きすぎてレビューが滞った件を扱います。適切な書き方は?

ここまでで、チームで働くための土台が揃いました。

第2部の最後は、その中であなた自身がどう振る舞うか—— 信頼の作られ方、AI との付き合い方、障害時の動き方を扱います。

読み終わったら記録しておくと、目次で進み具合が分かります。