ドメイン駆動設計:ドメインの分析
はじめに
ドメイン駆動設計(Domain-Driven Design、DDD)は、ソフトウェア設計がドメイン(事業領域)に基づいて行われることを重視するアプローチです。トップダウンの開発と異なり、まずドメインの深い理解が求められます。
本記事の内容は、『ドメイン駆動設計をはじめよう ―ソフトウェアの実装と事業戦略を結びつける実践技法』を基にしています。この書籍はドメイン駆動設計の基本的な概念や実践的な手法を深く理解するのに非常に役立ちました。興味がある方はぜひご一読ください。
ドメインとは
ドメインとは、企業が活動する事業領域のことです。例えば、Spotifyであれば「音楽ストリーミングサービス」がドメインになります。Amazonのように、ネット通販とAWSのような複数の事業領域を持つ企業もあります。また、Netflixのように、郵送DVDレンタル事業からインターネットストリーミングサービスへと事業領域が変化することもあります。
サブドメインとは
サブドメインは、ドメインを細分化したものです。参考書籍では、ドメインは「事業領域」、サブドメインは「業務領域」と訳されています。複数のサブドメインが連携することで、企業はサービスをユーザーに提供できます。例えば、音楽ストリーミングサービスでは、音楽レコメンドエンジン、ストリーミングシステム、ユーザー管理、プレイリスト管理、会計、決済、認証と認可などがサブドメインとして挙げられます。
サブドメインの分類
サブドメインは、中核サブドメイン、汎用サブドメイン、補完サブドメインに分類されます。
中核サブドメイン(Core Subdomain)
中核サブドメインは、事業戦略の中心となるサブドメインです。中核サブドメインでは、参入障壁を高くして競合他社が模倣しにくい独自の仕組みを作る必要があるため、必然的に複雑な業務ルールやアルゴリズムが含まれることになります。自社の業績を生み出す領域になるため、会社はこのサブドメインに戦略的に取り組む必要があります。また、競争優位性を保つためには、中核サブドメインを持続的に発展させていくことが必要なため、常にソフトウェアへの機能追加や既存機能の最適化が行われます。
汎用サブドメイン(Generic Subdomain)
汎用サブドメインは、他社でも同様の方法で解決できる課題を含む領域になります。汎用サブドメインの業務ロジックは複雑な場合がありますが、競争優位性を直接生み出すものではありません。この領域のソフトウェアは複雑になることが多く簡単には作れないため、独自で開発するのではなく、実績のある外部のパッケージ製品やクラウドサービスなどを用いるのが効果的です。
補完サブドメイン(Supporting Subdomain)
補完サブドメインは、事業活動を支える上で必要なサブドメインですが、単純で競争優位性を生み出さない領域になります。業務ロジックは単純なCRUD機能が中心となることが多いです。この領域は競争優位性には繋がらないため、参入障壁を作る必要はありません。
ドメイン分析の具体例
上記のサブドメインの分析例として、ホテル予約サービスの事業を考えてみると、以下のように分類できそうです。
中核サブドメイン
- 予約検索・比較エンジン
ユーザーが特定の条件でホテルを検索し、価格、立地、レビューなどを比較できる機能。これにより、ユーザーは最適なホテルを見つけやすくなり、サービスの競争力を高めています。 - ユーザー体験の最適化
ユーザーインターフェース(UI)とユーザーエクスペリエンス(UX)の設計。予約プロセスをシンプルかつ快適にすることで、ユーザーの満足度を高め、リピート利用を促進します。 - パーソナライズされたレコメンド機能
過去の予約履歴やユーザーの嗜好に基づいて、ユーザーに合った宿泊施設を提案する機能。これにより、顧客のエンゲージメントが向上し、サービスの差別化が図られます。
汎用サブドメイン
- 決済システム
予約時の支払いを処理するシステム。これは一般的な機能であり、外部の決済ゲートウェイ(例: PayPal、Stripe)を利用することで実装されます。競争優位性には直接関係しません。 - ユーザー認証・認可システム
ログイン、ユーザーアカウント管理、アクセス権管理を行うシステム。多くのオンラインサービスで見られる一般的な機能です。
補完サブドメイン
- レビュー・フィードバックシステム
宿泊施設に対するユーザーレビューやフィードバックを収集し、表示する機能。競争優位性に関係はしないです。Googleレビューなどを用いて汎用サブドメインに移動できる可能性があります。 - バックオフィスの管理システム
ホテルや宿泊施設の在庫(空室)管理や、契約状況の管理を行うシステム。サービス提供に必須ですが、独自性や競争力には関与しない領域です。 - カスタマーサポート管理
ユーザーからの問い合わせやトラブル対応を管理するシステム。業務をサポートするために必要ですが、競争優位性には直接影響しません。
各サブドメインごとの開発方針
中核サブドメインのソフトウェアは、競争優位性を確保するために、変更や進化が容易である必要があります。そのため、先進的な開発方法を取り入れた自社での開発が望ましく、外部委託や汎用パッケージの利用は避けるべきです。
汎用サブドメインは、業務ロジックは複雑ですが、様々な解決方法が存在します。この領域は競争優位性を生み出さないため、効率が重要になります。自社で開発するよりも、パッケージ製品やオープンソースソフトウェアを利用する方が費用対効果が高い場合が多いです。
補完サブドメインも競争優位性を生み出さないため、効率を重視します。ただし、汎用サブドメインのような適切なパッケージ製品やクラウドサービスがないため、自社で開発をするか、外部に開発を委託する必要があります。ロジックは単純で変更が少ないため、緻密な設計や高度な開発技法は不要であり、フレームワークを用いて業務ロジックを実装すれば十分です。
サブドメインの分類方法
サブドメインは、企業の事業戦略に基づいて分類されます。その境界を見極めるには、事業活動の詳細な分析が必要です。例えば、会社の組織図を調査することが有効な出発点となります。オンライン販売の会社であれば、倉庫、顧客サービス、出荷、配送、品質管理、販売促進などの部門があるはずです。まずそれらを出発点として、更にそれぞれを分析してより細かいサブドメインに分類していくことができます。
どこまで分類すべきか
サブドメインは、関連性の強いユースケース(同じアクターが関与し、同じ外部システムと繋がり、密接に関係するデータを操作するユースケース同士)の集まりになります。そのため、サブドメインを強く関係したユースケースの集まりになるまで細分化すれば、境界としては正確になります。
サブドメインの分類は、特に中核サブドメインにおいて正確さが求められます。この正確な分類により、汎用サブドメインや補完サブドメインを切り離して競争優位性を与える領域に最大限注力することが可能になります。汎用サブドメインや補完サブドメインについては、過度に正確に深掘りする必要はありません。ソフトウェアの設計判断に影響する発見がなくなれば、それ以上分割する必要はありません。
ドメインエキスパート
ドメインエキスパートは、ドメイン、あるいはサブドメインの活動に精通した人たちで、その分野におけるプロセス、ルール、課題、機会を理解しています。彼らが提供する情報に基づいてドメインの分析を行うことで、開発チームはソフトウェアを設計・実装し、ビジネスのゴールを達成することができます。業務エキスパートと開発チームの緊密な連携が、ドメイン駆動設計における質の高いソフトウェア開発を支える基盤となります。
終わりに
ドメイン駆動設計は、単なる技術的な設計手法ではなく、ビジネスと技術を結びつけるための強力なアプローチです。このアプローチを適切に導入することで、ソフトウェアが単なるツールにとどまらず、企業の競争力を高める重要な資産となります。特に、中核サブドメインに焦点を当て、そこにリソースを集中させることで、競争優位性を築くことが可能です。
Discussion