Scala Matsuri 2018でDDDネタで登壇してきました

2018/3/16 - 3/18 にかけて開催された、日本国内では最大の Scala コミュニティの祭典、
[Scala Matsuri 2018](http://2018.scalamatsuri.org/#top) で登壇させていただきました。

[実践ScalaでDDD](https://speakerdeck.com/crossroad0201/practice-ddd-with-scala-en) と言うタイトルで、
DDD(ドメイン駆動設計)をScalaで実践するときのポイントをお話してきました。

実はいままでコミュニティの場で登壇させていただくことにちょっとした恐れ...
ちゃんと話せるだろうか、間違ったことを言ってたらどうしようか...とかがあったのですが、
昨年の [Scala Kansai Summit](http://summit.scala-kansai.org) での初登壇からはじまって、[関ジャバ](https://kanjava.connpass.com)、そして今回の **Scala Matsuri**と登壇の機会をいただいて、
これまでの聞くだけでは得られなかった良い経験ができました。

またコミュニティに発信できるようなネタができたら、ぜひ応募したいと思います。

## Day 0

Scala入門者むけのトレーニングと、オープンソースプロダクトのコミッターの方をまじえてのOSSハッカソンが開催されていました。

僕は都合で参加せずでしたが、有名なOSSにプルリクを出したりして面白そうだなと思いました。

## Day 1

### なぜ Composability は重要か

https://twitter.com/gakuzzzz/status/974816756249255936

*Composability* とは？と言うお話です。

普段Scalaでプログラムを書いていて、粒度の細かい再利用性の高い関数をつなげることで業務的に意味のある
演算をさせたいと思うことがよくあって、*Composability* に関心があったのですがすごくわかりやすかったです。

また、コードの「What」と「How」を分離し、*implicit parameter* で「How」を暗黙的に扱うことで
本来解決したい問題である「What」に注力できると言うのが、自分も最近意識的にやっていたことだったので強く共感できました。

「なにか」は理解できたので、次は「どうやって」と言う話も聞きたいと思いました。

### 1日目からレガシー化

https://kubukoz.github.io/legacy-day1/#/

プログラミングをする上でのアンチパターンを、「どんなプログラミングをするとプロジェクトをダメにすることができるか？」
という逆説的な見方で説明されていたセッションです。

内容的には「あるある」って感じでしたが、そういうプレゼンの仕方もあるのは面白かったです。

### 仕事で役立つモナド変換子

https://twitter.com/gabro27/status/974874969778765825

関数型プログラミングの難敵(?) *Monad* あたりの解説です。

Scalaでプログラミングしていると、`Future[Option[Hoge]]` のような型を扱うケースが頻発しますが、
これをスマートに扱うのはどうすればよいか？と言うお話で、*Monad Transformer* で解決できるよ、と。
これも常々悩むところなので大変参考になりました。

### 実用的な圏論入門

https://twitter.com/DanielaSfregola/status/974911004231397376

難問奇問の *圏論* の解説です。

よく使われる *Monoid*、*Functor*、*Applicative*、*Monad* がそれぞれどのようなものかを
順を追って丁寧に説明されていて、かなり理解が進んだと思います。

この辺の理屈はプロジェクトチームの全員が理解するのはちょっと現実的にきびしいかなーと思いますが、
例えば共通ライブラリやフレームワークを実装するときに引き出しとして持っておくと非常に有効だと感じたので、
普段のプログラミングでも意識的に扱いたいなと思いました。

### Scalaらしいオブジェクト指向プログラミング

Scalaと言えば関数型プログラミングの側面が取り上げられがちだけど、あえてオブジェクト指向の側面から
見直してみようと言うお話。

依存性注入（DI）についての話題が多かったと思いますが、ScalaやりはじめてからDIコンテナとかまったく使わなくなった
（Playの中では使われてますが）ので、改めて言われてみると...と思うところはありました。

### リアクティブDDD実践入門

https://twitter.com/j5ik2o/status/975202430747996160

*Akka* を使ってCQRSパターンとイベントソーシングをどう実現できるか、のお話。

自分もずっとScalaでDDDをやってきてますが、オンプレミスなシステムならともかく、
スケーラビリティを要求されるとこの分野に踏み出さないといけないなと思っていたので、非常に興味深かったです。

あと、ユースケースからドメインモデルを分析する話（BCE分析？）が、ドメインモデルを動的側面からどう見ればいいか
と言う悩みに対するヒントになりました。

いかんせん*Akka*を予習できてなかったのでわからなかった部分も少なくなかったですが、
サンプルコードもあわせて見返したいと思います。

### 懇親会

**ZOZOTOWN** さん提供の懇親会へ。

噂のZOZOスーツの実物が見れました笑


## Day 2

### ScalaJS for Backend(node.js)

https://twitter.com/smogami/status/975202692967448576

Scalaで書いたコードを、Scala.jsを通すことで AWS Lambda の  Node.js ランタイム上で動作させる話です。

自分も今 Scala + AWS Lambda でアプリケーション開発していますが、AWS Lambda のJavaランタイムの
スピンアップの遅さは気になるところで、Scala.js をその用途で実用レベルで使えるのかどうかに興味がありました。

デバッグのしづらさや、一部不便がある（Javaライブラリを使った永続化あたり？）とのことでしたが、
Javaランタイムでは数秒はかかるスピンアップが 0.1秒以下になるとのことで、
条件さえ揃えば選択肢としてアリだなと思いました。


### 依存型プログラミング入門

[Idris](https://www.idris-lang.org) と言う言語を使って、依存型プログラミングの思想を学ぶ内容です。

依存型プログラミングがなんなのか知らなかったのですが、Scalaのような型付け言語がデータ構造を制約するのに加えて、
依存型言語ではデータの値にも制約をかけることができるそうです。

たとえば、あるInt型のパラメタが自然数でなければならない場合、Scalaではパラメタのチェックをして範囲外であればエラーをかえす、
つまり*実行時にエラーになる* のが、依存型では「自然数のInt型」を定義（証明？）することでコンパイル時点でエラーにできるとのこと。
極論すれば、コンパイルさえ通ればエラーになりえないので、ユニットテストとかいらなくなるんじゃ...

とは言え、そもそもScalaじゃないですし(笑)、言語的に応用するのはちょっと難しそうでしたが、知識として持っておくのは面白いと思いました。

### 実践ScalaでDDD

https://twitter.com/crossroad0201/status/975271887243689985

自分がスピーカーでした。
90分しゃべり続けて疲れましたが、なんとか最後まで話しきれてようやく肩の荷が下りたって感じです。

少しでも聞きに来ていただいていた方々のご参考になれば幸いです。

### Akka実践バイブルワークショップ

https://twitter.com/yugolf/status/975246087777742849

[Akka実践バイブル](http://amzn.asia/ew3LNoE) の翻訳者、前出さんのワークショップ。

Akka を使ったサンプルコードを実際に動かしながら理解できる内容です。
ちょっと途中で中座してしまったのですが、とにかくサンプルが丁寧で書籍とあわせてじっくり理解していきたいと思いました。

### CQRS discussion

https://twitter.com/j5ik2o/status/975202430747996160

Day 1のセッションの補習的な内容です。

ただ Akka そのものの基礎知識がなくて、ちょっとついていけず...
現場でも必要とされている技術要素なので、モノにしていきたいところです。

### 今から始めるLens

*Lens* なる法則(?)の解説です。
ぜんぜん知らない世界だったのですが、「ネストした型の#copy()呼び出しが深くなる問題」への
ひとつの対処方法として使えると言うことで興味を持って聞きました。

内容的にはこれまた数学的と言うか法則を読み解いていく話だったのですが、まだついていけました。
でも実務でここまでやるのはちょっとハードル高いかな〜笑
共通ライブラリとかを作るときのテクニックとしては有用だと思いました。

## さいごに

運営スタッフの皆さん、スピーカーの皆さん、スポンサー各社さま、
会場やケータリングサービスを提供してくださった方々、
参加した皆さん、全員に感謝の2日間でした。

ありがとうございました。