こんにちは、id:hakobe932 です。
はてなでは有志が不定期の放課後勉強会を開催しています。今回は、ソウトウェア設計に興味のあるエンジニアがあつまって開催したドメイン駆動設計( = DDD)についての勉強会について紹介します。
実践ドメイン駆動設計を輪読
今年の3月に発売された、実践ドメイン駆動設計を輪読する形式で勉強会を行いました。

実践ドメイン駆動設計 (Object Oriented Selection)
- 作者: ヴァーン・ヴァーノン,高木正弘
- 出版社/メーカー: 翔泳社
- 発売日: 2015/03/17
- メディア: 大型本
- この商品を含むブログ (2件) を見る
ドメイン駆動設計に関する書籍では、エリック・エヴァンスのドメイン駆動設計が最も有名です。ただ、この本については、読了したエンジニアがいたため、新しく刊行された実践ドメイン駆動設計を読むことになりました。
実践ドメイン駆動設計では、スクラム開発を支援するSaaS形式のWebアプリケーションが題材に用いられています。題材になじみがあるので実際のシステムをイメージすながら学ぶことができます。また、この本は原著が2003年に刊行されたエリック・エヴァンスのドメイン駆動設計に比べると、現代的な技術セットを前提にしているため自分たちのシステムとの対応付けも比較的容易です。
議論を中心にした形式
輪講形式の勉強会は、ともすれば、担当者が前で話して終わりになってしまいます。 そこで、活発に議論をして成果が残るように、以下のような形式にしてみました。
- 勉強会の時点で全員が、きちんと本を読んでおく
- 本を読んでいる前提なので発表資料は作りこまない
- 発表者以外の人も気になったポイントは、事前に疑問リストとしてまとめておく
- 勉強会当日は主に議論をする
- 議論の内容はログに残す
このやり方を運用するには、GitHubのIssueが便利でした。
担当者は担当の章のIssueを作っておき、内容の簡単なまとめを発表資料として用意します。参加者は疑問や補足などをIssueのコメントの書き込んでおきます。勉強会当日はみんなでIssueを眺めながら議論をします。
勉強会のログは以下のようにGitHubのissueに蓄積されていきます。ログをまとめておけば、勉強会に参加しなかった人もあとから読んで知見を共有できます。
以下のようにコメントで気軽に質問や議論ができます。
参加者は毎週本をきちんと読み込んでこないといけないため大変ですが、 議論中心となることで、難しい部分についてじっくり議論したり、本の内容にとどまらない、 自分達の現在作っているソフトウェアから得られた知見の共有や、設計の善し悪しを議論したりすることができました。
勉強会の成果
勉強会を開催したことで以下のような成果がありました。
既存のソフトウェアの設計の整理と理解
ドメイン駆動設計に登場する設計概念を、自分達が開発しているソフトウェアに照らし合わせて、詳しい分析をすることができました。例えば、
- 各プロジェクトに適切なユビキタス言語は設定されているだろうか?
- プロジェクトAを構成しているシステム群は境界付けられたコンテキストの分割が適切なのだろうか?
- システムBのモデル層のクラスはリポジトリとアプリケーションサービスが渾然一体になっていて抽象化がうまくいってないように見える
- 最近設計されたプロジェクトCでは知見をいかして、CQRSの形式になっていて良い
- 古くから利用しているモジュールXは共有カーネルといえ、良くないのではないか
- 境界付けられたコンテキストによって保護されたシステムとして独立させるべきだ
といった議論がおこりました。
社内の各チームのエンジニアがまんべんなく参加していたため、議論を通じて他のチームのプロジェクトの ソフトウェアの設計についての知見が共有されるという効果もありました。
ソフトウェア設計技術の習得
ドメイン駆動設計は、単なる一つの設計手法というわけではなく、様々な設計テクニックの集大成です。
ドメイン駆動設計を学ぶことで、オブジェクト指向による基本的な抽象化のテクニックをはじめ、GoFのデザインパターンやエンタープライズアーキテクチャパターンなどの広く利用されているパターン、CQRSやイベントソーシングなどの最近良く聞くようになった設計技術など、様々なソフトウェア技術の知識を得られます。
勉強会では、参加メンバーの知識を相互に補完して、こういった技術を共通のものとしていきました。
新しいプロジェクトの設計への活用
先日開催されたScala関西 Summit 2015で発表された、はてなブックマーク in Scalaでは、はてなブックマークのコア部分の実装でドメイン駆動設計を導入していることを紹介しています。このシステムでは今回のドメイン駆動設計勉強会で議論した内容を生かして、より品質の高いソフトウェア設計を目指しています。
以下のようなアーキテクチャを採用しています。くわしくは資料をご覧ください。
まとめ
はてなでのドメイン駆動設計勉強会の取り組みについて紹介しました。
勉強会ではドメイン駆動設計について直接学んだだけでなく、自分達が開発中のソフトウェアについて振り替えって議論することで、 ドメイン駆動設計の枠組みでアーキテクチャを整理して、より深い理解や改善可能なポイントを見つけることができました。
今回得られた知見をベースに、勉強会参加者メンバーがソフトウェアの改善を進めていってくれるでしょう。紹介したように新しいプロジェクトでは、Scalaによるドメイン駆動設計を導入する動きもでています。
はてなでは、品質の高いソフトウェア開発をめざして、継続的にソフトウェア工学について学び、その成果をサービス開発に生かします。
YAPCでも聞けます
まもなく開催される、YAPC::Asia Tokyo 2015では、はてなブログのシステムアーキテクチャの変遷やその思想について紹介する発表があります。ぜひご観覧ください。