序
ここ数年していた私の業務は大雑把にいうと以下のような感じ。
python3系
- numpy+C/C++で書かれたツールで、大きめのデータを扱うパイプラインを構築する。
- pandasで、RDBを読んだりexcelやらcsvやらを扱ったりする。
scala2系
- Sparkで、大きめるデータを扱うパイプラインを構築する。
- Playframework/Akkaで作られたwebアプリをメンテする。
pythonはおそらく今後しばらくは大きく変化しないが、Scalaは本年に登場予定の3系にだんだんと移行していくものと思われる。
Scala3では、
Scala 3、Pythonのようにインデントベースの構文で書けるようになるってよ!
に紹介されているように、以下のように、pythonに親和的な書き方「も」できるようになりそうだ(現時点では、反対も多いようだが)。
enum Day
case Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
def isWeekend: Boolean = this match
case Saturday | Sunday => true
case _ => false
def fromString(str: String): Day =
try Day.valueOf(str)
catch
case _: IllegalArgumentException =>
throw new IllegalArgumentException(s"$str is not a valid day")
def use(dayString: String) =
val day = fromString(dayString)
if day.isWeekend
println("Today is a weekend")
println(s"I rest {dayString}")
else
println("Today is a workday")
IDEの応援があると、scala2系を書いている時に、pythonをうらやましいと思うことはほとんどないのだけれど、まぁ、インデント構文の方が可読性が高い気はする。
さて、ということで、今python3を使って仕事している方々が、いずれscala3系をマスターしておくと10年後に、どの程度幸せかを軽く考えてみた(以下、python3も適宜併用することが前提)。
10年後のお仕事想定
[1] Scala3でマイクロサービスなお仕事をする。
長いことプチパズワードなマイクロサービス。生き残っているITサービスを継続的に改善していくのに資するものなので、今後もマイクロサービスを作るお仕事は少しずつ増えていくものと予想。マイクロサービスの場合、インターフェースがきちんと切られていれば実装言語はさほど問われない。技術者の集めやすさと言語の生産性の高さで決まるものと思われる。
Scalaには、数年前からマイクロサービスフレームワークlagomが登場している。近年のlagomは、web系の企業の選択肢のひとつとして定着したplayframwork+akkaの上に作られており、今後はマイクロサービス開発に使われるようになっていくものと考えられる。
参考 マイクロサービスフレームワークのLagom 1.5がAkka Managementを導入、KubernetesとOpenShiftをサポート
(開発経験がないのでお勉強レベルだが、)マイクロサービスでは、Future等を駆使してた非同期サービスを作ることが基本になる(以下、scala3インデント構文風(?)に書いてみた)。
package com.example.hellostream.impl
import com.lightbend.lagom.scaladsl.api.ServiceCall
import com.example.hellostream.api.HelloStreamService
import com.example.hello.api.HelloService
import scala.concurrent.Future
/**
* Implementation of the HelloStreamService.
*/
class HelloStreamServiceImpl(helloService: HelloService) extends HelloStreamService
def stream = ServiceCall x =>
Future.successful(x.mapAsync(8)(helloService.hello(_).invoke()))
参考 マイクロサービスフレームワーク Lagom の新規アプリケーションを作成する
デバッグのことを考えると、非同期の処理は、コンパイル言語であるscalaで書く方が安心感があるだろう。
おまけ、lagom.jsでクライアント側も書く
長いこと、バージョン0.6台だったscala.jsが2020年に入りバージョン1.0に達している。
https://www.scala-js.org/
広く使われているわけではないが、マイクロサービス気クライアント側をscala.jsで書くという選択肢も10年後ならばありかもしれない(まだなし、かもしれないが)。
以下を見るに、マイクロサービスのクライアント向けのlagom.jsという開発が進んでいるようだ。
https://github.com/mliarakos/lagom-scalajs-example
こんな感じにクライアント側でパターンマッチを使って書く、らしい。
client.greeting.invoke().onComplete
case Success(message) => // display message
case Failure(exception) => // handle exception
[2] Scala3でデータエンジニアリングなお仕事
Amazon EMR、MS databricks等、クラウド上でのビックデータ案件でも、定番の一つとなっているScala2+Spark2。
蓄積されるデータは今後10年も増えるだろうから、10年後にはScala3+Spark3(?)のお仕事は当然にあるはず。ただし、pysparkでいいのでは、という話も増えそう。
これがScala3でのお仕事の本命のひとつとは思うが、web上に多くの情報があるので、委細は略する。
[3] Scala3でAIエンジニアなお仕事
python中心で、10年後もAIエンジニアとして食べていけると思うけれども、学習量が多い場合で複雑な分散処理などを書く必要が出てきた場合には、JVM言語であるScala3を使えると幅が広がりそうだ。使う技術は上に書いた、Akka上でのマイクロサービスやSparkを使ったデータ処理との組み合わせとなるだろうから、委細略。...個人的には、今後10年で、JVMを介してアクセスできるクラウド上のAIフレームワークが成熟していくものと期待。
おまけ マルチプレイヤーなゲーム開発のAI&分析業務でScala3はどの程度使えるか?
...これは個人的な興味から。
マイクロサービスやデータエンジニアと並んでゲーム業界は成長業界である。
ゲーム開発では、クライアントは今後も当面はC/C++系だろうし、サーバ側は、シングルバイナリなサーバをかけるGoが強そう。単一言語でいくならば、Unityを擁して、サーバー側もWebAssemblyも行けるC#か。今後10年という視野だと、ここにrustがどう絡むかといったところだろうか。
scala3はゲーム開発ではおそらく広く使われることはない。が、JVM上のAIエンジンをフル活用するような場合、Python+Scala+αでけっこうなんとかなっちゃうことも可能、なのかもしれない。scala-nativeがあるけれども、クライアント側までを全てscalaで、というのはないだろう。
サーバ寄りの私としては、サーバ側でのレンダリングやプラットフォームを問わないWebAssemblyの活用が広がることを期待している。ゲーム開発の大多数はサーバ側でのお仕事となり、クライアント側のコードは職人的なエンジニアさんにおまかせすれば良いとなるのかな、と。
WebAssembly 1.0がW3C推奨としてブラウザ上でネイティブ動作する第4の言語に
個人的には、Cにトランスパイルされる言語vlnag/nimに期待。
終わりに
Scala3でなくて、10年後も、やっぱPythonとGoかC#の組み合わせでしょというのもあり。
そうでない場合は、エンタープライズなDX案件でPython使えるプロマネさんという将来が今後10年は安泰なのかな。
おしまい。