目次を表示する

EvansとVernonで学ぶDDD

背景

背景

ドメイン駆動設計(DDD)は、ソフトウェアの複雑さに向き合うための設計手法です。2003年にEric Evansが体系化して以来、20年以上にわたりエンタープライズ開発の世界で支持を受け続けています。

DDDを語る書籍として広く知られるEvansの「Domain-Driven Design」とVaughn Vernonの「Implementing Domain-Driven Design」は、それぞれ異なるアプローチを持ちますが、その関係性が整理されないまま紹介されることが多く、「どこから手をつければいいか分からない」という状態が続いています。

本書は、採用管理システムという一貫した事例を通じて、両者のアプローチを比較しながらDDDを体系的に学べる入門資料として書かれました。

EvansとVernonとは何者か

Eric Evans

Eric Evansは、2003年に「Domain-Driven Design: Tackling Complexity in the Heart of Software」を著したソフトウェア設計者です。この書籍でEvansは、ソフトウェアの複雑さはドメイン(業務領域)の複雑さに起因するという前提に立ち、設計の哲学と思考法を体系化しました。

本書では「青本」と呼びます。青本は実装レシピではなく、設計の思想書に近い性格を持ちます。Evansはユビキタス言語(Ubiquitous Language)、境界づけられたコンテキスト(Bounded Context)、エンティティ(Entity)、値オブジェクト(Value Object)、集約(Aggregate)といった概念を定義し、それらを統合した設計の枠組みを提示しました。抽象度が高く、具体的なアーキテクチャパターンの記述は少ないため、「読んだが実装に繋がらなかった」という声も多い書籍です。

Vaughn Vernon

Vaughn Vernonは、2013年に「Implementing Domain-Driven Design」を著したソフトウェアアーキテクトです。Vernonは青本の思想を出発点として、CQRS(Command Query Responsibility Segregation)、ドメインイベント(Domain Events)、ヘキサゴナルアーキテクチャ(Hexagonal Architecture)などの現代的なアーキテクチャパターンと組み合わせる形でDDDを実装可能な形に具体化しました。

本書では「赤本」と呼びます。赤本はコード例を豊富に含み、青本が「何を」設計するかを説くのに対し、赤本は「どのように」実装するかを説くという役割分担があります。

両者の関係

VernonはEvansの弟子ではなく、独立した実践者です。ただし赤本の前提には青本があり、青本なしに赤本は成立しません。VernonはEvansが定義した概念をそのまま継承しつつ、青本が十分に踏み込まなかった領域を埋めています。

この非対称な関係が、DDDを学ぶ上での混乱の一因でもあります。青本と赤本を同列に並べて比較しようとすると、一方が哲学的抽象論を語り、他方が実装論を語るという噛み合わせの悪さが生じます。本書ではこの関係性を明示しながら進めます。

本書の読み方

本書の各章は、概念の性質に応じて以下の3種類のラベルのいずれかで分類されています。

  • [共通]: 青本と赤本の両者が同じ概念を共有している章。定義に大きな差異はありませんが、強調点や説明の粒度が異なる場合があります。
  • [比較]: 同じ概念に対して、EvansとVernonがそれぞれ異なるアプローチや解釈を持つ章。どちらが正しいという話ではなく、文脈に応じた選択肢として整理します。
  • [Vernon追加]: 青本には存在しない、Vernonが赤本で新たに導入した概念を扱う章。DDDの現代的な実践においては重要ですが、青本の延長線上にある概念です。

各章はこのラベルを見出しに記載しています。青本を先に読んでいる読者は[比較]と[Vernon追加]の章を重点的に読むことで差分を効率よく把握できます。

通し事例:採用管理システム

本書全体を通じて、採用管理システムを実装事例として使用します。業務フローが明確で、複数の独立したサブドメインを持ち、DDDの各概念を無理なく配置できる題材です。

システムは以下の4つの境界づけられたコンテキストで構成されます。

コンテキスト責務の概要
求人管理求人票の作成・公開・締切を管理する
選考管理応募から内定・不合格までの選考プロセスを管理する
候補者管理候補者のプロフィールと応募履歴を管理する
通知選考ステータスの変化を候補者や担当者にメールで通知する

求人管理と選考管理は密接に連携しますが、候補者管理と通知はそれぞれ独立した関心を持ちます。通知コンテキストは他のコンテキストからドメインイベントを受け取って動作する典型的なサポートサブドメインです。

各章のコード例はTypeScriptで書かれており、特定のフレームワークには依存していません。

章立て

各章の内容と対応するラベルを以下に示します。

  • Ch.1 プロローグ ── EvansとVernonとは何者か(本章)
  • Ch.2 [共通] ユビキタス言語
  • Ch.3 [共通] 境界づけられたコンテキスト
  • Ch.4 [共通] Context Map
  • Ch.5 [Vernon追加] Event Storming
  • Ch.6 [共通] Entity と Value Object
  • Ch.7 [比較] 集約
  • Ch.8 [Vernon追加] Domain Events
  • Ch.9 [Vernon追加] CQRS と Event Sourcing
  • Ch.10 [比較] アーキテクチャ
  • Ch.11 [実装] TypeScriptで全パターンを繋げる
  • Ch.12 エピローグ

インフォグラフィック

サマリー

本書の構造

graph TD
  Evans["Eric Evans\n青本\n(Domain-Driven Design, 2003)"]
  Vernon["Vaughn Vernon\n赤本\n(Implementing DDD, 2013)"]

  subgraph Common["[共通] 両者が共有する概念"]
    C2["Ch.2 ユビキタス言語"]
    C3["Ch.3 境界づけられたコンテキスト"]
    C4["Ch.4 Context Map"]
    C6["Ch.6 Entity と Value Object"]
  end

  subgraph Compare["[比較] アプローチが異なる概念"]
    C7["Ch.7 集約"]
    C10["Ch.10 アーキテクチャ"]
  end

  subgraph VernonOnly["[Vernon追加] 赤本が導入した概念"]
    C5["Ch.5 Event Storming"]
    C8["Ch.8 Domain Events"]
    C9["Ch.9 CQRS と Event Sourcing"]
  end

  Evans --> Common
  Evans --> Compare
  Vernon --> Common
  Vernon --> Compare
  Vernon --> VernonOnly

  Common --> C11["Ch.11 TypeScriptで全パターンを繋げる"]
  Compare --> C11
  VernonOnly --> C11