ScalaMatsuri 2019に行ってきました。

# ScalaMatsuri 2019に行ってきました。
## ScalaMatsuriとは
Scalaをテーマにしたカンファレンス。
今年は、6/27 - 6/29の３日間で開催。  
私は、6/28(カンファレンス Day),6/29(アンカンファレンス Day)に参加しました。

[ScalaMatsuri 2019](https://2019.scalamatsuri.org/)

## 参加の目的
日々の業務で体験することのできない内容を間接的に体験することで、エンジニアとしてのモチベーションを保つことが目的。  

## 個人的に面白かった内容
* DDDとかClean Archietectureとか  
  以下の1.のようにコードに落とす際にエンジニアによる翻訳が入ってしまうと、実際の業務ドメインとコードの乖離が大きくなり、実際の業務では使えないシステムになる。<del>問題のある部分は運用でカバー</del>この点は、昔から多くのプロジェクトが抱える問題である。

    ドメインエキスパートの知識 -> エンジニアによる実装( 翻訳 ) -> コード
    ドメインエキスパートの知識 -> エンジニアによる実装( <del>翻訳</del> ) -> コード

    ドメインエキスパートとエンジニアが共通言語(ユキビタス言語)を使用してシステムを構築することで、ドメインエキスパートの知識をエンジニアによる翻訳といった作業がなくなるため、実際の業務ドメインとコードの乖離がなくなり、実際の業務で使えるシステムができる。  
    DDDのこの点は、システム開発の永遠の問題を解決するための有効な手段に思える。
    今回のScalaMatsuriでも、色々なセッションで、DDDやClean Archietectureの話がでてきており、多くの人が興味を持ち実際に実践していることがわかる。
    ただし、参加したセッションでは、自社サービスをDDDで開発した話であり、受託開発にDDDを適用した話はなかった。受託開発となると、ドメインエキスパートを巻き込むための労力が、自社サービスとは比較にならない。
    機会があれば、受託開発でDDDを実践した話やドメインエキスパート側の話も聞いてみたい。  

* Graal VM  
  早いらしい。
  Java VMの欠点には、以下がある。
  * イニシャルコストが高い
  * メモリを多く食う

    オンプレミスでクラスタを組んでいた時代では、あらかじめ立ち上げて温めておけばよいだけだったのが、クラウドが主流になって早数年、AWSのlambdaなどでJava VMで動作する言語を使う場合は、大きな欠点。
    native-imageコマンドでバイナリ化することで、前述の問題を解決できる。（らしい。未検証）
    昨年のScalaMatsuriでは、この欠点を回避するためにscala.jsで書いてNode.js上で動かすといった発表あった。

    個人的に、OracleにはJava言語ではなくGraal VM頑張って欲しい。言語は、もうJava言語じゃなくていいかと。

* Akka Cluster & Kubernetes  
  Scalaでマイクロサービスをやるなら`Akka Cluster`1択。
  Akka ClusterをKubernetesを組み合わせることで、コンテナ(Docker)を使用したフォールトトレラントなマイクロサービスの構築ができそう。
  Kubernetesは運用が難しいといった話もあるが、実際にやってみないことには、できそうの域をでない。
  以下、あとから確認するためのメモ

    https://developer.ibm.com/jp/patterns/deploy-akka-clusters-on-kubernetes/
    https://blog.softwaremill.com/running-akka-cluster-on-kubernetes-e4cd2913e951

* Extensible Effects  
  LTで使っているコードをみただけだが、使う側はすごくSimpleにコードがかけそう。
  理解するのは難しそうだが、あとで調べてみる。

    以下、あとから確認するためのメモ

    https://qiita.com/phenan/items/360289bf295f9dd5fd15

# 最後に
ScalaMatsuriに参加してScalaに対する考え方が少し変わったので、それを書いておく。

私は、以下のような経緯でScalaに興味を持ったのだが、やはり純粋な関数型プログラミングの考え方は難しく、なかなか理解が進まない。
正直、Better Javaでよいと思っていた。

* Javaでの開発を10年ほど経験  
  -> ボイラーコードに悩む  
* JRubyに出会う  
  -> ちょうど、その頃、JRubyでのプロダクト開発に参加
* 動的型付けに悩む  
  -> テストせずにリリースして、引数の不足からエラー発生（私が修正コードではないですよ）
* Scalaに出会う  
  -> 静的型付け、型推論、Caseクラス、パターンマッチングなど最高！でもMonadとかわからない。

今回、多くのセッション内でDDDやClean Architectureの話しを聞いたところ、ドメインをコードで表すには、Scalaの表現力(Simple)を活用すべきと感じた。  
MonadとかExtensible Effectsとか純粋関数型の考え方を理解したほうが、Simpleに表現できる(と思う)ので、今後、純粋関数型の考え方を申込し勉強していきたい。  

最後にSpeakerの皆さん運営のみなさん、ありがとうございました。

# メモ
以下はあとから見直してみる資料。

[Using Akka Cluster for a payment service](https://speakerdeck.com/negokaz/using-akka-cluster-for-a-payment-service)

[Clean Aechitecture in Practice](https://speakerdeck.com/yoshiyoshifujii/clean-architecture-in-practice-at-scalamatsuri2019)

[Making Logic Monad](https://www.slideshare.net/SanshiroYoshida/making-logic-monad)

[悩める開発者に贈る〜サービスの継続的な成長を支える分析設計手法](https://gitpitch.com/s10myk4/scalamaturi2019-slide#/)

[Case of Ad Deliverry System is Implemented by Scaal and DDD](https://speakerdeck.com/atty303/case-of-ad-delivery-system-is-implemented-by-scala-and-ddd?slide=20)

[HIgh Performance Scala](https://speakerdeck.com/hiroki6/high-performance-scala)

[How to build an Event-Sourcing system using Akka with EKS](https://speakerdeck.com/j5ik2o/how-to-build-an-event-sourcing-system-using-akka-with-eks)

[Write stack safe non-tailrec recursive functions](https://speakerdeck.com/jooohn/write-stack-safe-non-tailrec-recursive-functions)

[The advantage of using 'Eff' in Scala Project](https://speakerdeck.com/ma2k8/the-advantage-of-using-eff-in-scala-project)

[Pure domain model and the technology behind it](https://speakerdeck.com/petitviolet/pure-domain-model-and-the-technology-behind-it)

[Intro to typeclass in Scala](https://speakerdeck.com/phenan/intro-to-typeclass-in-scala)

[Running Scala on AWS Lambda in a snappy way](https://speakerdeck.com/todokr/running-scala-on-aws-lambda-in-a-snappy-way)

[FAST & FUNCTIONAL](https://speakerdeck.com/miciek/fast-and-functional-scala-matsuri-jp)