TwitterがScalaを採用した大昔を振り返ってScalaについて色々考えてみる

雑にtweetしたら多少反応があったというか、新しいもの書くばかりではなく歴史を振り返る方が、場合によっては面白いというかためになるというか、 そもそもプログラミングに限らず現在や未来は過去の延長線上でしかないので、歴史を振り返ることは大事ですね。

先に断っておきますが「X(旧Twitter)」と書くの面倒だし「X」だけだとわかりにくいので、*1単にTwitterと記述すると思います。

あと自分はTwitterの中の人や昔Twitterの中の人だった人と軽く話したことはある程度で、もちろん自分はTwitterの中の人だったことはないです。外から観察した情報を書くだけです。

さて、どこから振り返ればいいのか難しいのと、そもそも歴史そのものを正確に詳細に振り返るというよりは、当時(から現在に至るまで)の雰囲気を伝えることや、それに対する自分なりの解釈などを書きつつ、これの読者に同じように過去を振り返ってもらったり未来を考えてもらうのがある意味では最終目的なので、できるだけ間違った記述を書かないようには心がけるつもりですが、何か明らかに事実の記述が間違ってたら指摘ください。

ちなみに筆者がプログラミングある程度本格的にやり始めたのは2009年くらいです。

自分のTweetでも言及しましたが、公式というか中の人の発表で2008年と言っているので、TwitterScalaを採用し始めたのは、少なくとも2008年か、それより前です。

www.youtube.com

www.publickey1.jp

Twitter社のGitHubOSS観察しても2009年や2010年などが最初のコミットのrepoがいくつか残っています。(大抵はその後置き換わってアーカイブされているrepoも多いですが)

そしてScalaは少なくとも古いものでは2.7系です。

https://github.com/twitter-archive/kestrel/blob/cf7845792263ddfb926231b5a31c69e955192c75/project/build.properties#L7 https://github.com/twitter-archive/ostrich/commit/7163e67fa78d57b84cfbcdfad0d80d96ba788b45 https://github.com/twitter/finagle/commit/e04e51645374f8d958d85de384142dd00f4b7574

これもある程度tweetしましたが、2008年がどういう雰囲気か?というと、参考までに色々な有名な技術その他が出始めた時期としては例えば以下 *2 *3 *4

  • 2003年: Groovy
  • 2004年: Ruby on Rails
  • 2005年: Google Code
  • 2006年: Java 6
  • 2006年: AWS(SQS、S3、EC2あたりの一部だけ?)
  • 2007年: Clojure
  • 2008年: GitHub
  • 2009年: Go, CoffeeScript
  • 2011年: Kotlin
  • 2011年: Java 7
  • 2012年: TypeScript
  • 2013年: Docker
  • 2013年: Java 8
  • 2014〜2015年?: Swift
  • 2015年: Rustの1.0リリース

つまり2008年というのは

  • プログラミング言語としては、今やだいぶ有名になったRust, TypeScript, Kotlin, Goなどが出る前であった
  • GitHubがちょうど出たかどうか?くらいで、まだそもそもGitHubのようなものを一般人は全然利用していなかったか、利用していたとしてもせいぜいGoogle Codeなど他のものだった
    • 現代の人はGoogle Code知らなそう
    • GitHubはギリギリその頃から利用され始めたとしても、連携する無料のCIサービス(Travis CIなど)が出てきて流行るのはもう少し後のはず
    • OSSという文化というか、それに一般人が気軽に参加する文化も、今と比較したらかなり少ない、ハードル高い
  • AWSは今と比較したら最低限の主要サービスのいくつかは数年前に始まっていたが、クラウドというのはまだまだ普及していなかった、はず?
  • やっとCoffeeScriptが登場して、これから流行るとかで、TypeScriptはまだだし、フロントの技術スタックは、今とは全く別だったはず
    • フロントは移り変わり激しい感もあるので、そんな大昔と比較しなくても異なるでしょうけど
  • Dockerなんて便利なもの実質存在しないぞ!!!
    • 似たような技術の試行錯誤や普及の兆しは、多少あったかもしれないが
  • この時代だか、もう少し後だか、詳細覚えてないがLightweight programming language(LL言語)みたいな言葉が流行っていた時期があった気がする
    • 当時から思ってたけど、あの言葉何・・・
    • Javaが当時6でラムダ式すらなく、記述つらい〜、みたいな雰囲気などもセットで(?)

という感じです。

ちなみにScalaですが、おそらく以下 (Scalaが後からgitやGitHub移行した都合上、GitHubのtagの日付とは違う場合があるので注意)

  • 2008年: 2.7.1
  • 2009年: 2.7.6
  • 2010年: 2.8.0

つまり、Twitterは、出て数年経って流行ってた*5Ruby on Railsを採用した後、一部パフォーマンス面などで辛くなってScala 2.7.x(かつ、おそらくJava 6)に置き換え始めた、という感じです。

これも多少Tweetしましたが、当時のTwitter、あるいはその当時や数年間、いくつかの企業が最初にScalaを採用し始めた経緯というか空気感としては

  • ラムダ式やcase classやパターンマッチなど、記述の面でも(当時の他の言語と比較しても)同等かそれ以上に色々便利である
    • Scala 2.7だとデフォルト引数や名前付き引数やcase classのcopyメソッドその他色々が、まだなかったですが!
    • implicitでの型クラスは2.7でも可能(可能だが今と比較するとそこまで普及してなかったし、Twitterが当時そこは重視してなかった気はする?が)
  • (静的型が好きな人にとっては)Rubyなどと比較して、(Javaなどと比較して)簡潔に書けるのに、静的型で嬉しい
  • Javaのライブラリが大体そのまま呼べるので、エコシステムの充実度は(全く別の新規言語作るより)困りにくい
  • そもそもJVM自体のマルチスレッド関連やGCが、(少なくとも当時は)Rubyその他のいつかと比較して優れていた?
    • 当時のTwitterJVM移行にした理由の一つであるはず
  • 当時でもJVM自体の好き嫌いはわかれていた可能性はあるが、昨今のほぼDocker前提などの空気感とはまた全然別なので、JVMのメリットデメリットの基準が、今と当時では微妙に違いそう

などでしょうか。

そういえば、JVM言語かつ記述が(Javaと比較したら相対的に)簡潔なもの(Rubyに結構影響受けた?)としては、Groovyなどもありましたね。

当時のことや、そもそもプログラミング言語のランタイムの性能やアーキテクチャには別に詳しくないので、ここからは逆に聞きたいんですが、2008年頃にRubyが辛くなったとして、ScalaというかJVM以外で他にどういう選択肢があったんでしょうかね???

当時、マルチスレッドというかパフォーマンス面で低レイヤー含めて頑張りたいからといって、例えばC++やCなどで一部を直接頑張るのが現実的だったんでしょうか?その道のプロがいれば部分的に採用はいけたのかもしれないけど、結局大規模になったら辛くなって後で他のものに置き換えることになりそう?(何もわからない)

JavaそのものではなくScalaを採用したのは、パフォーマンス面の解決にはJVMが良さそうけど、Java 6だと記述がつらくて〜、という気持ちだと思いますが、中の人の実際の気持ちはどうだったんでしょうね。 (中の人の証言探すのが面倒というだけ)

今と比較したら当時まだまだScalaの完成度は高くなかった気がするけれど、それでも採用するメリットが上回ったんでしょうかね。

結果としてJVMScalaを採用して、かなり色々なことがありながらも10数年以上も動き続けてるので、当時のその選択は結果としては正解の一つだったのでしょう。 (もちろんRuby部分がすぐに消えたわけじゃないはずだし、それ以外の技術スタックも採用してるが、JVMScalaの割合がずっと多かったはず) (そのあたりの遷移は普通に公開資料あって調べればある程度わかるが省略)

さて、もう2024年が終わろうとしていて、当時の雰囲気とは色々変わったと思いますが、 もし今Twitter規模のものを最初から作るか、あえて他の技術で書き換えるとしたらどういう選択肢があるのでしょうか? ギリギリまでコストを切り詰めることを重視しなければ?極論すると現代の有名技術や言語なら、同程度にスケールするものを作るだけなら、アーキテクチャ面でしっかり作ればわりとなんでもいける気はしますが(普通のプログラマの雑な予想)

JVMとしては、Dockerとの相性というか、他のものと比較したら場合によってメモリ消費多くなりがちとか起動遅いとか、Rustと比較したらGCが〜とか、色々と言われることはありますが、とはいえ詳細な利用状況はともかく、自分が知ってる範囲で雑に少しだけあげてもAppleなりGoogleなりLINEなり、いくらでも超大企業というか大規模でも動いてる実績があるので、すごく遠い将来どうなるかは知りませんが、すぐダメということはほぼあり得なくて、今後もある程度当たり前のように使われるでしょう。

さて、Scalaに関してですが、上記に挙げた2008年頃に採用された雰囲気と、今の状況を比較してみるとどうでしょうか?

  • Scala自体も、もちろん進化している
  • Scala自体はJVM以外の対応も頑張ってる(scala-js, scala-native, wasm)
    • とはいえ他の言語も同じように複数の環境?で動く対応をするのが割とよく行われてる
    • 頑張ってはいるが、あくまでもcompilerなどがJVM前提だし、Scala自体はJVM言語としての側面は今なお強い
  • とはいえ、他の言語も進化したり、新しい言語が出てきている
  • 後から出てきて普及した言語だと、結局大抵企業がバックにいて、お金が投入されてて、期間が短い割には急激にエコシステムも充実してる気がする

という状況です。なんだか、割と当たり前のことしか言ってませんが。

2008年当時のメリットだけでは採用理由としては今となっては弱いというか、他の言語も互いに影響を与え合って「ある程度簡潔に記述出来て静的型」くらいなら当たり前に備えてる言語は多く出てきていますね。 それでもなおScalaの残ってる特徴というと、より関数型な部分やメタプロの機能とか、(Rustと比較したら)あえてGCがあるので、GCありでいい状況なら楽とかなどでしょうか。

2008年当時にJavaが今のJava 21くらいに強力だったら当時のTwitterScalaを採用してたでしょうか?

と、ここまで書いてきましたが、特にScala自体の未来に関して自分なりの結論はありません。

多少間違っていても断定的に強い言葉で未来予想なりなんなりを書いた方がなんか盛り上がる気はしますが、そういうの好きではないので(ぇ

Scala自体や関連するもの含めた未来予想は、そんなの極論すればわからないというかあえて特に書かないですが、あくまで個人的な今後を含めたScalaの関わり方や姿勢としては

  • ほぼ「社会人歴」と「プログラミング歴」と「Scala歴」が同じである
    • 大学は文学部で、プログラミング本格的にやり出したのが実質社会人になってからであり、Scalaは社会人1年目にコップ本を手に取ったのがきっかけである
  • Scalaでの仕事歴も大体同じなので、もう14年?くらい、生活してお金を稼ぐための道具でもある
  • Scalaを通じて学んだことが大量にあるし、(直接権限行使したことがほぼないが)なぜかScala 2も3も本体のコミット権限持ってるし、いくつかのScala関連OSSでもコミッターである
  • もはやScalaは空気

という感じなので、今後Scalaがどうなろうとしばらくどんな形であれ関わり続ける、という気持ちではいます。もちろん必要や興味に応じて他の技術も手を出すでしょうけど。

本当は、Scala 2.9から2.13に至る途中の時代のあれこれ、あるいはScala 2.7より過去でも、いくらでも語れることがあった気がしますが、取り留めなくなるし、あえてとりあえずTwitterが採用した大昔を中心に書いてみました。

こういう歴史話や過去話、そもそもScala言語作者というかより開発者側の近い人に書いてほしい・・・というか、どの程度の量でもいいから他の言語が技術でも書いてみたら面白いんじゃないでしょうか。

*1:今回のblog記事に限らず自分の他の発言でも特に気が変わらなければ

*2:開発はもう少し前からもちろんされていただろうけど、ものによっては公開された年やversion 1になった年を雑に列挙

*3:列挙する基準は独断なので、特に深い意味はない

*4:wikipediaその他で雑に調べただけです

*5:同時のこと自分はよく知らないが