スタディサプリ Product Team Blog

株式会社リクルートが開発するスタディサプリのプロダクトチームのブログです

RubyKaigi 2019でujihisaが登壇した裏話

ujihisaです。先日2019年4月に日本の福岡で開催されたRubyKaigi 2019にて、ujihisaが "Play with local vars"というタイトルで発表してきました。この発表は、40分間英語でひたすらRubyのローカル変数についてだけ語るというものです。

発表スライドは公開済みで、こちらのgistですが、レンダリングにはshowtime.vimを要求しますし、実際にはデモがメインですので、RubyKaigi公式の動画を参照するのが便利です。

こんな風にレンダリングされます

www.youtube.com

登壇に至るまで

一年前、RubyKaigi 2018に参加していろんなすばらしい発表を聞いているうちに、

  • 「RubyKaigiでちゃんとした発表をしていないのは申し訳ない」という罪悪感というか強迫観念、
  • Rubyを使う上でローカル変数と向き合うのは避けて通れないけど、これだけを取り扱った発表は意外に無い」という素朴な気づき、
  • 「40分枠があるということはLTを8連続で行うことができるのでは?」という考察

などが生まれ、RubyKaigi 2019の発表公募がはじまったその日に "Play with local vars" という題名だけ書き、本文はTBD (あとで書く) のまま応募しました。応募後なんやかんやで悩みに悩みまくっていろいろあれして良い感じにして、これは発表直前まで毎日続きました。

ちょっと話は飛びます。ujihisaは、ソフトウェア開発を勉強する会 (勉強会、meetup、カンファレンスなど) と、ソフトウェア開発を行う企業は密接に関わってお互いが得をするモデルが便利なんじゃないかなと強めに思う派です。実際、RubyKaigiはかなり多くの企業スポンサーを受け入れ、カンファレンスをより良くするために各社を有効に活用しています。そしてRubyKaigiをスポンサーする会社は、RubyKaigiによって直接的ないし間接的にメリットを得ています。分かりやすい例だとプログラマの採用ですね。

弊社であるQuipperはRubyKaigiをスポンサーし、またujihisaほか数名が業務で(= 勤務日として) 参加しました 1。また、RubyKaigiのための準備や社内での発表練習は勤務時間内に行いました。

とくに発表練習 + フィードバックを社内で複数人でわいわいがやがやできたのは最高でした。RubyKaigi発表練習初回は確か2019-02-20でした、これはちょうどRubyKaigi 2019発表本番の2ヶ月前にあたりますね。その時はフィードバックを得るためまずは発表を通して行うというのを最優先したもので、例えばそのときに使ったスライドは最終的に全ページ破棄しました。2

余談ながら、QuipperはRubyKaigiだけでなく、VimConf 2018RailsDM 2019などもスポンサーしています。つい最近ですとゴリラ.vimも会場提供ディナースポンサーしましたね。

RubyKaigi 2019開催中

ujihisaの発表 "Play with local vars" は最終日である3日目の後半です。また、この発表の内容はRubyのローカル変数についてです。これはつまり、自分の発表までの(ローカル変数に関する)全ての発表を把握し、そのフィードバックを自分の発表に盛り込み続ける必要があるのは自明です。

実際に影響のあった事項や発表を羅列します。

  • (発表2ヶ月ぐらい前) numbered parameters (@1 とかのアレ) が導入される
    • Rubyでは、@がつく変数はすべてcurrent selfなどによってスコープが決まっている」と書いたばかりなのに...
    • (余談: ローカル変数はだいたいメソッドとしても使えるidentifiersの部分集合だけど、$1みたいなspecial local varsもあって若干ややこしい)
  • (開催直前である1日前) Rubyにパターンマッチが導入される
    • parse.yへの差分を見て、仕様と挙動を把握。これ思い切りローカル変数への代入の新たな方法ですね...
  • joker1007 "Pragmatic Monadic Programming in Ruby"
    • RubyVM::AbstractSyntaxTree.of についての説明
      • ここでこれが説明されてるし、内容的にujihisaの発表とかぶる関係で聞く人の層もかぶるため、自分の発表から RubyVM::AbstractSyntaxTree.of の説明を省く。既知のものとして取り扱う
      • これ本当に最高のAPIなので、みんな毎日数十回ぐらい使いましょう
    • p40 の AST Transformation (x <<= y つまり a = a << y を事前に変形する)
      • よし、これでAST Transformationも既知のものとして扱... あーいやまだちょっと厳しいかな...
  • Kazuki Tsujimoto "Pattern matching - New feature in Ruby 2.7"
    • 個人的にruby 2.7の最高の機能。発表前に一通り全部試してみて、「これこそが人類が長年求めてきたものだ」と歓喜し、感極まりました
    • 発表中に、pattern matchingは (for同様に) スコープをleakするということが言及される
      • 積極的な表現に換言すると、pattern matchingやforを使うことで、現在のスコープに新たにローカル変数を追加することができる
  • nagachika keynote "All bugfixes are incompatibilities"
    • parse.yを編集して文法要素のバグ修正はたいてい別のバグも引きおこすので、改めてparse.yをいじるというのはものすごく難しいということを強調
      • 自分の発表でparse.yをいじるというのは軽く用意していたので、むしろここを重点的にしようと意思決定
      • parse.yは怖い、それは事実だけど、それでもそんなに強くない僕でも実はカジュアルにいじり倒せるんだよ、という勇気づける方向に
      • といっても自分で言葉で語るのではなく、コードを書くことで実績を見せることで背中で圧をかけていくスタイル
    • この流れ、すごく好きです
  • tagomoris "Invitation to Dark Side of Ruby"
    • AST Transformation再登場。しかもこれLTなので全員が聞いている
      • うむ、AST Transformationは全人類にとって既知で、みんなが毎日使うものという認識で良いですね
      • これは実はマクロであるというのも明確に提示されている。これも既知として我々はその先に行こう
  • "Ruby Committers vs the World"
    • これを受けて、プレゼンツールshowtime.vimの(広義の)バグ修正 (機能追加)
      • 右代入のための新たな記号である "👉" のフォントサイズが変わらずめちゃくちゃ小さいという問題があった
      • というわけで修正した
      • なおshowtime.vimは最高のプレゼンツールなのでみんな使おう。この発表のため作者のthincaさんは事前に内部的にかなり変更を加えてくれました

余談ながら、急にめちゃくちゃ体調も悪くなって、いろいろと不穏でした。

発表内容

Play with local varsのスライドは立体的に構成しました。

  1. eval 'x = 123'; eval 'p x' が動かない理由は? どうやれば動く?
  2. eval 'x = 123'; p x が動かない理由は? どうやれば動く?
  3. 試しにRubyを変えて(壊して)みたらどうなる?

という問題-解決の流れと、

  • Rubyのローカル変数はどんな性質をもっている?
  • Rubyのローカル変数はevalやbinding経由で触るとどういうことが見える?
  • Rubyのローカル変数の実装の詳細はどうなっている?

という仕様・実装理解の流れと、

  • Vimでどのようにプレゼンを見せている?
  • Vimでどのようにコードを書いて実行している?
  • VimでどのようにRuby本体を編集している?

というメタなレベルを同時並行的に進めています。自然な展開に見えるようかなり順番調整したり、もともと見せていたものを見せなくしたりとしました。 (逆に自己紹介と会社紹介がちょっと犠牲になった感じがあります。もったいない)

カンファレンスに物理的に参加して登壇する、とは

RubyKaigi 2019という場に物理的に参加することで、発表者の生の顔を見ることができます。発表者に質問することができます。発表後に雑談することができます。でも発表自体は実は先に録画しておいて当日再生するだけでもできますし、そもそも動画じゃなくて文書にしといて「お前ら全員これ読んでおけ」みたいにすることもできますよね、むしろそっちの方がみんな自分のペースで行えるから理論上便利なはずです。現実は、むしろ同期的にその場でやることのメリットがでかいです。そもそも人間は怠惰なのでそういう場じゃないと聞かなかったりしますし。

で、ujihisa発表ではせっかくなので参加者にがんがん質問していくスタイルにしました。回答によって発表の流れが変わる可能性があり、それは想定した上で単純に事前に全パターン脳内シミュレーションすればいけます。(まあシミュレーションしなくてもいけるはずなんですが、40分という厳しい時間制限があり、変なところでスタックしてしまうと全員がもったいないので。回答を脳内キャッシュに載せておけば便利だよね的な感じです。)

今回の発表で参加者に聞いたものを適当に抜粋

  • Rubyのローカル変数をつかったことがある人はいますか
  • Rubyのローカル変数を完全に理解している人はいますか
  • 以下のコードは何を出力しますか
  • Rubyでローカル変数を宣言する方法を、assignとmethod/block parameter以外で全て網羅してください
  • Rubyのパーサの挙動を変えるにはどのファイルを編集すればよいですか

このへん、発表しててめちゃくちゃ気持ちよかったです。万人にはおすすめできないけど、好きな人にはおすすめです。

(余談ながら、2日目のパターンマッチングの発表で、forやパターンマッチングはローカル変数のスコープが漏れるという内容があり、これによって自分の発表の "ローカル変数を宣言する6の方法" の難易度が下がる...と思いきや聞いてみたら実はforが当日みんなから回答いただけなかったので、そういう意味ではあらためて出題してよかったです)

おわりに

とりとめのない雑多な裏話でした。次はVimConf 2019でお会いしましょう!


  1. 夫婦で参加したので、航空券費や宿泊費のうち必要経費として会社に申請したのはujihisa分のみにして、みたいな感じです。
  2. 基本的に、技術発表のときには、発表を分かりやすくするために人は無限の努力を費やすべき ではない と思います。聞く側が事前の予習などで事前知識を得た上で、当日に発表に食らいついていき、わからなくても発表者に聞く、みたいに聞く側が頑張るのが個人的な主張です。といいつつujihisa発表分に関しては、ujihisa個人の実績はたいしたことない(rubykaigi基準での)へぼい人なので、発表の分かりやすさ・話のついていきやさ・話の面白さがむしろ効いてくると判断し、そっちをこの2ヶ月で重点的に強化した、みたいな戦略をとりました。