猫でもわかるWebプログラミングと副業

本業Webエンジニア。副業でもWebエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

業務と個人でScalaを使って感じたScalaのメリット・デメリット

f:id:yoshiki_utakata:20210815235245p:plain

はじめに

この記事は、Scala アドベントカレンダー5日目の記事です。

まだ結構空いているので、みんな参加してみてください。

qiita.com

昨日は、 @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系でコンパイル言語であることが大きな特徴
    • 実行が速い
    • コンパイルでエラーを発見できる
    • コンパイルが遅い
  • パフォーマンスが不要な部分に採用すると負債になりやすい

アドベントカレンダーもぜひご参加ください

qiita.com

2日目の @exoego さんの記事も個人的には結構気になっています。

zenn.dev

個人開発した LGTMoon は Scala で書かれていますので、気になる人は参考にしてください。

github.com

コップ本

Sacla を勉強したい、と言う人は、『Scala スケーラブルプログラミング』(通称「コップ本」)がおすすめです。

Scala は言語仕様が複雑で、勉強する内容も多いため、本も分厚くて、難しくて、高くなっちゃうんですが、この本はおすすめです。僕も読みました。