■ 1. プロジェクト概要と技術選定
- チームのミッション: 新規プロダクトのAPIプラットフォームチームとして、変更容易性の高いAPIを作成し、素早い仮説検証サイクルを回せるものづくり体制を実現することを目指している
- 開発体制: PO、SM、開発者4名のスクラム体制で、複数のフロントチームと連携し、モノレポ構成で開発を進めている
- Go採用理由: 弊社のバックエンド推奨言語として、標準化(組織全体での技術統一)、省力化(開発効率の向上)、最新化(技術スタックの継続的な改善)の3つの基本方針に基づきGoを採用し、パフォーマンスと安定性が求められるバックエンドAPIでの豊富な採用実績がある
■ 2. ドメイン駆動設計の基礎概念
- DDDの定義: 事業領域を対象に、意図の伝達を円滑にし、事業戦略とソフトウェアの実装を結びつける設計手法であり、アジャイルとの相性が良く市場や戦略の変化に柔軟に適応できる
- 戦略的設計と戦術的設計: Why・WhatとHowの関係性を明確化し、事業目標達成のために事業活動を分析してドメインを細分化した業務領域(サブドメイン)を定義する
- 境界付けられたコンテキスト: ソフトウェア設計の視点から事業活動モデルを扱いやすい単位にするため、ドメインを分解したものである
- ドメインモデルと業務ロジック: 中核の業務領域を対象に複雑な業務ロジックを扱うための設計手法であり、業務領域におけるルールや前提条件、制約を値オブジェクト、集約、業務サービスで扱う
■ 3. Go × DDDの相性
- Goの言語特性: シンプルで明示的な言語仕様により暗黙的な魔法が少なく意図をコードにそのまま表現でき、後方互換性の高さと豊富な標準ライブラリによりドメインロジックの継続的な改善に集中できる
- 設計の自由度: フレームワークに縛られず、アーキテクチャを自分たちのドメインに合わせて構築でき、ドメインモデルのような単純なオブジェクト中心の設計と本質的に相性が良い
- 依存関係逆転の原則: Goのinterfaceは、ポートとアダプターの分離を自然に表現でき、実装ではなく抽象に依存する構造(依存の整合性)を型システム自体で保証できる
■ 4. ドメインモデルの実装
- 実装例: AIを使用してユーザーの悩み解決におすすめの書籍をピックアップする機能で、中核の業務領域は「Recommendation(レコメンド)」であり、「お気に入りリスト」「ユーザープロファイル」と連携する
- 主要コンポーネント: 不変性を持つドメインの値を表現する値オブジェクト、トランザクション境界を表現する集約(粒度が大きすぎるとパフォーマンス悪化、小さすぎると結果整合の制御が増え設計コストが高くなる)、ドメイン固有のロジックを実装する業務サービスで構成される
- 物理的な境界: 1BCに対しスキーマ群を設定し、1集約1リポジトリで永続化の単位は集約とし、BCに対してマイクロサービスを適用してモノレポでBCごとにモジュール化している
- 実践ポイント: フィールド非公開と慣習的なファクトリメソッドを使用し、スライスやマップを扱う場合は外部へ渡す前に必ずコピーするなど不変性を意識し、アプリケーションサービスは薄くして業務ロジックはドメイン層で実装する
■ 5. 開発課題と取り組み
- 理解促進の取り組み: ドメイン駆動設計の理解における課題に対し、プロジェクトの価値や目的を自分の言葉で再定義して所属チームレベルにブレイクダウンし、企画職の方と日次15分間理解を深める枠を設定した
- 学習活動: 「ドメイン駆動設計をはじめよう」をチーム全員で読み用語自体の勉強会を実施し、AWSワークショップと社内でのイベントストーミングを実施した
- AI活用: Claude Codeでの開発を実施し、構想中の取り組みとして速さを落とさず基盤的内容変更の共通認識を最短ループで回すことを目的に、CLAUDE.mdに人もAIも認識しておきたい内容を記載し、Claude Code Actionsを使用してPR作成時に「CLAUDE.mdのルール準拠チェック」「追記要否判定」を実施する計画がある
■ 6. まとめ
- 核心メッセージ: AIにより素早い仮説検証が可能となった今だからこそ、ドメインを基にした「本質的な設計」の重要性が高まっている
- Go × DDDの価値: 共通言語となるモデルによりチーム間のコミュニケーションが円滑化し、変更容易性の高いシステムで市場変化への迅速な対応が可能となり、後方互換性の高い言語仕様で長期的な保守性が確保され、設計の自由度によりドメインに最適化されたアーキテクチャの実現ができる