「ユーザーストーリーがエッジケースを見落としているため却下された。」「開発者は BA と異なる解釈をしました。」「QA はテスト合格だと言ったが、ビジネスは間違っていると言った。」これらを聞いたことがあれば、根本原因は通常ユーザーストーリーと受け入れ基準が十分に明確に書かれていないことです。
このガイドは実践的です。理論的ではありません。
1. ユーザーストーリーとは(そして何ではないか)
ユーザーストーリーはユーザーの視点から要件を表現する方法です:
として [ユーザータイプ]、私は望む [アクション/目標]、そのため [理由/価値]。
良い例:
小売顧客として、過去 12 ヶ月間のトランザクション履歴を表示できます、特定の月の支出を検証する必要があるためです。
ユーザーストーリーはではありません:
- 技術的タスク(「トランザクション履歴を取得する API エンドポイントを作成する」)
- 詳細な仕様(「システムは 100 レコードを返す必要があります...」)
- 機能リスト(「トランザクション履歴表示機能」)
2. INVEST を使用してストーリー品質をチェック
| 基準 | 意味 | チェック |
|---|---|---|
| Independent | ストーリーは独立して提供可能 | 「このストーリーは別のストーリーに依存していますか?」 |
| Negotiable | 詳細は交渉可能 | 「BA と開発者はスコープ変更について議論できますか?」 |
| Valuable | 明確な価値を提供 | 「ビジネスはなぜこれが必要なのかを説明できますか?」 |
| Estimable | 開発者が見積もり可能 | 「開発者はこれを見積もるのに十分な情報を持っていますか?」 |
| Small | 1 スプリントに適合 | 「1~3 日で完了できますか?」 |
| Testable | 結果を検証可能 | 「QA はどのように合格/不合格をテストするかを知っていますか?」 |
INVEST に失敗するストーリーは通常:
- あまりに大きい → より小さいストーリーに分割する
- テスト不可能 → 受け入れ基準が不足している
- 価値がない → 「そのため」句に本当の価値がない
3. 受け入れ基準:Given/When/Then 形式
受け入れ基準(AC)は、ストーリーが「完了」として受け入れられるための条件です。BDD を使用した形式:
前提条件 [コンテキスト/前提条件]
時に [ユーザーが実行するアクション]
その後 [期待される結果]
実例 — ストーリー:トランザクション履歴を表示
シナリオ 1:正しく表示
前提条件 過去 12 ヶ月間に少なくとも 1 つのトランザクションがあるアカウントでログインしている
時に メニューから「トランザクション履歴」をクリック
その後 最新 50 のトランザクションを表示、最新順にソート
シナリオ 2:トランザクションなしのアカウント
前提条件 新しいアカウントでログイン、トランザクションなし
時に 「トランザクション履歴」をクリック
その後 空のリストの代わりに「トランザクションなし」メッセージを表示
シナリオ 3:ネットワークエラー
前提条件 ログインしている
時に 「トランザクション履歴」を開いているがインターネット接続を失った
その後 エラーメッセージ「データを読み込めません。もう一度お試しください。」を表示
「再試行」ボタンを表示
4. AI を使用してエッジケースを検出
ここで AI は本当に役立ちます。ストーリー + AC をプロンプトに貼り付けます:
ここにユーザーストーリーと受け入れ基準があります:
[PASTE STORY + AC]
分析して、リストアップしてください:
1. カバーされていないエッジケース(特殊なケース、異常な入力)
2. 暗黙の非機能要件(パフォーマンス、セキュリティ、アクセシビリティ)
3. AC の不足しているエラーシナリオ
4. 現在の AC の曖昧さや矛盾
5. 追加の影響を受けるアクター?
AI は通常、以下を検出します:
- データが大きい場合のページネーション
- タイムゾーンのエッジケース
- 同時ユーザーシナリオ
- 権限のエッジケース(管理者対ユーザー対ゲスト)
- 空/null 状態
- 非常に長い入力文字列
- 特殊文字
5. AI 機能用の AC:何が追加されるか
ストーリーが AI を含む場合、これを追加します:
# AI 機能に固有の AC
シナリオ:AI が不確実
前提条件 ユーザーが曖昧な質問をする
時に AI 信頼度スコア < 0.7
その後 AI は必ず:
- 情報を作り上げない
- 明確化質問をするか、または
- 完全なコンテキストで人間のエージェントにルーティング
シナリオ:AI 出力が閾値以下
前提条件 AI がレスポンスを生成
時に 毒性スコア > 0.3(安全フィルターによる)
その後 レスポンスが自動的にブロック
インシデントが監査システムにログ
6. 準備完了の定義(DoR)
ストーリーはスプリント開始準備ができているとき:
準備完了の定義
☐ ストーリーが「~として...望む...そのため...」形式である
☐ 「そのため」は本当のビジネス価値で、単なる機能説明ではない
☐ Given/When/Then 形式の AC が少なくとも 3 つある
☐ AC は少なくとも 1 つのハッピーパス + 1 つのエラーパスをカバー
☐ ストーリーが INVEST チェックを通過する
☐ 依存関係が特定されている
☐ ストーリーサイズ ≤ 5 ストーリーポイント(Fibonacci を使用する場合)
☐ UI ワイヤーフレームまたはモックアップが添付されている(該当する場合)
☐ すべての関連ステークホルダーがレビュー済み
7. 一般的な BA の誤り
誤り 1:弱い「そのため」
- ❌ 「...そのため、システムがトランザクションリストを表示する」
- ✅ 「...そのため、月次調整前に支出を確認できる」
誤り 2:AC が UI で書かれ、動作ではない
- ❌ 「ボタン『もっと見る』はリスト下部に緑色で表示」
- ✅ 「ユーザーが下部にスクロールすると、システムが次の 20 レコードを自動ロード」
誤り 3:エラーシナリオがない
- 各ストーリーにはエラー/データなしのケース用に少なくとも 1 つの AC が必要
誤り 4:受け入れ基準 = 実装の詳細
- ❌ 「API は 200ms 以内に応答する必要がある」
- ✅ 「4G ネットワークで 2 秒以内にページロード」→ 開発者が API タイムアウトを決定
まとめ
良いユーザーストーリー = 正しいユーザー視点 + 明確な価値 + テスト可能な AC。
提案されたワークフロー:
- As/I want/So that テンプレートを使用してストーリーを作成
- INVEST をチェック、必要に応じて分割
- Given/When/Then で ≥3 AC を作成(ハッピー + エラー)
- AI に貼り付けて、不足しているエッジケースを検出
- スプリントバックログに追加する前にステークホルダーがレビュー
