イベントストーミングとは
イベントストーミング(Event Storming)は、イタリアのソフトウェア設計者Alberto Brandoliniが2013年に考案したワークショップ手法です。 大量の付箋を使い、ドメインイベントを起点にビジネスプロセスを可視化するという、シンプルかつ強力なアプローチです。
従来のモデリング手法(UML図、ER図など)が技術者中心になりがちだったのに対し、 イベントストーミングはドメインエキスパートと開発者が同じ場で協働することを前提に設計されています。 特別なツールや記法の知識は不要で、「ビジネスで何が起きるか」という共通の問いから始められます。
付箋の色分けルール
イベントストーミングでは、付箋の色によって要素の種類を区別します。 この標準化されたカラーコードにより、誰もが一目で構造を把握できます。
| 色 | 要素 | 説明 | 例 |
|---|---|---|---|
| オレンジ | ドメインイベント | ビジネスで起きた事実(過去形で記述) | 注文が確定された、支払いが完了した |
| 青 | コマンド | イベントを引き起こすアクション | 注文を確定する、支払いを処理する |
| 黄色 | 集約 / ポリシー | 集約(コマンドの受け手)またはビジネスルール | 注文、支払いポリシー |
| ピンク / 紫 | 外部システム | 自分たちが制御できないシステム | 決済ゲートウェイ、メール配信サービス |
| 赤 | ホットスポット | 疑問点・矛盾・未解決の課題 | 同時在庫引当の競合、返品ルールが不明 |
| 緑(小) | リードモデル | アクターが判断に使う情報 | 在庫一覧画面、注文履歴 |
| 黄色(小) | アクター / ユーザー | コマンドを実行する人またはシステム | 顧客、管理者、定期バッチ |
3つのレベル — 俯瞰から実装へ
イベントストーミングは3つのレベルに分かれています。 各レベルは独立して実施でき、段階的に詳細度を上げていきます。
graph LR BP[Big Picture\n全体俯瞰] --> PL[Process Level\nプロセス詳細化] --> DL[Design Level\n実装設計] BP ---|参加者: 10〜20名\n所要: 2〜4時間| BP PL ---|参加者: 5〜10名\n所要: 2〜3時間| PL DL ---|参加者: 3〜6名\n所要: 2〜4時間| DL style BP fill:#f97316,stroke:#ea580c,color:#fff style PL fill:#3b82f6,stroke:#1d4ed8,color:#fff style DL fill:#8b5cf6,stroke:#6d28d9,color:#fff
レベル1: Big Picture — ビジネスドメイン全体の俯瞰
Big Pictureは、ビジネスドメイン全体を俯瞰するための最初のレベルです。 10〜20名の多様な参加者(開発者、ドメインエキスパート、プロダクトオーナー、デザイナー等)が集まり、 ビジネスで「何が起きるか」をオレンジの付箋に書き出します。
Big Pictureの進め方
- Chaotic Exploration(カオスな探索): 参加者全員が思いつくドメインイベントをオレンジの付箋に書き、壁に貼る。順番は気にしない。「重複OK、批判禁止」がルール
- Timeline(時系列の整理): 貼り出したイベントを左から右へ時系列順に並べ替える。ここで矛盾や重複に気づく
- Pivotal Events(重要イベントの特定): ビジネスフェーズの区切りとなるイベントに印を付ける(例: 「注文が確定された」はフェーズの転換点)
- Swimlanes(スイムレーン分割): 関連イベントをグループ化し、Bounded Contextの候補を見つける
- Hot Spots(ホットスポットの記録): 議論が白熱した箇所、意見が分かれた箇所に赤い付箋を貼る
レベル2: Process Level — 特定プロセスの詳細化
Process Levelでは、Big Pictureで特定したプロセスのうち重要なものを選び、詳細化します。 参加者は5〜10名に絞り、当該プロセスに詳しいドメインエキスパートを必ず含めます。
Big Pictureではオレンジの付箋(イベント)のみでしたが、Process Levelでは以下の要素を追加します。
- コマンド(青): イベントを引き起こすアクション
- アクター(黄色・小): コマンドを実行する人またはシステム
- ポリシー(黄色・大): あるイベントに反応して自動的に実行されるビジネスルール
- リードモデル(緑): アクターが判断に使う情報・画面
- 外部システム(ピンク): 自分たちが制御できないシステム
sequenceDiagram participant A as アクター\n(顧客) participant RM as リードモデル\n(商品カタログ画面) participant CMD as コマンド\n(カートに追加する) participant AGG as 集約\n(ショッピングカート) participant EVT as ドメインイベント\n(商品がカートに追加された) participant POL as ポリシー\n(在庫確認ポリシー) participant EXT as 外部システム\n(在庫管理) A->>RM: 商品を閲覧 A->>CMD: カートに追加 CMD->>AGG: 処理 AGG->>EVT: 発行 EVT->>POL: トリガー POL->>EXT: 在庫確認
レベル3: Design Level — 実装可能なモデル設計
Design Levelは、Process Levelの成果物をもとに実装可能なモデルを設計する段階です。 参加者は3〜6名の開発者中心のチームで、ドメインエキスパートも参加します。
このレベルでは以下を明確にします。
- 集約(Aggregate)の境界: どのコマンドとイベントが同じ集約に属するか
- 集約のビジネスルール: コマンドを受け付ける条件(不変条件)
- 集約間の連携: イベントとポリシーによる結果整合性の設計
Design Levelからコードへの変換
Design Levelの成果物は、そのままコードに変換できる構造になっています。 付箋の色と配置がそのままコードの構造に対応します。
| 付箋 | コード上の対応 |
|---|---|
| 黄色(集約) | クラス / モジュール(Aggregate Root) |
| 青(コマンド) | 集約のパブリックメソッド / ユースケース |
| オレンジ(イベント) | ドメインイベントクラス |
| 黄色(ポリシー) | イベントハンドラ / サガ |
| 赤(ホットスポット) | TODOコメント / 設計要検討箇所 |
// Design Levelの付箋からコードへの変換例
// 黄色の付箋 → 集約
class Order {
private status: OrderStatus;
private items: OrderItem[];
private events: DomainEvent[] = [];
// 青の付箋 → コマンド(パブリックメソッド)
confirm(): void {
// 赤の付箋で特定したビジネスルール
if (this.items.length === 0) {
throw new Error('商品がない注文は確定できません');
}
if (this.status !== OrderStatus.DRAFT) {
throw new Error('下書き状態の注文のみ確定できます');
}
this.status = OrderStatus.CONFIRMED;
// オレンジの付箋 → ドメインイベント
this.events.push(new OrderConfirmed({
orderId: this.id,
confirmedAt: new Date(),
totalAmount: this.calculateTotal(),
}));
}
}
// 黄色の付箋(ポリシー)→ イベントハンドラ
class InventoryReservationPolicy {
// 「注文が確定されたら在庫を引き当てる」というポリシー
handle(event: OrderConfirmed): void {
this.inventoryService.reserve(
event.orderId,
event.items
);
}
} リモートイベントストーミング
COVID-19以降、リモートでのイベントストーミング実施が増えました。 MiroやMuralなどのオンラインホワイトボードツールが主に使われます。
ただし、Brandolini自身はリモート実施の制約を指摘しています。
リモート実施の対処法
- 参加人数を減らす: 対面の半分(5〜8名)が目安。10名を超えると議論が分散する
- 時間を短くする: 90分を上限とし、複数回に分けて実施する
- ブレイクアウトルームを活用: 3〜4名のグループで並行して探索し、全体で統合する
- テンプレートを用意する: Miro上に付箋の色分けガイドとエリアを事前に配置する
- ファシリテーターを2名配置: 1名がMiro操作、1名が議論をリードする
- 明確なタイムボックス: 各フェーズに時間制限を設け、テンポよく進める
失敗パターンと対処法
イベントストーミングは手法としてはシンプルですが、ファシリテーションの質によって成果が大きく変わります。 ここでは、よくある失敗パターンとその対処法を整理します。
| 失敗パターン | 症状 | 対処法 |
|---|---|---|
| 技術者だけで実施 | CRUDイベントばかり出る(作成された、更新された、削除された) | ドメインエキスパートを必ず参加させる。ビジネス用語でイベントを記述する |
| 集約の命名を急ぐ | コマンド・イベントが出揃う前に集約名を決め、それに引きずられる | Design Levelまで集約名は仮置き。まずコマンドとイベントのペアを明確にする |
| 完璧を求めすぎる | イベントの粒度に議論が集中し、全体像が見えない | Big Pictureは粗くてよい。詳細化はProcess Level以降で行う |
| ファシリテーター不在 | 声の大きい人が議論を支配し、サイロ化する | 中立的なファシリテーターを配置し、全員が発言できるよう促す |
| 付箋だけ残して放置 | ワークショップ後にアクションが取られない | 終了時にNext Actionを決定。写真撮影 → デジタル化 → バックログへ変換 |
| 1回で全部やろうとする | 疲労で後半の品質が低下する | 2〜3時間で区切り、複数回に分けて実施する |
実践的なファシリテーションのコツ
事前準備
- 壁を確保する: 最低8メートルの壁面が必要。会議室のホワイトボードでは狭い
- 付箋は大量に用意する: 1セッションで200〜300枚は消費する
- 太いマーカーのみ使用する: 細いペンで書くと遠くから読めない。1枚に1〜3語が理想
- 参加者への事前説明は最小限: 「イベント=ビジネスで起きたこと」だけ伝えれば十分
ワークショップ中のポイント
- 最初の10分は沈黙を許容する: 全員が書き始めるまで待つ。ファシリテーターが最初の例を1つだけ示すのは有効
- 「それは正しいか?」ではなく「他に何があるか?」: 評価ではなく探索にフォーカスする
- ホットスポットを歓迎する: 意見の対立は宝の山。赤い付箋を積極的に貼る
- 技術用語を避ける: 「APIが呼ばれた」ではなく「注文が確定された」というビジネスの言葉を使う
graph TB
subgraph BP[Big Picture]
E1[商品が出品された] --> E2[注文が作成された] --> E3[支払いが完了した] --> E4[商品が発送された] --> E5[商品が届けられた]
E3 --> HS1[🔴 在庫切れ時の\n対応が不明]
end
subgraph PL[Process Level - 注文プロセス]
A1[顧客] --> C1[注文を確定する]
C1 --> AG1[注文集約]
AG1 --> EV1[注文が確定された]
EV1 --> POL1[在庫引当ポリシー]
POL1 --> EXT1[在庫管理]
end
subgraph DL[Design Level]
AGG[注文\n集約ルート] --> CMD1[確定する]
AGG --> CMD2[キャンセルする]
CMD1 --> EVT1[注文確定イベント]
CMD2 --> EVT2[注文キャンセルイベント]
AGG --> RULE[不変条件:\n商品が1つ以上\nステータスがDRAFT]
end
BP --> PL --> DL
style BP fill:#1e1e2e,stroke:#f97316,color:#fff
style PL fill:#1e1e2e,stroke:#3b82f6,color:#fff
style DL fill:#1e1e2e,stroke:#8b5cf6,color:#fff
style HS1 fill:#ef4444,stroke:#dc2626,color:#fff
style AGG fill:#8b5cf6,stroke:#6d28d9,color:#fff
style RULE fill:#f59e0b,stroke:#d97706,color:#000理解度チェック
イベントストーミングでオレンジの付箋が表す要素は何ですか?
キーボード: 1〜4 で選択、Enter で回答