ドメイン駆動設計をはじめようを読んだ

2024/12/01に公開

はじめに

https://www.oreilly.co.jp/books/9784814400737/

この本は、アーキテクチャConference2024で購入したものです。会場では、訳者の増田亨さんが登壇されており、直接サインをいただくことができました。その際、増田さんがドメイン駆動設計に込めた思いや、現場での実践の重要性についてお話しされており、その熱意が非常に印象的でした。

私自身、現場でドメイン駆動設計を取り入れることを目指しており、この本に大きな期待を抱いて読み進めることにしました。特に、設計や実装を通じてビジネス価値をどう最大化するか、そしてチーム全体で共有できるモデルをどのように構築するかといったテーマに対して、具体的な知見やヒントを得られるのではないかと感じています。

読書メモ

第1部 設計の基本方針

第1部では、ドメイン駆動設計(DDD)の戦略的設計について学んだ。DDDは単なる技術的な手法ではなく、ビジネス価値を最大化するための設計アプローチで、特に「複雑性の管理」と「競争優位性の確保」に注目している。業務を「複雑さ」と「競争優位性」という2つの観点で分類し、それに応じてアーキテクチャを選定する考え方が印象的。

たとえば、競争優位性が高く複雑な業務(コアドメイン)には注力し、それ以外の部分(サポートドメインや汎用ドメイン)は既存のソリューションや外部サービスを活用するという戦略が示されている。「すべてに全力を注ぐのではなく、注力する部分を選ぶ」という考え方は新鮮で、リソースを効率的に活用するための参考になりそう。

また、ドメインの複雑性を理解するには、ドメインエキスパートとの密な連携が重要だという点も納得。設計の根幹はビジネスの本質的な課題を深く理解することにあり、それをチーム全体で共有することが鍵になる。

この章を読んで、ビジネスを深く理解した上で「どこに注力するか」を明確にし、それを設計に反映させることの大切さを実感。特にスタートアップのようにリソースが限られている場合、このアプローチを導入すれば効率よく価値を提供できるのではないかと感じた。

第Ⅱ部: 実装方法の選択

第Ⅱ部では、ドメイン駆動設計(DDD)の実装方法について具体的なアプローチが書かれていた。特に、コードを通じてどのようにドメインの理解を反映するか、また実装にあたっての課題や選択肢について詳しく掘り下げられているのが印象的だった。

モデルは設計の中心に位置し、コードはその表現手段であるため、設計と実装が乖離しないようにすることが重要であると書かれていた。特に、「境界づけられたコンテキスト」を意識して設計することで、モデルの一貫性を保ちながら実装を進めることができ、複雑性の増大を防ぐとされていた。このアプローチにより、チーム全体でモデルを共有しやすくなることも強調されていた。

実装においては、エンティティと値オブジェクトの使い分けや集約の設計が具体的に取り上げられていた。エンティティは識別子を持ち、ライフサイクルの管理が重要である一方、値オブジェクトは不変であり、コードの簡潔性やテストの容易さに寄与すると書かれていた。このように、それぞれの役割を明確にすることで、モデルの意図をコードに反映しやすくなるとのことだった。また、集約については、一貫性を保つ単位として適切なサイズや境界を定義する必要があるとされ、大きすぎるとパフォーマンスの問題が生じ、小さすぎると管理が煩雑になるため、適度な粒度を見極めることが重要とされていた。

さらに、インフラ層とドメイン層を分離する設計の重要性も書かれていた。リポジトリパターンを活用して、ドメインロジックがデータベース技術に依存しないようにすることで、変更に強いシステムを構築できるとされていた。また、サービス層を活用してアプリケーション層とドメイン層の責務を明確化することで、長期的な保守性を高められると書かれていた。

イベント駆動式ドメインモデルについては、設計や実装の具体的なイメージがつかめず、理解が追い付かなかった部分もあった。特に、イベントの発生とそれをどのようにモデルや設計に組み込むのかについて、もう少し実例を交えて考える必要があると感じた。

第Ⅲ部 ドメイン駆動設計の実践

第Ⅲ部では、ドメイン駆動設計(DDD)を実践する際の具体的なアプローチや経験則が書かれていた。特に、どの技術方式を選択するかについて、経験則にもとづく判定方法が示されており、この内容が非常にしっくりきた。図を用いて、複雑性や競争優位性、コスト、スピードといった観点で技術を評価するフレームワークが提示されており、実務での応用が明確にイメージできた。

さらに、イベントストーミングや現実世界でのドメイン駆動設計の進め方についても詳しく触れられていた。イベントストーミングは、プロセスを可視化しながらチーム全体でドメインの理解を深める手法として非常に有効であるとされており、その具体的な進め方や注意点が説明されていた。この手法を取り入れることで、関係者間の認識ギャップを埋め、よりスムーズに設計を進めることができると感じた。

また、現実世界でDDDを適用する際の課題や、それを克服するための具体的な方法についても書かれていた。特に、理想的な設計と現場での制約の間でどのように折り合いをつけるかというテーマが印象的だった。ドメインモデルを追求する中で、技術的な妥協点を見極めながらも、ビジネス価値を最大化するアプローチが提示されており、実務でのヒントになりそうだと感じた。

第Ⅳ部 他の方法論や設計技法との関係

第Ⅳ部では、ドメイン駆動設計(DDD)と他の方法論や設計技法との関係が書かれていた。特に、マイクロサービスアーキテクチャとの関係については、業務領域に基づくサービスの設計が推奨されており、その安全性と有効性は理解できた。しかし、実務で適用する際に発生するであろう複雑さにはついていけなさそうだと感じた。特に、過度な分割が引き起こすインターフェースの複雑化や調整の手間が、実務では大きな負担になりそうだと感じた。

一方で、「イベント駆動型アーキテクチャ」や「データメッシュ」については、概念や実際の使い方がつかめず、理解が追い付かなかった。これらについては再読時に改めてチャレンジし、理解を深めていきたいと思う。

全体的に、DDDと他の設計技法をどう組み合わせるかが重要だと感じたものの、複雑さをどう扱うかが今後の課題と感じる章だった。

最後に

本書を通じて、ドメイン駆動設計(DDD)が単なる設計手法に留まらず、ビジネス価値を最大化するための強力なフレームワークであることを改めて実感しました。設計の基本方針から具体的な実装方法、そして実践的なアプローチに至るまで、各章で得られる知見は非常に豊富で、実務に直結する内容が多かったです。特に、現場での課題に即した実践的なアプローチが多く含まれており、これからDDDを導入したいと考える人にとって、具体的な指針を与えてくれる一冊だと感じました。

また、この本はエリック・エヴァンスの「ドメイン駆動設計」の原著に挑戦したものの挫折してしまった方にもおすすめできる内容です。複雑な概念がシンプルに整理されており、具体例や図解が多く、実践に落とし込みやすい工夫がされています。原著の理解を深める前に、本書をステップとして活用するのも良いアプローチだと思います。

最後に、この本を手に取るきっかけをくれたアーキテクチャConference2024や、サインをいただいた増田亨さんへの感謝の気持ちを忘れずに、この読書の成果を現場で活かしていきたいです。本書で得た学びを土台に、ドメイン駆動設計をプロジェクトに取り入れる第一歩を踏み出したいと思います。

Discussion