コネヒト開発者ブログ

コネヒト開発者ブログ

ドメイン駆動設計入門の輪読会をやってました!

「コネヒト Advent Calendar 2023」の7日目のブログです!

コネヒト Advent Calendar 2023って?
コネヒトのエンジニアやデザイナーやPdMがお送りするアドベント カレンダーです。
コネヒトは「家族像」というテーマを取りまく様々な課題の解決を 目指す会社で、
ママの一歩を支えるアプリ「ママリ」などを 運営しています。

adventar.org


こんにちは。サーバーサイドエンジニアをしている高橋です。

以前からDDDに興味がありましたが、なんとなくしか理解しておらずそんな時に 「ドメイン駆動設計入門」の本をお勧めされました。 DDDの考え方は正解がないものなので、メンバーとワイワイしながら読んでみたいと思いこの輪読会を開催しました。

社内でメンバー募集をした時、サーバーサイドエンジニアに限らずインフラ、Androidエンジニア、機械学習エンジニアなど様々な領域の方が手を挙げてくれました。

既に知見がある方もいれば、DDDに興味があるけどわからないという方もいました。


輪読会の流れ

全15章あり、輪読会を開催したのは11月上旬からで、できれば年内に終わらせたいと思い、2章ずつの合計7回で終わるように設計しました。

2章ずつ読んできてもらい、以下の内容を事前にmiroの付箋に記入してもらいます。

輪読会では以下のように進めました。

  1. 順番に付箋を読み上げていく
  2. 深掘りしたい付箋に一人2票投票する
  3. 票が多かった付箋について深掘りして理解を高める

1時間の輪読会なので、なるべく議論できる時間を作りたいと思い、付箋は事前に書いてきてもらうようにしました。 深掘りタイムでは「自分も同じようにどういうことなんだろうと思った」という意見が多くあったので、DDDに知見のあるメンバーに質問して、疑問点を解消していきました。

具体的にどのような深掘りをしていたか一部紹介します。

本の例にあったものは、名前の登録時のバリデーションについて以下のように記載されていました。

名前にはn文字以上の入力が必須 ⇒ エンティティで実装する

同じ名前は登録できない ⇒ ドメインサービスで実装する

ほみ「名前が何文字以上かはエンティティに記載するのに、重複しているかどうかはエンティティに持たせると不自然になるのはなぜか説明できない」

高谷さん 「本だと「コードで書くと不自然になるから」という説明だったが、あんまりしっくりこなかった」

柳村さん 「インスタンス単体で解決可能かどうかじゃないですかね。たとえば高谷さんに高谷さんって他に存在していますかって聞いても分からないですよね。国の台帳かなんか調べないと分からない。」

aboさん 「値オブジェクトの値はチェックできるが、エンティティの存在チェックは自分でできないという理解をした。」

この会話だと柳村さんの説明でメンバーがなるほどなるほどと納得している様子でした。

DDDは誰かが答えを持っている訳ではないので、メンバー同士の対話を通してより理解を深められたと思いました。

メンバーの声

現状半分まで輪読会を終えて、メンバーに以下のようなアンケートを取ってみました。

この輪読会にどのようなことを期待して参加しましたか。

  • ドメイン駆動設計完全に理解した状態になる。
  • 開発をする上でそこまで意識することは正直ないが、概念として押さえておきたいと思ったから。
  • ドメイン駆動設計の大まかな理解と、可能であれば実務に取り入れていきたい。
  • DDDについての理解を深める。
  • モデリングとの実装のつながりを理解する。
  • 他の方と設計に関する知見交流ができると思ったため。

前半戦を終え、現時点で感じていること(難易度等)教えてください。

  • 実装パターンの話は理解が進んでいる一方で、肝心のドメイン周りは大丈夫?という感じ。でもこの本のテーマ的に、実装パターンから理解してドメイン駆動設計の本丸に進むのを怖くなくするみたいな感じっぽいので、それでいうといい感じ。
  • 業務上直接ドメインを意識することは少ないので、十分に理解した状態には至っていないが、参加メンバーに具体例を出してもらうことで納得できる部分はあり、ほんの少しずつだが理解が進んできている気がする。
  • 設計面はDDDの1側面ではあるので、モデリングとセットで学びたい。
  • 現行のコードに落とし込んでいくには慎重になったほうがよさそう。
  • ドメイン駆動設計を実現するための実装パターンが紹介されてはいるもののOOPのデザインパターンのお話しなど他の知識を知らないとよくわからないみたいな部分も少しあるので知見ない方は理解しずらしかもなと思ってました。

後半の輪読会でもっとこうした方がいいとかあれば教えてください。

  • 議事録をいい感じにみんなで取りたいわね。
  • メンバーで時間いっぱい議論に使えているので、良い会が進められている気がする。
  • 本から学びつつ、ママリの事業で実践するにはという会話を増やせるとよさそう。
  • そのためには一定の図解が必要で、miroで図解しながら話してもおもろいかもですね。
  • 輪読会自体の時間でも良いですし輪読会が終わった後でも良いですが改めて全体で深掘りして聞いてみたいことなどあればお話しできる時間や話せる場所があれば良いのかなと思った。同期的でなくともnotionに非同期で質問書くとでも全然あり。

感想

DDDはバックエンド領域の考え方と思っておりましたが、あくまでそれは実装方法の話であり、ドメインを意識して作っていくという意味ではどの領域のエンジニアにも必要なことだと改めて感じました。

比較的初心者でも読みやすいとは思いつつも、DDDの考え方に慣れていないと結構つまずく部分はありました。このような輪読会を通して、他の方の意見でより理解が深まったと思います。後半戦は年内に終わる予定ですので、引き続きやっていきたいと思っております。