Unipos engineer blog

Uniposの開発者ブログ

Functinal Reactive Domain Modeling読書会を完走しました

こんにちは、エンジニアの小紫(@petitviolet)です。

エンジニア有志でFunctional and Reactive Domain Modelingという本の読書会を開催していましたが、最近ようやく完走出来ました。

https://www.booktopia.com.au/http_coversbooktopiacomau/big/9781617292248/function-and-reactive-domain-modeling.jpg

何で読書会やったの?

この本はタイトルから分かるように、

  • Functional
  • Reactive
  • DomainModeling(DDD)

とかなり欲張りなトピックについて書かれている本です。
どれも社内で積極的に学習にもプロダクト開発にも取り入れていっているものではありますが、もう少し足場を固めるための情報を求めていました。
さらに、Fringe81がサーバサイド開発言語として全面的に取り入れているScalaでサンプル等が書かれているということで、これは読むしかないとなりスタートしました。

どんな内容?

https://www.manning.com/books/functional-and-reactive-domain-modeling

にある目次はこのようになっています。

1.  Functional domain modeling: an introduction
2.  Scala for functional domain models
3.  Designing functional domain models
4.  Functional patterns for domain models
5.  Modularization of domain models
6.  Being reactive
7.  Modeling with reactive streams
8.  Reactive persistence and event sourcing
9.  Testing your domain model
10. Summary - core thoughts and principles

全体の流れとしては、
関数型プログラミング学びつつドメインモデリングと組み合わせる、そしてFutureやActorとドメインモデリングを組み合わせるというものです。

もう少し細かく書くと、

  • Scalaを使って関数型プログラミングを学ぶ
    • 関数合成での処理の組み立て方
    • 副作用をどうやって切り離すか
    • Domain ModelingにおけるAlgebraic Data Type(ADT)の活用
    • Functor/Applicative/Monad/Kleisli等の概念
  • ScalaでReactiveなアプリケーションの書き方
    • AsynchronousなAPI
    • Domain ModelとActor
    • Reactive Streams
    • CQRS+ES
  • Domain ModelのTest
    • Property Based Testingについて

といった感じです。

学び

弊社Fringe81ではDomain-Driven-Design(DDD)に積極的に取り組んでいますが、基本的にオブジェクト指向プログラミングとの相性が良いものだと考えていました。
ですが、この本を読んでからは関数型プログラミングとの組み合わせ方に幅が出来たように感じます。

例えば、Userモデルの振る舞いはUserがメソッドとして持つのではなくUserServiceの関数として提供し、UserはあくまでADTであるとすることで、振る舞いが単なる関数となり処理を合成しやすい上にテストも用意になるというメリットがあります。
DDDにおけるService(ドメインサービス)はドメインモデル貧血症になる危険性があることから注意深く設計していましたが、上記のようなFPの視点に立つことでむしろドメインモデルとサービスが一対のものとして表現されるようになるというのはFPの視点を取り入れないと見えてこない景色でした。

実際のプロダクト開発でFP + DDDをどの程度取り入れていくべきかはメリット・デメリット様々で議論がわかれるところだとは思いますが、そういう議論ができるようになったという点でこの本を読んで良かったなと思っています。

最後に

より良いプロダクト開発のために一緒に読書会をして新しい技術や概念を学習していきたい人を探しています!
http://www.fringe81.com/recruit/