ドメイン駆動設計をざっくり把握したい①
DDDをざっくりまとめておく必要があったので、メモがてらまとめる。
前提
「ソフトウェア開発とは、恐ろしく複雑である」
という事実を真正面から向き合うための方法論。
全プログラマが泣いた建築士がプログラマーのごとく働かねばならぬとしたらという秀逸な例え。
デジタルサービスを事業としている会社にとって「ソフトウェアは事業そのもの」
といえる。
経営がソフトウェアを理解するのも大事だし、開発者が経営を理解するのも大事。
それがそのまま対象ドメインでの競争力になる。
DDDとは
DDD(ドメイン駆動設計)とは、Domain Driven Design の略でソフトウェア開発手法です。
GoFのようなデザインパターンではなく、ソフトウェア設計の概念です。
DDDの登場人物
DDD導入メリット(事業)
開発費用がコスト
から事業投資
へ置き換わる。
- 開発者とドメインエキスパートが共通言語(ユビキタス言語)を用いて視点を揃えることにより、ワンチームであたかも顧客が開発するようにソフトウェアを開発できる
- ドメインエキスパートですら理解が浅い業務ドメインの知識を、チームで共有し開発者視点も含め検討することにより、顧客の理想を超えるソフトウェアを開発できる
- 対象ドメインの複雑さを
ドメインモデル
というDDDの概念を用いて緩和する事ができる - DDDは、
設計がコードであり、且つコードが設計である
と表現されるように、開発時の翻訳コストが減り、実装時の課題を設計段階で気づくことが出来る - DDDは、アジャイル開発が前提なので、イテレーティブでインクリメンタルな開発を行うことが出来る
DDD導入メリット(人物)
各人の望むことが手に入る可能性が高まる。
- 開発者
- 適切で正しいソフトウェア開発手法を用いて、スキルアップしながら楽しく開発したい
- シニア開発者
- 開発者とドメインエキスパートの距離を縮め、事業価値を向上させたい
- ドメインエキスパート
- 開発者とコミュニケーションをスムーズに行い、顧客に喜ばれるソフトウェアを開発したい
- マネージャー
- 開発者が業務知識を得て、ドメインエキスパートが開発力を理解し、協力して結果を出してほしい
DDD導入メリット(具体例)
- 従来
- ドメインエキスパートが話す言葉と開発者の言葉が違い、実装内容にズレが生じる
- 1つの大きなシステムのため、実装(プログラム)が肥大化する
- 処理主体のトランザクションスクリプトでは、変更を入れる際のリスクと工数が肥大化する
1つの大きなシステムのため、DB(永続化層)が肥大化する
DDD
- ドメインエキスパートと開発者で共通言語(ユビキタス言語)で会話したとおりに実装できる
- ドメインとコンテキストを適切に分割することで、業務知識ごとに機能を分離することが出来る
- 業務知識を抽象化した
ドメインモデル
を用い開発を行うため、見通しがよく変化に強くなる - ドメインとコンテキストを適切に分割することで、永続化ストレージ(RDB/NoSQL等)を適切に分離することが出来る