3行でいうと

  • ソフトウェアの複雑さの源は、技術よりも業務の領域そのものにある
  • 専門家と開発者が共通の言葉(ユビキタス言語)を使い、それをコードに反映する
  • エンティティや集約など、モデルを表す基本部品を整理した
  • 大規模では、モデルが通用する範囲(境界づけられたコンテキスト)を明示する

向いている人

業務システムの設計に関わる開発者や設計者。複雑な業務を、コードにどう落とすか悩んでいる人。

読む意味

技術の選び方より前に、何を作ろうとしているのか(ドメイン)を起点に設計する発想が学べます。サービスの境界をどこに引くかを考える判断軸にもなります。

読むときの注意

独特の用語が多く、難解で読みにくいという読者の声があります。業務が十分に複雑な場合に限って検討すべきで、小規模で単純なシステムには過剰な投資になりうる、という注意もあります。

どんな本か

ソフトウェアコンサルタントのエリック・エヴァンスが、複雑な業務を扱う開発の設計手法を「ドメイン駆動設計(DDD)」としてまとめた本です。中心の主張は、ソフトウェアの複雑さの本質的な源は技術の難しさではなく、業務ドメインそのものの複雑さにある、という点です。それに立ち向かうため、業務の専門家と開発者が共通の語彙(ユビキタス言語)で対話を続け、その語彙をそのままコードに映したモデルを繰り返し磨いていくことを説きます。設計パターンの単なる一覧というより、モデリングという創造的な作業をどう続けるかを論じた思想書の性格が強い、と紹介されています。

本は4部構成です。第1部はモデルを機能させる考え方、第2部はエンティティ、値オブジェクト、サービス、集約、リポジトリ、ファクトリ、モジュールといったモデルを表す基本部品を扱います。第3部は、コードに潜む暗黙の概念を明示するリファクタリング、第4部は戦略的設計です。

第4部では、複数のモデルが混在する大きなシステムで、一つのモデルが通用する範囲を示す「境界づけられたコンテキスト」を導入します。また、最も価値を生む中核の領域(コアドメイン)に設計の投資を集中させる考え方も示されます。後年、この境界の考え方はマイクロサービスの境界設計にも読み替えられるようになりましたが、機械的に当てはめるものではない、との指摘もあります。

中身の柱

あわせて読む本

書評データベースの全文を読む

概要

ソフトウェアコンサルタントのエリック・エヴァンスが、複雑な業務ドメインを扱うソフトウェア開発における設計手法を体系化し、「ドメイン駆動設計(Domain-Driven Design, DDD)」という名称のもとにまとめた書籍。原著は2003年、Addison-Wesley社より刊行、日本語版は翔泳社より刊行されている。本書の中心的な主張は、ソフトウェアの複雑さの本質的な源泉は技術的な難しさではなく業務ドメインそのものの複雑さにあり、その複雑さに立ち向かうには、ドメインエキスパートと開発者が共通の語彙(ユビキタス言語)を用いて継続的に対話しながら、その語彙をそのままコードに反映させたモデルを反復的に洗練させていく必要がある、という点にある。設計パターンの単なるカタログではなく、モデリングという創造的な営みをどう組織的なプロセスとして継続するかを論じた思想書としての性格が強く、後年のマイクロサービスアーキテクチャ論やマイクロサービスの境界設計に多大な影響を与えたことで知られる。後年、DDDコミュニティでは本書が提示した手法群を大きく「戦略的設計(Strategic Design)」と「戦術的設計(Tactical Design)」という2つの区分で整理して語ることが一般的になっており、前者は境界づけられたコンテキストやコンテキストマップといったシステム全体の構造に関わる設計を、後者はエンティティや値オブジェクトといった個々のコードレベルの実装パターンを指す。

本の構成

全4部・17章構成。 - 第1部 ドメインモデルを機能させる(第1〜3章): 知識をかみ砕く作業、コミュニケーションと言語の使い方、モデルと実装を結びつけることの重要性を扱う。 - 第2部 モデル駆動設計の構成要素(第4〜7章): ドメインを隔離する層状アーキテクチャ、エンティティ・値オブジェクト・サービス・集約・リポジトリ・ファクトリ・モジュールといった基本的な構成要素(ビルディングブロック)を扱う。 - 第3部 より深い洞察へ向かうリファクタリング(第8〜13章): モデルに潜む暗黙的な概念を発見し明示化していくリファクタリングの手法、アナリシスパターンやデザインパターンをモデルに関係づける方法を扱う。 - 第4部 戦略的設計(第14〜17章): 複数のモデルが混在する大規模なシステムにおいて、モデルの整合性を維持し、コアドメインを蒸留し、大規模な構造を設計するための戦略的な手法を扱う。

主要な内容

ユビキタス言語とモデル駆動設計(第1部)

ドメインエキスパートと開発チームが会話・ドキュメント・コードのすべてにおいて同一の用語を一貫して用いる「ユビキタス言語」の確立を提唱する。ドメインモデルを図やドキュメントの中だけの存在に留めず、コードそのものにモデルを直接反映させる「モデル駆動設計」の考え方を軸に据え、モデルと実装が乖離しないよう両者を一体的に反復して磨き上げていく「知識のかみ砕き」の重要性を説く。

モデルを表現するビルディングブロック(第2部)

  • エンティティ: 属性ではなく同一性(アイデンティティ)によって区別されるオブジェクト。
  • 値オブジェクト: 属性の組み合わせによって定義され、それ自体に同一性を持たない不変のオブジェクト。
  • サービス: 特定のエンティティや値オブジェクトに自然に属さない操作を表現するオブジェクト。
  • 集約: 一貫性を維持すべき単位としてエンティティと値オブジェクトをまとめ、外部からのアクセスを集約ルートに限定することでトランザクション境界を明確にする概念。
  • リポジトリ: 集約の永続化・取得を抽象化するオブジェクト。
  • ファクトリ: 複雑な生成ロジックをオブジェクト生成そのものから切り離してカプセル化する概念。
  • モジュール: 関連する概念をまとめる単位であり、モジュール名自体もユビキタス言語の一部として扱われる。

より深い洞察へ向かうリファクタリング(第3部)

コードやモデルの中に暗黙的に存在している重要な概念(たとえば契約や方針といった概念)を明示的なオブジェクトとして取り出すリファクタリングのパターンを扱う。マーティン・ファウラーのアナリシスパターンや、ストラテジーパターン・コンポジットパターンといった古典的なデザインパターンを、ドメインの概念と整合する範囲で選択的に活用する方法を論じ、意図が明確なインターフェース・副作用のない関数・表明(アサーション)・概念の輪郭の一致・独立したクラス・操作の閉包といった性質を備えた「しなやかな設計(supple design)」の概念を提示する。

戦略的設計(第4部)

複数のチームやサブシステムがそれぞれ異なるモデルを持つ大規模なシステムにおいて、一つのモデルが有効に機能する明確な範囲を示す「境界づけられたコンテキスト(Bounded Context)」の概念を導入する。複数の境界づけられたコンテキスト間の関係を図示する「コンテキストマップ」では、共有カーネル・顧客/供給者関係・準拠者・腐敗防止層・別々の道・公開ホストサービス・公開された言語といった具体的な関係パターンが整理される。またシステム全体の中で最も価値を生み出す差別化領域である「コアドメイン」を、汎用的なサブドメインから切り分けて設計投資を集中させる「蒸留」の考え方、大規模なモデルに秩序を持たせるための「大規模な構造」(システムメタファー、責任のレイヤー、知識レベル、着脱可能コンポーネントフレームワークなど)のパターンも扱われる。境界づけられたコンテキストという概念は、後年のマイクロサービスアーキテクチャにおいて「一つの境界づけられたコンテキストを一つのマイクロサービスに対応させる」という設計指針として広く読み替えられるようになり、この一対一対応は境界の明確化・結合度の低減・独立デプロイの実現に資するとされる一方、常に機械的に当てはめるべきものではなく、システムの実情に応じた柔軟な運用が必要だという指摘もなされている。

具体例

本書全体を通じて、海運業界における貨物(カーゴ)・輸送経路・航海といった具体的なドメインを題材にした例が繰り返し用いられ、著者自身のコンサルティング経験に基づく実例として提示される。戦略的設計の章では、銀行業務における「融資」のコンテキストと「リスク管理」のコンテキストが異なるモデルを持つ場合に、両者の間に腐敗防止層を設けて片方のモデルがもう片方に汚染されないようにする具体例が示される。

実践への応用

業務システム開発において、開発者とドメインエキスパートが継続的に対話しながらユビキタス言語を確立し、その語彙をクラス名・メソッド名としてそのままコードに反映させること、集約の境界を明確にしてトランザクション整合性の単位を設計に落とし込むこと、複数チーム・複数サブシステムが関わる大規模開発では境界づけられたコンテキストを明示してモデルの混濁を防ぐこと、システムの中で最も差別化価値の高い部分(コアドメイン)を見極めて設計・実装の投資を集中させ、汎用的な機能は外部調達や既存パッケージの活用を検討することなどが、実務上の応用として挙げられる。マイクロサービスへの分割設計に取り組むチームにとっては、サービス境界をどこに引くかという難問に対して、技術的な都合ではなくドメインの意味的なまとまりを起点に検討するという判断軸を提供する点でも実践的価値が高い。

位置づけ・評価

「ドメイン駆動設計」という名称と体系を確立した基礎文献として位置づけられており、特に「境界づけられたコンテキスト」の概念は後年のマイクロサービスアーキテクチャにおけるサービス境界設計の理論的裏付けとしてしばしば引用される。本書の後、ヴォーン・バーノンによる『実践ドメイン駆動設計(Implementing Domain-Driven Design)』(2013年)などの後継書籍や、DDD Europeをはじめとする専門カンファレンスが生まれるなど、一つの技術コミュニティを形成する起点となった。パターンカタログとしての側面と設計思想書としての側面が併存する密度の高い内容から、実務での導入にあたっては後継のより実践的な解説書と併読されることが多い。一方で、マイクロソフトのアーキテクチャガイドラインなど実務寄りの資料では、DDDの導入は業務ロジックが十分に複雑なドメインに限って検討すべきであり、境界づけられたコンテキストごとの高度な分離とカプセル化を維持し続けるための労力が小規模・単純なシステムには過剰投資になりかねないと注意が促されており、あらゆるプロジェクトに無条件に適用すべき手法ではない点もあわせて議論されている。