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

DDD‗20250716_traP×DMM

 DDD‗20250716_traP×DMM

Avatar for DMM.com_新卒採用

DMM.com_新卒採用

July 16, 2025
Tweet

Transcript

  1. © DMM このスライドの目的 • ドメイン駆動設計を実践しようと思えるようになること • 「DDD?なにそれ?こわい...」な状態から「DDD?ちょっとわかる」に • それぞれの環境にあった方法で実践を •

    ドメインモデリング会を開いてみる • ドメイン駆動設計勉強会を開いてみる • あえて「ドメイン駆動設計」という単語を使わずに普及させてく • など 3
  2. © DMM 目次 • 第1部 ドメイン駆動設計のなりたち • 第2部 事業の “中核”

    を分析しよう • 第3部 “同じ言葉” を使おう • 第4部 “区切られた文脈” で分解しよう 5
  3. © DMM 戦略と戦術 9 戦略 大局的にどう動くか 戦術 局所的にどう動くか • がんがんいこうぜ

    • いのちだいじに • じゅもんつかうな 1. はじまりの町 2. ダンジョン 3. ラスボス
  4. © DMM ドメイン駆動設計の分類 大きく2つに分かれます • 戦略的設計 ◦ 業務領域を分類したり、同じ言葉(ユビキタス言語)を使ったり、ドメイン駆動設 計の根幹となる思想や指針に関すること •

    戦術的設計 ◦ 戦略的設計を実現するにあたって、コードに落とし込む際の実装テクニックなど のこと 10 この講義では戦略的設計を扱っていきます
  5. © DMM 2003年頃の開発 14 1999年: Extreme Programming 出版(いわゆるXP) 2001年: アジャイルソフトウェア開発宣言

    2002年: Patterns of Enterprise Application Architecture(PoEAA)出版 ←これに「値オブジェクト」「ドメイン モデル」などが!
  6. © DMM 2003年頃の開発 15 1999年: Extreme Programming 出版(いわゆるXP) 2001年: アジャイルソフトウェア開発宣言

    2002年: Patterns of Enterprise Application Architecture(PoEAA)出版 2004年: Ruby on Rails 公開
  7. © DMM 2.言葉の乖離 • ビジネス、業務領域に詳しい人、プログラマーで同じ言葉を使っていない • => 随時翻訳が必要 • =>

    同じ言葉を指しておらず、違う方を向いているので改善もされない 25 この案件では... このプロジェクトでは ... 正規表現でバリデーションする この条件の文字は弾きます
  8. © DMM 現代に行くにつれて • Ruby on Railsのような大きなフレームワークではアーキテクチャについ て考えることが少なかった • 2017,

    2018年頃にはGoが流行りはじめ、Ruby on Railsの代わりとなる ような設計が求める開発者が多くいた • => 値オブジェクトやアーキテクチャなどの戦術的設計に目が行く • => 戦略的設計については省略されがち 29
  9. © DMM どうやって効果の高い開発を知るか? • 想定回答 • 実際にサービスを使ってみる • Mission /

    Vision / Valueが書かれているページを探す • SNSでそのサービス名で検索してみる 44
  10. © DMM 一般 • 競争優位を生み出さないが、複雑な事業活動 のこと • 例. 認証、認可、宝飾品メーカーのECサイトの構築、メール送信サーバーの構 築、APIサーバーが動く環境の用意

    • SaaSやクラウドサービスで置き換えられる • (DMMだとプラットフォーム開発本部の認証認可基盤を利用するなど) 49
  11. © DMM 補完 • 他社と異なる、かつ簡単な事業活動 のこと • 競争優位は生み出さない • 例.

    マーテクの社内向け広告入稿管理画面、DMMブックスの出版社(または取 次)とのやり取り、goggle.com、drnrn.comなどタイポスクワッティングサイトの撤 去 • SaaSやクラウドサービスで置き換えられないが、事業活動に必要なもの 50
  12. © DMM 競争優位 • 中核 • 中核の業務領域だけが競争優位を生み出す • 一般 •

    その定義から競争優位を生み出さない • 補完 • 他社も同じことが簡単にできるため、競争優位を生み出さない 51
  13. © DMM 複雑さ • 中核 • 複雑。競争相手が容易にまねできないようにする必要がある • 一般 •

    複雑。他社パッケージを使うのにはそれなりの理由がある • PFの認証認可基盤、AWS、Datadog、… • 補完 • 簡単。大抵がCRUD操作や妥当性検証、データ構造の変換だけ 52
  14. © DMM 業務の分類 • 業務を細分化し、中核、一般、補完に分類していく 56 メルマガ配信 広告配信 人事 チーム管理

    問い合わせ 対応 … 広告配信の細分化 配信入稿 システム (補完) 配信システム (中核) 配信ログ収集 システム (一般?) データ分析 (中核) … 配信基盤
  15. © DMM 疑問1.どこまで分類すればいいのか(深さ) 57 さらに分類? さらに分類? さらに... 広告配信の細分化 配信入稿 システム

    (補完) 配信システム (中核) 配信ログ収集 システム (一般?) データ分析 (中核) …
  16. © DMM 疑問2.なにを分類すればいいのか(対象) 58 さらに分類? さらに分類? さらに分類? 広告配信の細分化 配信入稿 システム

    (補完) 配信システム (中核) 配信ログ収集 システム (一般?) データ分析 (中核) …
  17. © DMM 中核のみユースケースが見えるまで分類 60 配信システム (中核) 配信 サーバー 通常広告表示 ポップアップ表示

    「二度と表示しない」 ボタン押す ユーザー 配信システムのユースケース図 会員データを使ったレ コメンド広告表示
  18. © DMM 一般、補完は設計判断に影響が出なくなるまで分類 61 配信ログ収集 システム (一般?) ログ分類 (一般) ログを保存

    (一般) ログ検索 (一般) ログID発行 (一般) 配信サーバー へログ仕込む (補完) ログ削除 (一般) 深掘りしても一般 or 補完のみになったら問題なし ※ログ収集システムのイメージ: Datadog、NewRelic
  19. © DMM 中核、一般、補完の基本方針 • 一般、補完を無視して良いわけではなく、どれも必要 • (どれか一つ欠けても事業が成り立たなくなる) • 中核 •

    自社開発がベスト • 外部に委託すると企業秘密漏洩の危険、かつ事業の存続に関わる • 一般 • 外部製品やOSSを使うのがコスパ良さそう • 例. Web上の動画プレイヤー、動画の圧縮アルゴリズム • 補完 • 外部製品でそのまま補えないので自社で作るしかない • とはいえ単純なので、なるべく早く作れるフレームワークなどを利用 63
  20. © DMM コラム: 中核、一般、補完による選択 64 中核ですか? お金、分析、監査の いずれかですか? データ構造は 複雑ですか?

    ドメインモデル イベント履歴式 ドメインモデル アクティブレコード トランザクション スクリプト はい いいえ いいえ いいえ はい はい
  21. © DMM 第2部:まとめ • 解決したかった課題 • 効果の低い開発による機能性低下 • 見通しの悪いコードによる変更容易性の低下 •

    中核を見つけ、集中的に開発リソースを投入する • さらに、中核とそれ以外を分離し中核部分を開発しやすくする 67
  22. © DMM 言葉が違う例 • ビジネス • 広告などでDMMプレミアムを宣伝している • 加入したユーザーはプレミアムユーザーという •

    コード • サブスクライブユーザーという名前 • 月額料金を情報として持っている 71
  23. © DMM こんなことが起こったとする2 • プレミアムユーザーの区分けが • スタンダードプレミアムユーザー:月550円 • リッチプレミアムユーザー:月990円 •

    コード • サブスクライブユーザーに種別を持たせることに • type = “standard” | “rich” 73 これでいくつ区分けされても 大丈夫だ
  24. © DMM こんなことが起こったとする3 • 学生プレミアムユーザーとして、学生無料プランが登場 • クレカなど登録なしで学生情報だけで大丈夫 • コード •

    サブスクライブユーザーに学生プランを追加 74 サブスクライブしてないけど サブスクライブユーザー ...
  25. © DMM 今までの経緯を知らない社員がチームに配属 76 学生 プレミアムユーザー スタンダード プレミアムユーザー リッチ プレミアムユーザー

    サブスクライブ ユーザー クレカ 学生情報 乖離 わかりづらいよ〜 A社課金 プレミアムユーザー 連携企業 コード 仕様
  26. © DMM さらに困ること • 意思疎通が取りづらい • ビジネス側はそもそも「サブスクライブユーザー」なんて知らない • 今後、意図が伝わらずに必要な機能が実装されない可能性 •

    コード上で用語の改善が行われづらい • 「コードとビジネス上の用語は違うもの」という認識が根付いてしまったら、改善は されない • 「もう慣れてしまったし...」「仕様書通りに実装しただけだし...」 77
  27. © DMM 解決したい課題 • 機能性低下 • ビジネス側が意図していたものと違うものができあがる • 「これを作ってほしいわけではなくて...」 •

    変更容易性低下 • 同じ言葉を扱わなかったがために、機能の改修が遅れる • 「プレミアムユーザーの月額料金を変えるには、サブスクライブユーザーの...」と 翻訳していく必要 78
  28. © DMM 同じ言葉は業務エキスパートを参考に • 業務活動に特別詳しい人を「業務エキスパート」と呼ぶ • 例. • DMMブックス ->

    「作者、出版社、取次」の関係を知っている人 • DMMバヌーシー -> 「馬主、馬飼い、競馬場」の関係を知っている人 • 動画 -> 「動画圧縮(FFmpeg, AV1)、ライセンス」を知っている人 • エンジニアとは限らない • 利用者、プロジェクト責任者など様々 80
  29. © DMM 同じ言葉の定着 • 日常的にいたるところで使っていく • 「“本棚” 機能の実装お願いします〜」 • 「”トップページポップアップ”

    機能の実装できました?」 • 用語集としてまとめておく • チーム内で更新していくコンフルなど • (更新忘れが怖いのでスプリントごとなどで振り返るタイミングを) 81
  30. © DMM (余談)2003年 • 今となっては当たり前だよね、と思うかもしれませんが • 「Domain-Driven Design」が出版された 2003 年頃は当たり前ではな

    かった • 業務知識 => 分析モデル => 要件定義書 => 設計書 => コード • 業務知識や分析モデルとコードで全く別の言葉を使っていた 82
  31. © DMM • 機能性低下 • 文脈が異なることを理解せずに、本来求めていたものとは違うものを作ってしま う • 変更容易性低下 •

    複数の意味を持つ巨大な一枚岩モデルが作られてしまうと変更しづらい 解決したい課題 89
  32. © DMM “区切られた文脈” を設計する • “同じ言葉” は同じ意味で使うことが必要 • しかし、業務エキスパートの捉え方をそのまま映し出すのも必要 •

    通販での出品と搬送は別々の業務エキスパートがいる • 出品の業務エキスパート • 出品元の小売店、グッズ制作店、プラモ制作店などに詳しい • グッズの制作費とか、受注生産の流れとか • 搬送の業務エキスパート • 搬送業者、クロネコヤマト、佐川急便などに詳しい • 郵便番号とか、離島への届け方とか 90
  33. © DMM “区切られた文脈” を設計する • 出品の業務エキスパート • ユーザー:出品者 • 搬送の業務エキスパート

    • ユーザー:搬送業者 91 業務エキスパートの捉え方をそのまま使いたいが、 意味がかぶってしまう...
  34. © DMM 区切られた文脈の大きさはどうするか • 取り組んでいる課題しだい • 対象範囲を広げた方が良い場合 • 開発チームが iOS、Android

    で分かれていたが Flutter にするため、区切られた 文脈もともなって広げた • 対象範囲を狭めた方が良い場合 • マイクロサービス的に運用するため、認証認可基盤を認証基盤、認可基盤に分 け、区切られた文脈もともなって分けた 94
  35. © DMM 区切られた文脈はどう実現するの? • 実現パターンが多すぎるので、その時にあった方法で • (モデルや同じ言葉が違うことを認識するのが重要) • 同じチームの場合 •

    別々のリポジトリに分ける(配送システム、出品システム) • 同じリポジトリだが、ディレクトリで分ける(同じ構造体を共有するため) • など • 別チームの場合 • マイクロサービス的にサービスを分ける(認証基盤、認可基盤、データ基盤) • 変換サーバーを間に設ける(BFFのような) • など 98
  36. © DMM 参考 • ドメイン駆動設計をはじめよう - O’reilly Japan • texta.fm:

    1. Software Development in 2003 - Spotify • ドメイン駆動設計の正体 - Zenn • ピアソンショック - Scrapbox • Domain-Driven Design - Amazon • Patterns of Enterprise Application Architecture - Amazon • アジャイルソフトウェア開発宣言 104