PHPからScalaに乗り換えたチャットワークさん、その後どうですか?(前編)

int02 (2)

IT芸人の異名を持つ、トレタの増井雄一郎さんが「今、気になる人」に直撃する連載。今回は、ビジネス向けチャットツール「チャットワーク」を手がけるChatWorkでCTOを務める山本正喜さんの登場です。

チャットワークは世界205の国と地域、10万7000社以上で使われるチャットツール。2014年4月には、PHPと独自フレームワークで構築した大規模システムをScalaで刷新すると宣言し、エンジニア界隈で話題になりました。それから2年。Scala移行プロジェクトの舞台裏を山本さんに伺いました。

本当にScala化できるんですか?

増井:今日は、チャットワークをPHPからScalaに切り替えるお話を伺うためにやって来ました。

山本:はい。

増井:僕がこの話を知ったのは、ちょうど2年ぐらい前に読んだブログのエントリだったんです。いきなり失礼なんですが、僕はこの話を知って、ぶっちゃけアホじゃないかと思ったんですよ。

山本:あはは(笑)

増井:基本的に開発言語やフレームワーク、方法論を同時に変えるって結構大きな変更ですよね?

山本:そう思います。

増井:それなのに、この決断を発表された当時、御社にはScalaエンジニアがいなかったそうじゃないですか。「本当に大丈夫なのかな?」と思って、気になってたんです。昨年春には「Scala採用を決めて一年たった、CTOの雑感」というエントリをポストされていましたが、さらに1年経った今はどんな状況なんですか?

ChatWorkの山本正喜さん

ChatWorkの山本正喜さん

山本:ひと言で申し上げると「絶賛移行中」という感じですね。やはりなかなか一筋縄ではいきません。いまは、当初の計画からは少し方針転換しました。Scalaの採用を決めた時は、現行のシステムと並行して新システムを立ち上げて、データをマイグレーションさせながらガツンと全部移行することを想定していたんですが、ご想像の通り、やってみるとものすごく大変で。

増井:でしょうね。

山本:2年というと長く感じられるかもしれませんが、Scalaエンジニアのチームをゼロから作るところから始めていて、PHPのシステムも並行して開発しているので本格的に移行プロジェクトが動き出したのはここ1年といったところです。方針転換の部分ですが、ある程度できたタイミングで、実際にサーバーに乗せてテストしてみたところ、ロジック自体はちゃんと通ったんですが、サーバーのコストや一部のパフォーマンス面で許容できない影響があるところがわかってきたんです。

増井:それはいつのことですか?

山本:去年の後半ぐらいのことでした。決して小さくない課題ですし、このまま無理にプロダクションに載せながら解決していくのは正直しんどい。それで、一気に移行するのはいったん保留にしました。まずは課題感が大きく、今回の移行プロジェクトでも問題になった膨大な量があるメッセージDBなど、コアな難しいところをマイクロサービス的に切り出して、部分的にScalaで作り替えることにしたんです。それら重要課題をまず解決した上で全体の切り替えを再開しようと。

増井:なるほど。最終的にはすべての機能をScalaで置き換える予定なんでしょうか?

山本:すべて移行しきるのが理想ではありますが、現段階では、管理画面やユーザーのサインアップに関連する部分などはシステムの規模や負荷、更新頻度の観点から移行の優先度はまだ低いと考えています。当面は負荷が高い部分や難易度が高いところに限定して、移行を進めようと。Scalaを書けるメンバーも増えていくので、リソースの観点からバランスを見ています。

大規模システムをScala化する難しさ

増井:今はどこまで開発が進んでいるのでしょうか?

山本:メッセージDBのクラスタを一所懸命作り込んでいるところですね。コンセプト検証が終わって、実装段階に入っています。今までメッセージDBのクラスタリングについては、力業だったRDB(リレーショナルデータベース)から並列にスケールアウトが可能なKVS(キー・バリュー型データストア)にするため、いろいろなマネージドサービスを検討したんですが、多くのクラウドベンダーさんから「要望に応えるのは難しい」と言われてしまって。

増井:一般的なマネージドサービスが想定している規模感と、チャットワークの規模感はかなり違いますからね。

山本:そうなんです。マネージドだと保守運用をまるっとお任せできるので大変ありがたいんですが、規模が大きくなってしまうとコスト的にかなり厳しいことがわかったので、HBase(オープンソースの列指向分散データベース)を使い、自前でデータベースクラスタを作ると腹を決めました。

増井:でもHBaseで作るとなると、かなり大変ですよね。

山本:はい、おおごとですよ(笑)。できることならミドルウェアの大規模自前運用には手を出したくなかったんですが……。

トレタの増井雄一郎さん

トレタの増井雄一郎さん

増井:わかります(笑)。ところで、今ユーザー数はどのくらいなんですか?

山本:導入企業数はだいたい10万7000社ですね。

増井:それはかなりの数ですね。

山本:この数字の下に、ユーザーが紐付くので利用者数、メッセージ数となると相当な数に上ります。

増井:チャットワークの調子が少しでも悪いと、Twitter上に「仕事にならない」っていうツイートで埋まるぐらい使われてますもんね。まさにインフラの域です。不用意に止められませんね。

山本:システムにかかる負荷も大きいですし、ミッションクリティカル性も高い。何かと大変です。それで、メッセージの部分を分散処理できるよう、メッセージデータに特化したようなDBクラスタをScalaで作ろうとしているんです。

増井:がっつり、低レイヤーの世界に足を踏み入れる感じで。

山本:そうなんですよ。それこそI/Oやネットワークの特性を踏まえた高度なアーキテクチャーの世界に踏み込んでいく話なので、知見のある人に入ってもらわないとできません。

増井:普通のWebアプリケーションの世界とは全然違いますからね。

山本:そうですね。知見もそうですが、そこで飛び交う言葉や品質の考え方から違うので、いろいろと勉強になります。

決意表明から2年、エンジニアのモチベーションは?

増井:海外ではどれくらい使われているんでしょうか?

山本:世界205の国と地域で使われています。特に伸びているのはアジアですね。

増井:実はトレタも最近、シンガポールにオフィスを構えてサービス提供を開始したんですが、向こうの人と話したりすると、結構チャットワークを使っているっていう会社がありました。

山本:最近だと、ベトナムで結構利用していただいています。まずは現地をオフショア拠点にしている日系企業から派生して、現地企業も少しずつ入ってきている状況です。

増井:海外戦略のポイントは、どこにあるのでしょうか?

山本:以前からシリコンバレーにオフィスを構え、研究とマーケティング拠点としていましたが、今年からは調達した資金を使って、台湾やベトナムなどアジアにも人を張るようになりました。

増井:うちも同じように、まずシンガポールを1拠点目にしましたが、シンガポールは物価や人件費が高いですよね。しかもエンジニアはなかなか見つからない(笑)

山本:そうですね。マーケットとしては英語圏で個人所得も高くていいのですが、人口は500万ぐらいなのでそんなに大きくはないのが難しいところですね。ひと口にアジアといっても文化とマーケットはさまざまなので、各国の状況を見極めながら取り組んでいこうと思っています。

ChatWorkの山本正喜さん

増井:それだけ多くのユーザーを抱えて、世界にも進出しているチャットワークさんですが、Scala化プロジェクトに関しては、約2年間リリースできていませんよね。これまで、エンジニアのモチベーションが下がることはなかったのですか?

山本:基本的にPHPのエンジニアチームとは別にScalaチームがいて、並行しながら開発と研究開発をやっているので、エンジニアチーム全体でモチベーションが落ちるという感じはなかったですね。
増井:PHPチームはPHP版の開発を進め、Scalaチームは別で進んでいくとなると、両者間の情報共有やキャッチアップが大変そうですね。

山本:おっしゃる通りです。そうしたギャップを埋めるための仕組みを作るべきでしょうね。いまはPHPもScalaも両方書けるエンジニアが橋渡し役をしてくれています。この点に関しては、うまくバランスを取りながら進めるしかないと思っています。

増井:なるほど。では、次にチャットワークの機能について聞きたいのですが、確かユーザーは過去のメッセージをさかのぼって全部見ることができましたよね?

山本:はい。可能です。全体だと10億を超えるくらいのメッセージ量があるはずです。

増井:やはり、それくらいのサイズになりますよね……。しかもすべてが検索対象になっている。

山本:ええ、そうです。

増井:それほどのサイズ感だとHBaseでもかなり厳しいんじゃないですか?

山本:そうですね。それなりの規模のクラスタにはなってきそうです。検索機能については、AWSのCloudSearchを使っているのですが、日本リージョンでの最大の事例だと聞いています。

増井:それはそうでしょうね。これだけの検索対象はなかなかありませんよ。

山本:しかもチャットワークは過去のメッセージの編集もできますから、かなりヤバいです(笑)

増井:それは確かにヤバい!(笑)

スーパーエンジニアの加入で状況が一気に好転

増井:エンジニアの採用は順調ですか? 経験者を採るのもなかなか大変そうですが……。

山本:そうですね。Scalaは言語としてはすごくいいと思うんですが、使える人を採るのがとても難しい言語でもありますね。即戦力級のScalaエンジニアであれば尚更です。

増井:そもそも、経験者は限られていますしね。

山本:iPhoneブームが起きた時のiOSエンジニアのような感じで、Scalaをやりたいという人は毎年かなり増えていっていますが、「3年、5年バリバリ実践でやっていました。しかも結構な規模感で」という人はまだほとんどいない。また、いたとしてもガッツリ現場で活躍中でいらっしゃる。

増井:数が少ない上に、転職市場には出てこないわけですね。

山本:そうなんです。会社としてそういった方々に何らかの魅力を提示できないと、採用という観点では非常に難しいでしょうね。

トレタの増井雄一郎さん

増井:チャットワーク全体では、エンジニアは何人いるんですか?

山本:技術部門は34人ですね。

増井:結構いるんですね。うちはまだ10人しかいないので、うらやましいです。

山本:最近、増えたんですよ。全社員数のうち、エンジニアはだいたい半分ぐらい。そのうちScalaが書けるのが9人。PHPは7人。あとフロントエンド、インフラ、モバイル担当が各4人ぐらいいます。

僕らが最初にScala移行を表明したブログ記事は、Scalaを書ける人に来てもらって、教えてもらえれば、という意図で書いたのですが、幸いにも、スーパーエンジニアが来てくれたことで状況が一変しました。日本Scalaユーザーズグループ発起人のひとりであり、DDD(ドメイン駆動設計)のエキスパートでもある加藤潤一さんがあのブログを読んで、開発チームに加わってくれたんです。

増井:確かにそれは大きい出来事でしたね。

山本:加藤さんも増井さんと同じように「こいつら本当にできんの?」と、不安に思ったんだと思います(笑)

増井:「オレが助けてやる!」って思われたのかもしれないですね。

山本:ええ。ただ実際のところは「まず話を聞いてみよう」という思いで、応募していただいたようです。あの時は、さすがに社内がかなりザワつきましたよ。「すごい人からエントリが来た!」って。

増井:それはそうでしょう(笑)

山本:これは絶対採らねばということになって、面接してみたらすごく盛り上がって、是非、一緒にやり遂げましょうということになりました。彼はScala界隈では有名人なので、彼が入社してから、加藤さんと一緒にやりたいと言って応募してくださった方と、彼の知り合いや、つてをたどって採用してできたのが、今のScalaチームのベースになっています。卵が先か鶏が先かという話ではありますが、弊社の場合ではまずScalaにコミットしている会社だと宣言することで、エッジの立ったハイレベルなエンジニアにジョインしていただけ、それによってさらにブランディングが進むという良い循環を回すことができたたことが、採用戦略上、非常に良かったと思っています。

増井:チャットワークほど技術的難易度が高いサービスって、本当に大きいソーシャルゲームを作っている会社を除くと日本にはほとんどないので、そういう意味でも関心が高かったのかもしれないですね。

山本:はい。とはいえ、以前の僕らの技術力は、システムに求められる難易度に比べると、正直そこまで高くはありませんでした。でもScalaの採用を決断したことで、ハイレベルなエンジニア層を採る手段が得られ、チャットワークの技術可能性が担保されることにななりました。Scalaを採用して良かったかどうかの結論を出すにはまだ早すぎる部分はありますが、今のところは、選択して良かったという判断をしています。

……ということで、前編はここまで。
後編は、チャットワークの未来像や、技術的負債を抱えないための方法論などについて話を進めていきます。

(構成/武田敏則)