見出し画像

Rubyコミッター笹田さんと学ぶRubyのウラガワ

こんにちは、グロービスの法人開発チームでエンジニアをしている森谷です。

新卒でSIerに入りサプライチェーン管理の開発を5年弱した後、縁あってグロービスに入社し4年目となりますが、毎日楽しく開発に従事しています。

グロービスでは勉強会が多く開催されており、興味のある勉強会に自由に参加することができます。私自身もデータベース設計、ソフトウェア設計、テスト技法、スクラムなど様々な勉強会に参加してきました。

今回、Rubyコミッターの笹田さん(@koichisasada)が雑誌「WEB+DB PRESS」に連載されていた記事「Rubyのウラガワ」の勉強会を完走しましたのでご紹介します。

笹田さんに勉強会に参加していただき質疑応答する機会が得られるなど、大変貴重な経験もできましたので是非ご一読いただければ幸いです。

リモートで笹田さんにも参加頂きました!

勉強会について

技術顧問として参画して頂いている五十嵐さん(@igaiga555)に、RubyやRailsに関する共有会を毎週開催して頂いています。そこでRubyをもっと知りたい!という声があがり、「Rubyのウラガワ」を読んでみよう!となり勉強会開催に至りました。

全11回の連載記事はWEB+DB PRESS総集編[Vol.1~120]に大部分が収録されており、毎週1回分をわいわい議論しながら進めていきました。各自記事を事前に読み込み、勉強会においては概要の復習、学びや感想の共有、その後に疑問点などを議論したりします。

また勉強会メンバー同士の議論で解決しなかった話題については、著者である笹田さんを2回お招きしてQ&Aを実施するなど、かなり濃い時間を過ごすことができました。

Notionに各自学んだことを事前に書いておき、勉強会ではわいわい議論


内容ちょこっと紹介

「Rubyのウラガワ ~Rubyインタプリタに学ぶデータ構造とアルゴリズム~」というタイトルが示す通りRubyの様々な仕組み、例えばガベージコレクション、クラス階層、配列など、がどのようなデータ構造とアルゴリズムで作られているかを一つずつ紐解く内容となっています。

難しい内容が多いのですが、かなり面白いです。

例えば第4回「簡単そうで簡単じゃない配列の話」。Rubyの配列は可変長で他の言語とは違い大きさを変更できる特徴があるのですが、そのための工夫が随所に施されています。

工夫の一つがRubyの配列がバッファを持っていることです。

出典: WEB+DB PRESS vol.113 2019 p.133

上図のように要素数4の配列を初期化する場合、要素を格納するために4つ分のメモリを確保するだけではなく、少し余裕を持ってメモリを確保します。そうすることで要素が追加される毎にメモリを再確保する必要がなくなります。メモリ再確保を行うと全要素コピーが発生し遅くなる可能性があるため、なるべく避けたいわけです。

そして、バッファ確保の仕組みにも工夫があります。

配列の長さがバッファの長さを超える時、上の例では要素数6を超えて7つ目の要素をpushした時にバッファの拡張が行われます。この時 6 / 2 + 7 という計算がなされ、要素数が10まで入るように新しくバッファが確保されます。このような工夫と技により、n回pushによって拡張が行われた時の計算量がO(log n)となり高速化に繋がります。

普段何気なく使っている配列ですが、高速化のための先人たちの知恵が詰まっています。

参加メンバーイチオシのRubyのウラガワ

配列以外にもRubyに関するディープな話題が色々と話されました。各参加メンバーイチオシの話題について簡単に取り上げてみたいと思います。

  • 保守的GCについて by 越智さん

    • 連載記事を通して、Rubyのガベージコレクション(以降、GCと呼ぶ)は保守的マークアンドスイープを採用していることを知りました。マークアンドスイープについては、手前味噌になりますが私の記事をご覧ください。保守的GCとは、参照されているか不明瞭なポインターを念の為保護しておく手法です。保守的GCによってC拡張でオブジェクト生成しても誤ってGC対象になることを防いでいます。 特定versionから互換性を考慮しなくてよいと仮定した場合、保守的GCを維持したいかと問いを笹田さんとの勉強会で解消することが出来ました。保守的GCの弱点としてmoving(コピー GCなど)を取り入れるのが難しいということ。性能を向上させたいので、保守的GCをやめていきたいということがわかりました。GCの面白さや、互換性を保ちながらRubyを開発する苦労や楽しさを知ることができました。

  • Rubyインタプリタの最適化とRactorとYJITとの関係 by 長井さん

    • Rubyのウラガワには様々なRubyインタプリタに対する最適化手法が書かれていますが、それらが現在のRuby開発で進められている Ractor や YJIT とどのように関係していくのか笹田さんに伺うことができました。 例えばメソッド検索の高速化、とくにインラインキャッシュと呼ばれる機構は、 Ractor をより効率的に動作させるため、RCU のような競合を起こさずかつロックフリーな仕組みを導入しようとしていたり、YJIT ではこの情報を履歴情報として用いたりすることもあるというお話を伺うことができました。 Rubyのウラガワを読んでいたからこそ、このような実装の詳細に関する話題を理解することができるようになりました。

  • RVALUEとRuby3.2新機能Variable Width Allocation(VWA) by 五十嵐さん

    • Rubyオブジェクトを配置する固定長メモリRVALUE 40byteを、Interger, String, Array, Hashといったオブジェクトごとにどのように利用するかを連載の各回で説明しています。大きなサイズのオブジェクトはRVALUEと外部のメモリに配置するのに対し、小さいオブジェクトはRVALUEの中に埋め込んで外部メモリをつかわないことで高速化しています。Ruby3.2の新機能であるVariable Width Allocationについて笹田さんへ質問したところ、RVALUEのサイズを40byteよりも大きなサイズに拡張可能にしてRVALUE埋め込み表現オブジェクトを増やすことで高速化すること、そしてこの手法の長所短所を丁寧に説明していただき、理解を深めることができました。

勉強会に参加した感想

勉強会全体を通して、内容の一部は高難易度過ぎて分からないこともありましたが、Rubyがどういう仕組みで動いているのかと好奇心が掻き立てられ、様々なウラガワに出会うことができました。また、笹田さんのお話を伺いRubyの開発の大変さや楽しさを知るなど、Rubyの深淵を垣間見た気がします。

よりRubyを好きになる機会を提供してくれ、その熱意で継続をサポートしてくださった参加メンバーの方々には感謝しかありません。

皆様も機会があれば是非一度、連載記事を読んで頂けると幸いです。

最後に

「Rubyのウラガワ ~Rubyインタプリタに学ぶデータ構造とアルゴリズム~」の内容、勉強会についてご紹介させていただきました。

いかがでしたでしょうか。記事を通して、グロービス開発組織の雰囲気を少しでも知っていただけたり、Rubyに対する情熱や好奇心を持っていただけたら幸いです。

最後まで読んでいただき、ありがとうございました!

グロービスの開発組織ですが日々進化しています。私が入社した頃よりもはるかに組織面で整備が進み、今では豊富な知識を周囲に共有してくださる強いエンジニアやQAの方々も多く、技術面での学びや相談の機会が増えました。

もっとグロービスの開発組織を知りたい!という方はポッドキャストを聞いて頂いたり、是非一度カジュアル面談等でお話しさせていただければ幸いです。

■グロービスの組織についてや採用情報はこちら
https://recruiting-tech-globis.wraptas.site/


この記事が気に入ったらサポートをしてみませんか?