2024年の振り返りと2025年の抱負
今年の振り返りと来年に向けた目標の整理をしていく。
2024年の振り返り
2024年の目標として設定していたのは、以下の4つだった:
- 大学院で良い成績をとりつづける
- 仕事でより良い成果を出す
- 外部発信をしていく
- 人生をがんばる
それぞれ達成度合いを振り返っていく。
大学院で良い成績をとりつづける
2022年9月からオンラインで通い始めたGeorgia Tech、早いもので2年とちょっとが経過した。2024年の秋学期終了時点での取得単位数は24(修了単位は30)。
2024年にとったクラスは以下のとおり:
- CS6211: System Design for Cloud Computing
- CS6290: High Performance Computer Architecture
- CS7210: Distributed Computing
CS6211: System Design for Cloud Computing
CS6211はハンズオン形式でSDN (Software Defined Networks)、実際のクラウド(Azure)を利用したMapReduceシステムの実装、Azure上のマネージドサービスを活用したWebアプリケーション開発など、低いレイヤーから高いレイヤーまでを実践的に学ぶことのできるクラスだった。
毎週課題の進捗をTeams上のビデオ通話でTAに報告することになっており、時差に苦しみながらも一緒にチームを組んだToshiさんのおかげもあり無事にやり遂げられた。
CS6290: High Performance Computer Architecture
CS6290はコンピュータアーキテクチャに関するクラスで、多くはCPUに関するトピックだった。
今までブラックボックスとして扱っていたCPUに対する解像度がかなり上がったと同時に、現代のCPUに注ぎ込まれている工夫の数々に感嘆した。
パイプライン、分岐予測、Tomasuloアルゴリズムとリオーダバッファ、物理アドレス・仮想アドレス、コヒーレンス、メモリモデルなどに加え、ハードドライブの物理的構造とRAIDに関する話題、メモリ(DRAM)の回路的な構造などもカバーされていて、以前とったOS関連のクラスで曖昧なまま理解していた部分(例えばN-way set associativeとか)についての理解度を格段に上げることができた。
このクラスは授業の構成が素晴らしく、講義ビデオに頻繁に挿入されている小テストによって段階的に自分の理解を確認することができるし、中間テストと期末テストの過去問も解答付きで提供される上、Head TAによるサポートの手厚さが半端ではなかった。内容自体のおもしろさに加え、学習体験の良さという点も相まって、これまでとったクラスの中でも総合的な満足度はトップクラスに高い。
CS7210: Distributed Computing
最後のCS7210は、クラスのレビューサイトであるOMS Centralにおいて最も難しく、課題をこなすのにかかる時間も最長であるということで悪名高いクラスだった。
Workloadで降順ソートした結果。Distributed Computingが2位に大差をつけて圧倒的作業量を要していることが分かる。ちなみに数値は週あたりの作業時間数を表している
講義では分散システムの基本的な概念(例: Logical clock)を学んだのち、リアルワールドで使われている分散システムの数々、例えばGoogle SpannerやAmazon DynamoDB、Facebook Memcachedなどについて議論していき、エッジコンピューティングやIoT、ブロックチェーンなど最新の話題についても触れられた。
そして何よりこのクラスを最凶たらしめているのが、4つの課題である。
4つの課題を完了させると最終的にトランザクションおよびシャーディングに対応した分散キーバリューストアができあがるという内容で、この課題自体はGitHub上で公開されており世界中の大学で広く利用されているらしい。
課題のハイライトとしてはやはり、3つ目の課題で実装する分散合意アルゴリズムPaxosと、このPaxosを利用して4つ目の課題で実装するシャーディング・トランザクションに対応した分散キーバリューストアである。
最初はPaxosがラスボスで、その後の分散キーバリューストアはウイニングランだと思っていたが、実際は分散キーバリューストアもシャードをまたいだトランザクションを正しく処理するのに必要な2フェーズコミットの実装や、2フェーズコミットとシャードの移動が同時に起こる場合の処理など、裏ボスとして君臨していた。
苦しんだだけあり、学びとしては非常に大きく、分散システムに関する論文などを読み解いていく基礎体力は身についたと思う。
実際、この年末年始の休みで、ナウでイケてる分散合意アルゴリズムであるRaftの論文を読んだり各種解説を読んだりしながら、実装をしている。Paxosに比べてあまりにも分かりやすくて感動している(実際、Raftは「理解容易性」を最重要視されて設計されたアルゴリズムである)。
成績
2024年にとった3つのクラスで、すべてA(最高成績)をとることができた。
2023年秋学期に気が緩んでBをとってしまったこともあり、今年は反省して全力で取り組むことができたように思う。何より、昨年までとっていたクラスに比べて格段に難しいとされているクラスを意欲的に履修し、それらでAをとることができたのは自信につながる結果。
今後の履修
いよいよ取得単位も増えてきて、修了までにあと2コマしか取ることができないところまで来た。
2コマのうち1つは CS6515: Algorithms をとらなければならない(必修)ため、自由に選べるのはあと1つだけということになる。まだまだ学びたいことがたくさんあるのに……
- CS8803 O08: Compilers—Theory and Practice
- CS6422: Database System Implementation
- CS8803 O21: GPU Hardware and Software
- CS6262: Network Security
今のところ2025年春学期は Compiler を取る予定。これもDistributed Computingと同点で最も難しいクラスとされているが……
先ほどと同じ画像。圧倒的1位のDistributed Computingに次ぐ2位がCompilers
仕事でより良い成果を出す
Deno Land Inc.に入社して2年とちょっとが経過した(たまたま大学院の入学と時期がほぼ被っている)。
チームの人の入れ替わりもあり、この部分についてチーム内で一番詳しいのは自分、といった箇所もほどほどに出てきた。よりオーナーシップや責任感を持ってDenoの発展に貢献していかなければと思っている。
個人的に2024年で一番の大きな成果は、Denoのfetch
によるHTTP/2通信が特定の条件下で不安定になり、REFUSED_STREAMエラーとなってしまう問題の原因を特定し、ライブラリにパッチを送ることで解決させられたというところ。
あまり詳細には立ち入らないが、「よくわからないがたまにREFUSED_STREAMが出ているっぽい」というところから、最小再現構成を探し、HTTP/2の仕様の確認、リアルワールドのHTTP/2サーバー側の設定値の調査、他のHTTP/2クライアントライブラリの実装との比較などをして、ライブラリの関係者への合意形成とパッチの提案まで一貫して行い、問題解決へと導けたことが自分にとっては良い成功体験となった。
もう1つの成果としては、同じくfetch
に関連して、特定の条件下でスループットが許容できないレベルで悪化するという問題を特定し、修正までこぎつけたことだ。
簡単に背景を説明すると、Denoのfetch
の実装はv1.45前後あたりで内部的に大きなリファクタリングが入り、もともとはRustのHTTPクライアントライブラリreqwest
をベースに使用していたところ、新しくhyper
をベースとする書き換えが行われた。
この変更をDeno Deployに取り入れたところ、一部のデプロイメントでメモリ使用量が著しく(~100MB)増加していることが観測され、Deno Deployでは最大メモリ使用量として512MBが設定されているため、あるデプロイメントではメモリ不足によるエラーが頻発するようになってしまった。この問題について、上記と同じく最小再現構成を探し、プロファイルをとったりflamegraphとにらめっこしたりして、以下の事実をつきとめた。
- メモリ使用量の増加はパフォーマンスの悪化に起因していること (特定のケースでは、スループットは10倍ほど悪化していた)
- サーバーから受信した圧縮データを復元する際に利用している
tower_http
クレートで、一度確保したメモリ領域を使い回すことをせず、毎回小さいメモリをアロケーションするような実装になっていたこと
これを修正したのが以下のパッチである。
逆に反省点としては、2024年内に完了させたかったタスクを完了できなかったというのがある。
具体的には、Deno Deployの内部で動いているDenoランタイムをv2ベースにアップデートしたかったのだが、必要なコード修正量が想定より多かったことや、互換性を保ったままアップデートするための細かい対応等で時間がかかってしまい、来年に持ち越すことになった。
外部発信をしていく
いろいろな機会に恵まれ、イベントでの登壇を数多く(自分比)経験することができた。
- Denoハンズオン&もくもく会:Fresh + KV
- JSR Meetup
- Denoで変わるランタイムの景色 実践事例 Lunch LT
- RustのWebアプリ開発 LT道場 〜テスト編〜
- Funabashi.dev supported by KIKKAKE CREATION
また、計5本のYouTube動画にも出演させていただいた。
ふと思い立ってクリスマス会を開催したら16人も集まり、楽しくクリスマスを過ごすことができた。
人生をがんばる
健康
健康診断に行った。偉い。
歯医者に行った。偉い。神経を抜かない方法を取ろうとすると47万円かかるらしい。どうしよう。
婚活
Xで婚活ポストをした。
いろいろな人に相談をした。
合コンをした。
酒
世界各地のおいしいビールにハマってしまってしまった。
一人で鳥貴族に行って大学院の勉強をすることの楽しみを知ってしまった。
ラーメン
ぼちぼち食べてしまった。
2025年の抱負
大学院、修了する
あと2コマで修了。最後まで気を抜かず最大限の学びを吸収していきたい。
仕事でより良い成果を出す
毎年同じようなことを言ってるけど、やっぱり仕事で成果を出していきたいという気持ちは常にある。大学院が修了したらより仕事に集中できるようになるので、さらに頑張っていきたい。
文章を書く
2024年は登壇元年だったが、2025年は文章を書くことにも力を入れていきたい。具体的にはまず「作って学ぶ分散合意アルゴリズムRaft」みたいな記事(本?)を作りたいと考えている。時間に余裕があれば……
本・論文を読む
積読が溜まっているので、消化していきたい。
人生をがんばる
健康に気をつかう。婚活で進捗を生む。酒を飲みすぎない。痩せる。
Appendix: 過去の振り返り
Discussion