Python3とScala3で、１０年後に、いい仕事ができる場合の考察。

# 序
ここ数年していた私の業務は大雑把にいうと以下のような感じ。

```
python3系
- numpy+C/C++で書かれたツールで、大きめのデータを扱うパイプラインを構築する。
- pandasで、RDBを読んだりexcelやらcsvやらを扱ったりする。

scala2系
- Sparkで、大きめるデータを扱うパイプラインを構築する。
- Playframework/Akkaで作られたwebアプリをメンテする。
```

pythonはおそらく今後しばらくは大きく変化しないが、Scalaは本年に登場予定の3系にだんだんと移行していくものと思われる。
Scala3では、
[Scala 3、Pythonのようにインデントベースの構文で書けるようになるってよ！](https://qiita.com/hinastory/items/abb68fe47755894b79ea)
に紹介されているように、以下のように、pythonに親和的な書き方「も」できるようになりそうだ（現時点では、反対も多いようだが）。

```indent（抜粋）.scala
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")

```
出典　https://github.com/hinastory/dotty_examples/blob/master/src/main/scala/indent_based/IndentBasedExample.scala

IDEの応援があると、scala2系を書いている時に、pythonをうらやましいと思うことはほとんどないのだけれど、まぁ、インデント構文の方が可読性が高い気はする。

さて、ということで、今python3を使って仕事している方々が、いずれscala3系をマスターしておくと１０年後に、どの程度幸せかを軽く考えてみた(以下、python3も適宜併用することが前提)。

# １０年後のお仕事想定
## [1] Scala3でマイクロサービスなお仕事をする。
　長いことプチパズワードなマイクロサービス。生き残っているITサービスを継続的に改善していくのに資するものなので、今後もマイクロサービスを作るお仕事は少しずつ増えていくものと予想。マイクロサービスの場合、インターフェースがきちんと切られていれば実装言語はさほど問われない。技術者の集めやすさと言語の生産性の高さで決まるものと思われる。
　Scalaには、数年前からマイクロサービスフレームワークlagomが登場している。近年のlagomは、web系の企業の選択肢のひとつとして定着したplayframwork+akkaの上に作られており、今後はマイクロサービス開発に使われるようになっていくものと考えられる。
参考　[マイクロサービスフレームワークのLagom 1.5がAkka Managementを導入、KubernetesとOpenShiftをサポート](https://www.infoq.com/jp/news/2019/07/lagom-microservices-framework/)

（開発経験がないのでお勉強レベルだが、）マイクロサービスでは、Future等を駆使してた非同期サービスを作ることが基本になる(以下、scala3インデント構文風(？)に書いてみた)。

```HelloStreamServiceImpl_indent.scala
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 の新規アプリケーションを作成する](https://qiita.com/takuya0301/items/3dcf37d12d1e002f6451)

デバッグのことを考えると、非同期の処理は、コンパイル言語であるscalaで書く方が安心感があるだろう。
### おまけ、lagom.jsでクライアント側も書く
長いこと、バージョン0.6台だったscala.jsが2020年に入りバージョン1.0に達している。
https://www.scala-js.org/

広く使われているわけではないが、マイクロサービス気クライアント側をscala.jsで書くという選択肢も１０年後ならばありかもしれない（まだなし、かもしれないが）。
以下を見るに、マイクロサービスのクライアント向けのlagom.jsという開発が進んでいるようだ。
https://github.com/mliarakos/lagom-scalajs-example

こんな感じにクライアント側でパターンマッチを使って書く、らしい。

```client_invoke.scala
client.greeting.invoke().onComplete
  case Success(message) => // display message
  case Failure(exception) => // handle exception

```

## [2] Scala3でデータエンジニアリングなお仕事
　Amazon EMR、MS databricks等、クラウド上でのビックデータ案件でも、定番の一つとなっているScala2+Spark2。
　蓄積されるデータは今後１０年も増えるだろうから、１０年後にはScala3+Spark3(?)のお仕事は当然にあるはず。ただし、pysparkでいいのでは、という話も増えそう。
　これがScala3でのお仕事の本命のひとつとは思うが、web上に多くの情報があるので、委細は略する。

## [3] Scala3でAIエンジニアなお仕事
　python中心で、１０年後もAIエンジニアとして食べていけると思うけれども、学習量が多い場合で複雑な分散処理などを書く必要が出てきた場合には、JVM言語であるScala3を使えると幅が広がりそうだ。使う技術は上に書いた、Akka上でのマイクロサービスやSparkを使ったデータ処理との組み合わせとなるだろうから、委細略。...個人的には、今後１０年で、JVMを介してアクセスできるクラウド上のAIフレームワークが成熟していくものと期待。

### おまけ　マルチプレイヤーなゲーム開発のAI＆分析業務でScala3はどの程度使えるか？
...これは個人的な興味から。
マイクロサービスやデータエンジニアと並んでゲーム業界は成長業界である。
ゲーム開発では、クライアントは今後も当面はC/C++系だろうし、サーバ側は、シングルバイナリなサーバをかけるGoが強そう。単一言語でいくならば、Unityを擁して、サーバー側もWebAssemblyも行けるC#か。今後１０年という視野だと、ここにrustがどう絡むかといったところだろうか。

　scala3はゲーム開発ではおそらく広く使われることはない。が、JVM上のAIエンジンをフル活用するような場合、Python＋Scala＋αでけっこうなんとかなっちゃうことも可能、なのかもしれない。scala-nativeがあるけれども、クライアント側までを全てscalaで、というのはないだろう。

サーバ寄りの私としては、サーバ側でのレンダリングやプラットフォームを問わないWebAssemblyの活用が広がることを期待している。ゲーム開発の大多数はサーバ側でのお仕事となり、クライアント側のコードは職人的なエンジニアさんにおまかせすれば良いとなるのかな、と。
[WebAssembly 1.0がW3C推奨としてブラウザ上でネイティブ動作する第４の言語に](https://www.infoq.com/jp/news/2020/01/webassembly-w3c-recommendation/)
個人的には、Cにトランスパイルされる言語vlnag/nimに期待。

# 終わりに
Scala3でなくて、１０年後も、やっぱPythonとGoかC#の組み合わせでしょというのもあり。
そうでない場合は、エンタープライズなDX案件でPython使えるプロマネさんという将来が今後１０年は安泰なのかな。
おしまい。