https://zenn.dev/gakuzzzz/articles/f533f18df151d1

前置き

先日Twitterでこのような興味深いツイートを拝見しました。

なるほどと思ったので、自分が技術選定/アーキテクチャ設計において「どのような時にScalaを選択し、どのような時に選択しないのか」をあらためて言語化してみることにしました。

ちなみにこの記事タイトルは Scala福岡 2019 で講演させて頂いたものと同じタイトルですが、当時の資料は説明が無いと誤解を招く部分も多く非公開にしているため、その焼き直しも含めてこの記事を書いています。

また、ここで記載している内容は2022年8月現在の事情を元にした考えになります。言語の機能やとりまく状況などは日々変わっていくものであり、前提が変われば結論が変わることも当然にあります。あくまで現時点での意見の一つとして参考程度にして頂ければ幸いです。

また、この記事では主に言語機構や周辺ライブラリ・エコシステムといった側面からの判断を中心として記載しています。開発を行う人員については、自分を含め著者自身が集めたり依頼できるメンバー・チームを想定しています。 プロジェクトの体制や組織の人員計画などは個々のプロジェクトだけではなく、マーケティングや組織のMVV(ミッション・ビジョン・バリュー)、事業戦略、採用プール、採用コスト、教育制度などなど色々な要素が大きく関わってくるため、あまり一般化しても意味のある内容にできないと判断したためです。ご了承ください。

Scalaを有力な選択肢とする時

さて、自分がScalaを有力な選択肢の一つとする時は主として 「長期の運用および機能改善をし続ける想定のシステムを開発する時」 です。これに実行環境の要件などの制約を加味して選択肢を絞り込む形になる事が多いです。

また、システムの要件から分散処理系の実装として AkkaScio などを使用しなければ実現が難しい等、「特定のScalaライブラリに強く依存するシステムを開発する時」 も必然的に選択肢として有力になります。 もっともこれに関しては、IaaS や PaaS などのアーキテクチャの選択によって必須にならなかったり、Java や Kotlin から当該ライブラリを呼び出したりする事で、必ずしも Scala が優位な選択肢になるとは限らないケースも多い印象です。

従ってここでは「前者の長期の運用および機能改善をし続ける想定のシステムを開発する時」について掘り下げます。

長期の運用および機能改善をし続ける想定のシステム開発時

これは例えば SaaS のWebアプリケーションのバックエンドだったり、業務システムのサーバ実装だったり、あるいはスタートアップでMVPを明確にした後の機能を段階的に実現していくステップだったり等を想定しています。

ここで重要な事は 「長期に渡り改善をし続ける」 という事です。

例えば業務システムなどにおいて、一度作りきった後は追加開発に投資せずセキュリティアップデート等の保守運用しかしない、といった想定の場合はこの対象から外れます。

またスタートアップ等において、仮説検証がまだできておらずスクラップ&ビルドで仮説検証を行う場合なども当てはまらない想定です。この段階ではそもそもプログラミングに注力するより SaaS のマッシュアップや RPA などを組み合わせて仮説検証する方が賢明でしょう。

ではこの「長期に渡り改善をし続ける」という前提において何故 Scala なのかというと 「型システムの強さ」 が回答になり、何故他の型システムが強力な言語ではないのかというと 「JVMの資産活用」 が回答になります。

型システムの強力さ

近年では PHP に Type declarations が導入され、Python に Type hints が導入され、JavaScript も TypeScript が生まれ、Ruby にも RBS が導入され、と静的検査の活用がますます重要になってきています。