最近Scala書いてるよって話
しわーっす。今年もあっという間に12月ですね。
この記事はWanoグループアドベントカレンダーの6日目の記事です。
はじめに言っときますが、この記事にはコード出てきません、ほぼポエムです。
最近業務でScalaを書き始めたので、きっかけとか勉強方法とか書きます。
動機
業務で広告配信のシステム触ってて、管理画面とかバッチ周りはPerlで動いてるんですけど、Perl、正直つらい。。。です。。。。
社内カスタムフレームワーク(Amon2のカスタム)に微妙なところがあったり、うちのコード自体に微妙なところがあったり、Perlの言語仕様自体に嫌いなところがあったりとまあ複合的な要因なんですが、静的型付け言語で書き直したいという要求が高まっていました。
で、言語選定で上がったのが以下
Goはすでに広告配信サーバで使ってて、慣れてるんですが、お隣のチームがDB周りで苦労してるのを見て、敬遠。(なんかORマッパー周りでデファクトが無いっていう認識です)
残ったJVMで動作する3言語のうち、広告配信の会社でScalaがよく使われているというのを知っていたので、まあ、右にならえでScalaかな、という感じ
あと、今後AWS Glueでsparkのコードを書く可能性があるというのが大きい。
勉強方法
コップ本を半分くらい読んでたところで実践Scala入門が出たので、コップ本はまだ最後まで読めてません。
上2つを読んでれば、まあ、なんとなく読み書きできるようにはなるので、あとは、Scala MatsuriやScala関西の過去の発表資料を読んだりして補いました。
あと、Javaの人にはおなじみのひしだまさんのサイトなど
実は以前勉強しようとして挫折してる
2012-2013ごろ、客先常駐でSAStrutsのカスタムフレームワークでWebアプリ書いてたんですが、そのころにScala勉強して一度挫折してます。
そのころと比較すると今回はすんなり身についた感があります。
要因としては以下
いきなりコップ本読むのは実際つらいですからね。
あと、当時はimplicit conversionを見てキモチワルと思ったんですが、近年はimplicit conversionがはっきりとバッドプラクティスとされているのも大きいかもしれない。
それと、コンパイルがかなり速くなってることとか大きいですね。 (当時はplayframeworkのテンプレートを修正するだけで長いコンパイルが走ってた記憶)
Scalaの良いと思ったところ
月並ですが、
- for式
- パターンマッチ
- Option, Either, Try
- Case Class
などの存在ですね。
元々Javaの人なので、コード中にnullチェックが全然必要なかったり、ボイラープレートなコードを書く必要が少ないことに感動しています。
あと、型に守られているという安心感。
Scalaで困っているところ
モナドがわかりません
モナド分からなくてもアプリケーションコードはまあ、書けると思うんですが、ライブラリとかフレームワークの中で出てくるので、それらの中身を読む必要が出てきたときに困りそうですよね。
それから、implicit xxxxが微妙にわかってません。引数にimplicitがつくのは分かるんですが、implicit objectとかimplicit classとか、それらが絡むScalaのデザインパターンはちゃんと把握できてないです。
また、デファクトに近しいフレームワークの、Playframeworkの最新版に準拠した書籍がないのが地味に困ります。日本語書籍が無いのはわかってましたが、洋書でも2.6対応の本が無いんですよね。マニュアル読めって言われたらそれまでなんですけど。
上記にちょっと近い問題で、最近はScalaの入門的なブログエントリなどが少ないのかなという印象があります。Scalaを使っている会社の中の人たちのレベルが成熟してきていて、アドベントカレンダーなどでもアドバンスドな内容のエントリが増えているのかなと想像しています。
実際習得難易度としてはどんなもんか
Java8以降をバリバリ書ける人であれば、実践Scala入門とドワンゴの研修資料を通読すれば、「なんとなく読み書きできる」ってレベルまではすぐだとは思うものの、やっぱりGoと比較すると学習コストは高いかなと思いました。
Goの場合はTour of Goやるだけでも「なんとなく読み書きできる」感になるので。
まとめ
実践Scala入門おすすめ