こんにちは!ChatWork CTOの山本です。
先日このブログにて「チャットワークの新しい開発言語とフレームワークを決める開発合宿を開催!その全貌を丸公開します。」という記事で、チャットワークがScalaを採用することを発表しました。
ありがたいことにこの記事はたくさんの方に読んでいただき、大きな反響がありました。セミナーなどでお話する時も、Scala採用について話を聞きたいと言われることが増えています。
今回は、Scala採用にいたったより詳しい背景と、現在の状況、そしてこれからのことについてご紹介できればと思っています。
Scala採用にいたった背景
現在のチャットワークは、「PHP + 自社開発の独自フレームワーク」で構築されています。
もともとチャットワークの開発は、社内用のツールとして1人のプロジェクトからスタートしました。そのためあまり工数をかけることはできず、既存の社内システムの仕組みにアドオンする形で構築されました。
社内システムへと組み込むことで、アカウントの認証まわりや管理システム、組織/権限まわりの仕組みをそのまま利用でき、開発工数を大幅に削減することができました。しかし、大規模なサービス成長は仕組み上想定しておらず、リファクタリングにも限界を感じることが多くなり、今後の成長を考えるとアーキテクチャの刷新を検討するに至りました。
既存コードのリファクタリングではなく、言語やフレームワークからの刷新を考えたのは、主に下記の理由からです。
- 開発メンバーがやりたいと言ったから (重要)
- すでに部分的なリファクタリングは進めつつあったが、抜本的な刷新は難しく限界が見えてきた
- ビジネスとしてようやく軌道にのり、今後も継続して開発人員を増やしていけそうなこと
- 新しい開発メンバーが多数ジョインすることにより、独自フレームワークに対する学習コストが高くなったこと
- 数年以上前のアーキテクチャ中心の設計なので、今後を考えて最新の技術をキャッチアップしたい
というわけで、一度既存のシステムは忘れて「ゼロからつくるならどうするか考えよう!」ということで行ったのが先日の開発合宿です。
Scalaの選定理由はたくさんあるのですが、主要なところを挙げると
- 静的言語としての保守性とパフォーマンスの高さ (IDEもイケてる)
- 動的言語からスイッチして成功した実績があること (twitter、dwangoなど)
- AWSはJava SDKが最も充実しており、ずっと利用したかった
- チャットのリアルタイム処理と相性がいい (akka素敵)
- Javaのスキルセットを持つメンバーが何人かいた
- PHPエンジニアでも短時間(開発合宿中)でそれなりに書けるようになった
といったところでしょうか。
特にチャットワークのようにすでに大規模になっているシステムを再構築する上では、静的言語として保守性が高く、かつ生産性を犠牲にしないScalaは大変魅力的でした。(プロダクトによっては、Scalaがフィットしないケースも当然あると思います)
パフォーマンスの部分や、JVMまわりの運用については実際にやってみないと見えない部分も多く、プロトタイプをつくりながら検証していくことにしました。
現在の状況
もうすでにScalaでバリバリ置き換えはじめてる・・・なんてことはなく、まだまだ基本設計を進めたり、Scalaの基礎をみんなで学習していっている段階です。
Scalaの勉強用グループチャットをつくり、ChatWork APIを使って遊んでみたり、プロジェクトの一部で採用しはじめたりしています。
(初期のころのチャット)
ともにScalaを採用することになった、ビズリーチさんと合同のScala勉強会をしたりもしました。(初期のころだったので教わるばっかりになっちゃいましたが・・ ありがとうございます) ※Scalaな会社さん、ぜひやりましょう!
Scalaの採用を決めた時点では社内にScalaのエキスパートはおらず、まずは採用からはじめようというチャレンジングな(汗)プロジェクトで、試行錯誤の日々だったのですが、大きな転機がありました。
強力なScalaエンジニアの方にジョインしていただくことになったのです!
日本Scalaユーザーズグループ発起人の一人であり、DDD(ドメイン駆動設計)のエキスパートでもある 加藤 潤一 さんです。(通称かとじゅんさん)
加藤さんにはもともとチャットワークを使っていただいており、ちょうど転職活動をされていた時に、先日の開発合宿のブログ記事でのScalaエンジニア募集を見てエントリしていただいたのがきっかけです。
ぼくらがいま抱えている課題と、加藤さんがこれからやりたいこと、持っているスキルセット、いままでのご経験とが本当に綺麗にマッチし、面談ではすぐにお互い意気投合。"テックリード"としてチャットワークのアーキテクチャ全般を見ていただくポジションでジョインしていただくことになりました。
さっそく社内のScala勉強グループチャットに参加してもらって、「Scalaの文法が魔法すぎてツライ・・」と苦しんでいたメンバーに怒濤の解説ラッシュをいただいています。(神が降臨!)
(解説ラッシュを一部抜粋)
な、なるほど…
このあたりのScala学習にあたってハマったことなどはコンテンツとしても有用だと思いますので、このブログにて随時公開していければと思っています。
現在は既存のアーキテクチャを加藤さんに見ていただき、サービスとしての目標の一つである、1億ユーザーになっても大丈夫なアーキテクチャを一緒につくりあげていこうとしています。
これからのチャレンジ
チャットワークがリリースされてから約3年。がむしゃらに走り続けた3年でしたが、導入社数も4万6千社を越え、なんとかここまで来ることができました。
特にこの1年は、高まるサービスの負荷と戦い続けた1年でした。次々と現れるボトルネックを解消し、たくさんのSPOFをなくし、重たい処理を非同期にして疎結合化することに多くのリソースをかけてきました。
たくさんの機能のご要望をいただきながら、なかなか取り組めない歯がゆい1年でもありましたが、ようやく主立った問題点は解決し、サービスの安定性を劇的に改善することができました。(サービス障害では大変ご迷惑をおかけしました )
これからの3年はチャットワークの“セカンドステージ”と位置づけており、日本発世界スタンダードになるサービスを目指し、技術面でも、デザイン面でも、運用面でも大きくドライブをかけていきます。
これからのチャットワークに、ご期待いただければと思います!
引き続き・・
Scalaエンジニアも絶賛募集中です!まだまだ手が足りていません。
今回のScala化では、チャットワークのこれからの基盤となるシステムをつくっていきます。加藤さんと一緒に、Scala + DDDで大規模なシステムを再構築していくというのはとてもチャレンジングで、エンジニアのキャリアとしてもいい経験になるのではないかなと思います。
ご興味がありましたらぜひ!