msksgm’s blog

msksgm’s blog

Webエンジニアです。日々の勉強記録、技術書感想、美術観賞感想を投稿します。

「実践ドメイン駆動設計」感想

概要

実践ドメイン駆動設計」(以下、IDDD 本)を読みました。 前提(ドメイン駆動設計(以下、DDD)の経験、読了時間)、感想、DDD で実践していること、次に DDD で勉強すること、を記述します。

前提

DDD の経験

DDD の関連書籍では以下の本を読んだ経験があります。 特に、この本を読む前に「ドメイン駆動設計モデリング/実装ガイド」(以下、松岡本)を熟読しました。松岡本を題材にして、知り合いの間で勉強会も実施しました。

DDD の原典である「エリック・エヴァンスのドメイン駆動設計」(以下、エヴァンス本)は読んでいません。 もともと、IDDD 本はエヴァンス本よりも先に読むことを決めていました。

書籍以外の経験では、読書開始時点では、戦略的 DDD は業務でモデリングの実践を提案し、戦術的 DDD は本で読んだ以上の知識はありませんでした。

目的

以下の効果が得られることを目的に読み始めました。

  • エヴァンス本よりも先に読むことで、エヴァンス本を読む際に具体的なことから抽象的なことを理解できるようにする
  • 実践的な内容を学び、既に読んだ DDD の書籍を復習、知識の定着につなげる
  • 複数の境界づけられたコンテキストを想定した DDD の実践方法を学ぶ

読了時間

知り合いの間で勉強会を企画し、自身がファシリテーターとして進めました。 ファシリテーターの役割は当日の司会進行、勉強範囲の要約、意見だしなどです。 ペース配分は全 14 章を 14 週間にわけて読み進めていきました。1 週 1 章ペースです。 1 週間に 8 時間かけて予習して、当日 2 時間ぐらい勉強会をしたので、大体(8 + 2)時間 × 14 週で 140 時間かけました。 また、この本を読むにあたって、「『実践ドメイン駆動設計』から学ぶ DDD の実装入門」(以下、副読本)を副読書として扱い、勉強会を進行しました。 勉強会については、後日 zenn にまとめようと考えています。

あらかじめ勉強会メンバーで、松岡本の勉強会をおこなっていました。 DDD に関する基礎的な知識の認識合わせをするためです。 こちらも自身がファシリテーターを務めて、期間は 3 週間ほどでした。 準備時間は 4 時間から 6 時間で当日 2 時間の勉強会でした。なので、大体(6 + 2)時間 × 3 週で 24 時間かけました。

他には「ドメイン駆動設計入門」(以下、成瀬本)を個人的な副読本 2 冊目として使っていました。 成瀬本はサンプルコードが多く、戦略的 DDD のリファレンスになります。 そのため、IDDD 本で該当する章を読み終えたら、成瀬本のサンプルコード(C#)を Go でリプレイスすることで、知識の定着と実装時の肌感を覚えようとしました。そのため、実際にかけた時間は 200 時間ぐらいだと見積もっています。 実装したソースコードは zenn に解説記事を投稿し、GitHub のリンクも載せています。

以下は、IDDD 本と成瀬本の対応です。

ドメインオブジェクト IDDD 本 成瀬本 zenn
エンティティ 第 5 章 Chapter3 リンク
値オブジェクト 第 6 章 Chapter2 リンク
ドメインサービス 第 7 章 Chapter4 リンク
ファクトリ 第 11 章 Chapter9 リンク
リポジトリ 第 12 章 Chapter5 リンク
アプリケーションサービス 第 14 章 Chapter6 リンク
集約 第 10 章 Chapter12 リンク

感想

この本を熟読することで、確実に DDD の知見を深め、レベルアップできると思いました。 読了時間にも書いた通り、200 時間ぐらい DDD に時間を費やしたので、戦略的 DDD と戦術的 DDD の考え方を体に染み込ませることができました。 その結果、目的の「実践的な内容を学び、既に読んだ DDD の書籍を復習、知識の定着につなげる」「複数の境界づけられたコンテキストを想定した DDD の実践方法を学ぶ」を達成しました。 「エヴァンス本よりも先に読むことで、エヴァンス本を読む際に具体的なことから抽象的なことを理解できるようにする」も、具体的な内容を学べたので、エヴァンス本が読みやすくなったのではないかと考えています。 また、DDD 界隈でエヴァンス本と並んで評価されている IDDD 本を 14 週間かけて読み切ったことは自信にもつながりました。

DDD の入門書だけを読んで満足している人、次に読む書籍を探している人、エヴァンス本を読むことに尻込みしている人にぜひ読んでほしい内容です。 なぜなら、入門書では基本的すぎる例だったり抽象的な説明だったりする場合が多いからです。 そうすると、戦術的 DDD の実装パターンの理解が間違っていたり、戦略的 DDD のモデリングが軽視されたりします。結果、DDD に対して曖昧な認識になってしまう印象を持っています。 IDDD 本では戦術的 DDD、戦略的 DDD ともに1つの項目につき、どの書籍よりも詳細な解説がされるので、知見を深められます。 加えて、IDDD 本では、SaaSOvation というプロダクトを DDD によって解決していく様子をストーリー形式で学びます。 戦略的 DDD が本当に解決しようとしてしていること発見し、戦術的 DDD によって具体的にソースコードに落とし込んでいくため、実践的なことを学べます。これは DDD の目的の 1 つである継続的な改善をおこなっていることになります。 他にも、完成したサンプルコードも GitHub に上がっているため、解説した項目がどのように繋がっていくのかわかります。

読み進めるには、副読本を持っていることは必須です。IDDD 本の解説で抽象的すぎたり日本語がわかりづらかったりする部分をわかりやすく解説してくれます。 副読本の参考文献に、数多くの資料が載せられており、これらを探す手間が省けたと実感できます。 1 つ難点を言えば、IDDD 本の内容から省略されている部分が数多くあります。そのため、IDDD 本で気になった部分を知れない場合もあります。 しかし、それを差し引いても IDDD 本を理解するための心強い味方になってくれます。 加えて、松岡本をあらかじめ読んでおくことを強く推奨します。なぜなら、DDD 入門書として適切な薄さで、DDD について一通り学ぶことができるからです。 IDDD 本を読むときに、初見の単語や原則をあらかじめ省いておけるので、心理的な負担を減らすことができます。 あと、自分は経験がありませんでしたが、メッセージ基盤に関する知識があると「アーキテクチャ」「ドメインイベント」「境界づけられたコンテキストの統合」あたりを読む際に楽だと思いました。

この本を読む上で特筆する注意事項は、エヴァンス本の一解釈であることを認識することだと思いました。 また、日本語が読みづらかったり技術が古かったりするのも難点でした。 これについて詳細は後述します。

IDDD 本を人に薦めるなら、以下のように説明します。

  • DDD の具体例が多くて良い本
  • 詳細な説明は日本語で書かれた他書籍のどれよりも勉強になる
  • 具体から抽象の順番で学びたい人は、IDDD 本からエヴァンス本を読むことを推奨する(自分はエヴァンス本を読んでいませんが)
  • しかし、IDDD 本を読んでもエヴァンス本を読まなくて良い理由にはならない
  • しっかり読もうとすると相当時間がかかるので、時間がかかるのでエヴァンス本だけでも良い(理解にかかる時間の差はわかりませんが)
  • 理解度が変わるため、GitHub のサンプルコードは読んだ方がいい
  • 推薦する理由は多いが難解な本なので、DDD を学習する 1 冊目には向かない。松岡本から読んだ方が良い

より具体的に良かった点と悪かった点について記述します。

良かった点

全体を通して良かったといえることは、戦略的 DDD と戦術的 DDD に対して深い洞察と詳細な解説があることです。この本は全 14 章のうち、最初の 3 章が戦略的 DDD、残りの 11 章が戦術的 DDD の内容です。 具体的に良かった点は 3 つあります。 それぞれ記述します。

1 つめは戦略的 DDD についてです。 3 章(100 ページほど)にわたって、戦略的 DDD の必要性、やり方について解説していることが良かったです。 他の書籍では軽く扱われがちな戦略的 DDD についてしっかり触れます。 具体的には以下について知ることができます。

  • DDD 必要とする基準
  • 導入するにあたっての課題
  • ユビキタス言語
  • 境界づけられたコンテキストを定めることによって得られるもの
  • ドメインサブドメイン、コアドメイン
  • なぜ SaaSOvation は最初失敗しそうになったのか

特にドメインサブドメイン、コアドメインを定めることによって、ビジネス的な優位性、リソース配分なども考えられることは、ビジネス側との意思疎通にも繋がり非常に有用なメソッドだと考えました。 また、コンテキストマップによって境界づけられたコンテキストの関係(「巨大な泥団子」「顧客/供給者」「公開ホストサービス」「公表された言語」)を定義します。 コンテキストマップはシステムを俯瞰してみることができる一助になり、技術的な影響範囲の方向性、どちら側に腐敗防止層を実装するのかわかるようになります。 大規模かつ複雑なシステムの設計を目的にしている IDDD 本のストーリーで、その重要性について理解し、DDD に関係なく普段の業務でボトルネックになっている理由を気づけるようになりました。

2 つめは戦術的 DDD についてです。 他のどの書籍よりも戦術的 DDD について詳細な解説がされます。 例えば、入門書では「同一性を気にするのがエンティティです」という解説がよくあります。 それ自体は間違っていないですが、IDDD 本ではそれに加えて以下のようなことも解説します。

  • 同一性を判断するための一意な識別子はどのように生成するのか
  • エンティティは DB に保存する前後のどちらのタイミングなのか
  • そのドメインオブジェクトは本当にエンティティなのか

他にも以下のような戦術的 DDD の実装方法で紹介し、割と簡単に説明されがちなドメインオブジェクトに対して詳細なユースケースを記述しています。

  • ドメインサービスはステートレスでユビキタス言語の名前をつける(機械的に HogeService みたいな名前をつけない)
  • ファクトリはドメインオブジェクトの保存と生成で使われるタイミングが違う
  • 値オブジェクトの 5 つの特性、永続化の方法

一概に「ドメインオブジェクトについて理解した」と思っている人でもこの本で初めて知る原則やユースケースも多いと考えています。 特に第 8 章の「ドメインイベント」というエヴァンス本では記述されていない内容です。 メッセージング基盤を使った境界づけられたコンテキストの統合(通信)は、日本語資料の解説をあまり見たことがありません。 境界づけられたコンテキスト間の通信方法の知見だけでなく、DDD からマイクロサービスへの導入にもつながる知見も得られました。 関連して、第 13 章の「境界づけられたコンテキストの統合」は、Rest API による統合とメッセージング基盤を使った統合は、実利用を想定した場合、考慮するのが必須の項目だと考えています。そのため、この章は非常に参考になりました。

3 つめは一貫してヘキサゴナルアーキテクチャを用いた、層の役割、依存の分離の解説です。 クリーンアーキテクチャ、オニオンアーキテクチャについて解説した書籍、ネットの記事はあります。 しかし、どのようにわけて実装していくのかについて逐一具体的に述べた解説はほとんどないでしょうか。 この書籍ではヘキサゴナルアーキテクチャを用いて解説をします。どこにインタフェースを配置するのか、腐敗防止層はどうするのかを納得感を持ちながら読み進めることができました。 読み終えた今は全てのアーキテクチャがヘキサゴナルアーキテクチャでいいのではないかという気持ちになります。

他には、読み切ろうと思える内容だったことがよかった点です。 難しい本は最後まで読もうとすると本当に使わない知識だったり、難しすぎる内容が数多くでてきて心が折れたりします。 その点にいて、IDDD 本は内容が良かったため最後まで読み切れました。

まとめると、戦略的 DDD と戦術的 DDD の両方でレベルアップができることは間違いないので良書だと感じました。

悪かった点

悪かった点は 4 つあります。

1 つめは、文章についてです。副読本が必須になっている理由の 1 つは IDDD の文章が悪いからです。 より具体的にいうなら、以下があげられます。

  • 長い
  • 日本語訳でよくわからない箇所がある
  • 英語の本でありがちな独特な言い回しがきつい

「長い」は付録を除いても 519 ページあるからです。ページ数だけでなく文字も小さいため、1 ページ読むのにも時間がかかります。そのため心理的負担が大きいです。全て読むことが必須というわけでもなく、冗長に感じる部分も多くあります。 「日本語訳でよくわらない箇所がある」は、その意味の通りです。日本語訳が 2015 年、原著が 2013 年に出版されています。当時の英語書籍は読みづらい印象が多いです。なので仕方がない部分だとも考えられます。致命的に読めないはほとんどないですが、同じ意味の違う言葉がでてきたり、初見の単語がでてきたりと、時間がかかる理由になります。 「英語の本でありがちな独特な言い回しがきつい」は、個人的に端的な文章の方が理解しやすいから書きました。

2 つめは、IDDD 本もエヴァンス本の一解釈であることです。 エヴァンス本が伝えたいことを反影していると言われており、エヴァンス本人が IDDD 本にコメントを寄稿しています。 しかし、それらを踏まえてもあくまで著者(ヴォーン・ヴァーノン)の経験則と思想が入っている部分が散見されます。 戦術的 DDD も戦略的 DDD の両方とも深い知見を得られたと実感していますが、納得できない部分もありました。 なので、読むにあたっては自身が納得できるラインや真似しようと思えるラインを持つ必要があります。

3 つめは、使用技術が古いことです。 使用言語は Java 7 で O/R マッパに Hibernate を使用しています。 本の出版日が 2013 年なので仕方ない部分がありますが、Java 7 は古すぎますし、Hibernate は最新版が 2016 年で止まっているため書籍のために学ぶにはハードルが高いです。 加えて、書籍に掲載しているサンプルコードと GitHub のサンプルコードが対応していない部分があります。 GitHub 更新されたログがないので、書籍の出版時点で修正するか、第 2 版を出版してほしいです。

4 つめは、第 8 章「ドメインイベント」を終えたあたりから、内容が薄くなってくることです。 その時点で、DDD で守るべきことを一通り学び、繰り返し実践例を見ているので、同じ内容を繰り返し学んでいるようになります。 そのため、途中から得られるものが減ってきて飽きてきます。 山場は割と中盤あたりまでということを意識して読んだほうがいいと思いました。

どの不満点も、IDDD 本を読む心理的なハードルになります。 致命的な欠点ではありませんが、難解な書籍だと思って読んだ方がいいです。

DDD で実践していること

この本を読む一方で以下のことにも取り組んでいました。 どれも、DDD 導入のデメリットのコスト(周囲の合意と時間をとる、ソースコードが増える、など)がかかりました。 しかし、それを差し引いてもメリットがあると考えています。 業務においては、まだ完遂していませんが、この調子で継続していきます。

次に DDD で勉強すること

DDD について次を勉強するつもりです。全体的に以前よりも難しい部分に手を出せるようになったと感じています。

  • エヴァンス本を読む
    • ようやく DDD の原典に挑戦できる土台ができたと考えている
  • DDD を実践する
  • DB に対する知見(設計、パフォーマンス、SQL)を得る
    • DB 設計をアプリ設計に依存させない知識が必要だと感じている
  • ドメインイベントについて学ぶ
    • 一番面白かった分野のため。「マイクロサービスパターン」が良さそう
  • DDD の知見をさらに深める
    • 「Learning Domain-Driven Design」「Domain Modeling Made Functional」あたりが気になる

まとめ

  • 戦略的 DDD、戦術的 DDD の両方について、知見を深めることができる良書だった
  • 読みにくい部分、技術的に古い部分が多く読み切るには気合が必要(副読本が必須)
  • IDDD 本完読後もエヴァンス本を読むことは必須
  • エヴァンス本に並んで評価されている書籍を読み切ることができたのは、自信につながった
  • DDD をより発展させた部分に手を出せるようになった
  • 業務に落とし込んで実践できるようになった