なぜDDD初心者はググり出してすぐに心がくじけてしまうのか

DDD連載記事
* [なぜDDD初心者はググリ出してすぐに心がくじけてしまうのか](http://little-hands.hatenablog.com/entry/2017/09/24/005903)
* [ドメイン駆動設計の定義についてEric Evansはなんと言っているのか](http://little-hands.hatenablog.com/entry/2017/09/27/014403)
* [モデルでドメイン知識を表現するとは何か](http://little-hands.hatenablog.com/entry/2017/10/04/201201)
* [ドメイン駆動設計で実装を始めるのに一番とっつきやすいアーキテクチャは何か](http://little-hands.hatenablog.com/entry/2017/10/04/231743)
* [ドメイン駆動 + オニオンアーキテクチャ概略](http://little-hands.hatenablog.com/entry/2017/10/11/075634)
## 背景
直近のプロジェクトでDDDの思想に則ったアーキテクチャで一つリリースまで漕ぎ付けまして、そこに至るまで色々と調べたり試行錯誤をしながら学んだことを書いていこうと思います。

一番にですね、大体のDDDに興味を持った人がいうのが

```
「単語が難しいばかりで結局イメージが湧かない」

「ドメイン駆動の本を読もうとして速攻で心が折れた」

```

ということなんですよね。

DDDは思想としてすごく面白く、とても実用性なものなのに、なんでこんなにわかりづらいのか、ハードルが高いのか！！

という点について、私なりの解釈を述べたいと思います。

## 心をくじく要因
### Eric Evans本は説明が圧倒的に下手。笑
ドメイン駆動設計といえば原著がこの本(以下、原典)なのですが、

<a target="_blank" href="https://www.amazon.co.jp/gp/product/4798121967/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798121967&linkCode=as2&tag=majackyy-22&linkId=fcff16d1f17171252e6e345455e9e396">エリック・エヴァンスのドメイン駆動設計</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=majackyy-22&l=am2&o=9&a=4798121967" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

この本は本当〜〜〜にわかりづらいです。重要なことは確かに書いてあるんですが、構成がかなりしんどくてまとまりがないのです。一通り実装してからも結局この結論になるので、あの本でわからないのは仕方ないです。笑

まず書籍は実践DDD(以下、IDDD)から入るのが良いと思います。

<a target="_blank" href="https://www.amazon.co.jp/gp/product/B00UX9VJGW/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00UX9VJGW&linkCode=as2&tag=majackyy-22&linkId=a121f28c6f7cbe6c3477d79a5fed7405">実践ドメイン駆動設計</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=majackyy-22&l=am2&o=9&a=B00UX9VJGW" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

ここである程度イメージをもたせてから、興味があったら原点に当たるというのが良いでしょう。

### DDDは対象領域が広いが、それが理解されずそれぞれ局所的な説明がされていることが多い
DDDの領域は大きく分けて3つに分けられます。

* 開発思想：
  * システムの複雑性に取り組むために、業務の専門家と技術の専門家で言語・モデルの認識を合わせ、継続的に進化させていこう、という考え方
* 戦略的設計：
  * ドメインモデリングの前提を揃えるための、モデリング対象を定義する原則と手法(コアドメイン/サブドメイン、境界付けられたコンテキスト、コンテキストマップ等)
* 戦術的設計
  * モデルを具体的に表現するためのパターン(エンティティ、レポジトリ、レイヤードアーキテクチャ等)

この全体像が整理されないまま、メリットやHowの話になってしまうと、全体像が見えないので何の話をしているのか混乱してしまうのです。

強引に例を挙げるならスクラムの見積もり手法とGoFデザインパターンのいくつかを並べて同時に「開発の効率化とは」と論じるようなものです。それぞれに目的があり、関係性があり、それが繋がって本当にやりたいことができるわけです。

###  アーキテクチャの話のウェイトが軽い

戦術設計の話で、レイヤー化アーキテクチャについては 「ドメイン層を設けてドメインロジックはそこに閉じ込めましょう」ぐらいで終わっていきなりエンティティやレポジトリパターンの話になってしまう。

これも罠だと思っています。なぜなら、

<b><u>DDD戦術的設計の最大のメリット、同時に一番頭をひねるところはとにかくアーキテクチャにある</u></b>

と言っても過言ではないと思うからです。

まず、DDDの推奨するアーキテクチャを採用することによっていかにメリットがあるか。ここについてきちんと時間を割き、その後のモチベーションを高めることがまずは重要だと思っています。<b><u>エンティティ、レポジトリというパターンは、あくまでレイヤーを綺麗に分ける上でのHowでしかない</u></b>のです。ここのウェイトの認識を間違えないようにすることが重要です。

しかし！ここからはより具体的な問題が出てきます。。

###  アーキテクチャのお手本が一つに統合されていない

実は、原典でお手本とされているレイヤー化アーキテクチャと、IDDDでお手本とされているアーキテクチャが違うのです。

これは、IDDDでは原典から10年のときを経て洗練されたアーキテクチャになっているということなのですが、これはつまりエンティティなどのデザインパターンは原典でかなり完成されていたのに対して、レイヤー化アーキテクチャに関しては実はある意味未成熟なものであったということ。

そしてそれによりネット上の文献で紹介されるアーキテクチャが様々なものとなっているのです。IDDDではヘキサゴナルアーキテクチャというものが掲げられていましたが、それを進化させたオニオンアーキテクチャ、クリーンアーキテクチャなどの有名な亜種が存在します。また日本の著名なDDD推進されている方のスライドを見ると、ヘキサゴナルとは思想の異なるアーキテクチャを提案しています。

これが実装に着手する際に非常に大きな混乱を呼ぶのです。文脈の理解、採用するアーキテクチャの選定に時間を取られることでしょう。

## 今後のお話
以上、ひとまず導入して思うところをつらつらと書かせていただきました。

ひとまず上記のような分かりづらさがあるよね、というのを整理した上で、私なりに分かりやすいと思う説明の記事を書いていこうと思います。ご興味ありましたら、どうぞおつきあいくださいませ。



## 後続記事
よろしければどうぞ！
[DDDの定義についてEric Evansはなんと言っているのか](http://little-hands.hatenablog.com/entry/2017/09/27/014403)
[【DDD】モデルでドメイン知識を表現するとは何か](http://little-hands.hatenablog.com/entry/2017/10/04/201201)



### 終わりに
TwitterでもDDDの話をつぶやいてるのでよろしければフォローしてください。質問箱で匿名のご質問も受け付けています。  
記事に関するご質問もお気軽にどうぞ！

[Twitter: @little_hand_s](https://twitter.com/little_hand_s)
[質問箱](https://peing.net/ja/little_hands?p=auto)