RubyKaigi2022で "String meets Encoding" というタイトルで話しました

RubyKaigi2022 Day3で "String meets Encoding" というタイトルで話しました。

無事話すことができて良かったです。

スライド

後日YouTubeに動画がアップロードされると思うので、アップロードされたらそちらも貼ります。

きっかけ

本編中に話したとおり、RubyKaigi Takeout 2021 後に見たすとうさんのツイートです。ですが、読み違えていてすとうさんの元ツイは「String#encode高速化してほしい」だったのに「KEN_ALL.CSVを読み込むのが遅いのか…つまりCSV.readか?それを調査するか…よっしString#splitが30%近くかかってるな!これでプロポーザル出しちゃおう!」と読み違えたままその勢いでプロポーザル出しました。その後プロポーザルはアクセプトされ、全く気づかずにString#splitの速度改善してました。なんとかなったので良かったです。

困ったこと

RubyKaigi1週間前まで速度改善できず、見切り発車でプロポーザル出したことを大変後悔していました。職場の同僚にRubyKaigiの進捗を聞かれるたび「やばいです」「だめです」「全然わからなくて困ってます」と答えていました。実際RubyKaigi1週間前の金曜日の徹底解説で話したときには「速度改善できなかったんですけど何か話します…」と言っていました。 そもそもプロポーザル出した時点でC言語読めなくて苦しんで覚えるC言語を読んでました。今もあんまり読めないです。perfがmacOSで使えないということも知りませんでした。何も知らない私にいろいろアドバイスをくださったudzuraさんには本当に感謝しています。

なかなか速度改善できなかった理由はString#splitが何をしているか理解していなかったからでした。それまでperfで何かわかりやすいボトルネックが取れないかとあれこれやってみてはいたんですが、結局perfで見てるだけじゃだめでした。改善したい箇所、今回でいうとString#splitの処理の流れをlldbでステップ実行しながら全体的に把握して、その上でperfを見ることでperfが何を伝えようとしているのか分かるようになりました。perfは注目すべき点を可視化してくれますが、それがどんな意味を持っているかはコンテキストを把握してないとなかなか難しいものだな、と思いました。この辺の話もうまく発表内に組み込めると生生しくてよかったんですが、何分時間がなかったのできれいな一本道っぽく仕立てることにしました。

慣れないツールをガンガン使ったのでバグ踏むと解決に業務後の貴重な調査時間が吸い取られてしんどかったです。特にperfでcallgraph dwarfをつけてperf.dataが1MB以上になるような測定を行うとperfがクラッシュする問題1に苦しみました。結局なんとかtoolsのバージョンの問題を踏んでいて、Ubuntuのバージョンをjammyに上げないと解決しなかったです。

途中でmacOSのバージョンを上げてしまったのでXCodeやら手で入れたGCCが吹っ飛んで入れ直したりということもありました。面倒な手順を踏んでGCC入れてGDBデバッグできるようにしても、なぜかinlineの関数に入れなくて全然ステップ実行できなくて困ったりしました。その問題はGDBやめてlldbでデバッグすることで回避しました。

あとrebaseするとmacOSRubyがビルドできなくなったりもしました。これはどうやって解決したのか覚えていません。make clean などで一旦綺麗にして再実行した気がします。

時間なさすぎてノーレビューでぶっつけ本番に突入したので、反応を見るのが怖かったです。好意的な反応が多くてホッとしました。物理会場でお話するのは初めてでしたが、ふーがさんから聞いていた通り「発表前が一番緊張するけど、始まってしまえばもうあとは話すだけ」でした。

発表時間管理にキーノートのストップウォッチをあてにしていましたが、事前のセッティングでストップウォッチが始まってしまい、発表開始時に戻せず時間管理ができなくなっていたのはわりと困りました。別でストップウォッチは用意しておこうと思いました。また、発表中に適当なキーを触ったらページ数が大きく表示されてしまったのも焦りました。本番では余計なキーを触らないよう気をつけます。

良かったこと

発表前に使えなかった stackprof, perf, lldb が使えるようになりました。CRuby も単純なメソッドなら読めるようになりました。Kaigi駆動開発で自分のやれることをガッと増やす、をここ2年間やって無理やり自分を強くしていましたが、今年のように困ったことになるのでもっと普段からやろうと思いました…

また、発表後に「姿勢を見習いたい」のようなコメントをいくつかいただいたのは私にとって思ってもいないところでした。参考になる点があったなら幸いです。また、対面やオンラインで感想を言ってもらえるのはとてもうれしく励みになりました。ありがとうございました。

発表が終わった後、舞台裏で次の発表の準備をされていたznzさんに少し挨拶していつもるりまのPRを見てくださっているお礼を伝えられて良かったです。その瞬間のことが、なんだか心に焼き付いています。

話足りなかったこと

上にあげた困ったことも話したかったですが、これはいずれブログにでもまとめて昇華させてあげたいです。perfは大変便利なので、macOSを使っていてもわざわざLinux環境を作って入れる価値はあるツールだと思います。(macOSならインストゥルメンタルでもいいはずなんですが、使い方の情報がperf以上に少なくてたいへん)

あとは String のデータ構造や rb_encoding もとい OnigEncodingTypeST という巨大構造体2 も調べて話したかったです。いつかの機会に話せるといいなと思います。

まとめ

プロポーザルを出してからとにかく苦しい生活でした。去年はプレッシャーとの戦いでしたが、今年は成果が出ないことにずっと苦しんでいました。もう見切り発車でプロポーザル出すようなことはしたくないので、362日(今年はもっと短いですが)のRubyistとしての生活に気合をいれて、日々の成果をRubyKaigiにぶつけられるようになりたいです。

あとは PR がまだ draft なのでちゃんと仕上げたいですし、Stringまとめて生成すればオーバーヘッド少なくなりそうというのも見たいですし、宿題にしたStirng#encodeの高速化も見たいのでまだまだやりたいことがたくさんあります。楽しみです。