Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AI時代 DDDやってて良かったこと

Avatar for Suzu Ito Suzu Ito
August 19, 2026
730

AI時代 DDDやってて良かったこと

Avatar for Suzu Ito

Suzu Ito

August 19, 2026

Transcript

  1. サービス概要 カウシェ SNSのように 毎⽇開きたくなるECアプリ ダウンロード 累 計 700万 突 破

    ※2026年7⽉時点 GMV DAU 35 倍 81 倍 ※FY23.8⽉→FY26.5⽉⽐較 ※FY23.8⽉→FY26.5⽉⽐較 売上総利益 売上総利益/⼈ 411 倍 1.6 億 ※FY23.8⽉→FY26.5⽉⽐較 ※FY26.5⽉速報値を年換算
  2. DDDをどのように実践しているか 開発の流れ • • • • • • • •

    • • PRD(1つの機能、施策)が共有される(開発スタート!) 簡易版イベントストーミング ドメインモデル構築 ドメインモデル実装(Goのソースコード) Design Docの作成 実装計画の作成(AIにコードを書かせるための⼿順書) AIがコードを書く AIがレビューする QA リリース
  3. ドメインモデル実装 モデルを表現する構造体 モデルの振る舞いを表現する関数 ルール レポジトリインターフェース もドメイン層 ドメインモデル実装は ⼈間が⼿厚くレビュー // ユーザーのレベルと経験値

    type UserLevel struct { UserID string // ユーザーID Level Level // レベル Exp Exp // 経験値 } // 経験値を獲得、場合によってはレベルアップ、経験値獲得の履歴を返す func(s *UserLevel) GainExp(exp Exp, rule LevelUpRule) History // レベルアップのルール type LevelUpRule struct { Steps []LevelUpStep } type LevelUpStep struct { Level Level // レベル RequiredTotal Exp // 必要累計経験値 } // 永続化を担うレポジトリー type Repository interface { GetUserLevel(uid string) (UserLevel, error) PutUserLevel(uid string, lv UserLevel) error PutHistory(hist History) error }
  4. 上位レイヤーではCQRS(‧‧‧を⽬指してる) domain/ farmlevel/*.go plants/*.go … CommandとQueryを完全に分離 (‧‧‧を⽬指しています) command/*.go なぜこうする? readmodel/

    farmlevel/*.go plants/*.go … query/*.go ドメインモデルはCommand側 (Queryから参照されない) データ読み取り(Query)要件によって ドメインモデルの実装が汚染されることを防⽌したい 読み(⾼トラフィック、低レイテンシー) 書き(⼀貫性、ソースコードのシンプルさ) それぞれで最適化したい 上位レイヤーはドメインモデルを⽤いたトランザクションスクリプト レポジトリへのデータ読み書き、トランザクション管理 ハンドラーへのデータ返却