やっぱりコンパイラが書きたい。渡米後にRuby JIT開発を趣味から仕事に変えた私のキャリア戦略

やっぱりコンパイラが書きたい。趣味を仕事に変えた理由とキャリアチェンジ戦略

国分崇志@k0kubunと申します。プログラミング言語Rubyのコミッターとして活動しています。2019年からシリコンバレーで働いており、2022年からShopifyという会社でRubyのJust-In-Time(以下、JIT)コンパイラをフルタイムで開発しています。

長い間趣味でやっていたコンパイラの開発を仕事にしたのは、現職が初めてでした。この記事では、趣味を仕事に変えた経緯や、どのようにして業務経験のない分野にキャリアチェンジしたのかを紹介します。

仕事で分散システム、趣味でコンパイラを書くキャリア

コンパイラは学生のころから興味があって書いてきましたが、仕事ではWebアプリケーションや分散システムの開発を長くやっていました。まずはコンパイラではない仕事に就いた経緯をお話しします。

楽しく稼げる仕事を求めてたどり着いたRubyエンジニア

ゲームを作るのが好きで、大学生になるまではスーパー正男というJavaアプレットやRPGツクールなどでゲームを作る活動をしていて、大学2〜3年生になるとiOSのゲームアプリを開発するアルバイトをしていました。昔から、自分が「一番楽しい」と思うことを仕事に選んできたようです。

Rubyにはこのアルバイトで出会いました。iOSアプリのサーバーサイドを開発するにあたり、アルバイト先の社長にはCakePHPというフレームワークを勧められ、参考書を手に取ってみたところ「CakePHPはRuby on Railsの影響を受けて作られた」といったことが冒頭に書かれていました。そのころTwitterでフォローしている人たちもRubyを使っていたので興味を持ち、社長にも許可をもらえたので、サーバーサイドをRubyで書きはじめました。

当時はSwiftがなく、iOSアプリはObjective-Cで書くしかなかったのですが、これはとても書きにくい言語だと感じていました。そこからRubyを書きはじめるとあまりにも書きやすさに差があったため、ゲームのフロントエンドを作るよりRubyでサーバーサイドを書く方が楽しくなってきました。自然と、そういった仕事がしたいと思うようになりました。

その頃、Rubyを使う会社としてはクックパッドが知られていて、有名なエンジニアやRubyコミッターのインタビュー記事が目に入り、そういうすごいエンジニアと一緒にRubyを書いて働きたいと考えました。大学3年生夏のインターンで内定をもらい、大学の単位もほぼ取り終わっていたのでそれからクックパッドでほぼフルタイムのアルバイトを続け、そのままRubyエンジニアとして社会人になりました。

研究で分散システムと言語処理系の両方に興味を持つ

クックパッドでアルバイトを始めたころ、同じ大学で3学年上の2人の先輩もインターンをしていて、その短い期間に1人@draftcode分散テスト実行システムRRRSpecを、もう1人@eagletmtBundlerの並列インストール機能を作っており、すごい先輩たちがいると感じました。2人に勧められたこともあり、研究分野の言語処理系や並行システムも面白そうなので、大学4年生で同じ研究室に所属しました。

この研究室では、LISPの方言であるSchemeを授業で習い、そのインタプリタを自作するという課題が与えられるのですが、私はGo言語で実装しました。私がいた東京工業大学にもコンパイラの授業はありましたが、コードを一切書かないものや、先生が書いたものを少し修正するくらいだったため、言語処理系の仕組みを一通り調べつつ自分で作りながら学んだのは、これが初めてだったように思います。

また、draftcodeさんの修士論文がGoでコンパイラを書く研究で、私が課題にGoを使ったこともあり、学士論文の研究として引き継ぐことになりました。分散システムをモデル検査する言語のコンパイラでしたが、ここで初めてYaccという構文解析器の使い方も学びました。draftcodeさんが作っていたRRRSpecも比較的複雑な分散システムで、研究分野もあって分散システムへの興味が芽生えました。

一方、クックパッドではRuby on Railsのテンプレート言語としてHamlを使っていましたが、後続のSlimの方が速いという状況でした。eagletmtさんによるFamlという別のHaml実装はSlimにかなり近いところまで速く、クックパッドの本番にも導入されました。

しかし私は言語としてHamlの方が好きで、自分も書いてみたいという興味もあり、また別のHaml実装であるHamlitをスクラッチして卒業直前に完成させました。これが図らずもSlimより高速な初のHaml実装となり、RubyのGitHub Trendingで1位を取りました。この成功体験から、言語処理系の最適化に対する私の強い関心が形成されていったように思います。

このときHamlitには実装漏れがありましたが翌月に修正し、7年後にはHamlの公式実装になりました。

High Performance Template Engine - Speaker Deck (RubyKaigi 2015)

分散ミドルウェアを仕事で、JITコンパイラを趣味のOSS活動で

クックパッドで私は、アルバイトのときはRailsで新規サービスを開発していましたが、サービスより技術そのものへの関心が強かったため、宮川達彦@miyagawaさんをはじめとするスターエンジニアが数多く在籍していた開発基盤グループを希望し、2015年から正社員として働きはじめました。

当時、クックパッドにいたRubyコミッターの誰もRubyの開発そのものを仕事にはしておらず、国内では言語処理系の開発で給料をもらうのは難しそうな状態でした1。一方、もう1つの興味であった分散システムやミドルウェアの開発は、どうにかすれば仕事にできそうであり、社内でもジョブキュー基盤が必要になったときに私が開発したりしました。

このシステムはRubyで書きましたが、業界全般においてRubyの仕事はRailsを使ったWebアプリケーション開発がほとんどで、分散システムにはスレッドが並列に動くJavaなどが使われていました。そのため全てをRubyで書くクックパッドでは、分散システムに使う言語の経験が積めないことに焦りを感じはじめ、Rubyによる開発とJavaの分散システムを両方やっているトレジャーデータに転職しました。

トレジャーデータでは、Java・Kotlin・ScalaなどRubyではない言語を使って、大規模な分散システムの開発を経験しました。私は最適化全般に興味があり、また分散システムも好きだったことから、ストレージチームに所属して分散データベースの最適化の仕事に取り組めたのは、とても楽しい日々でした。

当時のトレジャーデータにもRubyコミッターやRailsコミッターがたくさんいましたが、誰もそれを仕事にはしていませんでした。私もRubyコミッターに就任して、テンプレートエンジンERBを最適化したり、LLVMを使ったCコンパイラや、RubyのJITコンパイラ、セルフホストJVMを作ったりといったOSS活動を、趣味の時間として実践する日々が続きました。

このように大規模な分散システムは会社に所属していないと開発できませんが、言語処理系の開発は趣味でもできます。そのためこの時点では、分散システムを仕事にして言語処理系を趣味にすることが、自分が一番楽しく、両方の興味を追求できるキャリアだと考えていました。

やっぱりコンパイラを仕事にした複合的なきっかけ

今でも分散システムとコンパイラでは、どちらの技術にも興味があるのですが、現在は仕事でも趣味でも言語処理系の開発一本に集中しています。この章ではその理由についてお話しします。

働きながら大学院に通い、コンパイラが一番好きなことに気付いた

大学の学部時代、友人は皆大学院に進学する中、私は経済的理由により就職する道を選びました。一方で周囲の活躍しているエンジニアを見ても修士卒や博士卒の人は少なくない状況で、彼らが分散システムなどの分野は大学院で学んだと語っていたことから、自分もいつか大学院に進学して、興味のある分野を学び直したいという思いがありました。

2016年のある日、植山類@rui314さんが働きながらスタンフォードに通いはじめたという話を読んでから、社会人大学院に興味を持ちました。転職後の2018年になって、授業料の大部分を会社の福利厚生で負担してもらい、自分もスタンフォードの授業を取ってみたところ、働きながらでも良い成績が取れるという実感が得られました。

ただし、学部時代の成績があまりよくなくて足切りの基準を突破していないことや、授業料が高過ぎることを考慮し、スタンフォードへの進学は諦めました。一方で複数の知り合いがジョージア工科大学の似たプログラムに通っていることを知り、ここなら選考基準を突破できそうで、かつ授業料も最も安い水準であったため、米国移住後の2020年秋に入学し、2022年春に卒業しました。

この大学で最も難しい4つの授業のうち、1つが分散システム、1つがコンパイラでした。両方とも取ってみたところ客観的には等しく難しく、興味深い授業になっていると感じました。どちらもクラスで高い方の成績を収めることができたものの、どちらかと言えばコンパイラの方がより情熱を傾けて取り組むことができました。それまで分散システムとコンパイラのどちらにも同じくらい興味があると思っていましたが、実はコンパイラにより大きな興味があると気付いた瞬間でした。

コンパイラを仕事にしているライバルに引き離される焦燥感

2020年夏に子供が産まれ、子供が起きている間は子供と過ごすか、会社に勤務しているかのどちらかになりました。仕事ではない活動は子供が寝ている間に行うことになるため、JITコンパイラの開発に費やす時間が以前より減りました。自分が趣味で開発していたMJITの開発速度が下がっている中で、ライバル実装であるShopifyのYJITや、RedHatのVladimir MakarovvnmakarovさんによるMIRは仕事として順調に開発されています。自分の実装とライバル実装の間で、出来の差がどんどん開いていきました。

大学院の授業によって分散システムよりコンパイラに興味があると気付いたにもかかわらず、分散システムにより多く時間を割く生活になっていました。それを埋め合せるために趣味の活動をがんばろうとしても、睡眠時間を削るなど無理をするしかなく、歳を重ねるにつれてこれでは限界がくると悟りました。

自分が一番興味のあることを仕事にすれば、そういった無理をする必要もなく、業務時間内に活動するだけで一番やりたいことを実現できる。そう考えるようになってしばらくした2022年の初め、ライバル実装であったShopifyのYJITチームでリードエンジニアを務めるMaxime Chevalier-Boisvert@Love2Codeさんから、現職への誘いをもらいました。しかし実際に転職するまでの半年間、なかなか決心がつきませんでした。

マーケットの変化とグリーンカードで訪れた転機

当時なかなか転職をしなかった理由は、スタートアップの待遇とアメリカのビザにありました。

私はトレジャーデータにシリーズCの資金調達直後に入社し、2018年に会社がArmに買収された関係で、少しキャッシュリッチになりました。味を占めた私はもう一度そういう機会を待っており、他の会社に転職して同等の収入を得るのは難しいだろうと考えていたため、転職を渋っていたのでした。

しかし、2021年にものすごく好調だった経済は2022年に不況に突入し、あと少しだけ待って区切りが来たら転職しようと考えていたのが、いつになるのか見通しが立たなくなりました。そうこうしているうちに、アメリカの永住権であるグリーンカードを2022年春に取得しました。

グリーンカードは通常2〜3年はかかるプロセスで、その途中に転職すると一からやり直しになってしまいます。さらにコロナの間は、トランプ政権でビザ労働者の再入国が制限されるなどの状況があったことから、少なくともグリーンカードを取るまでは転職をするつもりがほぼない状態でした。実際、2022年の下半期に不景気でさまざまな会社がレイオフしている中でビザ労働者が困っているところを見ると、グリーンカード取得前に焦って転職しなかったのは賢明だったと思います。

グリーンカードを取ったことで、転職しない片方の理由が消えました。もう片方は実際にオファー額を見てみないと何とも言えないと思い、受けてみたところ悪くない待遇をいただけたため、ここでコンパイラを仕事にしていく決心がつきました。

k0kubun.hatenablog.com

業務経験0年の分野にキャリアチェンジする方法

大学生のころからコンパイラを書くことを趣味にしていたものの、レジュメに書けるような業務経験は1つもありません。その状態でコンパイラ開発に転職することにも、その後のキャリアをどうしていくかにも不安だった時期はありました。最終的には「どうにかなる」と考えて選択しましたが、今現在はこういった不安についてどう考えているかをお話しします。

過去の経験を最大限に生かせるポジションを見つける

日本では言語処理系の開発で高い給料をもらえるポジションを探すのはなかなか難しいのですが、シリコンバレーにいると、その領域で面白そうな求人を出している給料の高い会社がそこそこ見つかります。長期的には、それらを渡り歩くことで楽しく暮らしてはいけそうです。しかし業務経験がない状態で入社できても、良い待遇ももらえるところは限られるでしょう。

私は転職の際に、それまでのスキルが次でも何とか生かせる職場を選んできました。今回の転職でも、なるべくそうなる状況を選びました。現在はRubyのJITコンパイラを仕事で開発しているわけですが、これを使って実際に高速化する対象は、Rubyで書かれた分散システムです。私はそういったシステムを最適化する仕事を行ってきました。そのためRubyアプリケーションの運用や最適化の経験がなくコンパイラだけを専門とするチームメンバーにはない良さを発揮でき、相応の待遇をもらえているように感じます。

Rubyとは関係ない、全く触ったこともない処理系を開発する仕事も検討していましたが、長期的にキャリアを築いていく上で、キャリアチェンジ後の1社目で自分が成果を残し、それをレジュメに書けるような環境に身を置くことの大切さを実感しています。

技術やドメインが変わっても再利用できるメタスキルを増やす

さまざまな不安を乗り越えて転職に踏み切れた理由は、自分がやりやすい環境を選ぶ以外にもう1つありました。それは、自分が具体的にどのような仕事をしているかにかかわらず、会社を超えて応用可能な能力を身に付けてきたと感じていたことです。

初めにRuby周りの技術に自信をつけた後、トレジャーデータでPythonやKotlinなどのRuby以外の言語を業務で使うようになりました。Rubyでは処理系自体もエコシステムも自分がかなり貢献している程度に詳しくなりましたが、それらの業務を通して、他の言語でも似たような理解度により早く達するためには何が必要かを意識していました。

特にKotlinにはRubyの次くらいに長く触れたのですが、JVMを自作してみたり、業務で使ったDropwizardフレームワークの認証の仕組みを読んだりカスタマイズしたりするうちに、技術に対する自信がつくのを感じました。現在でもRubyのJITのために、これまで仕事で使ったことがないRustをフルタイムで書いていますが、だいたい同じようなことをすればやっていけるだろうという自信がついていました。

またトレジャーデータにいたときには、自分の仕事もOSS活動もそれなりに高く評価してもらえていたため、IC(Individual Contributor)として比較的早く昇進できたり、Technical Architectのロールを兼務したりしましたが、昇進するほど技術の理解度や突破力より、コミュニケーションスキルが求められるようになりました。複数チーム間でゴールやデザインを調整したり、プロジェクトをリードして期待通り目的を達成しつつメンバーを成長させるといったことが、上司から求められるようになりました。

どの会社に移っても、高い給料をもらおうとするとそのようなスキルが必要になります。面接で通用するような複数の体験談を持っている程度には経験を積めたことが、今後もやっていく自信につながっています。現在も入社して日が浅いながら、パフォーマンスレビューが怖くならない理由になっています。

RubyKaigi 2017にて

大場光一郎(@koichiroo)さん撮影(巻頭写真も)

キャリアの選択で大切にしていること

最後に、自分がどこでどのくらい働くかを決めるとき、何を基準に考えているかをお話しします。

私は転職するたびに、自分が持っていない何らかの技術を周りの人が持っている環境に身を置くようにしています。そもそも私は技術を使って何を作るかより、技術そのものの完成度や理解度を高めることの方に関心があるのですが、効率的に技術力を上げていく上でどの環境を選ぶかはとても大きなインパクトがあることを経験上知っているからです。技術力向上に限らず、自分がなりたい像に近い人たちと時間を過ごすことは、目標への道筋の解像度を上げるために役立ちます。

また、自分の技術的興味の追求は自分の人生の一要素でしかなく、自分が仕事をすることで家族や自分が幸せに暮らせるかどうかを大切にしています。私の稼ぎで妻と子を養う都合、お金はとても大切で、単に自分がやりたい仕事をやるだけではなく、それによって会社やビジネスにもたらすインパクトが最大になるように努力し、それによって相応のお金ももらえる環境に身を置くことで、関わる全員が幸せになるような状態を目指しています。

東京よりも給与水準が高い海外の地域で暮らすと、同じ労力で倍以上の収入が得られる機会が珍しくないので、試したことがない方は一度挑戦してみてもよいかもしれません。

制作:はてな編集部


  1. 2015年当時では、作者であるまつもとゆきひろ氏ら3名が米国のPaaS企業であるHerokuにRuby開発者として所属していましたが、国内では2016年に卜部昌平氏がマネーフォワードに、2017年に笹田耕一氏と遠藤侑介氏がクックパッドに所属したことで、Rubyの開発を仕事とするキャリアが始まりました(編集注)。