11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

実はけっこう多い DDDの本

Last updated at Posted at 2023-09-03

DDDの本と言っても、青い本、赤い本だけではなく実はいろいろある。用途や時代、知識や技術レベルに合う本を選んで時間を有効に使いたい1

書籍・資料

以下に DDDの関連本を簡単に紹介し2、その後で各書籍が触れているパターンについて表にまとめる。書籍のフルネームは意外と長いのでよく使われる呼び名や略称をタイトルとし、また表の列名に使うため2文字の記号も付与した。

初期のDDD本たち

DDD が出てきた00年代中盤はこんな感じだった。

  • DB といえばほぼ RDB一択3で、オンプレで SoR を開発していた。
  • オブジェクト指向を熱心に信奉し手続き型勢を啓蒙したいと考える人が多かった。4
  • UML 普及期5で、成果物にUMLの各種ダイアグラムを含める事が流行り始めた。6
  • XML 大全盛で、設定ファイルから Webサービスまで何でも XMLだった7
  • WF への倦怠に伴い反復漸進型8開発への期待も高まってきたが、かと言ってすぐにアジャイルでもなく、メソドロジー論争からの流れで UP などの権威がまだ高かった910

エバンス本 (200312): D313

PoEAA で予告され14満を持して登場した大古典。以後の関連書籍や言説の量から客観的に見ても歴史的インパクトはとても大きいが、決して読みやすい本ではなく多くのDDD難民を生み出した。

DDD Quickly (2006): DQ15

エバンス本を要約した電子書籍でInfoQ でダウンロードできる。これで救われた DDD難民も当時は結構いたらしい16。『Secure By Design』では、まずこれを読むよう勧めている。

近現代のDDD本たち

エバンス本から10年後の2013年から現代までの本。この間、以下のようなことがあった。

  • NoSQLブーム以降、RDBが数ある選択肢のうちの一つになった17
  • クラウド技術やコンテナ技術が現れ、ほぼ大前提のレベルにまで普及した
  • 世俗の開発でも関数型プログラミングが普及した18
  • リアクティブ、イベント駆動の概念・製品・技術が発達した
  • マイクロサービス、サーバーレスが普及した 19
  • アジャイルが普及し、ドメインエキスパートまで含めたチーム一丸で協働しながら、小さなステップで反復開発するスタイルが一般的になった

IDDD (2013): ID20

エバンス本からこの IDDDまでの10年くらいで、ドメインを理解するにもモデル化するにも、イベントに着目すると良い事が知られてきた。この IDDD 以降、Domain Event が DDDのパターンカタログに追加された。ちなみに著者の Vaughn Vernon はリアクティブ周辺にも強い人で、『Reactive Messaging Patterns』でも Domain Event について説明している。

DDD Reference (2015): RF21

Evans 自身が 12年分の知見を加味しつつ、青い本から DDD 要点を抜粋したカタログ。45のパターンが各 1ページ程度でまとめられ、非常に薄い22。後発の DDD本からも参照されることが多い。

PPP of DDD (2015): PD23

『Secure By Design』でも DDD理解の参考図書として推奨されている良書。現代DDDをよく説明している。LDDD からも参照あり。

DDD Distilled (2016): DD24

IDDD の著者 Vaughn Vernon の別の DDD 本。IDDD よりかなり短いが、かといって抽象的すぎることもなく、図を多用して分かりやすく説明している。ちなみに 'distill' は DDD 用語としても頻出で、『Secure By Design』でも詳しく説明されている。

LDDD (2021): LD25

BoundedContext や Subdomain 周りのパターンが原型をくずさない範囲で明確に整理された26。これにより、どの状況でどのパターンを使うかの判断フローが明確になり、実用性が格段に高まった。2020年代に DDD を実践する場合に考慮すべきことが、ほぼ抜かりなく解説されている。

DDD周辺の本たち

DDD 専門の本ではないが深く関連する分野の本たち。セキュリティ、関数型パラダイム、マイクロサービスの観点で選んでみた。

Secure By Design (2019): SD27

セキュリティの本だが、著者たち全員が最も影響をうけたものとしてDDDを挙げており、第3章の概説をはじめとして驚くほど DDD 関連の記述が多い。セキュリティの CIA-Tのなかでも I(Integrity) に特に関係が深い28

Domain Modeling Made Functional (2018): DF29

実用上の選択肢がオブジェクト指向しかなかった時代と違い、関数型パラダイムでドメインを理解し30モデル化することも身近になってきた。この本では第1章の 'Introducing Domain Driven Design' から始まり、以降の章でも DDD と FP の親和性の高さが随所で解説されている。

Microservice Patterns (2018): MP31

マイクロサービスのパターン本。サービス境界の問題や32、イベント/メッセージングに関連して、DDD 関係の記述が多い。

Monolith to Microservices (2019): MM33

マイクロサービスの大家である Sam Newman の本。DDD 関連のページ数は多くないが、マイクロサービスを開発するにあたって最低限知っておくべき DDD の核心を挙げているのが面白い。

パターン

  • 行方向にパターンを並べる。DDD Reference の順序とカテゴリ分けを用いた。
  • 列方向に本(上で付与した2文字の記号)を並べる。
  • ◎ 目次レベルで記載あり、○文中で説明あり、△ほぼ名称が登場するのみ
Putting the Model to Work D3 DQ Rf ID PD DD LD SD DF MP MM
Bounded Context34
Ubiquitous Language35
Continuous Integration
Model-Driven Design
Hands-on Modelers
Refactoring Toward Deeper Insight
Building Blocks 36 D3 DQ Rf ID PD DD LD SD DF MP MM
Layered Architecture37
Entities
Value Objects
Domain Events
Services38
Modules
Aggregates
Repositories
Factories
Smart UI
Supple Design39 D3 DQ Rf ID PD DD LD SD DF MP MM
Intention-Revealing Interfaces
Side-Effect-Free Functions
Assertions
Standalone Classes
Closure of Operations
Declarative Design
Drawing on Established Formalisms
Conceptual Contours
Context Mapping40 D3 DQ Rf ID PD DD LD SD DF MP MM
Context Map41
Partnership42
Shared Kernel
Customer/Supplier
Conformist
Anticorruption Layer
Open-host Service
Published Language
Separate Ways
Big Ball of Mud43
Distillation D3 DQ Rf ID PD DD LD SD DF MP MM
Core Domain44
Generic Subdomains
Supporting Subdomain45 46
Domain Vision Statement
Highlighted Core
Cohesive Mechanisms
Segregated Core -
Abstract Core
Large-Scale Structure D3 DQ Rf ID PD DD LD SD DF MP MM
Evolving Order47
System Metaphor48
Responsibility Layers
Knowledge Level49
Pluggable Component Framework
DDD 外の参考概念 D3 DQ Rf ID PD DD LD SD DF MP MM
Event Sourced Domain Model50
Domain Model (pattern)
Active Record
Transaction Script
Anemic Domain Model51
Event Storming
Event Sourcing
CQRS
Saga
Process Manager52
Microservice53
Port & Adapter
Application Service54
Strangler Fig

パターン・カテゴリごとの寸評

Putting the Model to Work

  • 当然ながらどの本でも Bounded Context が最重要扱い55
  • 次いで Ubiquitous Languageで、DDD の本では昔も今も最重要レベル。上に挙げた DDD周辺本ではやや扱いが弱い。
  • Model-Driven Design は、DDD Reference の図でも Building Blocks 群と BC/UL を結ぶ位置に置かれ、本来とても重要なパターンだが、言及は意外と少ない。
  • Refactoring Toward Deeper Insight はほそぼそと触れられている。セキュアバイデザインでは「deep56」という概念から深く解説されている。
  • Hand-on Modeler / Continuous Integration は最近はあまり触れられなくなった(すでに言うまでもないということかもしれない)。

Building Blocks

  • 特に重要なのは Aggregateで、『Monolith to Microservices』では 最低限知っておくべき DDDの事として、Bounded Context と共に挙げられる。関数型の場合には若干扱いが異なるが、DMMF や PPPD ではその点についても解説される。
  • 次に重要なのが Domain Event で、モダンなDDD本はもちろん、DMMF やマイクロサービス本でも手厚く解説される。この Domain Event の有無が、古い DDDとモダンな DDDの最も顕著な違いでもある57

Supple Design

PPP of DDD くらいまでは若干記述があったが、最近の本ではあまり触れられない。このカテゴリは実はFPに関係が深く39、単発のネット記事などではたまに触れられるが、今回調べた DMMF では特に触れられていない58

Context Mapping

  • DDD の最重要要素である BoundedContext 群の協調や統合に関わるカテゴリなので、古いDDD本でもモダンなDDD本でもまんべんなくカバーされている。
  • 特に LDDD ではパターン群が階層的に整理され、初期のDDD本たちとは明確性や納得感に雲泥の差がある。
  • BoundedContext と関連が強いマイクロサービスの関連本でもっと触れられても良さそうだが、意外と記述がない。

Distillation59

  • このカテゴリでは Core / Generic / Supporting の3つの subdomain がよく言及される。DDD Reference では Supporting Subdomain が入っていなかったが、定番の 3タイプなので表に含めた。これらの記述も LDDD で特に手厚く、基本的な考え方から3タイプ間の移行まで詳しく解説される。
  • その他は、実務上は知らなくてもあまり困らないかもしれない。

Large-Scale Structure

  • このカテゴリは、エバンス自身の本を除いてはあまり触れられていない。
  • とはいえ、DDDの外から借用された Knowledge Level や System Metaphor あたりは、とても有名なので知っておくとよさそう。

DDD 外の参考概念

  • DDD Reference 所収のパターンではないが、DDDに関連が深いパターンやキーワードをいくつか抜き出した。
  • Event Sourced Domain Model(ESDM)から Transaction Script(TS)のあたり: PoEAA では Domain Model(DM) と Transaction Script の2パターンが紹介されていたが、LDDD では更に ESDM と Active Record(AS)を含めた4つの選択肢として再整理された。これに伴い、長らくアンチパターン扱い60だった TS が設計判断の決定木の中で復権し、一方 DM も「サブドメインタイプ=Core」かつ「変更履歴が不要なケース」の条件下のただの選択肢になった。
  • Event Storming から Process Managerあたり: Domain Event が DDD に含まれたことに伴い、イベント関連の概念についての言及も増えた。EDAの実装技法にとどまらず、Event Storming に見られるようにドメイン理解やコミュニケーションの面でも影響が大きい。
  • Microservice その他のパターン群: サービス粒度の問題に BoudedContext/Aggregate が強く関連することから、Microservice 関連のパターンがよく言及される。アーキテクチャの層に関連する Onion, Hexagonal, Clean61 は Port & Adapter として一括した。

まとめ

  • 総合的に見て、今読むなら LDDD がおすすめ。
    • エバンス本から 18年を経た業界の知見が取り込まれた最新のDDD
    • 概念が整理され、語り方、教え方も格段に進化している
    • 2020年代現在の技術状況での DDD の扱いという実用性
    • Building Blocks 偏重62が無いためバランスが良く63、OOを前提とせずに読んでも違和感が少ない
  • 手っ取り早く全要素を一望するには DDD Reference が良い。数回通読しても大して時間がかからない。パターンと基礎用語だけではなく、図もよく観察すると尚可。
  • 記述を比較したり知識を補強したりする資料としてなら、IDDD64、PPP of DDD、DDDD も良い。
  • エバンス本は、20年前の業界の空気を知る(人によっては思いだす)意味では面白い。ニュートンの『プリンキピア』やユークリッドの『原論』のノリで読んでみると楽しいかもしれない。
  • どの本を読むにしても、、、
    • Bounded Context/Ubiquitous Language、Context Mapping のパターン群、3つのサブドメインがまず大事
    • Building Blocks の中では Aggregate と Domain Event が群を抜いて重要。
  1. DDDに限らず、長い時間かけて最初から最後のページまでめくって目を通した、あるいは読書会に毎回出た、なのに1ヶ月後には何も覚えてない、といった状況も技術書あるあるなので気をつけたい。

  2. 各言語やフレームワークごとの DDD 本もあるが触れない(個人的には、正直あまり必要性も感じない)。

  3. XML Database や Object Database もあるにはあった。

  4. COBOL、C、VB等から Java(これがそもそも OO なのかにはここでは触れない)界に来た人の啓蒙。今にして思えばかなり「上から」な使命感だが、当時は関数型言語もデータベースも、とりあえずOとかOOとかつけるとワンランク上がった感が醸しだせる空気があった。

  5. OMG による標準化だったこともあり、OOPに先立って OOA、OOD で UMLを使うことこそ正統なオブジェクト指向とする見方も強かったと思う。『Agile Modeling(2002)』でも、「一般的なオブジェクト指向モデルの表記法かつ意味論である」としつつ、とはいえ UML も完全ではないから囚われる事のないようにと注意喚起されていた。

  6. スリーアミーゴを始め、当時のオブジェクト指向の大家たちの多くがUML推しだった。ちなみに現代でoo界 ≒ アジャイル界と捉える誤解が散見されるが、当時のOO界の大家とアジャイル勢はほぼ別物で、根本的なところで鋭く対立してたりする(どっちつかずだった Cockburn や Fowler もある時点で決別した)。ここがあやふやなまま古いプラクティスをつまみ食いすると「混ぜるな危険」な状況が生じがち。

  7. Eclipse でも、Java と UMLと XMLの三者間で相互に往来する EMF: Eclipse Modeling Framework が、とても格好良いイメージで期待されていた。

  8. I&I (Iterative and Incrimental) process。Alistair Cockburn によれば Incremental = "add onto", Iterative = "alter" である。

  9. 昔風の階層型組織に則って、モデラー役の上級技術者がUMLダイアグラムを描いて、コーダー役の下級技術者が実装するような世界観。アラン・ケイよりスリーアミーゴやOMGが当時のOOの権威で、何ならそういうのがオブジェクト指向開発と考える向きも多かった。ちなみに ICONIX も軽量とはいえ、どちらかと言えばアジャイルよりはそっち寄り。

  10. ちなみにアジャイルといっても、当時はスクラムじゃなくXP11が本命だった。

  11. 個人的には、今でもどちらかというとスクラムより XP が好ましい。

  12. 2004 年の本として言及されることもあるが、発売日 2003/8/22 とあるので2003年とした。

  13. 俗に言うエバンス本、または青い本。正式には 『Domain-Driven Design: Tackling Complexity in the Heart of Software』。

  14. Domain Model パターンの解説で、執筆中であると言及されていた。

  15. 正式には 『Domain Driven Design Quickly』 (Abel Avram & Floyd Marinescu, 2006)

  16. 国内だと、オージス総研/オブジェクトの広場の「DDD難民に捧げるDomain-Driven Designのエッセンス」もよく読まれた

  17. 例えばこの分類だと、RDB は12種のデータベースタイプのうちの一つという事になる。

  18. もちろん00年代でも関数型プログラミングの仕事もあるにはあっただろうが、今のように「次の開発は Java 止めて純粋関数型言語でやろっか」みたいなノリは一切なかったとおもう。

  19. サービスと DB の関係でも、Shared Database から Database per Service に価値観がシフトした。

  20. 正式には 『Implementing Domain-Driven Design』 (Vaughn Vernon, 2013)

  21. 正式には 『Domain-­Driven Design Reference』 (Evans Eric, 2015)

  22. 極限まで短くなっている分抽象度が高いので、必ずしも簡単とは言えないが、個人的には青い本を1回読むより、これを10回読むほうが短時間で多くの知見が得られると思う。

  23. 正式には 『Patterns, Principles, and Practices of Domain-Driven Design』 (Scott Millett & Nick Tune, 2015)

  24. 正式には 『Domain-Driven Design Distilled』 (Vaughn Vernon, 2016)

  25. 正式には 『Learning Domain-Driven Design: Aligning Software Architecture and Business Strategy』 (Vlad Khononov, 2021)

  26. Core Domain が Core Subdomainになったり、Bounded Context を関連付けるパターン群が階層化されたり。

  27. 『Secure By Design』 (Daniel Sawano, Dan Bergh Johnssonなど 2019)

  28. 日本語では別の訳語になるモデルのintegrity(整合性)とセキュリティのintegrity(完全性)が、『Security by Design』の観点では重なるという面白い知見。

  29. 正式には 『Domain Modeling Made Functional: Tackle Software Complexity with Domain-Driven Design and F#』 (Scott Wlaschin, 2018)

  30. 型(の取りうる値の集合)から型への写像でドメインを捉える、表示的意味論ベースのパラダイムが DDD と親和性が高いように思う。

  31. 正式には 『Microservices Patterns: With examples in Java』 (Chris Richardson, 2018)

  32. 2章からの引用'DDD and the microservice architecture are in almost perfect alignment.'。続く文で BoundedContext, Subdomain と Microservice の関係、またチーム面からの親和性について述べられる。

  33. 正式には 『Monolith to Microservices: Evolutionary Patterns to Transform Your Monolith』 (Sam Newman, 2019)

  34. 「アーキテクチャ設計とは本質的に境界に関するものである(LDDDの Ruth Malan の引用)」。また、「ソフトウェアアーキテクチャとは境界線を引く技芸である(クリーンアーキテクチャ)」

  35. DDDD では「DDDとは Bounded Context内での Ubiquitous Language のモデリングである(意訳)」とまで言っている。PPPD でもまた 'most important of DDD' とされる。Reference 本 DDD 三箇条でも「3. Speak a ubiquitous language within an explicitly bounded context.」である。

  36. 別名 Tactical Patterns。ここに囚われすぎるとダメなのは、たいていの本で注意喚起されていてる(例えば PPPD では overemphasize という表現)。

  37. LDDD では 3層と 4層を別物として扱い、永続化モデルが単一の場合の Transaction Script に 3層、Active Record に 4層を推奨している。

  38. Application Service との混同を避けて、Domain Service と明示的に書く本が多い。

  39. 型付 FP では特に Supple Design カテゴリとの親和性が高い。Side-Effect-Free Function はそのままFPの関数。Closure of Operation はモノイドまたは半群。Declarative Design は関数型パラダイムを含む上位の宣言型パラダイム。Drawing on Established Formalisms は圏論や抽象代数。また Assertion のある程度の部分が型レベルで表現できたり、Intention Revealing Interface も型クラスを利用できたりする。ただし Evans 自身は特に FP の素養があったわけでもないらしい。 2

  40. この Context Mapping と Distillation と Large-scale Structure の3つで、Strategic Design のサブカテゴリ

  41. IDDD によれば 'Context is king' である。

  42. LDDD では、この Partnership と Shared Kernel が、Cooperation という Team Collabolation タイプに含まれる。

  43. BBoM と略されることも多い。LDDD では BBoM > Bounded Context > Microservice > Distributed BBoM と大小関係を付けて粒度の問題について語っており、とてもリーズナブルである。

  44. Reference 本の DDD 三か条で「1. コアドメインに集中せよ」とされているほど重要で(この三か条は他の DDD本からもよく参照される)、これをスキップしてドメインにデザインを駆動させるのは無理。Lerning DDD では Core Subdomain と用語が調整されている。

  45. PDDDでは supporting domain。昔は domain と subdomain が用語上あまり整理されていなかった。

  46. DDD Reference にないが、Subdomain の分類は Core, Generic, Supporting の3つ(あるいは Generic & Supporting を含めて4つ)とするのが今では一般的なのでこの位置に書いた

  47. System Metaphor, Responsibility Layers, Knowledge Level, Pluggable Component Framework の4つを配下に持つ上位パターン

  48. eXtreme Programming からの借用。『Design It!』でも、「Make the Design Tangible」の10のパターンの一つに含まれていた。ちなみに『Pragmatic Thinking and Learning(Wetware本)』では、Metaphor は脳の創造的なモードと分析的なモードの待ち合わせ場所とされている。

  49. Fowler の『Analysis Pattern(1996)』で紹介されている分析技法で、ドメイン知識を操作レベルと知識レベルに分けるというもの。アナパタ全体で多用されている。

  50. ここでは Learning DDD の用語の Event Sourced Domain Model とした。Implementing DDD では A+ES、Microservice Patterns では event-sourcing based aggregate と言っている。

  51. behavior-rich を重視する OO と違い、FP では Anemic Domain Model はむしろ望ましいとの解説がある(PPPD や DDDD)。他の本でも data と behavior を分離する FP の利点がしばしば言及される。

  52. これも大古典である Hohpe Gregor の『Enterprise Integration Patterns』(略称EIP)でも解説されている重要なパターン。リアクティブ以降の現代 EDA の文脈でも、Saga の先のパターンとしてしばしば語られる。

  53. マイクロサービスと BoundedContext の関係については、Adrian Cockcroft の "A microservice definition: loosely coupled service oriented architecture with bounded context" のとおり。上記のマイクロサービス本では特に LDDD で詳しく解説されている。

  54. (Domain)Service ではない方の Service

  55. Ubiquitous Language の開発こそ DDD と言われることもあるが、これとて Bounded Context 無しには成立しない。

  56. LDDD や 『A Philosophy of Software Design』で語られる deep とはまた別の概念。

  57. 『From Object to Function』という関数型ドメインモデリングの本でも、DDD について言及しているのは、イベントに着目したドメインモデリングを二章に渡って解説してる部分だった。そこでも Aggregate と Domain Event にコマンドを加えた道具立てで、「状態」の変化について語っている。

  58. Supple Design のパターン群と特に親和性があるのは表示的意味論ベースのFPである一方、DMMF では微妙にテイストが違うという差かもしれない。

  59. DDD Quickly では、Context Mapping カテゴリの配下にパターンの一つのような形で並置されていた。

  60. もともと PoEAA では、メリデメや使える場面なども含めて記述されたパターンの一つであり、無条件にアンチパターンとされていたわけではなかった。

  61. なぜか不思議と日本の業界では、DDD と クリーンアーキテクチャをワンセットで語りたがる人が多いが、DDD界隈からクリーンアーキテクチャへの言及も、逆にクリーンアーキテクチャ本から DDD への言及もそんなには無い。また Entity という語も DDDと別の意味で使われていたり、他の Port & Adapter 系と比べて特段DDDと相性が良いわけでもない。

  62. Evans 自身が青い本を反省して、「BoundedContext や Strategic Design を差し置いてTactical Design について書きすぎた」と言っていたと何かの本に書いてあったが、見失った。見つけたら追記する。

  63. 一見 Building Blocks 偏重に見える IDDD も、実は BoundedContext から Context Mapping の辺りにかけての記述も、簡潔ながらとても上手く解説している。

  64. この本の当時は GitHub に置かれたサンプルプロジェクトがとても参考になったが、さすがに10年前の Java コードとなると陳腐してしまった感が否めない。

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?