イベントモデリング

英語名 Event Modeling
読み方 イベント モデリング
難易度
所要時間 3〜6時間(ワークショップ形式)
提唱者 Adam Dymitruk(2019)
目次

ひとことで言うと
#

システムの振る舞いを時系列のイベントとして並べ、「誰が」「何をして」「何が起き」「何が見えるか」を1枚の図で設計する手法。エンジニアだけでなくビジネス側も一緒に参加でき、システムの全体像を全員が同じ解像度で共有できる。Adam Dymitrukが2019年に提唱した。

押さえておきたい用語
#

押さえておきたい用語
イベント(Event)
システム内で起きた事実の記録。「注文が作成された」「支払いが完了した」のように過去形で表現する。イベントは不変(イミュータブル)で、後から変更しない。
コマンド(Command)
ユーザーやシステムがイベントを発生させるために行うアクション(意図)。「注文する」「支払う」のように命令形で表現する。
リードモデル(Read Model / View)
イベントから組み立てた表示用のデータ。UIの画面やAPIレスポンスに対応する。「注文一覧画面」「ダッシュボード」など。
スイムレーン(Swimlane)
イベントモデル図の横方向の行。ユーザー操作・コマンド・イベント・リードモデルをそれぞれ別のレーンに配置する。
ブループリントタイムライン(Blueprint Timeline)
全イベントを左から右に時系列で並べた図全体のこと。システムの全ライフサイクルを1枚で俯瞰できる。

イベントモデリングの全体像
#

イベントモデリング:4つのスイムレーンで振る舞いを設計する
イベントモデリングの4レーン構造時間の流れ →UI/画面コマンドイベントリードモデル商品一覧画面商品詳細画面カート追加ボタンカートに追加商品がカートに追加された決済画面注文する注文が作成された注文履歴画面ステータス表示支払いが完了した領収書画面PDF生成カート画面数量・合計表示
イベントモデリングの進め方フロー
1
イベントを時系列で並べる
システムで起きる事実を付箋で洗い出す
2
UI/コマンドを紐づける
各イベントを引き起こすアクションと画面を追加
3
リードモデルを設計
イベントから何が見えるか(画面・API)を定義
実装スライスに分割
タイムラインを縦に切りイテレーション単位に

こんな悩みに効く
#

  • 要件定義書はあるが、エンジニアとビジネス側でシステムの理解が食い違う
  • マイクロサービスの分割境界がわからない
  • イベント駆動アーキテクチャを導入したいが、どう設計すればいいかわからない
  • ウォーターフォール的な要件定義で見落としが多く、開発後半で手戻りが頻発する

基本の使い方
#

イベントを時系列で洗い出す(Event Brainstorming)

システムで発生するすべてのイベントをオレンジ色の付箋に書き、時系列で左から右に並べる。

  • イベントは過去形で書く(「注文が作成された」「在庫が減った」)
  • 最初は順番を気にせずブレインストーミングで出し、後から並べ替える
  • ビジネス側のメンバーにも参加してもらう(「何が起きるか」はビジネスが一番知っている)
  • この段階では網羅性より発散を重視する。漏れは後のステップで補完できる
コマンドとUIを紐づける

各イベントを引き起こす「アクション(コマンド)」と「画面(UI)」を追加する。

  • コマンド(青い付箋): 「注文する」「支払う」のように命令形で書く
  • UI(白い付箋): コマンドが実行される画面やフォームをスケッチまたはキャプション
  • コマンドとイベントの間にはビジネスルールがある(「在庫があれば注文が作成される」)
  • 自動化されたプロセス(バッチ、スケジューラー)もコマンドとして記載する
リードモデルを設計する

イベントから組み立てられる「表示データ」を定義する。

  • 各イベントの下にリードモデル(緑の付箋)を配置
  • 「このイベントが発生した結果、ユーザーに何が見えるか」を考える
  • ダッシュボード、一覧画面、詳細画面、通知メールなどが該当
  • リードモデルの設計はCQRS(コマンドクエリ責務分離)の「クエリ側」に直結する
実装スライスに分割する

タイムラインを縦に切り、イテレーション単位の開発タスクに変換する。

  • 1スライス = 「コマンド → イベント → リードモデル」の1セット
  • 各スライスが独立してデプロイ・テスト可能であることを確認
  • 依存関係の少ないスライスから着手し、段階的にシステムを組み上げる
  • スライスごとに受入テスト条件を定義する(「このイベントが発生したら、この画面にこう表示される」)

具体例
#

例1:予約管理システムの全体設計を1日で完了

美容室チェーン(30店舗)向けの予約管理システム開発プロジェクト。従来のウォーターフォールで要件定義書を作成した前回のプロジェクトでは、開発後半に「想定していなかった業務フロー」が8件見つかり、2か月の遅延が発生していた。

ワークショップの実施: 参加者: エンジニア4名、PM1名、美容室のオーナー1名、店長2名

Step 1 — イベント洗い出し(2時間): オレンジ付箋で67個のイベントを書き出した。「予約が作成された」「施術が開始された」「会計が完了した」など。美容室オーナーから「指名変更が発生した」「当日キャンセルが発生した」など、エンジニアだけでは思いつかないイベントが14個出た。

Step 2 — コマンドとUI(1.5時間): 各イベントにコマンドとUI画面を紐づけた。「予約する」→「予約が作成された」→「予約確認画面」のように。

Step 3 — リードモデル(1時間): 「本日の予約一覧」「スタイリスト別スケジュール」「月次売上ダッシュボード」など12個のリードモデルを定義。

Step 4 — スライス分割: 67イベントを8スライスに分割し、2週間スプリントで順次開発。

結果:

  • 要件の見落としは0件(前回は8件)
  • 開発期間は当初見積もりの**85%**で完了
  • 美容室オーナーから「自分の業務がそのまま図になっているので、完成形が想像できた」というフィードバック
例2:ECのマイクロサービス分割境界をイベントモデルで決定

モノリスECサイト(月間注文8万件)のマイクロサービス移行。DDDのバウンデッドコンテキストで分割しようとしたが、チーム間で境界の認識が合わず、3か月間設計が確定しなかった。

イベントモデリングで解決: タイムラインに全イベントを並べた結果、自然なクラスタが見えてきた。

クラスタ主なイベント独立性
商品カタログ商品が登録された、価格が更新された高(他に依存なし)
カート商品がカートに追加された、数量が変更された中(商品情報を参照)
注文注文が作成された、注文がキャンセルされた中(カート・在庫を参照)
決済支払いが完了した、返金が実行された高(注文IDのみ参照)
在庫在庫が引き当てられた、入荷が登録された高(商品IDのみ参照)
配送出荷指示が作成された、配達が完了した高(注文IDのみ参照)

イベントの流れを見ると、クラスタ間の依存は「IDの参照のみ」で済むケースがほとんどだった。これをそのままマイクロサービスの境界にした。

成果:

  • 3か月停滞していた設計が2日で確定
  • サービス間はイベントバス(Kafka)で非同期連携する設計に
  • 各チームが独立してデプロイ可能な構成を実現
  • 移行開始から6か月で、最初の3サービス(商品カタログ・決済・配送)の分離が完了
例3:保険請求システムの要件をビジネス側と共同で設計

損害保険会社のデジタル化プロジェクト。紙ベースの保険金請求フローをシステム化する要件定義に4か月かけたが、開発着手後に「査定の分岐条件が足りない」「書類差し戻しのフローが抜けている」が次々に判明し、手戻りコストが**全体の35%**を占めていた。

イベントモデリングワークショップ: 参加者: エンジニア3名、査定担当者2名、コールセンター担当1名、PM1名

3時間のワークショップで洗い出したイベント:

  • 請求フロー: 「請求が受付された」→「書類が確認された」→「書類不備が検出された」→「差し戻しが通知された」→「書類が再提出された」→「査定が開始された」→「追加調査が必要と判定された」→ …
  • 合計43イベント18コマンド9リードモデル

査定担当者から出た重要な洞察:

  • 「書類不備の差し戻しは全件の**32%**で発生するので、システム上は例外ではなくメインフロー」
  • 「査定の自動承認ルール(10万円以下は自動)が要件書に含まれていなかった」

これらは従来の要件定義書では4か月かけても拾えなかった情報だった。

スライス分割: 43イベントを6スライスに分割。第1スライス(請求受付→書類確認→査定)を最初の2スプリントで開発し、査定担当者にデモ。「これで十分使える」という確認を得てから残りのスライスに着手。

最終的に手戻りコストは前回の**35%→8%に減少。開発期間も当初見積もりの90%**で完了した。

やりがちな失敗パターン
#

  1. エンジニアだけでワークショップをやる — イベントモデリングの最大の価値は、ビジネス側の知識をシステム設計に直接反映すること。ドメインエキスパートの参加なしでは、従来の設計手法と変わらない
  2. 最初から完璧を目指す — 最初のワークショップで全イベントを網羅しようとすると疲弊する。80%の精度で十分。残りは開発中に発見して追加する
  3. イベントとコマンドを混同する — 「注文する」はコマンド、「注文が作成された」がイベント。イベントは起きた事実であり、失敗もありうる。この区別が曖昧だとシステムのエラーハンドリングが設計から漏れる
  4. モデルを作って放置する — イベントモデルはシステムの「生きた設計図」。開発が進むにつれて新しいイベントやリードモデルが出てくるので、スプリントごとに更新する

まとめ
#

イベントモデリングは、システムの振る舞いを「時系列のイベント」として並べ、コマンド・イベント・リードモデルの4レーンで設計する手法。ビジネス側とエンジニアが同じ図を見て議論できるため、要件の見落としが大幅に減る。タイムラインを縦に切れば実装スライスになるため、設計がそのまま開発計画に変わる。イベント駆動アーキテクチャやCQRSの導入にも直結する、実用性の高い設計手法である。