はじめに
この記事は、Scala アドベントカレンダー5日目の記事です。
まだ結構空いているので、みんな参加してみてください。
昨日は、 @maigo_name さんの sbt の Docker image を探したり作ったり でした。
Scala をどこで使っているか
個人での利用: LGTMoon
入社したときに、Scala の勉強のために作りました
会社での利用
私の所属している部署は、課金系のシステムを扱っていますが、その管理ツールで利用されています。
Scala のメリット/デメリット
教育コストが高い
- エンジニアでScalaを触ったことある人は少なく、教育コストが他の言語より高くつく
- 非同期をかなり意識して実装する必要がある
- implicit など、難しい概念がある
この記事を書くにあたって、Scala について考えてみました。よく「学習難易度が高い」と言われる Scala ですが、よく考えると、そうでもありません。
確かに、Python や Java といった、最近良く使われている言語と比べたら難しいと思いますが、他の言語にくらべて格段に難易度が高いとは思えません。
しかし、「教育コストが高い」は正しいと思います。PHPやPython、Javaであれば、触ったことあるエンジニアが多いですが、Scalaを触ったことあるエンジニアは非常に少ないため、必要な教育コストは他の言語より多くなります。
言語仕様もかなり独特なので、すでに他の言語を習得している人でも、すぐに書けるようにはなりません。
実装の負債化
教育コストの高さから、言語に対する理解度が不足している人も多く、実装が負債化することが多かったです。
例えば、「1リクエストごとに1秒sleepする実装をしているつもりが、実際には非同期処理になっており、一度にすべてのリクエストを送ってしまっていた」といった負債が見つかったことがあります。
実行時のパフォーマンスが良い
Scala の一番のメリットがここで、PHP、Pythonとは比べ物になりません。
私が個人開発した LGTMoon は、Heroku の一番小さいインスタンスで動いていますが、しっかりリクエストを捌き切っています。
逆に、社内ツールのような、パフォーマンスが不要なところで Scala を採用するときは気をつけなければなりません。
Scala のメリットは、パフォーマンスと、コンパイルによる異常検知ですので、この2つが必要とされない部分で採用すると、デメリットのほうが大きいと思います。
コンパイルによるエラーチェックが強力
Web系の言語は、PHPやRubyのように、インタプリタ型が多いですが、それに対してコンパイル型の言語の強みとして、コンパイル時にエラーが見つけられるという点があります。
壊れると影響が大きい部分との相性が良いです。
さらに、コンパイル時に、deprecated な構文等に対して warning を出してくれるのも非常に便利です。これにより、 Play Framework や、 Scala のバージョンアップが楽になります。
warningの例:
[warn] /Users/yoshiyuki_sakamoto/lgtmoon/app/database/Tables.scala:35:55: multiarg infix syntax looks like a tuple and will be deprecated [warn] def * = (id, contentType, createdAt, status, bin) <> (ImageRow.tupled, ImageRow.unapply)
これに対して、PHP等のインタプリタ系の言語の場合、該当部分を実行しなければエラーにならないので、非常に面倒です。
コンパイルが遅い
コンパイルをすることはメリットばかりではありません。コンパイルに時間がかかるのが一番のデメリットです。
特に Scala はコンパイルが遅く、ローカル開発だと開発に時間がかかります。高スペックのPCを用意するなどの対策が必要です。
ただし、LGTMoonほどのシンプルなシステムであれば、コンパイル時間は気になりません。
まとめ
- パフォーマンスが必要な部分に採用するのはオススメ
- Web系でコンパイル言語であることが大きな特徴
- 実行が速い
- コンパイルでエラーを発見できる
- コンパイルが遅い
- パフォーマンスが不要な部分に採用すると負債になりやすい
アドベントカレンダーもぜひご参加ください
2日目の @exoego さんの記事も個人的には結構気になっています。
個人開発した LGTMoon は Scala で書かれていますので、気になる人は参考にしてください。
コップ本
Sacla を勉強したい、と言う人は、『Scala スケーラブルプログラミング』(通称「コップ本」)がおすすめです。
Scala は言語仕様が複雑で、勉強する内容も多いため、本も分厚くて、難しくて、高くなっちゃうんですが、この本はおすすめです。僕も読みました。