読者です 読者をやめる 読者になる 読者になる

この国では犬が

本と芝居とソフトウェア

スカラ祭 2016 1 日目 : Scala を掘り下げたくなりました #ScalaMatsuri

Scala ソフトウェア

この土日で開催されている ScalaMatsuri 2016 に参加しています。

日常業務ではほぼ 100% Java を使っていて、Java はそのエコシステムまで含めた総合力ではとてもナイスな言語だと思うのですが、どうしても他のよりモダンな言語に比べるともう一つ……というところもあって*1、じんわりと Scala の可能性を探る日々です。

そんなじんわりじんわりした中、一発大きなカンファレンスに参加したら色々とコトが前進するのでは、と一念発起して 1 万円の参加費をはたいて、スカラ祭に参加しています。
まだ 1 日目ですが、参加してとてもよかったと感じています。

以下、参加したセッションの感想を述べます。

セッション

本当は朝の 10:00 からがくぞさん(@gakuzzzz)のセッションがあったのですが、寝坊しました……。
土曜日に早起きはできない。

せめてもの罪滅ぼし(?)に、セッション資料だけでも紹介させてもらいます。

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

というわけで、一発目は岡本 雄太さん(@okapies)のセッション。

Java 界隈でも著名な岡本さんのセッションを初めて見たのですが、噂に違わぬハイテンポなセッションでした。
わずか 40 分でリアクティブひとめぐり!

www.slideshare.net

とてもよく整理された内容と語り口で、聞いているときはなるほどなるほどと思っていたのですが、終わってしばらくたってみるとよく覚えていません。笑

記憶が追いついていないだけだと思うので、……スライドで改めて復習します。
スライドもやはりよく整理されていて、あとで見返すこともしやすいのがありがたいと感じます。

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

Wix 社の Tomer Gabel さん(@tomerg)のセッション。

表題の通り、Scala で書かれたあんまりいけてないコードを Scala の機能を活用しながらいけてるコードにリファクタリングする、という内容で、ライブコーディングも交えながらほどよいテンポで(笑)進みました。

www.slideshare.net

実際僕は Scala を始めたばっかりで、公式のチュートリアルをようやく七割がた終えたところという体たらくなのですが、そのレベルでも Scala らしいコードの書き方、Scala のよさを感じられるありがたいセッションだったと思います。

具体的には、ざっくり以下の二本立てでした。

  • "Stringly Typed"(「書式」を取り決めた文字列を引き回してあれこれするようなコード)を改善する
    • 文字列を渡して内部でパースするコンストラクタを、ファクトリ関数に置き換える
    • そのオブジェクトの使用箇所も、いい感じにパターンマッチを用いるように書き換える
  • Collection Abuse(コレクションの乱用)を改善する
    • インラインで処理をつなぎすぎているところへ、一時変数を導入したり、ローカルな関数を定義して名前をつける
    • タプルをやめ、ケースクラスを定義して要素に名前をつける

こうして見ると、普段から Scala を使っている人にとってはだいぶ基本的だったのかもと思いますが、僕のような初心者にとってはまさに求めていた内容でした!
英語がゆっくりでとても聞き取りやすかったのも助かりました。*2

バッチを Akka Streams で再実装したら100倍速くなった話

TIS の根来 和輝さん(@negokaz)のセッション。

MySQL からその日の取引情報を取り出して時刻順に並べて CSV ファイルに書き出す、という夜間バッチを、Rails による実装から Akka Streams に置き換えたことで 100 倍……どころか 295 倍速くなった、という話でした。295 倍。笑

www.slideshare.net

テスト用の環境とデータを用意して、ボトルネック(メモリ)を特定して、解消して、新しいボトルネック(CPU)を特定して……というパフォーマンス改善の正道をいくプロセスで Akka Streams に行き着いた、といったストーリーで、納得感のある内容でした。

ただ、15 分しかない枠だったこともあり、個人的には Akka Streams ならではの話というか、苦労したところとか、こういう問題があってこう解決したとか、なぜ他の言語やツールキットではなく Akka Streams を採用したのか、みたいな話を期待していたけれどそういうのがなかったのが、ちょっと惜しかったかな……という感もありました……というところまで書いて、そういえば最後に Tips のスライドがあったけれど時間がなくなって飛ばされていたことを思い出しました。
15 分では仕方ない、とは思いますし、この 15 分の枠というもの自体は、お昼すぎの眠たくなりがちな時間帯に軽いテンポをもたらしていてよかったと思うので、なかなか難しいところです。

アジアから Scala OSS に貢献するということ

退職にともなう連日の飲み会で声が……と言いながら始まった、瀬良 和弘さん(@seratch)のセッション。
退職自体はセッションの内容とは(たぶん)関係ありませんが、「エムスリーの瀬良さん」というイメージだったのでちょっとびっくりです。今後のご活躍も楽しみです。

さて、内容はというと、一言でいうと、日本人はもっと世界に出た方がいい、というメッセージを伝えるものだったと思います。英語で。*3

www.slideshare.net

瀬良さん自身は海外に住んだことがない、「ふつうの」日本人プログラマだけれど、Skinny FrameworkScalikeJDBC といった OSS を自ら開発・公開されたり、様々な OSS に貢献されたりしていて、みんなにもできるはずだ、やっていこう、という話でした。
もし自分のプロダクトを公開したら README も英語で書こう、ブログも英語で発信していこう、といったこともおっしゃっていました。

個人的に、「たしかに」と思ったのは、日本では日本語で読める技術書が豊富に出ていて、日本語のコミュニティも活発だけれど、それは(日本人一般が)英語が苦手であることの裏返しだ、ということです。英語が苦手だから、日本語の書籍が充実するし、充実しているから、英語が読めなくてもやっていける。
でも、また同時に、やはり英語ができた方が得られる情報も発信できる情報も増えるのは確かだと思います。この業界、とにかく第一線の一次情報が英語という場合が割合として非常に大きいので、英語を使ってコミュニケーションしていくということは、それが大きなコストのかかることであっても、やる価値があるし、これから先どんどんやらないといけなくなっていくだろうな、と感じています。

Scala コードは JVM でどのように表現されているのか

午後から始まった 15 分セッションの 3 本目にして最後は、関ジャバの会長である阪田 浩一さん(@jyukutyo)のバイトコードセッション。

www.slideshare.net

恥ずかしながら、このセッションに参加するまで Scala コンパイラが最終成果物として何を出しているのかのイメージをきちんと持っていませんでした。

ああ、言われてみれば当たり前なのですが。.class ファイルとして、JVMバイトコードを出しているのですね。
CAFE BABE から始まる、Java プログラマにはおなじみのやつです。

15 分セッションだけあってさすがに駆け足で進むのですが、バイトコードの基礎知識に始まって、trait、パターンマッチ、カリー化といった Scala ならではの記法がバイトコードでどう表現されるのかの解説までを、無駄なく、漏れなく駆け抜ける、見事なセッションでした。

バイトコードはこうやって読むんだよ」とか「javap 使おう!」とか、それだけなら 15 分でもやれると思うのですが、それらの内容もきっちりおさえつつ、Scala コードとの対応関係までわかるように解説するというのは……。

やはり、(なぜか)「イメージをきちんと持っていなかった」僕が「わかった!」という感動を得られたのは、実際の Scala コードとそのコンパイル結果のバイトコード(の javap -v の結果)をバシッと見せてもらったからだと思います。
おみそれしました。

あなたのScalaを爆速にする7つの方法

井上 ゆりさん(@iyunoriue)(と、インケンさん)のセッション。

爆速、爆速……と思いながら参加しましたが、がっつりベンチマーク取っての骨太な、でありながらかつクイズ形式で和やかに進むというお得なセッションでした。

www.slideshare.net

SSD 上の 2GB の Memory Mapped File の方が(同サイズのデータを扱う)memcached 1.4.0 より速い(memcached 1.4.0 では 1 キーあたりのデータサイズが 1MB 以下という制約がある!)とか、フィボナッチ数列の生成で Stream による実装の方が Array による実装の方が圧倒的に速い(Stream の方は値を 1 つしか取り出していなかったから! ずるい!)とか、なかなか意表を突くクイズも取り入れながら、単なる豆知識にとどまらない、Scala の奥深さを感じられる内容だったと思います。

個人的には、コレクションの性能周りの問題に、(Scala のコレクションのことはほとんど知らなかったのですが)C++ 時代の知識とコレクション名からの推測でだいたい正解できたのがなんかちょっと嬉しかったです。笑
でもまじめな話、データ構造なんてのは言語によってそうそう大きく変わるものではないので、こうやって知識が応用できる場合があるのもさもありなんで、プログラマというのは経験をきちんと積めば報われる職業だな、ということもちょっとだけ思ったりします。

あと、Scala はコレクションの性能特性が公式ページに一覧化されている、というのもステキですね。

一目瞭然です!

The Zen of Akka

JavaOne 2015 では Java 9 に入る予定の Reactive Streams の話をされていた、Typesafe 社の Konrad Malawski さん(@ktosopl)のセッション。

同時間帯の関数型ドメインモデリングのセッションもちょっと気になっていたのですが、概要に「ドメインの代数がモノイド、函手、モナドといった圏論的な構造から構築できるか試してみる」みたいな文字列を見つけて(あっ……)と思ってこちらに逃げてきました。

このセッションは、「Akka という考え方」とでもいうべき、Akka とうまく付き合うためにどう考え、どうすればいいかが詰まった内容でした。

www.slideshare.net

そもそも Akka を使ったことも使おうと思ったこともないので*4、Akka そのものとのマッピングはできていないのですが、それぞれの特徴的な考え方から Akka の輪郭が浮かび上がってくるようなセッションでした……いや、まじめな話。笑

実際に使っている人にとっては、なおさら面白い内容だったのではと思います。
いつか使う(使おうとする)日が来たら、きっと思い出すことになるでしょう。

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

本日最後は、MOTEX の藤井 善隆さん(@yoshiyoshifujii)のセッション。

www.slideshare.net

藤井さんは Scala を始めてからまだ 7 か月、チームも似たような感じということで、にもかかわらずドメイン駆動設計というチャレンジも重ねて、苦労しながらの、進行中の知見を共有する、ということで、かえって僕のように知識も経験もない人にも共感できるところの大きい内容だったと思います。

特に面白いと感じたのは、「どうしてもレイヤ感で責務が漏れてしまう」といった課題に対して「チームでどうするか決める」「コードレビューやモデリング(のレビュー)で対処する」「定常的にリファクタリングし続ける」といったプロセス的な解決策が色々上がってきたところです。現場感がありました。

一方で、CQRS(Command Query Responsibility Segregation)の考え方を適用して、クエリ(データの取得)については限定的に Query Model としてレイヤ間を飛ばして扱えるようにする、という技術的な解決策も出ていたり、Query Model に対して Command Model はあくまでレイヤー化アーキテクチャを守る、という判断があったり、結局こちらも現場感なのかもしれませんが……ドメイン駆動設計で開発することになったらきっと同じことで悩むのだろうな、と感じられる、学ぶところの大きい内容だったと思います。

その他雑感と一日目のまとめ

そんなわけでスカラ祭初日はとても充実した一日でした!
セッション終了後の懇親会も楽しみました。

参加費 1 万円を支払った甲斐は十分あったと感じます。
冒頭や本文中にも述べたように Scala は全然始めたばかりなのですが、初心者でもそれなりに理解できて、かつ奥行きもある質の良いセッションが多かったのではないかと思いますし、会場も全体としては広く、時間的なゆとりもあり、水や、お菓子やコーヒーといったちょっとしたサービスもとてもありがたかったです。

何といっても Scala を使っている・使おうとしている人たちが 500 人ばかりも一堂に会する場所に集まって(そんな場所が日本にあるのです!)、その空気を吸うことがとてもいい刺激になっています。
この辺は JavaOne に参加したときの感想にも近いところがありますね。

それから、Scala やっぱりいい言語だな、と思います。
まだ半分お試しのつもりでしたが、Scala をちょっとまじめに掘り下げてみたくなりました。

二日目は主にアンカンファレンス形式ということで、いったいどうなるのか若干不安もありますが笑、それ以上に楽しみです!

追記 : 2 日目も行ってきました

enk.hatenablog.com

*1:Java に限らず、Scala も含むすべての言語には得意不得意があるわけですが

*2:僕は利用しませんでしたが、今回の ScalaMatsuri では、多くのセッションで同時通訳もついていました

*3:ScalaMatsuri のセッションはそもそもだいたい日英半々で、日本人で英語の発表をされている方もいたのですが、瀬良さんの場合は特にそのメッセージと重ねていたところが大きかったのだろう、と思います

*4:Scala 界で有名なライブラリ群、くらいの認識