Scala採用を決めて一年たった、CTOの雑感

こんにちは!ChatWork CTOの山本です。

ChatWorkでは一年前に、PHPの独自フレームワークでつくられた大規模システムを、Scalaを使ってゼロベースでつくりなおすという決断をしました。

Scala採用までの経緯を三行で:

  • カウボーイ開発で約4年間積み上げてきたPHPのシステムがもはや限界
  • ゼロベースでつくりなおそうと開発合宿を開催。満場一致でScalaに決定!
  • しかし社内にScalaを書ける人は誰もいないのであった・・(どうすんの・・?)

参考記事: チャットワークの新しい開発言語とフレームワークを決める開発合宿を開催!その全貌を丸公開します。

というわけで勢いのままScala採用を決めたはいいものの、ここからどうしよう・・・という状態でした。

そこから約一年。ChatWorkのScala開発はどうなってるの?とご質問いただく機会も増えましたので、現在の状況含め、Scalaってどうなの?というところも含めてこの記事でご説明できればと思います。

これからScala採用を検討してるんだけど・・という会社さんの参考にもなれば。

いまのScalaプロジェクトの状況

残念ながら、まだプロダクション環境に乗ってはいない状況ですが、ようやく6月-7月前後に一部のシステムがScalaで稼働する予定です。

主要な部分のアーキテクチャや実装はできつつあり、あとはクライアントサイドをつくるチームとのAPI設計の詳細を詰めたり、インフラチームと本番で稼働させた際のスケールや監視、デプロイまわりなどの仕組み構築を行っています。

当初は昨年内には稼働させたい・・・なんて目標を立てながら進めていましたが、既存で稼働中の巨大システムを止めることなくリプレースすることは大変難しく、開発に時間がかかっています。

今回のプロジェクトでは一気に新システムへと切り替えるビッグバンリリースはリスクが大きいため避け、既存システムと新システムを並行運用しながらデュアルシステムとして稼働させ、機能単位で少しずつリプレースしていくというアプローチをとっています。

DDD(ドメイン駆動設計)によるシステム設計を全面的に取り入れており、新しくScalaでつくるシステムには既存システムの負債の影響を受けないよう、既存システムと新システムとの間に腐敗防止層(Anti-Corruption Layer)を設けることで、新システムは理想のドメインモデルで実装できるようにしています。

完全に新システムが稼働してしまえば腐敗防止層は破棄されますが、既存システムに依存する部分はすべて抽象化されているので、アプリケーションロジックに一切手をいれずに切り替えが可能です。

このあたり、巨大になってしまったレガシーシステムを新システムにどうスムーズに切り替えていくかというのは大変難しい問題なので、また今後私たちが行った事例やノウハウを公開できればと思います。

Scalaチームはどんな感じ?

いまはScalaをメインで書いているのが4人ですが、開発を加速させるため今後数ヶ月以内にさらに+4人ぐらいになる予定です。

PHPを書いてるメンバーが社内には6名ぐらいいて、まだScalaチームの方が小規模ですが、今後新システムの稼働に伴いどんどんとPHPのメンバーがScalaチームへとコンバートされていく予定です。(PHPのコードは今後ゼロにしていく予定)

順調にScalaシフトが進んでいるといっても良いんじゃないかと思います。

Scala採用を決めた当初は難易度の高いScalaに大苦戦していて、プロジェクトが全く進む気配がなかったのですが、Scalaエキスパートの加藤潤一さんのジョインによって大きく状況が変わりました。

じゅんいち☆かとう

※加藤潤一さんはChatWorkがScala採用を決めた例の合宿記事を見て採用サイトから直接エントリーしていただきました。ブログでの情報公開ほんと大事!

1人エキスパートがいると学習スピードは圧倒的に早くなるもので、詰まったところをどんどんと教えてもらいつつ、社内でも毎週Scala勉強会を開催するなどボトムアップの取り組みも多数行っています。

Scalaの学習コストってどう?

Scalaむずかしいです。。。いや、ホント。

PHPをメインでやってきた人間からするとケタ違いの難易度ですね。

単純にJavaっぽく書くだけならそう難しくはないのですが、関数型でちゃんと書いて、Immutableでモナドで高階関数で末尾再帰でカリー化でとやっていくと・・・。

社内でScala勉強会は毎週やっているのですが、Scalaを理解するためには関数型言語を理解しなければということで、Haskell勉強会が立ち上がっており、Scalaを勉強するためにHaskellを勉強するという状況に。。。

とはいえ指導してくれる人がいて、関数型で超クリーンに副作用なくシンプルに書けることを実践でまざまざと見せつけられると、これはエンジニアとして身につけておくべきだよねーとみんな必死にがんばっています。

経営サイドの視点からすると高い学習コストをどう支払っていくかは難しい問題で、全員を一気にできるようにするのではなく、まずごく少人数のメンバーが習得し、そこからOJTベースで集中的にスキルトランスファーしつつ、全体のボトムアップは勉強会で長い目でやっていくというのがいいんじゃないでしょうか。

ゼロからスクラッチでの開発と、ある程度のフレームワークや基盤ができてからその上で参考になるコードを見ながら開発できるのでは難易度が違いますし、全員がすぐにエキスパートになる必要はないかと思います。

いまのところ、Scalaプロジェクトにアサインされているメンバーは3-6ヶ月ほどでかなり書けるようになってきていますが、Scalaプロジェクト外のメンバーは毎週勉強会をやっているとはいえ、まだまだという状況です。

Scalaエンジニアって採用できるの?

Scalaエンジニアとれないです。。。いや、ホント。

いまでこそScala Matsuriが大盛況だとか、Scalaキテル!みたいな 流れがあって話題ですが、「Scalaを実務で3年以上やってきました」なんて人はほとんどいないワケで・・・(特に転職市場では)

このあたりはスマホが盛り上がり出した時のiOS/Androidエンジニアと似た状況で、やりたいと思ってる人はすごく増えているけれど、チームを引っ張れるほど経験のある人はごくわずしかしかおらず、どこの会社も採用には大変苦労しています。

あと2-3年すれば状況は大きく変わるとは思いますが。次何勉強しようかなと思ってるエンジニアの方は、確実に引っ張りだこになるのでいまScalaやっておくのはオススメです(笑)

単純に求人媒体に出したところではまず採れないので、まずは「Scalaやってます!」というのを認知してもらうことが大切で、最近のスタートアップ界隈では合同で勉強会をしたり、Scalaのイベントを実施したりと積極的にアピールをがんばっています。

逆にScalaを採用してる会社がまだまだ少ないいまだからこそ、Scalaやってる人の注目を集めやすいかもしれませんね。

ChatWork社の場合は幸いにしても加藤潤一さんというScalaエキスパートが社内にいるので、Scalaがすでに書ける人の採用と同時に、これからScalaをやりたい!という人の採用も行っています。ちょうど社内でもScalaを勉強しはじめているエンジニアが多数いるので、一緒に社内勉強会などで学習していけると効率いいですしね。

Javaをバリバリやってましたという人よりは、RubyなどLLをやってた人の方が習得しやすいようで、特にHaskellやってるという人(あんまりいないか・・)はすごくスムーズなようです。

というわけで、いまScalaのチームをつくろうということであれば、まずは1-2人Scalaのエキスパートをなんとか確保し、あとは採用も進めつつ社内で育てていくという方針が良いかもしれません。

何度も言いますが学習の難易度は大変高いので、誰にも教えてもらわずにゼロベースで学習していくのはオススメしません。。。

まだ初学者向けのScala本があまりなかったりとかの事情もありますが。

Scalaを採用してよかったこと

もちろん当初の狙いどおり、静的言語ならではの堅牢性やパフォーマンスの良さなどはあるのですが、何よりも一番よかったのは「エンジニア文化が大きく育った」ことだと感じています。

以前までは社内勉強会はたまにあってもあまり続かず、日々のプロジェクトをこなすので精一杯で勉強している暇なんてないという雰囲気がありました。

それがいまでは毎週のように3-4個の勉強会が定期的に行われ、Scala勉強会はもちろんHaskell勉強会、DDD勉強会、技術本の輪読会などが自発的にどんどんと開かれています。

社内のチャットでも各技術を語り合う専用の「部活グループチャット」が生まれ、「Scala部」「PHP部」「JavaScript部」などはもちろん、「Docker部」や「Go-lang部」、「OCaml部」なんてのもあり活発にやりとりされています。

こういった空気感が生まれたのも、Scalaを採用したことが端緒ではないかなと思います。

あまりにもハードルが高い技術を選択したことによって、「ヤバイ、これは業務の延長では絶対無理!みんなで助けあって勉強しよう・・」みたいな(笑)

Scalaを採用している会社=技術的なチャレンジをしてる会社、というイメージにもつながり、ジョインしていただけるエンジニアに技術的に尖った人が格段に多くなったこともエンジニア文化を加速することにつながっています。

その流れはサーバーサイドだけにとどまらず、フロントエンドではTypeScriptを採用したり、モバイルアプリケーションではリアクティブプログラミングを全面的に取り入れ、インフラではDockerでWebサーバーを運用し、データストアはほぼすべてをDynamoDBで運用しようなどかなりアグレッシブに攻めるようになりました。

Scala採用を決める以前は、正直あまり技術的なチャレンジは少なく、なるべく枯れた難易度の低い技術を組み合わせて工夫するという考え方でした。

これはこれで悪い戦略ではないと思っていて、会社としてチャレンジする領域の技術的ハードルが十分に低いのであれば、採用がしやすく学習もしやすい技術を選択すべきだと思います。

私たちもチャットワーク以前では法人向けであまり負荷が高くないサービスを中心にビジネスをしていたので、ビジネスとしてはアグレッシブにしつつも、技術としてはなるべく難易度が低い言語やフレームワーク、インフラもPaaSを積極活用するなどの戦略をとっていました。

チャットワークが想定していた以上に広く利用されるようになり、あきらかにいままでの自分たちが持つ技術ポートフォリオ以上のものが求められるようになりました。真正面から専門的なエンジニアリングに向き合う必要に迫られ、そこにScalaはわかりやすく全員の前にまずチャレンジすべきハードルになってくれたように思います。

Scalaならではの技術的なメリットは、実際のところ本番稼働させてみないと本当には実感できないものだとは思っていますが、明らかに現場の技術レベルは大幅に上がっていますし、今後も向上し続ける文化をつくれたことは、勇気を持ってScalaを採用して本当によかったことだと思っています。

Scalaを採用すべき?

これは本当に、その会社の状況によりけりだと思います。

Scalaは前述の通り学習コストも採用コストも高く、動的言語と比べてもコンパイル時間などで開発効率として不利な面が多くあります。

スタートアップで、ガンガン毎日仕様を変えながら当たるか当たらないかわからないものをつくっていく、という時には正直まだ向かない言語だとは思います。

ただ、技術的に高い堅牢性や保守性を求められたり、巨大なデータや高い負荷を扱うことがわかっているようであれば非常に強い力になってくれると思います。

twitterがRuby on Railsから、ドワンゴがPHPからScalaに切り替えたように、システムがある程度大きくなり基本的な仕様が固まってからの、セカンドシステム用の言語という選択肢がいまのところフィットしているのかもしれません。

静的言語の堅牢性がありつつも、型推論や柔軟な構文などでそこまで動的言語のころから開発効率を落とさなくてもすむので。

ただ、いかんせんコンパイル時間だけはどうしようもなく、いまのところは金の弾丸(札束で殴る)を使うしかないので、ScalaチームはみんなMacbookProのCPU MAX版を購入しました。(高い、、)

オダスキー先生(Scala開発者)が次世代の神コンパイラを開発中との噂に全Scalaエンジニアが注目しております。

採用の難しさ、学習方法の充実、コンパイル速度の問題が解決すれば、Scalaは一気にメインストリームの言語になるんじゃないかなと思います。

というわけで

時間はかかっていますが、Scala採用がんばっています。

新システムの稼働がもうすぐなので、そこが動いてくればようやく機能的なバージョンアップも進められるようになるので、チャットワークユーザーの皆さまはご期待いただければと。

Scalaを採用している or しようとしてる会社さん、ぜひScalaを盛り上げていくために一緒に勉強会やイベントやりましょう!

Scalaをバリバリ書いてる or 書きたいと思ってるエンジニアの方、ChatWorkでは絶賛エンジニア募集中でございます(笑)

大規模なサービスをScalaでゼロからDDDでつくりなおし、AWSフル活用でスケールするサービスをつくるのってきっと刺激的なはず!

採用情報 | チャットワーク(ChatWork)

それでは、Enjoy Scala!

※追記

本日、GMO VenturePartners社を引受先とする3億円の資金調達を発表いたしました。日本発世界スタンダードを目指しこれからドライブをかけていきます!