Scalaの特徴ってなんだろう?もし今自分が言語に対して求めることにフラットで考えるなら、なぜScalaを選ぶのだろう?
選ぶ理由
Javaがベースである
一番はこれかもしれない。慣れ親しんだJavaの考え方をベースにロジックを組むことができる。喋り慣れている言語でロジックを考えるほうが、思考の変換をせずに済む。
関数型がある
これによりボイラープレートコードが極端に減る。JavaやKotlinにもあるけど、Scalaのほうが書いていて手に馴染む感がある。アンダースコアも、慣れればとても直感的に思える。直感的なものは思考の邪魔をしない。
コンパイル後の安心感がある
JavaよりもScalaのほうが、コンパイラでバグを見つけてくれるので、実行時にめったに落ちない印象がある。静的型付けやOption型、ローンパターン(scala.util.Using)とかがそれに貢献している印象がある。
sbtが便利
大きなものから小さなものまで、異なるアーキテクチャ向けのものまでなんでも対応できちゃう。自分は好きすぎて、Javaのプロジェクトもsbtで管理してる。
REPLが便利
初めて触ったreplがこれなのでバイアスがあるかもしれない。ちょっとしたjavaプログラム(substringの挙動とか、regexの挙動とかoffsetDateTimeの挙動とか)を調べたいときに便利。ammだと外部ライブラリを import ivy でサクッとインポートできて便利。
中立
逆に自分が選定基準じゃないもの
圏論ベースで書けること
自分が圏論を勉強していないから、読めないだけってのはある。思考のベースが圏論になると、その考え方も変わるのかもしれない。今のところはflatMapだけでも十分にコードが書けてしまうため勉強のモチベーションがない。
選ばない理由
Scala を選ばない理由はなんだろうか。
プラットフォームによってScala以外の適切な言語がある
iOSならswift, Androidならkotlin, UnityならC#など、プラットフォームに最適化された言語があるならそっちのほうが良さそう。GASとかも、やろうと思えばscala.jsとか書けるかもしれないけど、環境構築の労力と見合うのか微妙っぽくてやれてない。
依存関係地獄になる
主に既存アプリの問題。最新のScalaを使っていると問題ないけど、特にScala2系のバージョン間の互換性のなさ、それによるライブラリ選定に嫌気が差す。既存プロダクトは歯を食いしばってバージョンアップするか、機能を切り出して単機能アプリとして独立させるか(稀にそのタイミングで別言語になってしまうことも...)する必要があったりする。Scalaが流行った当時はまだオンプレ時代で単機能アプリが現実的じゃないからモリモリ多機能重鈍アプリになりがちっていうのもあったのかも。
ライブラリが多い
Scalaはその言語仕様から、何でも(?)書ける言語になっており、主要なJSONパーサーだけでも乱立する状況になってしまった。そのため「Scalaでプログラムを書くぞ!」と息巻いても、直後にライブラリ選定をせまられる。これはScalaを知らない初心者にとって高いハードルだ。Scalaを知らないのにライブラリ選定なんてできるわけがないし、ライブラリに任せたいってことはそれが主な関心事ではないので、そこで時間取りたくないし、取られるのも辛い。
ライブラリが廃れる
Scalaのライブラリは、アーリーアダプターの貢献によるところもあり(ありがとうございます)、そういうライブラリは言語のバージョンアップについていけず、最新バージョンでは使えない(=廃れてしまった)ものがあったりする。OSSならプルリク出してみるのも手だが、マージされるかはわからない。本体側での対応が難しいなら、フォークして自プロジェクトで管理する必要も出てくる。Javaだとあまりそのような事象に出会わないので、その辺は手間だ。
コミュニティが不穏
日本だとScalaMatsuriとかわいわいランドとかあって個人的にはとても好きなのだけど。(海外では)コミュニティ内外で衝突があったっていうニュースをよく聞く(バイアスがあるかもしれない)。当事者じゃないので背景も温度感もわからず、Scalaをやるうえでその話題にどう接すれば良いのか(or スルーすれば良いのか)がわからない。
ウェブに(日本語)リソースが少ない。
Kotlinとかと比べると、ググったときの情報とかが少ない気がする。Scala系は自分が知る限りDiscordに閉じている傾向があって、何か知りたいときにGoogleやTwitterではなくDiscordで聞く、っていうのはハードルを感じるかもしれない。少なくとも自分はDiscordあまり使わないので抵抗を感じる。
感想
言語や周辺ツールだとかなり便利なものが揃っているので、手軽に始めやすいってのがある。一方で運用面を考えるとちょっと考慮事項が増えたりもする。ただ、運用面の考慮事項はScalaに限った話ではなく、他の言語でも大なり小なりあるので、そこが大きなデメリットになることは少ない気がしている。バージョンギャップはPythonやRubyなんかでも聞くし、コミュニティの話はRustとかでも見かけたし、ウェブのリソースが少ないのはDiscordに対するジェネレーションギャップな気がしてならない(若い人はDiscordよく使ってる気がする)(老害発揮中)。となるとデメリットが打ち消されてメリットだけが残り、それなりの速さで高級言語が書けて、maven repositoryに過去資産が豊富で、jsやネイティブにもビルドできるってなると、とりま初手Scala選んでおいて、Scala-CLIとかでロジック実験しつつ、プラットフォーム選ぶなら翻訳する、みたいな動きが楽だと思っている。
なんだかんだ書いたけど、結局はScalaが一番手に馴染んでて書きやすいってのが大きいかな。