Rust, Go, Elixir, Kotlin 次世代言語の魅力をCTOが語る

2018年4月12日、GoやKotlinなど次世代プログラミング言語をテーマにしたイベント「CTO meetup Rust, Go, Elixir, Kotlin 次世代言語の魅力をCTOが語る」が開催されました。 イベント前半は登壇者らが各次世代言語の特徴や魅力を語り、後半は、各言語の難点や今後のトレンドについて議論しました。各言語のエキスパートが語る次世代言語の可能性をレポートします。

登壇者情報

・幾田 雅仁氏(言語:Elixir、golang)/株式会社gumi CTO

大手インターネットプロバイダ, 大手ポータルサイト, クレジットカード第三者プロセッサを経て, 現在は株式会社 gumi に在籍。 Elixir が動作する Erlang VM の使用歴が10年を超える OTP おじさん. 一般社団法人 Japan Elixir Association の理事でもある。 CTO 就任後, gumi のサーバインフラは主に Golang で, ミドルウェアやマイクロサービス, API サーバは主にElixirで開発する方針を定める。

 ・辻 良繁氏(言語:golang)/株式会社ZUU チーフエンジニア
東京大学大学院 情報理工学系研究科 修士課程修了。専門はデータ工学。在学中にIPA未踏ユースにて、「PostgreSQLの検索高速化」での採択経験あり。 株式会社ドワンゴにてniconico事業のアプリケーション開発に従事した後、スタートアップ2社の開発部門立ち上げ・技術責任者を経て、2017年より現職。 現在は中核事業の一つである自社CMS開発をGo言語を用いて実現。ZUU onlineを始めとする自社メディアのリプレイス・新規立ち上げの技術責任者を担当。
・高橋 篤樹氏(言語:Rust)/株式会社deBit チーフエンジニア
東京工業大学工学部情報工学科卒業失敗。 エンジニアとして独立、フリーランスとして活動後。夏休みに野宿旅をしていた際に、現在のdeBitと出会う。 現CTOStephan Lutherとの2名体制の際に参画。Pure RustのAMQP実装 amqprや、libbtcのRustバインディングであるbitcoinrsを開発中。
・長澤 太郎氏(言語:Kotlin)/エムスリー株式会社 日本Kotlinユーザグループ
エムスリー株式会社でソフトウェアエンジニアとして医療の世界をよりよくするかたわら、Kotlinの啓蒙活動をしています。 著書に「Kotlinスタートブック」などがあります。最近、猫を飼い始めました。
・松原 崇幸氏(言語:Elixir)/エムスリー株式会社 チームリーダー ソフトウェアエンジニア
エムスリー株式会社にて自社サービスの開発、改善、運用を通して医療の課題解決をしています。 趣味で触っていた Elixir のポテンシャルに惹かれ昨年から現職の本番環境にも導入。 OSS が好きで自分で作ったライブラリを GitHub に公開しています。Elixir 関連では Power Assert の著作者です。

モデレータ

・大谷 祐司氏/株式会社サーキュレーションCTO
サイバーエージェントでインターネット広告のシステム部門を立ち上げ、子会社の技術責任者に就任。 その後インテリジェンスで技術責任者としてエンジニア組織を立ち上げる。 2017年1月より福岡に移住し、スタートアップCTOを経てサーキュレーションに参画。

次世代言語Rust, Go, Elixir, Kotlinの魅力について

言語選定で大事なのは「使うのが楽しいかどうか」、既存言語の難点を広くカバーする次世代言語

大谷:まずは各言語を選定した理由について、皆さんにお聞きしたいと思います。

幾田:ゲームのサーバーは、APIサーバーとマルチバトル用サーバーの2つがあります。この両サーバーの言語を統一する時に候補に挙がったのがElixirでした。

APIサーバーはユーザー情報などをデータベースとして保存するサーバーで、当社はもともとPythonで書いていました。 もうひとつのマルチバトル用サーバーはステートフルサーバーで、大量のスマートフォン端末と常時繋がり、UDPのパケットをガンガン飛ばしてゲーム空間内での位置情報を同期しながらアクションゲームを提供します。こちらはC10K問題を回避するためにPythonではなく、C#、Erlang、C++を使っており、APIサーバーとは使用言語が違っていたんですね。 なので両サーバー間で言語を揃えよう、となりまして。そこで、安心して使えるということでElixirを選びました。

Goに関しては現場からの提案で選定しましたね。 当社は1200台程度のサーバーに対してインフラエンジニアが4人くらいと非常に少ない。手動では運用しきれず、どうしようかとなった時に、Goを使ってどんどんツールを作って自動化しよう!となりました。

松原:昨年の春頃に、広告配信に近いサービスを新規事業として作り始めました。 当時の開発メンバーで作ることになるとRailsでとなるのですが、システム要件としてそれなりのリクエストを捌ける必要がありRailsではパフォーマンス上懸念がありました。 そこで試しに個人的に興味のあったElixirで試作したところ、特別なチューンを施さなくてもスループットがRailsより10倍程度高く、Elixirを採用することにしました。

辻:メディアのリプレイスという要件に対処する時に、WordPressでは対処できないアクセス数をさばく必要があったため、高速な処理のできる言語としてGoに注目しました。

最終的にGoを選んだのは、スピンアップの早さと学習の容易さが理由です。 特にC系の言語を学んだ優秀なエンジニアであれば、1週間くらい練習したら実戦投入可能なレベルまですぐに成長します。

高橋:業種の事情から、パフォーマンスと安全性を両立可能で、なおかつ低レイヤーのなかで型システムが一番充実している言語が求められていました。この条件にRustが当てはまったんです。

……というのは実は後付けの理由です。

多分皆さんそうだと思うんですけど、本音を言えば言語選定で一番大事なのは「その言語を使うのが楽しいかどうか」。なので、Rustを採用した理由は「Rustをすごい書きたかったから」というだけです。

「書く楽しさ」と「運用の容易さ」、どちらを優先すべき?

大谷:「書いていて楽しい」という点は確かに大事なポイントですね。「どう楽しいのか?」という部分をもう少し伺いたいのですが。

松原:Elixirにはパイプ演算子というものがあるんですけど、これで関数を繋げていくのがめちゃくちゃかっこいいんです。それが好きで……すいません、それだけです(笑)。

高橋:RustのコミュニティはRustの特徴として「ゼロコスト抽象化」を挙げています。 ヒープにアロケーションするといったコストをかけずに型プログラミングができるようにして、パフォーマンスと抽象性を両立しようというのがRustです。柔軟性の高い、型をゴリゴリ使うコードを書きながら、高パフォーマンスも実現できる……という喜びがあります。

幾田:流れをひっくり返すかも知れませんが、ElixirやGoを選択した理由は楽しさではなく「運用が後々楽になるから」です。

Elixirは、プロセスデザインをしっかり行い、スーパーバイザツリーを上手く使うことで、落ちないシステムが作れる。そうするとちゃんと夜眠れるようになるんですね。

またGoの場合は、他言語に比べると個々人の能力差が生じにくい。大きなプロジェクトを作るためにエンジニアを大量採用すると技術レベルにばらつきが生まれやすいですが、その問題を解消できます。

高橋:その意味で言えば、RustはElixirとは逆の方向を向いた言語と言えるかも知れません。「書いている今が楽しい、後のことは考えない」という感じで(笑)。耳が痛い。

幾田:Rustについてフォローしておくと、学習コストは若干高いもののコンパイラに守られているという長所があるので、後々の運用を楽にすることは確かでしょう。

高橋:ありがとうございます(笑)。

Ctomeetup

向いている使用方法、他の言語との違い、好きなところ、イマイチなところは?

メンテのやりやすさや学習コストに注目

大谷:結構多岐にわたるテーマと思いますが、まずは幾田さんからお願いします。

幾田:ElixirもGoもフォーマッターが付いているので、誰が書いても同じ構文になりやすい。なので、チームでのメンテがしやすいです。

イマイチなところなんですが、Erlangの文法はPrologを参考にしているので正直読みづらい。Elixirになって読みやすくなったが、マクロとかプロトコルによって読み難くなる恐れがあるので、gumiではこれらを使用禁止にしています。

また、Goはコードが長くなりがちです。結構宣言的に書くので、Elixirを使えば40行程度で済むところがGoだと90行くらいになります。ただ読みやすいのでメンテはしやすい。

長澤:KotlinはJavaの弱点を克服した後発言語でありながら、尖っていないというところが好きです。いい意味で妥協のある言語だと思います。Kotlin への移行もそれほどハードルが高くない。現場重視と言うか、コードを書く人にとって負担の少ない言語に仕上がっています。

ただ、妥協が悪い方に向かうこともあります。 Kotlinにはnullに関するプログラミングミスを未然に防ぐ機能がありますが、これがコードの見た目を野暮ったくする。ちょっと泥臭い工夫が随所にあり、これはメリットでもありデメリットだと感じています。

辻:Goの特徴は高速に動作するということ。もうひとつの特徴はスピンアップが速いことです。メディアサイトはアクセス量が頻繁に変動しますが、Goはこういう環境下で威力を発揮します。

イマイチなところは……。1.9系のバージョンでは早い早いとは言われつつも、WebアプリケーションをGoで書くとコード量が膨れるのでコンパイルに時間がかかっていました。ただ1.10にバージョンアップしたら克服されたので、今では駄目なところはあんまりないですね。

幾田:駄目なところがないってすごい(笑)。

高橋:Rustはシングルバイナリになるというメリットがある。 カーネルなど最低限のマシンの環境の一致は必要ですが、それさえ一致していれば1個のバイナリにコンパイルして、後はどこにでも持ち込めます。マイクロサービスなどの文脈ではかなり有利です。

駄目なところは学習コストが高いこと。 学び始めはコンパイラが何を言っているのか全く分からない。言語として難しいので、人材採用も難しく、また他の言語にあるはずのライブラリがないので自作が必要です。

社内の新言語普及には「少しずつ追加する」のが効果的

大谷:社内での新言語普及のために、何か工夫していることはありますか?

幾田:Elixirを書ける人、Goを使ってインフラを担当できる人を採用できるかと言うとこれは難しい。教育は大事です。

Elixir は、教育担当者を2人揃えています。教育ブースのテーブルに行けば、疑問点について教育担当者が教えてくれます。 Go は、特に何も対策していません。経費で本を購入したり、セミナーに参加できるため、そちらでカバーできないかと考えている。

松原:私は逆に普及に力を割けていませんが、そういう場合はできる人を巻き込むという方法は良いかもしれません。 たまたま上手くいっただけかもしれませんが、Elixirの本を渡したらいつの間にか勝手に学んでくれ開発まで普通にしてくれました。

大谷:採用は厳しいですか?

松原:Elixir 経験者は少ないですね。Elixirを知っているという人に会うと、「むしろ何で?」となるくらいですから(笑)。

長澤:私も社内での普及についてはあまり努力をしていませんでした。他人にあまり積極的には勧めなかった。

でも思い切って導入してみたら、最近では、自分から興味を持ってKotlinを業務に使っているという話を聞くようになりました。

辻:今サーバーサイドでGoを書いている人の3分の2は未経験です。ただ他のWeb言語をしっかり学んだ経験があれば、あまり能力差は出ないかな、と感じます。

高橋:採用過程でRust経験者には1人も会いませんでした。 ただ同じ低レイヤーということで、C言語の開発経験などを重視して採用しています。

長澤:一般的な話ですが、社内の普及方法としては文献輪読などの勉強会やハッカソンの開催などが良いでしょう。それと一気に新言語へリプレイスするのではなく、少しずつ追加していくこと。こうして新言語を普及させるというのは、結構他の会社さんもやっていると思います。

エンジニアとして尖りたいなら、トレンドは追わなくても良い

大谷:最後の質問ですが、今後言語のトレンドはどうなると思いますか?

長澤:今のトレンドは静的型付け。大きいシステムの開発になると、コンパイラに守られたいというのがあると思います。 以前は動的との違いの一つとして、型を都度毎に書くことを言われていました。しかし最近の静的型付け言語はコンパイラが肩代わりしてくれるため、その面倒くささもなくなりましたしね。

高橋:まず、個人的な感覚ですがRustは絶対流行らないと思います(笑)。 一部のトップ層で普及してもそれはエンジニア界で流行ったとは言えません。マスが受容する世界は来ないのではないかと思います。

ただ、無理にトレンドを追う必要もない。エンジニアとして尖りたいなら、トレンドをキャッチアップしつつ追わないというのもひとつの選択です。

長澤:それに関してひとつ。僕はRustが流行りそうな気がしているんです。盛り上がりを見せているIoTや車載システムなどの組み込み方面では流行るのでは?

辻:パラダイム・シフトという意味で、文法的にはRustはすごい良い言語だと思います。恐らくWebで必要なライブラリが揃ってくれば流行るんじゃないでしょうか。

長澤:いや……高級なアプリケーション制作には向いていないのでは。Rustを盛り上げるなら、RustでLinuxを書き換える、とかじゃないですか?

高橋:実はOSをRustで書くというRedoxプロジェクトというのがあります。でも全然流行っていません(笑)。 ただ、皆さんの意見を聞いていると……流行らないというのは僕の勘違いだったかも知れないですね(笑)。

CTOmeetup

【CTO meetup】Rust, Go, Elixir, Kotlin 次世代言語の魅力をCTOが語る、熱い登壇が開催され、懇親会も大盛況で終了いたしました。 ご登壇者の皆様、参加者の皆様、ありがとうございました。次回のCTOmeetup開催は、6月を予定しています。 CTOmeetup

FLEXYとはABOUT FLEXY

『FLEXY』はエンジニア・デザイナー・CTO・技術顧問を中心に
週2-3日 x 自社プロダクト案件を紹介するサービスです