2022年にやったこと

今年のハイライトは

  • 大学院を卒業し、CS修士号を取った
  • グリーンカードを取った
  • Shopifyに転職し、仕事でRubyのJIT開発を始めた

という感じの一年だった。

大学

5月にジョージア工科大学のCS修士を卒業した。 ほとんどの人は3~4年かけて卒業するプログラムを、理論上最速である1年9か月で卒業するRTAをやっていた。 かといって特に雑になるでもなく、GPA 3.90/4.00 だったので、GPA 3.36だった学部の時よりかなりマシな成績を取っている。

なんかその記事に書くとダサくなりそうなので書かなかったが、よく宿題の提出期限になる月曜の朝5時はほぼ毎週起きててギリギリに提出するくらいには大変だった。4:57~4:59くらいの時間帯で提出した宿題の数は多い。しかも別にダラけててそうなっていたのでもなくて、毎日真面目にやっていても睡眠を削る必要が出てくるくらいのワークロードだった。卒業してからは生活が変わりすぎてすごい昔のことのように感じる。

博士は将来的に時間と経済的な余裕ができたら挑戦するかもしれないが、どこかに公開した論文は一つもないままここまで来てしまったので、まずはアカデミックな実績を作っておくところからかなという感じがする。MJITの話は実用性はさておき新規性はある気がするので書いてみたい気がするが、日々コードばかり書いてしまっていて特に準備とかも進められていない。

仕事

Treasure Data (1~7月)

年の頭にCTOのnahiさんがテクニカルアーキテクト的なロールを持つグループを発足し、ICと半々くらいでそれを兼務し始めた。 純粋にシステムのことだけを考えるシステムアーキテクトとは違い、テクニカルなこと"も"考えてビジネスのプライオリティを調整するような業務だけど、3つのチームや様々なコンポーネントを転々としたことで得た広めのコンポーネント知識を活かして価値を発揮していくのがやりやすい働き方だったように思う。短い間にどれくらい価値が出せたかはわからないけど、良い経験になった。

ICとして何をやっていたかは退職ブログにも書いたが、 クエリを速くするためにストレージレイヤーを改善する仕事をやらせてもらっていた。 あるワーカーコンポーネントをスクラッチして、とあるマイグレーションを一つ完遂した。 そのコンポーネントがそれとは別の巨大マイグレーションプロジェクトにも一役買う予定のままそれの完成を見ずに退職したが、それが今どんな感じなのか秘かに気になっている。

Shopify (7~12月)

Shopifyが開発したRubyのJITであるYJITをフルタイムで開発する仕事をし始めた。これまでは仕事で分散システムをやり、趣味で言語処理系をやる生活を送っていたが、仕事も趣味も言語処理系一本に絞っていく生活にシフトした。チーム内に日本語ネイティブの人がいなくて、完全に英語だけで仕事をするようになったことも前職との違いと言えそう。

今年やった主な業務としては、Arm移植に結構なVM命令数貢献したのと、不要コードを消すコードGCを僕がリードで開発していたのと、 本番で使えるメトリクスの拡充を行ない本番アプリにRuby masterを出してYJITのチューニングをやっていたという感じ。 Ruby masterを本番に出してチューニングする業務を始めるまでの最初3か月くらいはプロプライエタリなコードは1行も書いてなかったが、今ではYJITのバージョンアップやチューニングコミットだけで業務アプリにコミット数をまあまあ積んでいる人になった。

CEOが書いたので公開情報だが、お客様のストアをレンダリングする、社内で最もトラフィックが多いコンポーネントほぼ全台でYJITが有効になっており、同コンポーネント上でRuby masterのYJITなし/あり同士で公平に速度比較をしている環境ではYJITにより5~10%レイテンシが改善しているのを眺めており、ちゃんと有意差の出るJITになっているなと感心している。このくらいの差が本番で出てなかった時にその原因を調査したり、対応策をObject Shapeやってる人たちに提案したり、このグラフやそれ以外のメトリクスを持つダッシュボードのメンテとかを僕が担当していた。依然として軸足はコンパイラ開発に置きたいものの、YJITが会社やビジネスにより大きなインパクトを与えられる機会はどんどん活かしていきたい。

US生活

グリーンカードを取り終わった。ビザで生活してるとコロナの影響で再入国できなくなるリスクがあったり、レイオフされたときに面倒だったりするので、取り終えられてよかった。

資産運用は2020年末にやっとまともにやり始めたという感じで、2021年は好調、その利益が2022年でひっくり返るみたいな年だったが、まあ多くの人がそうならざるを得ない年だったのではないだろうか。去年市場の調子がよかったころ2億円を2022年の目標にしてたのが、まあ全然そういう雰囲気じゃなくなったが、資産の大部分を運用に回した状態で不況を経験した結果、長期運用的にはどうにかなりそうだなという実感が得られている。

運用視点での今年の面白ポイントとしては、I Bonds (インフレ連動の国債) が金利9.62%保証だった奴を買える枠いっぱい買えたのと、使わなくなってクローズされてたSavings口座を別の銀行で開設したら金利4.11%まで来たところか。もちろん本当に金利に興味がある人はSavings口座ではなくCash Depositとかを使う気がしているが、僕はメインの運用は株と債券でやっているので、ちょっと高い買い物をする前に即出せる場所にお金をプールしておく場所としてSavings口座を使っているに過ぎない。具体的には、来年現金が貯まってきたら車を買い替えようかなという機運になっている。

我が家ではプリスクール(幼稚園)は子供が3歳になってから入れようと考えていて、それがとうとう来年まで迫っているので、今年学区とかも全く知識がなかった状態から結構いろいろ調べた。元同僚がプリスクールに月$2000使っているという話を聞いた時はビビっていたが、うちは少なくとも最初は週2~3で午前だけとかがいいねという話をしていて、それだと月$300~400くらいの感じでいけそうな雰囲気。子供が楽しんでくれるといいなと思っている。

発表

子供の面倒を妻一人で見るのは大変なので、物理的に参加しないといけないカンファレンスは基本的に敬遠している。例外的に、(会社費用で飛行機代が出る)僕と一緒に家族の分は自費で一時帰国すると妻が実家に帰ることができるRubyKaigiだけはありがたく参加させていただいている。

コロナの影響で、オンラインのイベントは今でもそこそこ行なわれていて、ありがたいことにいくつか登壇のお誘いもいただき、以下のイベントで登壇した。

例年通りRubyのJITの話をしたのが2回。RubyのJIT開発が業務になった関係で、それをやっている英語話者の同僚にコンテキストを伝える関係上、日本語と英語どちらもサポートしているカンファレンスでは英語でRubyのJITの話をするように意識し始めた。また、Ruby RoguesというPodcastも再びお誘いをいただいて、そこでも英語でRubyのJITの話をしている: MJIT, YJIT, and HAML - RUBY 573

自分が資料を用意するでもなく、(打ち合わせやネタのメモの用意などは事前にするが)当日他のパネリストに話を振られて応答するスタイルの登壇をしたのは今年が始めてだった。ある程度の頻度で登壇活動をしたい気持ちはあるが、どんなイベントが登壇者を募集してるかの情報を見逃しがちなので、お誘いをいただけるのは助かるしありがたい。

ブログ

2022年「年間総合はてなブログランキング」トップ100 に2つランクインしたので、ちょっとがんばった感じがする。一方で今年も1000ブクマに届いてないので、それだけ伸ばせる人たちはすごいなあという気持ちがある。今年書いた記事をブクマ順に並べると以下のような感じになる。

引き続き、登壇の場で放出できなかった面白ネタなどを記事にしていきたい。

OSS活動

フルタイムOSS開発者になったが、入社するまではYJITはほとんど触ってなかったので、趣味の時間でやっているOSS活動は入社の前後でそれほど変わっていない。YJIT以外のOSS開発は全てGitHub Sponsorsに支えられている。

sqldef, xremap, rspec-openapi

僕が作者のOSSの中だと、sqldefxremapの2つに勢いがあり、これを伸ばしたいという気持ちが年の始めくらいからあった。どちらもユーザー数が増えている感覚があり、ありがたいが、どちらのプロジェクトも自分が直接使わない環境もサポートしないといけない難しさを感じている。sqldefの方はSQL Serverサポートメンテナの@ytakayaさんと、新しくSQLite3サポートメンテナになった@knakaさんに非常に助けられている。xremapの方はUbuntuでもX11でもない環境の問題は結構面倒なので、Ubuntu以外のdistroやWaylandを使っているメンテナが可能なら欲しい状況なのだが、今のところそのあてはない。

メンテナ移譲関連の話をすると、rspec-openapiは主に前職で使っていたgemなので、前職にいる間にco-maintainerになっていただいていた@exoegoさんにownershipを移譲させていただいた。精力的にメンテしていただいていて、とてもありがたい。

Haml, Temple, Slim

あとはHamlの開発版ブランチをHamlitにリプレースするプロジェクトをマージした後、Haml 6が出ないまま1年が経っていたので、作者をつついてgem pushの権限をもらいHaml 6をリリースし、そこからのリリースやバグ修正は今のところ僕が全部やっている。

HamlやHamlitが使っているフレームワークのtempleに関しても、GitHubのwrite権限がある状態だったところからgem pushの権限ももらい、長い間溜まっていた変更をリリースしたりした。そこで出た変更にSlimを追従させる必要性から、(temple対応だけ担当の)Slimのメンテナにもなった。ERBとHamlとSlimの全てのメンテナをやっている人間になった。

MJIT

業務時間外にYJITに触ってしまうと、成果を出すために実質の残業に依存する習慣がつきかねないため、趣味ではYJITには触らないようにしている。が、それはそれとして結局趣味でもRubyを速くするコンパイラを書くことに一番関心があるため、MJITを触っている。MJITのアーキテクチャでRubyを速くするのは大変なので、デザインそのものをひたすら変え続けていて、Ruby 3.3でもそのあたりをもうちょっと変えてからいろいろやっていく所存。

2023年は

railsbenchが1.4倍速くなる現状のYJITもなかなかすごいが、ローカル変数のレジスタ割り当てがまだ終わってないみたいな無限の伸びしろがある状態なので、Ruby 3.3ではモダンな言語処理系に入っている最適化がCRubyのJITに一通り入れられた状態でリリースできるといいなと思う。

MJITを一人で開発していた時と違って、YJITでは信頼できる何人ものチームメンバーと一緒に戦えるので、良いものにできそう。