「 ドメイン駆動設計を導入するためにやったこと」参加ノート

modeling-how-to-learn.connpass.com

前回に引き続き、こちらのイベントでお話を聞いてきました。自分用ノートです。

ドメイン駆動設計のプラクティスでカバーできること、できないこと

DDDの目的

  1. ソフトウェアの機能性を高めること

    • 役に立つものを作る、作ったけど使えないを避ける
  2. ソフトウェアの保守性を高めること

    • 機能拡張が容易でありつづけたい

アプローチ

  1. ドメインエキスパートと行うドメインモデリング

  2. 保守性向上のためのアプローチ

目的が明確であれば、1, 2どちらかだけでも価値がある

DDDとの相性とは

DDDはドメインが複雑な領域に適用するのに向いている

ドメインが複雑な領域とは?ドメイン把握が難しいくらいの感覚

実際のアプローチ

  • https://little-hands.hatenablog.com/entry/2020/12/22/ddd-in-first-3month
  • コードの作成
  • レイヤーに跨るコーディング・テストの規約の整備
  • ドメインモデル図を作成し、それを元に開発
  • 地道なペアプロ・レビュー
  • お客様の解像度をあげる
    • PdM, カスタマーサクセスと連携、フィードバックのぐるぐる
  • 新機能
    • アーリーアクセス
  • 既存機能
    • CSから直接お客様の声を聞く機会を設ける
  • [質問] EAとGAで、機能の出しわけするのは、feature flagのような仕組みを自作しているのでしょうか??
    • はい

すんなりいったこと

巨大レガシーシステムの戦略評価とリファクタリングにおけるDDDの活用事例

問題領域と解決領域を考える

  1. 娯楽を楽しみたい

    • スポーツ
    • 動画
    • ゲーム
  2. 顧客を整理したい

モノリシックシステムは複数の問題領域にまたがりがち - 在庫・配送・注文をモノリシックなECサイトが解決するなど

問題領域が不明な場合 - 何領域があって、システムがどう関わっているか - コアドメインを見定めるのは困難

取り組んだこと

  • ドメインエキスパートにインタビューを実施
    1. 解決したい課題
    2. 目的
    3. ルール、どんな世界観か
    4. 登場概念と、考え方

    → これらの異なる境界が問題領域の境界

苦戦したこと

  • 莫大な情報量
  • 有識者が誰かわからない
  • Rails Wayの引力
    • Active Recordに機能が集中しているのでRepositoryパターンでActive Recordを隠蔽するのが大変
  • Rubyの特性

基幹システムの変更を楽で安全にする

ミュータブルデータからイミュータブルデータへ

  • 可能な限りUPDATEを使わない
    • INSERT, DELETE

分解思考から組み立て思考へ

  • 分解して人手をわけようから、全体像を見て組み立てていこう

現場で実践してみて

ドメインモデルパターンでは規定集・業務マニュアルが設計になる