ScalaからGoへの移行方法

CrowdStrikeのCTOによる、会社が5人から200人以上に成長した際にScalaからGoに移行した方法と理由に関する記事の翻訳。



Scalaは長い間CrowdStrikeスタックの一部であり、実際にはメイン言語でさえありました。 2012年にソフトウェアの開発を開始したときに、Scalaの実装を支援しました。 実際、これはCrowdStrikeに移行した主な理由の1つです。 いくつかの主要な開発者がScalaの実装に興味を持っていたため、これは誰にとっても良い選択肢でした。



私は非常に積極的にScalaを使用したGravityから引っ越しました。 これは会社の主要言語でした。 慣れて、気に入って、その力を見て、CrowdStrikeが成長するにつれてScalaで見た困難のいくつかを防ぐことができると確信しました。 Hadoopとチーフアーキテクト(hello Bissel!)で高負荷分析、バッチタスクを行いました。ラムダアーキテクチャが流行するずっと前から使用されていました。



上級開発者の1人からの最近の引用により、スタックのほとんどをGoに移行した理由と、デフォルトで新しいサービスをGoに移行した理由を説明するこの投稿を書かざるを得ませんでした。



読者に投稿の終わりまで待たせる代わりに、私はすぐにScalaが完全にスタックを離れることはないと言います。 実際、光らない場所ではGoを補完するものです。 Scalaは、機械学習と分析スタックの重要なリンクです。 彼女は私たちが使用しているJava製品と連携して働いており、アナリストに素敵なDSLを提供できる彼女の能力により、Scalaは依然として良い選択となっています。 しかし、デフォルトの言語ではなく、より専門的なツールになりました。



この話は、テクニカルディレクターの外観のプリズムを通して説明します。 ビジネスの成長に伴い、会社を初期の5人の開発者から200人以上のプログラマーに拡大する必要があるプリズム。 それは、人々がプロジェクトからプロジェクトに簡単に切り替えて、新しい人をすばやく簡単に雇うことができるサポートされたコードベースを持つことです。



2009/2010にGravityでScalaのスケーラビリティに関する潜在的な問題を初めて目にしたことを覚えています。 主要なクライアントから深刻な生産上の問題に関する情報を受け取ったのは、営業日の終わりでした。 何人かの人々が問題の調査を開始し、クラッシュが発生したコードをローカライズすることができました。 しかし、本当の問題は、このコードが何をしているのかわからなかったことです。 私たちは、私たちのプロジェクトでこれまで見たことのない奇妙なシンボルに出会いました。 これは宇宙船演算子<| * |>です。 誰かが「あれは何だ?」と大声で言った。 完全に自明ではないある種の暗黙の魔法がありました。 IDEが文字を見つけることができなかったため、Cmd-Bでメソッドに移動しても役に立ちませんでした(IDEはその後改善されました)。 「<| * |>」でのクイックグーグルも失敗しました。 私たちは行き止まりに追い込まれました。









このコードを書いたプログラマーは休暇中だったため利用できなかったので、私たちは自分でそれを把握しなければなりませんでした。 scalazと呼ばれる最近追加された新しいライブラリを発見し、数時間後にこの神秘的なシンボルを見つけて、それが何をしているのかを理解し、修正を展開しました。 しかし、この瞬間は、数分かかるはずだった修正を数時間の追跡に変えました。 これは、開発チームに分裂が見られるようになった瞬間です。



Scalaはアカデミックな環境で生まれた非常に強力な言語であり、「一度だけ」のコードを簡単に書き始めるのに十分な柔軟性を提供します。 通常、Scala開発者は2つのキャンプに分かれています-「これはJavaの最高のバージョンです」-campと「I(heart)Applicative Functors」-campです。









Camp「これは最高のJavaバージョンです」はScalaの簡潔さと、ScalaをJavaよりも一般的に楽しくする標準機能を愛しています。 彼らのコードには関数型プログラミングがありますが、狂信的ではありません。 キャンプ「I(heart)Applicative Functors」では、機能的な世界が活気づき、人々は知識を深め始め、Haskellのような言語からすでに機能的な背景をもたらします。



私の経験では、2つのキャンプを分離し、それぞれに優秀なプログラマーがいたため、1つのキャンプが他のキャンプより悪いか、良いとは言えませんでした。 半機能的なキャンプでは、異なる言語で作業している可能性のあるより普遍的な開発者、またはAPIサーバーで作業するためにラムダ計算を勉強したくない開発者しかいませんでした。



例として、経験豊富なScala開発者の1人によって作成されたプロジェクトの1つからのコードを次に示します。

import scalaz._
import scalaz.std.list._
import scalaz.syntax.monad._
import scalaz.syntax.monoid._
import scalaz.syntax.traverse.{ToFunctorOps => _, _}

class Foo[F[+_] : Monad, A, B](val execute: Foo.Request[A] => F[B], val joins: Foo.Request[A] => B => List[Foo.Request[A]])(implicit J: Foo.Join[A, B]) {

def bar: Foo[({type l[+a]=WriterT[F, Log[A, B], a]})#l, A, B] = {
type TraceW[FF[+_], +AA] = WriterT[FF, Log[A, B], AA]
def execute(request: Request[A]): WriterT[F, Log[A, B], B] =
self.execute(request).liftM[TraceW] :++>> (repr => List(request -> request.response(repr, self.joins(request)(repr))))
----- REDACTED -------
      
      





- , , - — WTF? . , , . , — , , , .



, . Scala , , SBT, IDE, , JAR… ScalaZ, . , . SBT . , , , , , SBT .



- , . Twitter , , , , Scala, . , . , Scala , 50 .



Go. Go , , . Go . , , . , 3 , 3 . , (, Sean Berry), 3 , Go , Scala .



, , , , , , , ? , ! Go, , , , Go, Go , . Go , . Scala? , , , Go.



Go , . , Go . Scala JVM, Java , JVM .



, . Go, Go Go : «, , . Scala- 4 , . , Go». senior-, web- . Go , .



Golang.



Scala ScalaZ( ValidationNel!), 7- . - Scala, Scalding. Scala, , , . Go -.



Go .








All Articles