AIエージェントと一緒にイベントストーミングをはじめよう！

## この記事は何？

**ドメイン駆動設計**を題材とした書籍「ドメイン駆動設計をはじめよう」を読みました。
非常におもしろく有用な内容なのでぜひみなさんにもおすすめです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/61e76bc2-699c-2916-9750-72c573250fad.png)
[amazon](https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86-%E2%80%95%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E5%AE%9F%E8%A3%85%E3%81%A8%E4%BA%8B%E6%A5%AD%E6%88%A6%E7%95%A5%E3%82%92%E7%B5%90%E3%81%B3%E3%81%A4%E3%81%91%E3%82%8B%E5%AE%9F%E8%B7%B5%E6%8A%80%E6%B3%95-Vlad-Khononov/dp/481440073X/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp&crid=3NG3TW69NWXB7&amp&dib=eyJ2IjoiMSJ9.QkkTe8iPwp7x_lRszhhMSkeoxhiUlIWWVpiiLXpqVouU2_RR3bB8SExSHPxgpZPLZ-VfFn_BCibRVrQM0CmuzmFEM4b1u-Rj9XL7U6Qeno4osQn7wsQLngKiiGul935gY3ICbHfQaurCcbp0ezeduOyx9G11EI2Y-ix70Ucomr4762tUsTaoxJb3TW_Sh-l1R47gGV85v5ZjOZ1fuCqcOAU4VwP0tbWBj5IZteLlYmlnT-6H4q5kjmuxGjrCsmNEp5dpBJN2lMHLQDoodnvtVIqC4ArRkaZzcUQ-eP_48FM.aMSHbxOAFdvMOkD1vg6RhJo4L8J_tk5qZW9PcQBATiU&amp&dib_tag=se&amp&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86&amp&qid=1726624519&amp&sprefix=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86%2Caps%2C219&amp&sr=8-1)

この記事では全部の内容を紹介するのは不可能なので、**第12章のイベントストーミング**に絞って紹介をしたいと思います。

要約を記載するだけでなく、**AIエージェント型のVSCode拡張機能「Cline」** と一緒にイベントストーミングをやってみたので、その内容を紹介します！


## なぜいまドメイン駆動設計か？

なぜ「**ドメイン駆動設計**」をテーマとしたのか？ これはまさに**withAI時代に必須の学び**だと考えたからです。

みなさんが体感しているように、コーディングなどの定型作業はAIに取って代わられる可能性が高いと思います。 その中で、我々が顧客に価値を届けるために必要なものは、**ドメイン知識、および、それをどのようにシステムに落とし込むかというスキル**です。

## イベントストーミングとは？

イベントストーミングは、グループでビジネスプロセスをブレインストーミングし、迅速にモデル化するためのローテクな活動です。
ある意味で、イベントストーミングはビジネスドメインの知識を共有するための実践的なツールと言えます。

### イベントストーミングのステップ

#### Step1 : 発散的に探索する

イベントストーミングは探求する業務領域に関する**業務イベント**のブレインストーミングから始まります。
業務イベントは業務活動で起きた興味深い出来事（過去形で表現する）です。
![fig12-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/92317f59-ff31-37d7-1e8b-361289e37c61.png)

#### Step2 : 時系列に並べる

Step1で洗い出した業務イベントを確認し、時系列に並べます。
まず、「正常系のシナリオ」のフローからはじめてください。

正常系が完了したら「代替シナリオ」を追加します。
エラーが発生するシナリオ、異なる意思決定が行われるシナリオです。
![fig12-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/791dbd29-f021-53b9-c1cb-9fe0b34423ea.png)

#### Step3 : 問題点を洗い出す

プロセス全体の中で注意が必要な点を特定します。
- ボトルネックになっている箇所
- 自動化できていない作業
- 文書化できていないものや業務知識が不足しているところ

![fig12-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/39dfc36b-1268-604b-40fc-e331872c3981.png)

#### Step4 : 転換イベントを見つける

文脈やフェーズの変化を示す重要な業務イベントを探します。
これらのイベントを「転換イベント」(pivotal event)と呼びます。

たとえば、「ショッピングカートが初期化された」「注文処理が開始された」「注文が出荷された」「注文が配達された」「注文が返品された」などは、注文処理プロセスの重要な変化を表します。
![fig12-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/2fb4f2e6-46c5-ffee-535b-32e72a253145.png)

#### Step5 : コマンドを見つける

業務イベントは、すでに起こったことを説明します。
それに対して「コマンド」は、イベントあるいはイベントのフローを引き起こすものを説明します。
何かを指示する形式で表現します。
- キャンペーンを公開する
- 処理を取り消す
- 注文を送信する
  
コマンドが生成するであろうイベントの前に貼り出します。

特定のアクターによって実行されるコマンドは、そのアクター情報を追記します。
![fig12-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/163779de-460a-1940-ba82-315dc68bfe3a.png)

#### Step6 : ポリシーを定義する

コマンドのほとんどは、特定のアクターに関連づけられていません。
このステップでは、これらのコマンドを実行すると想定される「自動化ポリシー」を探します。
自動化ポリシーとは、あるイベントがコマンドの実行を引き起こすシナリオです。

コマンドがなんらかの判定条件を満たした場合にのみ実行されるんら、その判定条件も明記します。
![fig12-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/eaf4d173-3238-ff3a-711b-9f4fca1b14e2.png)

#### Step7 : 読み取りモデルを見つける

読み取りモデルは、アクターが、コマンドを実行するかどうかを判断するために使う、対象領域の状態を表現するデータのビューです。
画面、レポート、通知などが該当します。

![fig12-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/d3c7dc60-fa83-4b31-b714-c3366a7d4d90.png)

#### Step8 : 外部システムを追加する

このステップでは、外部システムを追加してモデルを拡張します。
外部システムとは、探求している業務領域の外側に存在するシステムの表現です。

コマンドを実行したり、イベントに関する通知を受けたりする可能性があるものが該当します。

このステップが終わった段階で、全てのコマンドは、
- アクターによって実行されるか
- ポリシーによって発動されるか
- 外部システムによって呼び出されるか

のいずれかになっているはずです。

![fig12-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/b6b68b3a-c252-2438-926a-80dd16d831de.png)

#### Step9 : 集約を見つける

全てのイベントとコマンドを洗い出したら、関連する概念を集約として整理します。
集約はコマンドを受け取り、イベントを生成します。

![fig12-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/7e198346-e435-b9ad-7f6d-25bfa4471439.png)

#### Step10 : 区切られた文脈に分割する

イベントストーミングセクションの最後のステップとして、機能的に密接に関係していたり、自動化ポリシーを介して結合されていたりする集約を探します。
このような集約の集まりが、**区切られた文脈**の境界の自然な候補となります。
![fig12-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/a76eb77e-a248-c84c-aa07-09266445b04a.png)

## Clineとはじめるイベントストーミング！

Clineは、VSCode拡張機能型のAIエージェントです。
コーディングが得意タスクですが、今回試してみて上流工程の成果物作成にも結構使えると思いました。

### やりとりの様子

基本的には、チャットでやり取りしますが、思考を深めるための対話ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/3a1ed21f-d542-0700-02e0-0045c2beb568.png)


### 初期のプロンプト

長いので折りたたんであります。

<details><summary>とあるサービスの改善施策の承認フロー</summary>

```xml:prompt

<task>
今からイベントストーミングをデモンストレーションしてみたいと思います。

以下にイベントストーミングの手順（10個のステップ）を提示しますので、よく理解してください。

<イベントストーミングの手順>

## 12章　イベントストーミング

### イベントストーミングとは何か？

イベントストーミングは、グループでビジネスプロセスをブレインストーミングし、迅速にモデル化するためのローテクな活動です。ある意味で、イベントストーミングはビジネスドメインの知識を共有するための実践的なツールと言えます。
イベントストーミングセッションには「スコープ」があります：それは、グループが探求したいと考えるビジネスプロセスのことです。参加者は、タイムライン上に付箋紙で表されたドメインイベントの連続として、そのプロセスを探求していきます。ステップバイステップで、モデルはアクター、コマンド、外部システムなどの追加的な概念で強化され、最終的にそのすべての要素がビジネスプロセスの仕組みを物語るようになります。

### イベントストーミングのステップ

#### Step1 : 発散的に探索する

イベントストーミングは探求する業務領域に関する**業務イベント**のブレインストーミングから始まります。
業務イベントは業務活動で起きた興味深い出来事（過去形で表現する）です。

#### Step2 : 時系列に並べる

Step1で洗い出した業務イベントを確認し、時系列に並べます。
まず、「正常系のシナリオ」のフローからはじめてください。

正常系が完了したら「代替シナリオ」を追加します。
エラーが発生するシナリオ、異なる意思決定が行われるシナリオです。

#### Step3 : 問題点を洗い出す

プロセス全体の中で注意が必要な点を特定します。
- ボトルネックになっている箇所
- 自動化できていない作業
- 文書化できていないものや業務知識が不足しているところ

#### Step4 : 転換イベントを見つける

文脈やフェーズの変化を示す重要な業務イベントを探します。
これらのイベントを「転換イベント」(pivotal event)と呼びます。

たとえば、「ショッピングカートが初期化された」「注文処理が開始された」「注文が出荷された」「注文が配達された」「注文が返品された」などは、注文処理プロセスの重要な変化を表します。

#### Step5 : コマンドを見つける

業務イベントは、すでに起こったことを説明します。
それにたいして「コマンド」は、イベントあるいはイベントのフローを引き起こすものを説明します。
何かを指示する形式で表現します。
- キャンペーンを公開する
- 処理を取り消す
- 注文を送信する
  
コマンドが生成するであろうイベントの前に貼り出します。

特定のアクターによって実行されるコマンドは、そのアクター情報を追記します。

#### Step6 : ポリシーを定義する

コマンドのほとんどは、特定のアクターに関連づけられていません。
このステップでは、これらのコマンドを実行すると想定される「自動化ポリシー」を探します。
自動化ポリシーとは、あるイベントがコマンドの実行を引き起こすシナリオです。

コマンドがなんらかの判定条件を満たした場合にのみ実行されるんら、その判定条件も明記します。

#### Step7 : 読み取りモデルを見つける

読み取りモデルは、アクターが、コマンドを実行するかどうかを判断するために使う、対象領域の状態を表現するデータのビューです。
画面、レポート、通知などが該当します。

#### Step8 : 外部システムを追加する

このステップでは、外部システムを追加してモデルを拡張します。
外部システムとは、探求している業務領域の外側に存在するシステムの表現です。

コマンドを実行したり、イベントに関する通知を受けたりする可能性があるものが該当します。

このステップが終わった段階で、全てのコマンドは、
- アクターによって実行されるか
- ポリシーによって発動されるか
- 外部システムによって呼び出されるか

のいずれかになっているはずです。

#### Step9 : 集約を見つける

全てのイベントとコマンドを洗い出したら、関連する概念を集約として整理します。
集約はコマンドを受け取り、イベントを生成します。

#### Step10 : 区切られた文脈に分割する

イベントストーミングセクションの最後のステップとして、機能的に密接に関係していたり、自動化ポリシーを介して結合されていたりする集約を探します。
このような集約の集まりが、**区切られた文脈**の境界の自然な候補となります。

</イベントストーミングの手順>

<指示事項>
この手順を用いて、以下のような業務に関し、イベントストーミングの手順に沿って分析を行い、業務フローを出力してください。
まずはStep1からお願いします。
</指示事項>

<対象業務>
とある会員制のストリーミングサービスでは会員を増やし、かつより単価の高いプレミアム会員への移行を促進するために色々な改善施策を行っています。

改善施策は、ビジネスオーナーが発案したり、協業先（代理店）から提案されたりします。

改善施策は、その実行可能性や費用対効果、法令への遵守度、アプリの利用規約への適合度などを検討し、実施するかどうかを決定します。
実施するかどうかについては、リスクや投入する費用に応じて、ビジネスオーナーの判断で実行される場合もあれば、より上位の組織による承認が必要な場合もあります。
いずれの場合にも、実行の承認、条件付き承認、却下などの結果が発生します。

なお、同社はコンプライアンスを重視しており、利用規約の改定の可能性がある場合には、法務部に相談します。
利用規約改定が必要と認められた場合には、利用規約の改定と会員からの改めて同意を得る必要があります。

実行の承認が得られた場合には、開発チームに要件定義が引き渡され、開発チームは要件定義をもとに実装を行います。

条件付き承認の場合には、条件をクリアするべく再度フィージビリティースタディが行われ、その結果がビジネスオーナーに報告されます。
この結果実行がの承認が得られる場合もありますが、却下される場合もあります。

開発チームが要件定義を元に、設計を行い、実装が完了したならば、ビジネスオーナーによるリリース判定が行われます。
リリース判定の結果についても、承認、条件付き承認、却下のいずれかが発生します。
現実的には、却下されることはほとんどなく、条件付き承認やリリースの延期という形になります。

最後に、改善施策については、意図通りの効果が得られたかどうかを評価し、今後の施策に活かすためのフィードバックを行います。

例外的に、外部システムやインフラストラクチャーの更改にともなって、開発作業が発生する場合もあります。

</対象業務>
</task>
```
</details>

## Clineと作った成果物！

### 概略フローを提示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/f4d50f52-a5fe-30e6-4bfd-68896e0e7321.png)


### 詳細フロー
かなり長いので、[GitHub](https://github.com/tis-abe-akira/event-storming/blob/7a71c410f1e57ebabd947c88caea1a1581576095/business-flow.md)を見てください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130262/4181a19d-bf5e-db15-9973-b644fd680f39.png)


## まとめ

書籍にあるように、イベントストーミングは本来、できればアナログなやり方で対面実施するのが良いと思います。
しかし、現実問題としてロケーションが離れている場合など、デジタルを使ってやらざるを得ない場合が多いと思います。

その際には、デジタルのホワイトボードなどでフローを描画する方法もありますが、AIエージェントとの対話を通じて思考を深めていくのも有効であると思いました。

### 有効な点

- 言語化の過程で**同じ言葉（ユビキタス言語）** を使うようになる
- 議論（AIエージェントとのやりとり）のログをエクスポートできるためトレーサビリティーが高い
- 成果物がMarkdownやMermeid形式で残るためそこから関連文書やコードの自動生成に繋げやすい

### 気をつけないといけない点

- 本来の方式に比べると発散が不十分になり、例外的なフローや改善の機会を見失うリスクがある
- ドメインエキスパートが生成AIに慣れていないと積極的な参加が得られない可能性がある

今後のwithAI時代の開発に向けて少しでも参考になれば幸いです。


## おまけ

今年は、アドベントカレンダーの記事を3本書くことになりました。
過去の2本の記事も紹介しておきます。

[12/5分：AIエージェントモデラー現る！](https://qiita.com/akiraabe/items/b25bcd47978f90319aaf)
[12/7分：VSCode拡張型AIエージェントClineがヤバイ！](https://qiita.com/akiraabe/items/27d89769e86ca7b6e2e8)