Findy Engineer Lab

エンジニアの"ちょい先"を考えるメディア

Rustに貢献してみませんか?コントリビューターたちが語る開発の裏側とOSS活動の魅力

「効率的で信頼できるソフトウェアを誰もが作れる言語」を提唱するプログラミング言語・Rust。その優れたパフォーマンスやプログラムとしての信頼性・生産性の高さなどから、近年非常に人気を集めています。

Rustのようなオープンソースソフトウェア(以下、OSS)の開発を支えているのは、機能開発やドキュメント整備など、プロジェクトに何らかの形で貢献をするコントリビューターたちです。今回はRustのコアコミッターである大櫛佑貴さんとTaKO8Kiさんに、知られざるRust開発の裏側とOSS活動に携わる魅力について聞きました。
* … 取材はリモートにて実施しました。

Rustに触れたきっかけ

――今回のインタビューでは、お二人のコントリビューターとしての活動内容を伺います。まずは、ユーザーとしてRustを書くようになったきっかけを教えてください。

大櫛:Rustとの出会いは2018年頃でした。私がまだ高校生だった頃に、周囲の人々からおすすめされたんです。しかし、それほど興味があったわけではなく「へえー」と思って聞き流していました。当時の私は主にGoを書いていて、スカラシップ制度を利用してGo Conferenceに参加しました。すると誘ってくださった会社の社員の方が、Go Conferenceに参加しているにもかかわらず、かなりRustを推してくれたんです。

これだけみんながすすめるのならば良い言語なのだろうと、Rustに興味を持ちました。ちょうど当時、オライリーから『プログラミングRust』(通称:カニ本)が出版されていました。 Go Conference後にその本を買って、Rustを読んだり書いたりしたのがなれ初めです。

TaKO8Ki:私は2年前くらいにRustを触り始めました。大学3年生の頃に企業のサマーインターンに参加したんですが、一緒に働いていた人がRustを好きで、その人もOSSにコントリビューションしていました。RustやOSSに関心を持ったのは、それがきっかけです。その後、『コンピュータシステムの理論と実装』に書かれたことをRustで実装してみたり、自分でライブラリを作ったり、インターン先でRustを利用したりと、活用の幅を広げました。

――そこから、コントリビューターとしての活動を開始したのは?

大櫛:RustをきっかけにFLOSSのコントリビューションを始めたのではなく、もっと前から活動をしていました。そもそも、OSSに興味を持ったのは、あるミートアップに参加して、OpenJDKのコミッターによるOracle JDKとOpenJDKの歴史や文化の話を聞いたことです。OSSの世界やその思想の素晴らしさに感銘を受けました。

もうひとつは俗物的な理由になってしまいますが、私は普通科の高校に通い、卒業後に就職したんです。コンピュータサイエンスのバックグラウンドが全くなくて、就職でアピールできる点を作るのが難しいと考えました。ならば、OSS活動をやろうと思って細々と取り組んでいました。その後、Rustを学ぶなかで、Rustにもコントリビューションしようと思うようになりました。

TaKO8Ki:私の場合は、インターン先で出会った人がOSS活動をしていたこともあり、その影響で興味を持ったんですよ。そして、継続的にOSS活動をするためには、それなりにモチベーションを持って取り組めるものでなければ続きません。Rustが割と自分に合っていたので、これをやってみようと思いました。

TaKO8Kiさん

Rustを支える開発体制の特徴とは

――各種OSSごとに、開発の進め方の方針はさまざまです。Rustの場合はどのような点に特徴があると思いますか?

大櫛:Rustのリリースチャンネルは大きく分けてNightly、Beta、Stableの3つの段階に分かれています。メインリポジトリのマスターブランチで毎日リリースされるのがNightlyで、その機能が6週間経つとBetaになり、それがさらに6週間経つとStableになります。

このリリースサイクルの短さは、各種プログラミング言語の中では比較的珍しいほうだと思います。そうした早いリリースサイクルの中でも、後方互換性を担保しつつ機能を成熟させるために色々な取り組みがなされています。まずはNightlyだけに実装してユーザーからの意見を募ったり、Stableの前にBetaを用意することで万が一バグが見つかってもRevertできるようにしたりなどです。6週間のサイクルの中で、関連するチームやワーキンググループのメンバーを中心に議論をし、取り込むかどうかを精査しています。

――それ以外にも、RustはCompiler teamやRustc Dev Guide working groupなど、機能や役割ごとにチームやワーキンググループが分かれていることも特徴です。

TaKO8Ki:チームはたくさんありますよね。

大櫛:そうですね。rust-lang.orgのGovernanceページを見ていただくと、編成やメンバーなどがわかりやすいと思います。

――このような編成となっている利点は何でしょうか?

大櫛:先ほど「関連するチームやワーキンググループのメンバーを中心に議論をし、取り込むかどうかを精査」という話をしましたが、そうした意思決定をする際に、たとえば「これは言語仕様に関する変更だから、Language teamで話し合って決める」というように役割分担が明確になっています。

TaKO8Ki:それから、Pull Requestを出すと変更箇所に応じてレビュアーが勝手にアサインされます。これは、チームの役割が明確に分かれているからこそ、できることですね。

――どのような活動をしていると、チームやワーキンググループのメンバーとして認められるのですか?

TaKO8Ki:方針はチームやワーキンググループによって異なります。たとえばCompiler teamの場合は、Membershipページにある「How promotion decisions are made」の項目に、方針が記載されています。基本的には、特定機能へ継続的にコミットし、かつ既存のメンバーの推薦をもらうと、参画できる条件のチームが多いです。

大櫛佑貴さん

大櫛:開発体制の他の特徴としては、なるべく新規のコントリビューターが参画しやすいように工夫をしていますね。例を挙げると、私がメンテナンスに携わっているRustc Dev Guideがあります。これはRustcにコントリビューションするうえで知っておくべきことを学べるガイドです。レビューの流れやビルドの方法など各種の情報を解説しています。

TaKO8Ki:他にも今年の8月16日にtranslation関連の機能へのコントリビューションを推奨する入門記事が公開されています。これまでRustにコントリビューションしたことのない人たちに向けて、間口を広げる活動をたくさん実施しています。

活動を続けるなかで、印象に残る出来事

――これまで活動されてきたなかで、特に印象に残る出来事があれば教えてください。

大櫛:私は「Fix ICEs with @ .. binding」というPull Requestです。先ほど述べた通り、Rustは基本的に6週間ごとにマイナーバージョンを上げていきますが、もしもクリティカルなバグがあった場合はパッチバージョンを上げてポイントリリースが行われます。そしてバージョン1.45.1にて、パターンマッチングのインターナルコンパイラエラーを修正する変更が加えられました。

しかし、その変更が原因で別のインターナルコンパイラエラーが発生するという課題が発生しました。私がこの件について修正をしたのが「Fix ICEs with @ .. binding」で、バージョン1.45.2にて無事にインターナルコンパイラエラーを解消できました。こういったパッチリリース系の修正は、その性質上それなりに緊迫感があります。その状況下で、スピード感を持ってコードを修正できたのは達成感があって、強く印象に残っています。

TaKO8Ki:私は、自分が発行した大きめのPull Requestの2つが印象に残っています。まずは「Collapse multiple dead code warnings into a single diagnostic」です。Rustはコンパイル時に、読み込みがされていないstructのフィールドなどのワーニングが出ます。そして、かつてはワーニングが複数あった場合に、表示される情報が冗長で読みづらいという課題がありました。ワーニングをよりコンパクトに表示させるようにしたのが、このPull Requestでやったことです。

本対応により、ワーニングが複数あった場合には上図のような表示がされるようになった。

2つ目は比較的最近のもので「Separate the receiver from arguments in HIR」です。もともとRustでは以下のようなメソッド呼び出しがある場合、レシーバー「self」と引数「a」「b」を、コンパイラ内部では「self」「a」「b」の3要素を持つスライスとして扱っていたので、レシーバーを扱うためにはスライスの0番目の要素にアクセスする必要がありました。

self.foo(a, b)

MIR(Mid-level Intermediate Representation)ではだいぶ前にこの扱いを直したんですが、それをHIR(High-Level Intermediate Representation)の側では直していませんでした。それを修正したのがこのPull Requestです。この列挙型のバリアントが多くの箇所で使われているため、変更差分がかなり大きかったです。

――これらはコード修正に関するものですが、イベント登壇などで印象に残ることはありますか?

TaKO8Ki:去年に開催された「Rust.Tokyo 2021」で「Rustでrbenvよりも7秒速いRubyのバージョンマネージャーを作った」という発表をしました。「自分自身が業務で活用できるツール」というコンセプトで開発を進めており、きちんと成果を出すことができたので、印象深いです。

大櫛:私も同じように「Rust.Tokyo 2021」が印象に残っており、「How Rust triages regressions and prevents them from reaching to stable」という発表をしました。過去にリアルイベントでの登壇は経験していたものの、初めてオンラインカンファレンスで発表したので、とても緊張したのを覚えています。事前に動画をレコーディングして提出するんですが、なかなか満足のいく出来にならず、収録に苦戦しました。

OSS活動の第一歩を踏み出すために

――記事の読者には「OSS活動に取り組んでみたいけれど、自分の書いたコードが通用するのか不安だ」と考える方も多いと思います。お二人にもそうした気持ちを抱えていた頃はありましたか? もしあったならば、どうやってその不安を払拭していきましたか?

TaKO8Ki:確かに最初の頃は、自分ができることの幅を広げるのが難しいという気持ちはありました。ですがRustは、「Guide to Rustc Development」など入門者向けのドキュメントがかなり整備されているので、OSSの中ではコントリビューションしやすいほうだと思います。

それに、過去には「Rust Compiler Ambitions for 2022」というブログ記事の「What do I do if I'm interested in compiler development but have no experience in compilers?」という項目の中で「コンパイラ開発の経験がなくても気にしなくていい」「今コントリビューションしているメンバーも、Rustの開発をしながら徐々にコンパイラの知識を身につけたんだ」という旨のことが書かれています。

自分のスキルの高低は気にせず、できることから手をつけたらいいと思います。コミッターたちに質問できる場も用意されているので、困ったことがあれば誰かしら助けてくれるはずです。

大櫛:私の場合は、コミュニティ内での自分の行動や振る舞いが、果たして他の人たちの邪魔にならないだろうかと気にしていました。その不安を払拭するため、すぐにコントリビューションするのではなく、しばらくROMる(ネット上で投稿などをせずに「ただ見るだけ」という行動をとる)ことに時間を費やしましたね。他のコントリビューターたちの活動内容を見て、自分なりにそれをまねることで、徐々に開発の流れを理解していきました。

TaKO8Ki:そう言われてみると自分もかつては、積極的に活動しているコントリビューターたちが初期の頃に何をしていたか、履歴を追っていました。

エンジニアがOSS活動に取り組む意義

――Rust関連で、今後実現したいことはありますか?

TaKO8Ki:OSSにおいては“活動を継続すること”が重要なので、これからもRust関連の活動を続けます。それから、自分が知らない技術領域を学びながら、パフォーマンス改善や新しい機能の開発などにも挑戦していけたらと思っています。また、Rust以外にもOSS開発をしているので、それらの活動にも引き続き取り組んでいきたいです。

大櫛:私の場合、あまり大それたことをやろうというビジョンや野心のようなものはないんです。でも、これまでやってきたように、新機能開発や既存機能の改良、そしてメンテナーがいなくなってしまった機能の引き継ぎなどを、今後も継続します。

それから、私はRustc Dev Guideのメンテナーを務めており、「新規のコントリビューターたちが入りやすい土壌作り」は関心がある分野なので、注力していきたいです。私は日本語話者でもありますから、日本人がRustにコントリビューションする支援ができたら、嬉しいです。

――最後に、お二人の思う「エンジニアがOSSにコントリビューションする意義」をお話しください。

TaKO8Ki:私は基本的に、自分自身が普段使っているツールにコミットメントして、自分の開発が便利になるのが好きでOSS活動をしています。そして、そのコードで世界中の人々を助けることができるのが、OSSの魅力です。それに、OSSは私個人の活動履歴が形となって残るので、達成感もあります。

大櫛:私も先ほど述べた通り、本当にふわふわした気持ちでOSS活動をしていて、“意義”のような大それたことは言えません。ですが、OSSはコントリビューションした履歴が残るので、私の活動を見てくれた誰かが、それをきっかけになんらかの活動をしてくれたらいいなと思っています。自分自身が、冒頭で述べたOpenJDKのコミッターの話を聞いたことをきっかけに、OSSへのコントリビューションを始めたように。

そういったポジティブな連鎖を楽しめる人であれば、OSS活動はきっと楽しいものになります。少なくとも、私自身はいつも楽しんで活動に取り組めています。

――このインタビューを読んだ誰かが、OSSの新たなコントリビューターになってくれると嬉しいですね。今回はありがとうございました!

取材・執筆:中薗昴