ドメイン駆動開発を浸透させるための新しい取り組み

はじめまして、ライクル事業部 エンジニアの菊池@kichionです。
普段の業務では主にエンジニアチーム運営・運用の課題解決やビジネスサイドとのやり取りが多く、中長期目線でのアプローチを行っています。 エンジニアとして行っている技術選定や実装関連についてはZenn - kichionにも投稿していますので興味があればご覧になってください。

今回はライクル事業部として少しづつ取り入れ始めている「ドメイン駆動開発」に焦点を当てて見ます (ドメイン駆動に関わる内容については、端的ですがQiita - kichionにも投稿してますので気になったらご参照ください)

※ ドメイン駆動開発について馴染みがない人向けに解説を書いていますが、実際の取組みについてはドメイン駆動開発を浸透させるための取り組み以降になりますので読み飛ばしてしまって良いです。

ドメイン駆動開発(DDD)

名著「エリック・エヴァンスのドメイン駆動設計」を起点として広まったソフトウェア問題解決の手法・設計パターン集です。 冠になっているドメインに焦点を当てることが特徴で、技術的要素*1に目がいきがちですが、ソフトウェア本来の目的である問題解決のためのエッセンスが豊富な内容になっています。

ドメイン

ここで言うドメインとは技術的な要素ではなく「ビジネスの領域であり、ソフトウェア化するドメイン」を指していて、アプリケーションの対象になるビジネスの領域を指しています。

ドメインモデリング

ドメインが明らかになるとソフトウェアにする際の実態をプログラミングすることができるようになります。そのドメインオブジェクトの属性や振る舞いを定義することをドメインモデリングと呼んでいます。
ドメインモデリングの定義には「問題解決のために、物事の特定の側面を抽象化したもの」と示されておりソフトウェア化の対象部分だけを組み込む必要があります。

技術的要素

ドメイン駆動開発 または DDD とGoogleで検索すると以下のような内容の実装例が多く目に止まります

  • Entity
  • Value Object
  • Aggregate
  • Application Service
  • Repository
  • Factory
  • etc...

これらはあくまでもドメイン駆動開発に親和性の高いデザインパターンの内容であり、ドメイン駆動開発の本質ではありません。ですが、ビジネスサイドとの調整などが必要なく始めやすい側面から「軽量DDD」と言われており、そのためブログなどでよく見かける情報になっています。

ドメイン駆動開発の目的

ドメイン駆動開発の目的は「ソフトウェア化する対象の問題を解決する」です。
ドメインに焦点を当て、ドメインモデリングを行うことでドメイン固有でアプリケーション対象をプログラミングすることができます。これでソフトウェア化する対象の問題を解決するというドメイン駆動開発の目的が達成できるようになったと言えます。

ドメイン駆動開発を浸透させるための取り組み

ここからはドメイン駆動開発を取り入れようとしているライクル開発部がどのような取り組みを行っているかをご紹介したいと思います。

ドメイン駆動開発 勉強会

最近、ドメイン駆動開発 勉強会と称して1時間くらいの長さで開催しました。
菊池もそこまでドメイン駆動開発に卓越した人間ではないですが… 一応教えられることはあると思いスピーカーとしてやっています。
(第一回目の内容を一部抜粋してSlideShareに公開しています)

ドメイン駆動開発の議論が多少なりとも行われているのでいい刺激になった回でした。また、理解が浅い点について改めて勉強し直すきっかけになったので菊池個人としてもいい時間になっています。

ドメインオブジェクト整理会

以前の開発フローでは仕様がPO/PMから降りてきた後にそのまま担当者をアサインして実装する流れで行われていました。
※ 図では簡略化のために「実装依頼」としていますが、実際はスクラムを採用していて自発的にタスクを取っていく流れで進めています

f:id:kichion0526:20210813140656p:plain
以前の端的な開発フロー

既存機能なら特に問題はありませんが、新規機能の開発においては共通言語(ユビキタス言語)が定まらなかったり、担当者の恣意的解釈でドメインの解釈がブレるなどの問題がありました。
(中間のTL / PMが伝書鳩の役目しか果たしていないのは言うまでもありません…)

そこで、解決方法の一つとして「ドメインオブジェクト整理会」なるものを行ってから実装に進むようにしました。

f:id:kichion0526:20210813141916p:plain
ドメインオブジェクト整理会を行った開発フロー

ポイントとしては以下です。

  • ドメインの理解のための質問をTLが常に行う
  • 整理会にてドメインの知識を担当者に共有する
  • 整理会にてドメインオブジェクトの名付け・振る舞いについて議論する

道半ばではありますが、新しいドメインについては一度立ち止まって整理されて名付けまで行われるのでエンジニアチーム内では好評な取り組みです。 整理会を行うまであやふやだったドメインについても考える機会が増えて、些細な違和感があると名付けや正しいふるまいを議論するような空気感が作れたのは大きいです。

今後やっていきたいこと

続・DDD勉強会

まだ半歩しか進んでいなく位のボリュームなので次回は「実際の事業を改めてドメインモデリングしてみる」というハードな内容で開催予定です。 更に踏み込んだ内容も勉強会で取り上げていきたいと思っています。

現在のドメイン・ユビキタス言語整理

やはりすでに実装済みの内容についてもリバースエンジニアリング的にドメインを整理しないと後で名付けに支障が出てくる*2と考えているので早めに行っていきたい内容です。

ドメインエキスパートを交えたドメインオブジェクト整理会

現状のドメインオブジェクト整理会でもかなり有意義ですが、TLのドメインに対する質問が浅いと整理会の中で「よくわかんないですね…」という場面も少なからずあります。
やはりドメインの有識者を交えてこのような会を開きたいのですが、ドメインエキスパートは大概忙しいので実施までの道のりは険しいです。

終わりに

今回は走り出したばかりのライクルの「ドメイン駆動開発」に対する取り組みをピックアップしてお届けしました!
これ以外にも運営・開発を改善する取り組みは週毎に変わっていてとても刺激が多いチームです。この記事を読んで、会社・チームに興味が出てきましたら積極採用中ですので、他の情報も見ていただければと思います。

*1:技術的要素とまとめているが戦術的DDD・軽量DDDとも言われる内容でデザインパターンのみを指している

*2:ユビキタス言語におけるコンフリクトを危惧している