DevLOVE Premium「ドメイン駆動設計本格入門」に参加しました

3/22(金)にDevLOVE Premiumとして開催された「ドメイン駆動設計本格入門」に参加してきました。 講師は「現場で役立つシステム設計の原則」の著者でもある、増田亨(@masuda220)さんです。 まだ、聞いた話をすべて消化できたわけではないのですが、参加してから数日たってしまいましたので、一旦今の段階でまとめておこうと思います。

参加のきっかけ

ドメイン駆動設計には関心があるけど、きちんと理解できているとは言い難い状態で、ずっと来ていました。増田さんの本にしても、 Twitterで時々目にしたり、気にはなっていましたが手に取るところまでは至らずという状態でした。

そんな中、DevLOVE Premiumで増田さんがお話しされることを知り、DevLOVEのクラウドファンディングの特典で無料参加できることから、 ちょうどいい機会だし参加してみようと思いました。

アジェンダ

ドメイン駆動設計の考え方

ソフトウェアを何年も成長させていきたかったら、変更が楽で安全にしておかなければならない。 変更が楽で安全であることは、ソフトウェアにとって、あらゆる面で(使いやすさ、ビジネスの要求への対応、開発スピード、、、)プラスに作用する。 逆に、変更がやっかいで危険だと、全てにマイナスに作用し、何か課題があっても対応できないことになる。 ドメイン駆動設計は、ソフトウェアを「変更が楽で安全」に保つための手段だし、むしろ「変化を呼び込む設計」とも言える。

ドメイン駆動設計を理解する三つのキーワード

・・・なんだけど、なかなか難しい。ここが理解しにくいから、ドメイン駆動設計自体が難しく感じられる。

要点を絞り込み、

と考えると、見通しがよくなる。

(ここからが肝なんだけど、まだ十分に消化できていないので、別エントリーで書こうと思う。)

エヴァンス本のススメ

増田さんから、

  • エヴァンス本は通読するような本じゃない(何度も読んでいるから、読み込んで入るけど)
  • 値オブジェクトがビジネスルールの整理と実装の主役。エンティティは脇役だし、ドメインサービスは必要ない。それくらい振り切って読むと理解しやすいかも。
  • ユビキタス言語とかコンテキストといったキーワードがよく取り上げられるが、それが目的ではない(道具・準備の話でしかない)
  • 第1部、第2部は準備で、本質ではない。役に立つには第3部まで読まないとダメ。特に第3部の9章、10章、第4部の14章、15章、16章。

といった話があった。

レガシーに立ち向かえ

ドキュメントもコードもあやしいレガシーシステムにどう立ち向かうか、という話。それまでとはちょっと毛色の違う印象。 どうやってコードに埋もれたビジネスルールをあぶり出していくか、という感じ。 (個人的には10年位前にやってたことを思い出す)

マイクロサービスとドメイン駆動設計

ドメイン駆動設計は、別にマイクロサービスへの分割を目的とはしていない。 ただ、良い設計を目指しているので、結果的にマイクロサービス化がやりやすくなる。

ドメイン駆動設計の最初は、あちこちに手が入るので、その段階でマイクロサービス化に走るのは失敗する可能性が高い。 もっと安定してから対応すべき。

(最初からマイクロサービスとして分割して作るべきか?という議論では、そのほうが良いのでは?と思っていたが、 こういう話を聞くとたしかに最初はモノリスとして作ったほうがよいのでは?という気がする。そもそも、 最初から分割するとして、何を根拠に分割するんだ?という話になるし。)

全体を通して

Stringのような汎用型を使わず、取りうる値の範囲を意識した固有の型を使うという話など、話としては「なるほど」と思うものの、 まだ「本当にそれで最後までやり通せるのか?」に答えが出せていない状況です。

また、ビジネスルールの抽出・設計・実装は、リファクタリングを続けていく中でモデルが安定していくのだと思いますが、 実際にそれがうまくできるのか、実感を持てていないです。

参加した際、増田さんの著書をいただくことができましたので、早速読み始めています。 早いうちに実践して、この辺の感覚を持てるようになりたいと考えています。