パパエンジニアのポエム

奥さんと娘ちゃんへの愛が止まらない

ドメイン駆動設計をざっくり把握したい①

DDDをざっくりまとめておく必要があったので、メモがてらまとめる。

前提

「ソフトウェア開発とは、恐ろしく複雑である」という事実を真正面から向き合うための方法論。
プログラマが泣いた建築士がプログラマーのごとく働かねばならぬとしたらという秀逸な例え。

デジタルサービスを事業としている会社にとって「ソフトウェアは事業そのもの」といえる。
経営がソフトウェアを理解するのも大事だし、開発者が経営を理解するのも大事。
それがそのまま対象ドメインでの競争力になる。

DDDとは

DDD(ドメイン駆動設計)とは、Domain Driven Design の略でソフトウェア開発手法です。
GoFのようなデザインパターンではなく、ソフトウェア設計の概念です。

DDDの登場人物

  • 開発者
    • ソフトウェアを開発する人
  • ドメインエキスパート
    • ソフトウェアが対象とする業務領域(ドメイン)について業務知識を有する人

DDD導入メリット(事業)

開発費用がコストから事業投資へ置き換わる。

  • 開発者とドメインエキスパートが共通言語(ユビキタス言語)を用いて視点を揃えることにより、ワンチームであたかも顧客が開発するようにソフトウェアを開発できる
  • ドメインエキスパートですら理解が浅い業務ドメインの知識を、チームで共有し開発者視点も含め検討することにより、顧客の理想を超えるソフトウェアを開発できる
  • 対象ドメインの複雑さをドメインモデルというDDDの概念を用いて緩和する事ができる
  • DDDは、設計がコードであり、且つコードが設計であると表現されるように、開発時の翻訳コストが減り、実装時の課題を設計段階で気づくことが出来る
  • DDDは、アジャイル開発が前提なので、イテレーティブでインクリメンタルな開発を行うことが出来る

DDD導入メリット(人物)

各人の望むことが手に入る可能性が高まる。

  • 開発者
    • 適切で正しいソフトウェア開発手法を用いて、スキルアップしながら楽しく開発したい
  • シニア開発者
    • 開発者とドメインエキスパートの距離を縮め、事業価値を向上させたい
  • ドメインエキスパート
    • 開発者とコミュニケーションをスムーズに行い、顧客に喜ばれるソフトウェアを開発したい
  • マネージャー
    • 開発者が業務知識を得て、ドメインエキスパートが開発力を理解し、協力して結果を出してほしい

DDD導入メリット(具体例)

  • 従来
  • ドメインエキスパートが話す言葉と開発者の言葉が違い、実装内容にズレが生じる
  • 1つの大きなシステムのため、実装(プログラム)が肥大化する
  • 処理主体のトランザクションスクリプトでは、変更を入れる際のリスクと工数が肥大化する
  • 1つの大きなシステムのため、DB(永続化層)が肥大化する

  • DDD

  • ドメインエキスパートと開発者で共通言語(ユビキタス言語)で会話したとおりに実装できる
  • ドメインとコンテキストを適切に分割することで、業務知識ごとに機能を分離することが出来る
  • 業務知識を抽象化したドメインモデルを用い開発を行うため、見通しがよく変化に強くなる
  • ドメインとコンテキストを適切に分割することで、永続化ストレージ(RDB/NoSQL等)を適切に分離することが出来る

DDD用語集

  • ドメイン
    • ソフトウェアが対象とする業務領域のこと
  • ドメインモデル
    • 業務知識に則り、ドメインの名前や振る舞いが、適切に反映されている概念的なモデル
    • ドメインモデルをコードに落とし込むとソフトウェアモデル(OOPの場合エンティティモデル)となる
  • 境界づけられたコンテキスト
  • ユビキタス言語
    • ドメインエキスパートや開発者を含めたチームで共有する言語のこと
    • 名詞だけでなく形容詞や動詞も含まれる
    • 境界づけられたコンテキスト内で一意であれば良い
  • 戦略的設計
    • ユビキタス言語、境界づけられたコンテキスト、コンテキストマップを用いた抽象的なソフトウェア設計の総称
  • 戦術的設計
    • レイヤ化アーキテクチャ、エンティティ、サービス等の具体的なソフトウェア設計の総称