Scala Days 2019に行ってきました!Scala 3の最新情報を一挙公開! 

f:id:vasilyjp:20190621161508p:plain

こんにちは!ZOZOテクノロジーズでバックエンド開発をしている@acjustplayです。

実は!この前!世界で一番大きいScalaカンファレンス Scala Days に行ってきました!

今年のScala Daysはスイスのローザンヌで、6/11〜13の3日間の開催でした。今まではアメリカとヨーロッパのどちらかでの開催が多かったですが、ちょうど今年がScala誕生15周年とScala Days開催10周年が重なり、特別な意味を持つ場所ーScalaとScala Daysの起点と言えるEPFL(スイス連邦工科大学ローザンヌ校)での開催になりました。

ちなみに今年はEPFLの50周年記念と私の初海外カンファレンス参加記念でもあり、もはや奇跡の宝箱としか言えないですね!

ScalaのロゴのモチーフになるEPFLの階段
あの有名な階段はEPFLの中にあります!

今回のScala Daysで私が一番注目していたのは、やはりScala 3の情報だったので、それに関連するセッションの内容を紹介していきたいと思います!

Day 1: A Tour of Scala 3

まずはDay 1のオープニングキーノート、EDMとともに登場されたScalaの作者Martin Odersky教授からの「A Tour of Scala 3」。

セッションのスライドはこちらへ

Scala Daysのメイン会場
会場おしゃれすぎます

キーノートの内容はスライドにわかりやすく記載されているので、詳細はスライドをご覧ください。ここでは、ざっくりとまとめておきます。

Scala 3のロードマップ

おそらく、みなさんが一番気になるのは「Scala 3いつ出るの?」という点でしょう。少なくとも私はめっちゃ気になっていました!

キーノートによるとScala 3は 2020秋 にリリースされる予定です(Day 2のセッションで、これとはちょっと異なるロードマップも提示されていましたが…)。そしてScala 3へより移行しやすくするために、並行してScala 2.14の開発も進めているようです。

Odersky教授のScala 3おすすめ機能ランキング

キーノートで一番比重が大きかったのがこの部分です。Odersky教授が、各レベル向けのScala 3のおすすめ機能ベスト3をピックアップしてくれました。

For beginners(初心者向け)

  1. Enums
  2. Toplevel definition
  3. Drop new

For everyday coding(業務で使っている人向け)

  1. Delegates
  2. Extension Method
  3. Union Type

For experts(上級者向け)

  1. Functions Everywhere
  2. Typeclass Derivation
  3. Match Types

各機能の細かい説明はスライド、またはdottyのドキュメントに記載されているので割愛します。

この中で、個人的にはDelegatesの導入に一番興味を持っています。Delegatesは今までの implicit の代わりとして紹介されました。モチベーションとしては、implicit の中でも非常に強力な一部の機能は、簡単に記述できるため乱用されがちでした。その乱用を防ぐためにより安全かつ意図が伝わりやすいDelegatesが用意されたそうです。

dottyのドキュメントでも implicitdelegate で書き換えられる説明が載っているので、3に移行する予定があれば事前に慣れておいたほうがよさそうですね。

ちなみにOdersky教授は事前にTwitterでみんなのおすすめ機能のアンケートを実施して、以下のような結果になったそうです!

  • For beginners(初心者向け): Enums
  • For everyday coding(業務で使っている人向け): Union Type
  • For experts(上級者向け):Typeclass Derivation

私もほぼ同じ考えだったので、日頃からアプリケーションコードを書いている人にとっては、記述量が減らせてシンプルに使える機能の方が人気なのかもしれないですね。

Day 2: Future-proofing Scala: the TASTY intermediate representation

EPFLのLAMPチームのGuillaume Martresさんから、Scala 3の独自の変換用フォーマットTASTyの紹介です。

セッションのスライド

TASTyはdottyと一緒にScala 3から導入されます。例えばFoo.scalaをdottyでコンパイルしたら、Foo.tastyとFoo.class 2つのファイルができます。

tastyファイルはプログラム(.scala)の情報を保持して、実行可能なファイル(.class)に変換できる形式になりますので、イメージとしてはFoo.scala -> Foo.tasty -> Foo.classという感じです。

tastyファイル生成は型チェックの後に行われ、まずプログラムの情報を抽象構文木(Abstract Syntax Tree, AST)にパースして、タイパーで型情報を付与します。その型付けをした抽象構文木(Typed Abstart Syntax Tree)を保存しているのがTASTyです!

そしてプログラムなのでコメントなどドキュメント情報も保存できます。フルのフォーマット情報はGitHubで確認できます。

TASTyを導入する一つの理由としては、今までScalaでバージョン間の互換性を担保しづらい課題を解決したいという点があるそうです。

根本的な機能改善や変更を加えたい時に、バイナリー互換性を破壊しないことはほぼ不可能です。例えば最近出た2.13でも、コレクション構造の見直しによって2.12とは非互換になっています。

TASTyを導入することで、対応するScalaバージョンのライブラリjarがまだ存在していなくても、classファイルを消してtastyファイルから再生成すればエラー発生させずに、自分のプロジェクトコードを実行できるとのことです。

Scala Daysで提供されたコーヒー
ちょっと休憩でコーヒーの写真入ります。Scala Daysでは、常にカフェイン+各種飲み物+スナックが提供されています。

Day 2: How are we going to migrate to Scala 3.0, aka Dotty?

LightbendのScalaチームのLukas Rytzさんから、Scala 3の変更点、移行プランの詳細紹介です。

セッションのスライド

もともとは、"How do we prepare ..." という表現のタイトルでしたが、Scala 3のロードマップが明確になったので、より肯定的な表現にされたらしいです。

セッションのスライドはこちらへ

セッションの主な内容は以下の3点です。

  • Scala 3の変更点
  • Scala 2、3チーム開発の進め方
  • マイグレーションのタイムライン

ここで要注意なのが、スライドにあるタイムライン(p.27)とキーノートのタイムラインが違う(!!?)ことです。セッションのスライドによるとScala 3のリリースが2021年に予定されていますが、果たしてどちらを信じるべきでしょうか!?

そして、変更点として一番に挙げられたのがやはり implicit が変わることでした。10年前だと一つの機能でいろんなことができるのが良いとされていましたが、今では利用者の用途ごと最適な機能を提供するようにシフトしてきました。その考え方の変化が今回の変更につながったとのことです。

セッションの最後に、Scala 3はScala 2+1だ(ScalaのStandard Libraryは2系のものをそのまま使うので)とRytzさんが強調されていました。

Scala 3の変更が大きすぎて、もはや別の言語ではないかという議論がよくされます。このセッションを踏まえて、マイグレーションをスムーズに行えるように開発チームがすでに色々考慮、用意してくれていることがわかったので安心できますね!

Day 3: Metaprogramming in Dotty

EPFLのLAMPチームのNicolas Stuckiさんから、dottyでのMetaprogrammingのセッションです!

ScalaのMetaprogrammingといえばマクロですが、Scala 2のmacrosのデザインはコンパイラの内部実装に依存しているので、そのままdottyとScala 3で使えません。そのためdottyではmacrosがリデザインされました。

その影響でdottyを使いたい場合は既存のマクロを書き直さないといけないです。ただし、マクロのプロジェクトをそのままdottyのプロジェクトから使う分であれば大丈夫だそうです。

セッションのスライドはこちらへ

dottyからは新しいmacrosが導入され、さらにmacrosを使わなくてもMetaprogrammingができる機能が追加されます。セッションでは一番コアになる部分を紹介してくれました。

Inline

Metaprogrammingのための新機能。このmodifierをつけるとコンパイラがいい感じにコードを展開してくれます。

Match Type

型パラメータをパターンマッチして型を返せる機能です。Metaprogrammingのための機能ではないですが組み合わせて使うと便利です。

Macros: Quotes & Splices

'$でマクロを作成できます。'はコードをデータに変換し、$はその逆の動きをします。お馴染みのstring interpolationに似ていますね!

Macros: TASTy Reflect

Quotes & Splicesだけではできない、型付け構文木(TASTy)を分析、構築できるAPI。

スライドでは各機能の使い方をサンプルコード付きで丁寧に説明されていますので、一通り目を通してみてください!

おまけ1:他の面白かったセッション

Scala 3以外にも面白かったセッションがいっぱいあります。印象的だったセッションは以下の2つです!

Day 2: Testing in the postapocalyptic future

Daniel Westheideさんから、Scalaであまり聞かれないMutation Testingをどう実現するかの話です。 スライドはこちら

Day 3: Pure Functional Database Programming‚ without JDBC

doobieの作者Rob Norrisさんから、jdbcを使わず、かつ関数型プログラミングでPostgreSQLのデータベースを操作する話です。

実装したサンプルはSkunkというライブラリです(また実験中なので使わないでくださいとNorrisさんが言っていました)。

おまけ2:関連イベント

今年は10周年記念でもあり、みんなを盛り上げるために運営チームはかなり関連イベントに力を入れていました。例えばローザンヌの市内観光ツアー(!)や、ラヴォー地区のブドウ畑観光ツアー(!!)はカンファレンスパスを持てば無料(!!!)で参加できます。私はスケジュールが合わずツアーに参加できなかったですが、それ以外にも素晴らしいイベントがたくさんありましたので少し紹介します!

自撮りブース

そうです。自撮りです。あのScalaロゴのモチーフにもなったEPFL校内の階段と自撮りできる機会がカンファレンス期間中用意されていました。

自撮りできる機械
階段と自撮りできます。チャレンジしてみましたが完全に失敗しました。

Scala Spree

Scala SpreeはDay 1の朝一からオープニングキーノートが始まるまで、EPFLのキャンパスで行われます。 同じ会場で初心者向けのScala Bridgeも開催されています。

EPFLのキャンパスご飯
イベントでランチ券が配布されて、EPFLの学食を体験できます。

「開発者にもっとオープンソース文化に慣れてもらう」のがScala Spreeの趣旨です。なので参加者はOSSのプロジェクトにプルリクエストを出してマージしてもらうことが目標です。

プロジェクトの担当者は参加者に手伝ってもらいたいIssueのリストを用意して、参加者はその中からピックアップしてプルリクエストを出せるまで開発する感じです。もちろんリスト以外の自分が気になる課題があればそれを行っても構わないですし、プルリクエストを出さずに各プロジェクトをセットアップして試したりするのもOKです。結構ゆるい感じです。

プロジェクトはみんなさんお馴染みのscalac、Coursier、dotty、Scala.jsなどがあります、プロジェクトのMaintainersもその場でサポートしてくれますので、気軽に質問することができます。  

ContributorのTシャツ
ContributorのTシャツが欲しくてドキドキしながらScalaのリポジトリにプルリクエストを送ってみましたが、最後に、参加者全員にTシャツをプレゼントとして渡されました(笑)

メインライブラリーへコミットするのは、ずっと難しそうとか、敷居が高そう、というイメージを持っていましたが、難易度が低くて簡単な修正だけど誰かに直してもらいたいというIssueもたくさんあります。

初めての人でもコミットしてもらいやすくするために、プロジェクト側も色々と工夫をしています。例えばScalaのリポジトリでは good first issue というラベルを、初めてプルリクエストを出す人向けのIssueにつけられています。私もここからIssueを探してプルリクエストを出しました!

Diversity & Inclusion Lunch

Day 2は、Scalaコミュニティの中で少数派になる人たち(underrepresented groups)のためのランチが用意されました。アイスブレイクとしてピープルビンゴゲームから始まり、そのあとみんなでランチを食べながら交流していきました。初めての海外カンファレンスで知っている人がいなかった状況の中、参加者と交流するきっかけを作ってもらえ、本当に助かりました。

sphere.itのチケット
ランチでsphere.itの運営者と話す機会があり、そのあとチケットをいただきました! ありがとうございます!

ランチ以外にも、Diversity & Inclusionのパネルディスカッションがあり、ダイバシティの重要性を発信する企画に感動しました。

Community Dinner

Day 2の夜にカンファレンス参加者が全員参加できるCommunity Dinnerがローザンヌのオリンピック・ミュージアムにて開催されました。

オリンピック・ミュージアム

オリンピック・ミュージアムから眺めるレマン湖

場所をオリンピック・ミュージアムにする理由はこの映える眺めではなく、オリンピック精神である"friendship, solidarity and fair play"(友情、連帯感、フェアプレー)はScalaコミュニティが大事にしているバリューにもあてはまるからです。細かいところまでコミュニティの価値観が体現されています。

そしてまさかのジャズ演奏があります!

ジャズを演奏しているバンド

踊っているScalaエンジニア
リズムにのってみんな踊りだす!

Community Dinnerで他の参加者とも交流ができて、他の会社/国のテック事情も聞けて大変良かったです。最後にみんなからの熱い要望に応じて、バンドのアンコール演奏を持ってCommunity Dinnerが円満閉幕しました。

おまけ3:ローザンヌ

最後のおまけでは、ローザンヌの風景をお送りします。

ローザンヌ大聖堂
ローザンヌ大聖堂

Esplanade de Montbenon
Esplanade de Montbenon

ローザンヌの街並み
ローザンヌの街並み

レマン湖の白鳥達
レマン湖の白鳥達

ローザンヌは非常に激しい坂が多い町です。毎日山登り気分でした(日本に帰ってきたら少し筋肉痛になりました)。

坂に駐車している車
坂でもお構いなく駐車しています

おわりに

行く前は、正直「どうせそのあと動画上がってくるし行かなくても…」と思いながら参加するかどうか少し迷っていました。しかし、実際に現地でセッションを聞いたり、参加者と交流したり、そして一番重要なのはみんながコミュニティをより良くさせよう、Scalaをもっといろんな人に知ってもらおう、と努力している姿を直接体験することができて、本当に良かったです。

ここで「Scalaのカンファレンス行ってみたいなぁー」と思ったあなた! 日本最大級のScalaカンファレンス、Scala Matsuri が6/27〜29にお台場の東京国際交流館で開催されます! 面白いセッションはもちろん、パプリック向けの無料ワークショップ(!!!!)もありますので、気軽に参加してみてはいかがでしょうか?

ZOZOテクノロジーズも将軍スポンサーとして協賛します! あとブースも出しますので、是非遊びにきてくださいー!

最後の最後に

今回のScala Daysの参加にあたって全ての費用を負担してくれた会社に感謝しかないです。さすが物価世界一高いスイスです。震えます。

ZOZOテクノロジーズは、最新技術を学びたければ会社が惜しげなく後押ししてくれます。エンジニアまだまだ募集していますので一緒に働いてみませんか?

www.wantedly.com

カテゴリー