2024-05-23

RubyKaigi 2024 で LT 登壇した 兼 参加記

    Fohte です。
    所属企業のウォンテッドリー株式会社に参加を支援いただき、RubyKaigi 2024 に参加しました。RubyKaigi には仙台で開催された RubyKaigi 2018 が初参加で 1、今回が 6 年ぶり 2 度目の参加となります。前回は一般参加でしたが、今回はなんと LT proposal が通り、LT 登壇もしました。

    LT 編

    今回は "The Journey of rubocop-daemon into RuboCop" というタイトルで登壇しました。自分の作成した rubocop-daemon gem が生まれた背景から RuboCop 本体に取り込まれるまでの過程と、その過程で感じた OSS 開発の良さと大変さを話しました。

    地域 rb で同様の LT をしていて、それらをストーリー仕立てにしてエモい感じに (?) しました。

    登壇までの準備編

    今回の LT では、rubocop-daemon gem を作る上で、作ってバズったは良いけどメンテナンスがつらいなと感じていたところに、RuboCop 本体に取り込まれて 2 救われた思いをしたという話をしています。

    この経験は稀有だと考えていて、「RubyKaigi でも話せるネタかもしれない」「同じような境遇の人を救えるかもしれない」といったことを考えて LT で proposal を出しました。「RubyKaigi は Ruby の中身の話がメインだろうし、通るかは微妙なところだな…」と感じていたところに "Your proposal for RubyKaigi 2024 LT has been accepted" という 1 通のメールが。小躍りしました。
    地域 rb ですでに話していたネタだったので (既出ネタでも) proposal が通ったことに驚くとともに、通ったということは RubyKaigi という参加者が 1,000 人規模の大きなイベントで話せるくらいの面白いネタなのだと自画自賛して、気合いを入れて資料を作っていました。
    伝えたいことの軸は資料を作る前から明確で、全体の構成や話す内容はざっくりと決まっていました。ただ、それでも今回の資料作成にはおそらく合計で 10 時間以上は時間を費やしました。これはなぜかというと、「5 分に収めること」「英語で資料を書くこと」が大変だったからです。

    5 分に収める難しさ

    RubyKaigi の LT では必ず 5 分に収める必要があります。仮に 5 分を超えてしまったら、銅鑼が鳴らされて強制退場です。それはそれで面白いですが (?)、肝心な部分が伝えられないまま退場するのは話す側にとっても聞く側にとってもよくありません。なので、今回はちゃんと 5 分に終わり切るように、長くなっても 4 分半程度で終わるように調整しました。

    具体的には、「スピーカーノートに台詞を書いておく」「複数回通しで発声しながら練習する」ということをやっていました。
    普段の地域 rb などのイベントではスピーカーノートは書いていませんが、今回初めて書きました。5 分という制約の中では、「ここ何を言いたいんだっけ」と迷う暇は少しもありません。その場で考えて一瞬でいい感じの言葉を出力するスキルに長けていればまた別かもしれませんが、自分はそこまでの自信がなかったので、スピーカーノートに話すことを全て書いておきました。幸い RubyKaigi の会場は壇上の手元に自分の PC を持っていけて、スピーカーノートを見られるようになっています。このおかげで言葉に詰まることなく発表できたと思っています。
    また、複数回発声しながら練習することもスムーズな発表の手助けとなりました。このおかげで 5 分という時間の感覚を掴めたのと、練習を繰り返す間に資料の不備や台詞の過不足に気付けました。少なくとも一度くらいは練習しておいたほうがよさそうです。

    英語で資料を書く

    これは ChatGPT をはじめとする LLM の登場により幾分と楽になったと思います。自分は日本語でまずスライドを作り、それを PDF で export して ChatGPT にその PDF を食わせて英語に翻訳する、というアプローチをとりました。PDF をそのまま解釈してくれる ChatGPT、便利。
    ただそれだけでは細かいニュアンスが伝わりにくかったり、難解な表現になっていたりしたので、自分で校正しつつ同僚の @qnighy にも校正を手伝ってもらっていました。自分の発表準備がありながらも長時間手伝ってくれた @qnighy にはとても感謝しています。

    初登壇してみて

    RubyKaigi という大きなイベントでたくさんの人の注目を浴びながら発表するという、これまたとても貴重な経験ができました。またこの場に立って発表したいと思える、刺激的で最高の体験でした。Twitter や懇親会などでも「いい話だった」とたくさんの方々から感想をいただけて、発表して良かったと心から感じました。

    緊張は思ったよりしませんでした。LT 当日は朝からずっとそわそわしていて、壇上よりもそれまでの時間のほうが緊張していた気がします。舞台裏では LT 登壇者の方が全員待機していたのですが、皆さんがそわそわされているところを見て逆に落ち着いたのかもしれません (?)。待機中に皆さんと交流できたことも緊張が和らげられました。
    一番緊張していたのは、舞台裏で資料の投影テストをしているときに、うまくスピーカーノートを表示できなかったシーンかも。なんとかなったけどめちゃくちゃ焦った。

    LT を聴いてくださった皆さん、ありがとうございました。まだ見ていない方は、いずれ公開されるアーカイブをご視聴いただければ幸いです。感想はいつでもどれだけでもお待ちしております。

    参加記

    ここからは登壇者目線ではなく参加者としての話をします。

    自分はウォンテッドリーとして参加していて、ウォンテッドリーでは Platinum Sponsor としてブースも展示していました。なので、基本的には自分たちのスポンサーブースの対応をしつつ、興味のあるセッションを掻い摘まむ感じでした。興味のあるセッションすべてを聞けたわけではないのが心残り。

    全体を通した感想としては、「前回 (RubyKaigi 2018) 参加したときよりも格段に理解できることが増えていて楽しかった」。といっても以前に比べて理解できるようになっただけで、まだ全然理解できないことは多かった……。ただ少しでも理解度が上がっていることを認識できて自信に繋がりました。
    あと英語はやっぱり分からない。日本語で聴いてもおそらく分からないであろうセッションを、不慣れな英語で聴くのは大変でした。英語が分からないのか技術的な内容が分からないのかが分からない。多分どっちも分かってない。

    Day 1

    とにかくよかった。RubyKaigi の開幕 Keynote ということで聴衆の期待も高そうで、自分も期待していましたが、それを裏切らない良さでした。自分の理解でざっくり書くと、どのようにして Quine を書くのか、Quine のような奇妙なコード (syntax) を IRB でどう対応するのか、といった話。アニメーション Quine が特に良かった。どのフレームでも動作する Quine はイケているし、Quine 自体を知らなくてもなんとなくすごさを分かるところが、聴衆が置いてきぼりにならない Keynote として洗練された発表だと感じました。まさに超絶技巧。

    Property Based Testing という手法の説明から pbt gem の実装まで触れられ、Property Based Testing を知らなくても実際に導入してみようと思えるセッションでした。Ractor も「並列処理できる新しめのなにか」程度の認識しかなかったので、「ブロック内では scope が Ractor になるので RSpec の matcher などは使えない」といった制約を知れたのは大きな収穫でした。

    pf2 gem の実装についての話でした。RubyKaigi の少し前にあった Gotanda.rb でも発表されていて、そこで楽しそうに発表されていたのがとても印象に残っています。楽しそうに喋っている発表聞くとこちらも楽しい。内容は 3 割くらいしか理解できていないので悔しい。プロファイラーの勉強をしておきます。プロファイリングのオーバーヘッドを減らすために周期的にサンプリングするというアイデアはとても良さそうだと感じました。

    懇親会: Official Party

    海の近くでのバーベキューの体験良かった。旧友に再開したりしてオフ会を楽しめました。
    帰り方が分からなくなりトイレに行きたいのに迷うという最悪な展開になり、ようやく駆け込んだコンビニで Rubyist がトイレ前に行列を作っていたのがハイライト (?)。

    Day 2

    Day 2 は自分の LT 発表もあったので、見に行きたいセッションも泣く泣く断念して裏で発表練習していました。会期中で最も気が張り詰めていました。

    Day 2 で唯一聴けたセッション。RuboCop を爆速にしたいという気持ちが伝わってくるセッションでした。めっちゃわかる。とてもわかる。すごくわかる。
    書いている途中のコードを autocorrect されたくないという話も、いままであまり気にしていなかった (最初は気になっていただろうけど慣れてしまった) ので我に返った気持ちでした。確かに autocorrect されたくない。v1.61.0 から、AutoCorrect: contextual としておくと LSP では autocorrect せず CLI からは autocorrect するようになったとのこと。便利。
    30 分のセッションが 5 分に感じられる濃密なセッションでよかった。

    Leaner さんには個人的にお世話になっているのもあり、今回も美味しい焼き肉をご馳走になり足を向けて寝られません。新たな知り合いもできて良い懇親会でした。牛タンがとてもおいしかった。

    Day 3

    Day 2 の LT 登壇で完全に力が抜けてしまい、ちゃんと聴けたのは同僚のセッション (Porting mruby/c for the SNES (Super Famicom)) くらいでした。満員ですごい。他は残り少ない気力を振り絞ってスポンサーブースを回っていたりしました。

    frozen_string_literal: true に対するアツい (?) 想いのぶつけ合いだったり、async/await は Ruby にはいらない (雑な要約) という話だったり、Go の defer がほしいという話だったりが面白かった。
    async/await、JavaScript では非常に便利に使っていますが、確かに Ruby であれば良いなと思う場面はほぼないかも。
    defer はたまにほしい場面があるのでわかる。

    Ruby2 (Ruby 2.x ではなく、ゼロから Ruby を作り直す) という構想が過去にあったという話が印象深かったです。Perl6 (Raku) や Python 3 と似た話で、あとから考えるとやらなくて良かったという話で深く納得しました。Python 2 vs 3、つらい……。
    あと namespace 分離ができるようになれば Ruby 4 にできるかも、という話も良かった。community-driven な機能が入れば Ruby のメジャーバージョンアップできる、なんてアツい展開すぎる。最高のアイデア (と実装) があれば committer でなくとも Ruby 本体に大きく貢献できることを知れて、自分も何かやるぞと気持ちが高ぶりました。

    最近知り合った方々だったり旧友だったりいろんな方とお話できてよかった。商店街 (?) をまるごと貸し切るというのは初体験で面白かった。

    そしてここではついに rubocop-daemon を RuboCop に取り込んでいただいた @koic さんと話せて、rubocop-daemon をなぜ RuboCop に入れてくれたのかを聞けました。簡単に自分の言葉でまとめると、

    • RuboCop を高速にするという discussion の中で rubocop-daemon が挙げられていた
    • やりたいことの方向性が RuboCop と合っていたので rubocop-daemon を RuboCop に取り入れるという選択をした
    • 一番苦労したのがライセンス
      • rubocop-daemon の作者 (自分) が Fohte という名前だったので日本人であるということが分からず、共通の知人もおらず、取り込む上でライセンスをどう扱うかに悩んだ
      • ライセンスと作者を尊重したいので、ファイルの先頭にライセンスを埋め込んだ

    という話を聞けました。これだけでも RubyKaigi に参加した価値がありました。ありがとう RuboCop、ありがとう @koic さん。そして Fohte という日本人っぽくないハンドルネームにしてすみません。生まれ変わったらそのあたりも考慮した命名をします。

    懇親会後は pixiv さんが最近は RubyKaigi 中に毎回開催されているらしい RubyMusicMixin というクラブイベントに参加していました。

    クラブに行ったのは初めてだったんですが、爆音でいい感じの曲が無限に流れてくる体験がとても良かった。座って 𝑐ℎ𝑖𝑙𝑙 しながら (?) 爆音を浴びてました。

    沖縄旅行編

    せっかく沖縄に行ったし、Day 4 にちょっと散策しようということで、ウォンテッドリーのメンバー 4 人で那覇周辺を散策していました。ちなみに Day 0 は旅行どころではなかった 3

    国際通りにあった、御菓子御殿というお店の生紅芋タルトがめちゃくちゃ美味しかった。紅芋タルトがとにかく好きなんですが、紅芋タルトの紅芋部分が絞りたてでふわふわになっていて最高でした。毎日食べたい (?)。

    DMM かりゆし水族館に行ってみた。水族館、魚が可愛くて癒やされる。水族館なのに鳥や亀もいて不思議でした。動物の中では鳥が一番好きなので思わぬ嬉しさがありました。時間的な制約で美ら海水族館には行けなかったのが無念……。

    最後に沖縄っぽいところということでウミカジテラスへ。曇っていたのが残念ですが、海が綺麗で最高でした。泳げないけど泳ぎたい。また沖縄行ったらボート乗ったりしてみたい。

    最後に

    6 年ぶり 2 回目の RubyKaigi はモチベーションも上がるし色んな方々と話せたし、何より @koic さんに rubocop-daemon を取り込んでいただいた裏話を聴けたし、とにかく最高でした。
    RubyKaigi というと、Ruby の中身の話をするのでどうしても普段の使い方からは遠く離れていて、理解が追いつかず敬遠しがちでした。ただ、発表者の方々が楽しそうに話しているのは見ている方も楽しいし、もっと理解できるようになりたいという思いからモチベーションに繋がります。実際に繋がりました。好きな言語の話をアツく語れるようになりたい。なるぞ。
    次回も参加したいし、次回までには言語の作り方を学んだ上で臨む所存です。

    ちょっと宣伝ですが、来たる来週金曜日 (5/31) には RubyKaigi 2024事後勉強会 で LT します。「RubyKaigi の思い出と LT 初登壇」というタイトルで、初参加の RubyKaigi 2018 での体験から今回の体験というエモめの話をする予定です。ぜひご覧ください。

    ウォンテッドリーメンバーの皆と ✌️
    ウォンテッドリーメンバーの皆と ✌️

    Footnotes

    1. RubyKaigi 2018 に参加してきました (@fohte) - シンクロ・フード エンジニアブログ

    2. https://github.com/rubocop/rubocop/pull/10706

    3. Day 0 は 20 時くらいに沖縄に着陸し、宿の近場は飲食店が閉まっている & 土砂降りの雨に見舞われて遠出もできないということで雨でシナシナになりながら Uber Eats を頼んで食べて寝ました。天候運が悪すぎる。