2021年にやったこと

というわけでこれ毎年書いてるんですけど、 なんか参戦したくなったので Rubyist近況 Advent Calendar 2021 24日目です。 入居者募集 記事があるくらいですし、自由に書こうと思います。メリークリスマス。

発表

1歳児がいる状況で家を留守にしたり夜に声を出したりすると家族に負担がかかるので、録画提出できるカンファレンスにしか基本参加しないことにしているのだけど、コロナが長引いていることにより今年も登壇しやすい状況が続いた。

とはいえ、ハイブリッド開催だったRubyConfに関しては、国内の渡航だけでShopifyのYJITチーム全員 (や当地のRubyフレンズ) と対面で話せる貴重な機会だったので、行けなかったのは惜しいなあと思う。シリコンバレーっていうテックっぽい田舎があるんですが、全てのカンファレンスをここで開催しませんか?

2015年は10本、2016-2019年は6-7本、2020-2021年は3本というトレンドになってきており、若さからくる勢いを失った感じがするが、そんなことより家族との時間の方が大事である。

あとRuby RoguesというPodcastでまた話した。2018年に2回話してるので、今回で3回目。5年前にtimakin社長と僕がやっていた幻のPodcastがあって、今も自分でホストできる状況にはないものの、各所からワンショットでゲストとして呼ばれるみたいなのはいつでもお待ちしております。

仕事

初めて職業プログラマ(ただしアルバイト)になったのが2011年5月なので、プログラマ歴10年になった。プロプログラマ。前前前職と前前職は真面目に大学とサークルをやっていたころだったので勤務時間はあまり長くなく、さっさと単位をほぼ取り終えてサークルをやめ*1、2013年10年から週に1コマだけ取って残りは全部働く社畜*2になりそのまま新卒になったのが前職なので、そういう意味では実質の経験は8年。いやあ、2004年にまだプログラミングも知らず、HTMLをFFFTPでinfoseekにアップロードしてスーパー正男を使ったゲームを公開していたころからここまで長かったですね。

で、やっと現職の話をすると、おかげ様で現職よりも待遇が良い会社がシリコンバレーですら見つけるのが大変な状態まで厚遇されている上、元々やりたかったような仕事に手が届く社内地位を得つつあり、グリーンカードのプロセスをリセットしたくないというのもあって辞めるモチベーションがなさすぎる状態*3になり、入社してもう4年半経った。2度目の昇進をしてSeniorの上のStaffというタイトルがつき、今年は1年中とあるプロジェクトのリードをしつつ、その裏で分散システムのスケーラビリティや性能改善のための新コンポーネント開発をやっている。もう触ってないのも含めて、僕が一番コミット数が多いか詳しいみたいなリポジトリが社内に結構ある*4けど、僕個人のリソースがスケールしないので知識のトランスファーを年中やっている状態なのだが、今のチームで僕の仕事の一つを引き継いだ人が辞めてしまったので、その人がその後やり始めた仕事も増えつつ、結局僕に返ってきた*5。前職でeagletmt先生が僕に知識を引き継いでいたところを、何故か僕が先に辞め、先輩が僕の書いたジョブキューを日々メンテするのを眺めている立場なので、文句は言えないと思う。

大学

成績発表〜!

  • Spring 2021
    • CS-6200 - Graduate Intro to OS: A (87.2%)
    • CSE-6250 - Big Data for Health: A (96.36%)
  • Summer 2021
  • Fall 2021
    • CS-6250 - Computer Networks: A (90.54%)
    • CS-6515 - Intro to Grad Algorithms: A (96.12%)
    • CS-8803 - Compilers Theory and Practice: A (94.23%)

ノルマクリア失敗! 全部Aを取るというのを今年の目標にしていたのだが、やらかしてしまった。ほとんどのクラスでは僕のやる気と余力と能力が点数に反映されている感じがするが、Deep Learningに関してはもう不服オブ不服である。授業で説明された理論はおおむね理解しているし、プロジェクトでもものすごい時間を費やしてかなりの理解が得られたが、残念ながら論文のクオリティを上げるといった作業より、コードをいっぱい書いてより多くの成果を出すというあまり点数に関係ないところに時間を使いすぎたようで、他のチームは大体成績がよかったところで大幅に点を削られてしまい、Aに0.55%*6だけ届かない結果となった。僕は学部時代もコードを一切書かないコンパイラの授業*7では点数が悪かったし、コードを書く以外の作業にやる気を出すのが得意でないことは自覚していきたい。

これらの授業を通して、OSのアーキテクチャ機械学習、pandas、scikit-learn、MapReduce、Pig、Spark、Scala、DNN、CNN、Transformer、pytorch、TCP/IPRSAFFT、P vs NP、LP、NFA、DFAレジスタアロケーションの実装、MIPSアセンブリ、その他多くを1年で学んだというのは、すごいインプットに倒した1年だったなと思う。学部のプログラミングに関する授業は(元々知ってる)CとJavaを1年かけて学ぶくらいの速度だったので、フルタイムで学生をやっていた当時よりむしろフルタイム社会人の今年の方がプログラミングについて圧倒的に多くのことを学んだと思う*8。成績表でも見せない限り「えー適当に流してたんでしょ?」とか言われそうな詰め込み具合である。全部完全に理解しました™ *9

個別の授業の感想は卒業した後にまとめて書こうと思うが、ハイライトとしては、同じ授業をたまたま同時に取ってた同僚と機械学習の宿題でKaggleコンペで競ったり、2人グループでTigerMIPSコンパイラを書くプロジェクトにソロ参戦して竹内関数のベンチマークでランキングを競う奴あたりが個人的に一番楽しかった。春学期にあと3つ授業を取ると卒業できるので、何事もなければトータル5学期(1年9か月)で卒業できる見込み。

US生活

ビザステータスでアメリカに入国してから2年が経った。コロナで家賃が下がって、立地も治安もよいリノベ直後の2ベッドルーム*10を $2,550/mo という安すぎる意味不明の家賃で確保してからというもの、更新の時に賃上げするんじゃないかとビクビクしていたが、今月の更新で家賃は上がらなかった。便利すぎる。グリーンカードのプロセスも大変そうだなあというイメージがあったけど、既に最終ステージで指紋採取も健康診断も終え、コロナで面接はないことになってるので、早ければ来年グリーンカードが取れそうな状態になった。トランプ政権が終わったので途中でビザのプロセスが遅くなったり厳しくなったりするみたいな可能性も低くなってそう。

車に子供を長時間乗せると睡眠や機嫌のコントロールが大変なので、家から車で10分以上かかるところにはほぼ行ってなくて、基本的に公園とスーパーと外食のテイクアウトにしか行かない生活をしている。外食は育児上の苦労が多いのとそもそも僕がケチなところもあり、コロナもある状況下の楽しみとして、料理に大分凝るようになった。これまで手を出してなかった揚げ物や低温調理など。いい奴を作りたい時は結構料理系YouTuberの動画を見てるんだけど、ステーキの焼き方が一番改善した気がする。同僚のtaroleoさんのfacebook記事を読んでreverse sear的な焼き方を学んだ時は「焼き目をつける」という工程をちゃんと理解できてなかった感じがするが、中に火を通す工程をじっくり終わらせて、その後表面だけを超高温で短時間加熱してカリカリにすると、食感が大分おいしい感じになる。

ところで去年は、ゲーセンが治安が最悪のところにしか音ゲーが置いてあるゲーセンがないと書いたが、SFベイエリアにいながらIIDX両皆伝を維持しているnobu_kさんに僕が懸念していた地域は実際には治安が良いと教えてもらった。ワクチン摂取が急速に進み全てがオープンになったころ、家族が留守にしていたタイミングでRound 1に行って、IIDX SP八段は取ってきた。ちなみにアメリカではコンマイのネットワークをラウワンが独占契約してるらしく、型落ちでない*11音ゲーをするには今はラウワンに行くしかないらしい。あと、テキサスホールデムのルールを覚えたので、ついでにカジノにも行って、一番レートの低い4/8 Limit卓のMin Buy-in $40 をそのままスッて来た。

ポーカーは地獄のようなセンスだが、資産運用はどうやら人並程度にはできるようになってきたようで、東京のソフトウェアエンジニアの年収くらいの利益はカタい状態になった。まあ、それでは家族3人ベイエリアで暮らしていくというのはできないので、まだまだ無限にお金を稼がないといけない感じがある。

ブログ

CI/CD Conの発表 数時間かかる週一リリースを毎日何度も爆速でできるようにするまで / CI/CD Conference 2021 - Speaker Deck が一番伸びてて、ブログの方はボチボチという感じなのだが、その中では以下が伸びた方。

ところで、学生のころにQiitaに書いた ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い - Qiita が今でも色な人にincludesとかの説明資料として使っていただけているらしく、これを含めたその他いくつかの昔の記事が伸びていたおかげで、10k subs YouTuberの盾みたいな奴をIncrements社からいただいた。

しかし最近は人気YouTuberかのような活動は一切しておらず、超純粋に自分の備忘録としてのみQiitaを使っているため、ブログより多く書いてる割には最近の記事はLGTMが0とか1みたいな記事がほとんどである。ただ、もとからそういうコンセプトで続けていることによって、書くクオリティにプレッシャーがかからず自由に書けるのが便利なので、自分の記憶のためにこのスタンスは続けていきたい。それだけだとフリーライダーっぽいので、たまに記事がヒットしてIncrements社に利便性の対価が還元できると良いですね。

OSS活動

MJITでRailsを速くできるようにしたいというのは2017年から毎年毎年本当に毎年目標にしていたのだが、今年ついにそのパズルを解き、4年間にわたって取り組み続けていた目標を達成した。だが、逆説的に、なぜ遅かったかを理解した瞬間、「ああ、この方針はダメだな」と悟ったので、CRubyではCコンパイラ+dlopenでJITをするのはやめようという方針で活動している。で、YJITという別のJITを開発し始めたShopifyチームが、たまたま同時期にJITRails高速化を達成したため、MJITを置き換えようとしているMIRはもっと時間がかかりそうなこともあり、第一ステップとしてMJITはYJITに置き換えて(Cコンパイラ+dlopenを発破解体して)いこうという風になった。というか去年の末の時点ではShopifyチームがこの速度で成果を出してくるとは全く予想できなかったので、去年考えていたJITのロードマップとはかなり違う結末になったが、僕一人でメンテする状況ではなくなった上、MJITと違って極めて短いwarmupでRailsbenchで性能改善ができるようになったのはとても素晴らしいことだと思う。4月に最後の授業が終わったら時間に余裕ができるけど、YJITの発展が結構速くて春ごろの状況の予測が困難なので、今後どこに投資するかはその時になってから考えたいと思う。

CRuby以外の点では、主にsqldefrspec-openapi、その他もいろいろ、で継続的にissueやPRが来るのでその対応などをやっていた。Haml 6をHamlitが乗っ取るというのを作者にお願いされてそのパッチを書いてマージされたけどまだリリースされてないという活動もあった。今年、他の人がxremapをRustで書き直すという試みが2回行なわれたが、これは実は大分前から僕自身がやろうと温めていたアイデアでもあったので、今月の期末テストが終わったタイミングからの時間を使ってxremapをRustに書き直すというのをやった。スターもまた伸びて嬉しい。

GitHub Sponsorsで支援をいただいている方々には大変お世話になっております。OSSは、仕事で給料が十分いただけてるのとは別腹というか、割と真面目に全てのissueやPRに対応している分、趣味とはいえど、僕がその時最も興味があるプロジェクトとは独立してそこそこメンテ作業にプライベート時間を割いているため、ここで少なからずお金をいただけているのは当初の想定を超えるほど精神的な支えになっています。特に、Comcastで1Gbpsのインターネットをする料金が月$100とバカ高い*12のが経費になったり、生産性のためにマシンスペックを上げたりする時にこれも経費になったりするので、すごいケチな性格の僕としてはとても助かっています。

2021年は

今年は子供が寝てから朝5-6時まで宿題をやって提出して、朝7時に起きて子供と過ごすみたいな日が毎週ある感じだったけど、頭と腹は毎日痛くて、睡眠不足は寿命が縮まるしハゲるらしいので、来年は春学期でさっさとGPA 3.9*13で卒業して、その後は健康に過ごすことを目標にしたい。あとはこれ:

*1:大学公認サークルである学園祭実行委員をやめただけで、それと同時に非公認の東工大音ゲーサークルを立ち上げたので、勤務後や休日のゲーセン通いという名のサークル活動はやっていた

*2:バイトの時は有給を取ってなかったので、社会人の時より普通に勤務時間が長かった。実際この時が一番本来の新卒ぽい成長をしていたし、新卒と会社が同じだったことを利用してこの期間がまるでフルタイムのように履歴書やLinkedInで書きがちなのはそのため。書かなかったとしても必要以上に実力を低く見つもられてお互い損するだけな気がする。

*3:僕の給料を決める権限がある人にこういうのを読まれてしまうと交渉の立場が悪くなるのでこういうのはあまり書かない方が良いのだが、これを読んだとしてもフェアに決めてくれるだろうという信頼が既にある。

*4:特にTD APIって奴は、3年前までに1年だけ在籍していたチームのリポジトリなんだけど、何故かそのチーム内にはこれまで僕よりコミットしている人がいなくて、在職者の中で過去に僕よりコミットしたのは古橋さんだけ、僕の次はもうやめたkamipoさん、という渋い状態になっている。僕がリファラルしたmakimotoさんがそろそろkamipoさんを超えそうなので僕も抜いていって欲しい。

*5:倍返しだ!! というのはおいといて、この辺をやる僕のチームのSeniorポジションが2月くらいに開くっぽいので、これを読んでる人どうですか? Railsのコードを眺めたりちょっかいを出したりしながら、KotlinでバックエンドのAPIをバリバリ書きまくるみたいなのに興味があるルビーストがいたら是非リファラルしたいのでDMしてください

*6:予告通りAのボーダー90%はcurveしなかったが、roundはして89.5%以上がAとなったため

*7:コンパイラを書かないコンパイラの授業とは…? これで実際コンパイラ書けるようになるのか…? と思ったものだが、今もその教科書は持っているので眺めてみたところ、全てコンパイラフロントエンドの理論の話で、これは今回の授業の3つのパートのうち1つ目でカバーされていた。実際、コードを書く授業かに関わらずもともとフロントエンド側には興味がなくてそこだけ知識が薄かったので、実際に(Aを取るために)真面目に勉強してみると勉強になった。それ以外のパートは、特にレジスタアロケーションも何故か同じ教授の授業で全く同じレクチャー(完全にコピペだったので「[違うクラスの名前]にようこそ!」みたいな導入だった)を試聴済みだったのもあり、「知ってた」みたいな感じだった。

*8:プログラミングについて「は」、というのが正しくて、数学とか物理とか文系科目がその他の時間を占めていたため。

*9:まあBを取ってしまったディープラーニングに関してはもう何も言えませんが………

*10:西日暮里で住んでた2DKの1.5倍くらい広い

*11:型落ちDDRとかIIDXじゃないbeatmaniaは結構ある

*12:高い割には雨がちょっと降った程度で使えなくなるので意味がわからん

*13:もうBを1つ取って0.1削ったため