ScalaMatsuri 2016に参加して打ちのめされた話

大島 雅人
36

こんにちは、大島です。2016年1月30日と31日の2日間、ScalaMatsuriに参加してきました。私はiOSエンジニアとしてRMPにジョインしましたが、最近は英語サプリのサーバーサイドエンジニアとしてScalaを主に書いています。少しはScalaのコードが読めるようになってきたかな?と自信がついてきたところでしたが、まだまだ修行が足りないと感じさせられる刺激的なカンファレンスでした。

ScalaMatsuriとは

____________________________2016-02-08_8.22.48

その名の通りScalaをテーマにしたカンファレンスで2013年から開催されています。今回で3回目の開催で、国内外からScalaに関する著名なエンジニアも参加し、日本語セッション、英語セッションもある国際的なカンファレンスです。

Scala をテーマにした日本最大級のカンファレンスが開催されます。

ScalaMatsuri 2016

IMG_8575

今回、弊社リクルートマーケティングパートナーズはスポンサーとして協賛しエンジニア数名で業務として参加してきました。スポンサーブース用のロールスクリーンも今回に合わせて作成したようで、人事もScala人材の採用に力を入れているようです!
場所は、東京国際交流会館というお台場の近くの会場で行われました。当日は雪が降るかもしれないという天気予報だったのですが、無事開催されました。
会場はメインホールと大きめな会議室の2つが用意されており、同時並行でセッションが行われます。1日目は、あらかじめ用意されたセッションから好きなセッションを聞きに行くという形式でした。英語のセッションでは同時翻訳機も配られていたので、英語が分からなくてもある程度理解できるようになっていました。
2日目は、アンカンファレンスと言って参加者自身でセッションの内容を決めて各会場を使ってディスカッションやセッションをするという内容でした。

  • アンカンファレンスのホワイトボード

IMG_8578

本記事では、1日目に受けたセッションと2日目のアンカンファレンスのうちいくつかを抜粋して紹介していこうと思います。

Refactoring in Scala

1日目の基調講演で行われたセッションです。
EntityのIdの型は一般的にIntLongStringなどの基本的な型ですが、型システムの恩恵を受けるべくリファクタリングしていくという話でした。とても分かりやすい内容だったのでなんとなくは理解できたのですが、Scala力の低い私ではTaggedTypePhantomType、変換に用いるためのIsoPrismなど聞いたことがない単語がたくさん出てきてまだまだ勉強が足りないなと感じました。

なぜリアクティブは重要か

今回のカンファレンスのキーワードともいえるリアクティブについてのセッションでした。リアクティブという言葉は色々な文脈で使われていますが、丁寧に一つ一つ説明してくれていてとても参考になりました。特に関数型の利点のところの説明で、高階関数によってビジネスロジックとデータ型を分離できるという部分が分かりやすく、今まで関数型のメリットがいまいち分かっていませんでしたが、すっと理解することができました。

一方で、リアクティブなプログラミングモデルのところまでは理解できたのですが、リアクティブなアーキテクチャのところが難しかったです。
英語サプリではPlayFrameworkを利用して、Dockerのコンテナで運用しています。これもリアクティブなアーキテクチャのような気もするのですが、何を持ってリアクティブというのかというところがまだ掴めていないです。

楽しく役立つ Scala リファクタリング

このセッションはScala力の低い自分でも理解できる内容で楽しめました。チェスのゲームをScalaで実装したサンプルをもとに、少しずつライブコーディングでリファクタリングしていくセッションで、以下のようなポイントで紹介していました。

  • 文字列でデータの種類を表現せずに、型を使って表現する
  • データ型と処理を分けて書く(case classとobject)
  • タプルではなく、case classを利用する
  • コレクションのメソッドを全てチェーンで書くのではなく、可読性を考えて中間状態を記述する

基本的な内容でしたが、可読性を高めるための方法をいくつか知ることができてためになるセッションでした。

Scalaでドメイン駆動設計に真正面から取り組んだ話

英語サプリでもDDDを採用しており、興味深く聞くことができました。レイヤー化しているが各層にロジックが染み出してきてしまったり、各層の変換処理が多くなってかえって複雑になってしまったり、エラーを各層に伝搬させていくなど、現場レベルで苦労した話で構成されていて共感できる内容が多かったです。
また、各層の変換処理が多くなってしまうことの解決策として説明されていたCQRSという設計手法を今回初めて知りました。
CQRSとは

  • Command
  • Query
  • Responsibility
  • Segregation

の略でコマンドとクエリで責務を分離しようとする手法だそうです。アプリケーションにおいて様々な処理がありますが、その中でもただ単に一覧からデータを引っ張ってくるような簡単な処理はクエリと呼ばれ、その場合はDomain層を省略して直接Infra層からデータを取得してきてしまうような設計のことだと理解しました。

2日目に行われたアンカンファレンスでも同様のディスカッションがあり、CQRSとEventSourcingという単語も出てきたことからこのあたりの概念は勉強していかないといけないなと感じました。

Scalaz人間

2日目のアンカンファレンスのセッションです。本当はScalaz入門なのですが、ホワイトボードに間違ってScalaz入問と書いてしまったため、Scalaz人間と間違って読めてしまうというセッションでした。

セッションの内容はScalazのコミッタの方々が登壇し、参加者に何が知りたいかを聞くような進め方でした。しかし、参加者からこれといった回答が得られなかったため、Scalazを構成している型クラスの説明から始まりました。
私は型クラスという単語は聞いたことがありましたが、それがなんなのかをきちんと理解しておらず調べながら聞いていました。会場の雰囲気を察してくれたのか登壇者同士でそもそも型クラスとは?という説明をした方がいいのではないかという話になり、Scalaz勉強会 主要な型クラスの紹介に沿って説明をしてもらうという流れでした。

英語サプリでは、PlayFramework2.4、Slick3、Scalazを使ってサーバーサイドを実装しており、EitherTOptionT\/などScalazの便利な機能を使っています。型クラスでさえ理解できていない私ですが、Scalazの便利な構文をなんとなく使えているのでScalazはただの便利な道具であるぐらいに考えて利用するというのも悪くないと思いました。とはいえ、型クラス、Implicit Parameterなどの基本的なことを理解しないといけないということに気づかされ、有意義なセッションとなりました。

Freer Monad Extensive Effect in Scala

こちらは2日目のアンカンファレンスの最後のセッションです。
1日目のセッションでFree Monadという言葉が出てきましたが、セッションを聞いても理解できませんでした。今度こそ理解できるようになるかなという軽い気持ちで参加してみましたが、これはFreeではなくより自由なという意味のFreer Monadでした…
難しい内容のセッションで私にはほとんど理解できませんでした1)同僚の新卒氏「だいたい分かりました。」が、こういう世界があるということを知れただけでも大きな収穫でしたし、いつか理解できるようになりたいという気持ちになれるセッションでした。

まとめ

数ヶ月Scalaのサーバーサイド開発に携わり基本的なコレクション操作やSlickの扱い方、FutureやEitherの概念などが理解できるようになり始め、Scalaに詳しくなってきたつもりでしたが、まだまだ分からないことだらけだったと打ちのめされるいいきっかけになったカンファレンスでした。
来年こそは分かるようになっていたいという目標ができたので、まずは、コップ本FP in ScalaドワンゴのScala Text独習Scalazなどを読んで、それらが説明できるようになることを目指したいと思います。

カンファレンス自体のTwitterの様子は、【全収録】資料も反響も総チェックしよう! 日本最大級のScalaカンファレンス #ScalaMatsuri まとめまとめに丁寧にまとめられているので、雰囲気を知るにはこちらもご覧になるといいのではないかと思います。

脚注

脚注
1 同僚の新卒氏「だいたい分かりました。」