最近の海外DDDセミナーを聞いてみたら色々と常識が破壊された

## TL;DR
- 最近の設計志向はイベント駆動がかなり中心になっている
    - とくにDDD界隈がここまでイベント駆動一本槍だとは思わなかった
    - ストーリーを出発点にイベント駆動で設計を組み立てる「イベントストーミング」がかなり多くの場所で事例として取り上げられている

## はじめに
最近、洋書や動画の講演資料などいくつか海外の情報源に当たることがおおくなり、その中で「結構日本でやられている取り組みとちがうなー」と考えることが多く、一旦そのあたりの差分をまとめておこうかと思いました。

ただの出羽守（あるいは[鹿鳴館精神](https://note.com/kenhori2/n/nb457295a416b)）ではなく、一つの潮流としてこんなのがあるってのを記述できればなと思います

## イベントが設計の基本線となりつつある、、、のか？
まず1つ目に驚いたのが、イベントが設計の中心になっている、そう感じる機会が多かったこと。

ここで言うイベントは、実践ドメイン駆動設計の中でも「ドメインイベント」として実装パターンの中に入れられています。

<a href="https://www.amazon.co.jp/dp/B00UX9VJGW?_encoding=UTF8&btkr=1&linkCode=li2&tag=posaunehm-22&linkId=32974afa7dbdeb3a66d3d1111c5328b1&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B00UX9VJGW&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=posaunehm-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=posaunehm-22&language=ja_JP&l=li2&o=9&a=B00UX9VJGW" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

このドメインイベント自体は、実践ドメイン駆動設計の序文の中でもEvansが以下のように述べています。

> いまやDDDのメインストリームに躍り出つつあるドメインイベント

この感覚、日本だと「あ、たしかにPub/Subモデルとか設計の取り入れられているよねー」くらいの受け取り方じゃないかとおもうんですが、ここがもう根本的に捉え違えているのかなというふうに感じています。

端的に言うと、~~クラス~~サービスやエンティティ間の呼び出しは基本的にすべてイベントを利用して実行すべきである、というのが一つの潮流としてあるのです。メソッド呼び出しという「叙述的」な記述を廃して、Pub/Subの仕組みを中心とした「これが発生したときにこれを行う」という「宣言的」な記法の方が依存関係をうまく整理できる、と。

結構衝撃を受けたのが下記のような一見当たり前の呼び出しが、「叙述的で避けるべき」記法として紹介されたことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447106/98b65c74-9f38-51a4-457a-e83235667bca.png)

つまり、より好ましいのは以下のようにイベントを利用して宣言的に記述することで、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447106/f5ef48a3-d06d-155c-b2b1-0b4fc7c7ba26.png)

さらに進めてこのようなPub/Subの設計を **標準とすべき** と説明を受けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447106/06462f9a-63f6-a460-2912-851e1337a70c.png)

これ、一見過激な主張なんですが、実際理にはかなっています。PubSubにすることで、確かに **コンポーネント間の依存関係はかなり小さくなっている** のです。イベントとそれに対応する動作さえ仕様化してしまえば、コンポーネントごとに完全に独立してテストができます。

また、依存関係がきれいに逆転できており、実際理想的なヘキサゴナルアーキテクチャ（あるいはオニオンアーキテクチャ）になっています。インタフェースやDIでなんとか実現していたことが、この形式だといともたやすくできてしまうんですよね。

## あらたな設計手法、イベントストーミング
そして、このような設計パラダイムの中では、設計のやり方そのものが結構変わってきます。そしてDDDの世界で主流になりつつあるのが **イベントストーミング** です。

イベントストーミングは、設計手法であるとともに「ビジネスプロセスの理解手法」である、ともいわれます。乱暴に言うと、**ビジネス理解とシステム設計を同時にやってしまう** わけですね。

イベントストーミングというのは、システムをオブジェクトではなくシステムを中心に見よう、というアプローチです。

まず、ビジネスとしてどのようなイベントがあり得るのかを並べていきます。イベントというのはビジネス上何かをするきっかけのことであり、各々が仕事を始める原因となるものです。これを、ドメインの当事者と一緒に並べていくのが最初の一歩です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447106/ad67ac43-ec0c-c2b6-7a88-255a1d77e244.png)

次に、そのイベントによって「どこの誰が」「何をする」というのを違う色の付箋で追記していきます。


![読書メモ - Frame 5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447106/9ff00408-15e7-200a-78b8-ea784a48c018.jpeg)

「何をする」というのが明確になっていくに従い、自然とイベントは増えていくでしょう。

また、このイベントの流れの中で、守るべきポリシー（業務ルール）や疑問があれば、それらも別の色で書いていきます。

![読書メモ - Frame 5 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447106/7b5c9f15-a200-7f01-6c51-c136025300c2.jpeg)

このイベントと時系列ベースのモデリングは、クラス図を中心とした静的なモデリングとは結構着眼点が違い、面白いと感じました。

実際この作り方をすると、一つ一つのサービスはマイクロサービス的に独立できそうです。少なくとも、かなり相互依存の低い状態を、DIなどに頼らずに実現できそうです

## 2022/02/27追記
思いのほか伸びてしまったので、参考にした動画や書籍をあげておきますね。

まず、「海外のDDDセミナー」というのは、以下の動画になります（ただし、O'Reilly のSafari Books Online で閲覧できる動画なので、自由に見れるわけではないです）

- [Event Stroming by Allen Holub](https://learning.oreilly.com/videos/event-storming/0636920362104/)

そして、DDDの書籍でかなり突っ込んでこの辺のことを書いているのは、実戦ドメイン駆動設計の著者である Vaughn Vernon氏の「Domain-Driven Design Distilled（蒸留ドメイン駆動設計）」です。

この本は、きょん氏を始め、かなりの方がおすすめ書籍として上げられており、また本としては比較的短いので、技術洋書入門としてもおすすめです。

参考になるかは微妙ですが、私も[読んだ感想をタグ付きでTwitterに投稿している](https://twitter.com/hashtag/%E6%9C%9D%E3%81%AEDDDD30%E5%88%86%E4%B8%80%E6%9C%AC%E5%8B%9D%E8%B2%A0)ので（後でちゃんとまとめなきゃ）、ご参考になれば。


<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=posaunehm-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01JJSGE5S&linkId=877a7671427450009ddfbf11dfe3a37c"></iframe>

そして最後に、この辺の動画とか本は前述のSafari Books Onlineで読むことができるのですが、こちらはACMの会員になると年間1万円程度で読むことができます。

https://qiita.com/moomooya/items/d2d697958a99250ba726

現在日本語の書籍も充実していっており（現時点で112冊、しかもその中には[ITILv4の和訳](https://learning.oreilly.com/library/view/itil-foundation-itil/9780113316625/)などかなり自分で買うと高いけど持っておきたい本も含まれている）、洋書はO'Reillyだけではなく、ManningやPragmatic Bookshelfなどのおなじみ洋書メーカーも多数あるので、めちゃくちゃオススメです。