【社内勉強会レポート】知識ゼロから始めたRust勉強会の記録

当社では、エンジニアの継続的なスキルアップと新しい技術への挑戦を目的として、有志によるRust勉強会が開催されました。

本記事では、2部構成で行われた活動内容とその成果について共有します。

  • 第1部:The Book輪読会 - Rustの基本概念を体系的に学習
  • 第2部:Rustの練習帳モブプロ輪読会 - 実践的な開発を通じて知識を定着

本記事が、「社内勉強会はどのように行われているのか」「TDDによる開発はどのような体験か」といった点に興味をお持ちの方々にとって、一つの参考となれば幸いです。

なぜ今、私たちはRustを学ぶのか

勉強会を始めるにあたり、私たちが数ある言語の中からRustを選んだのには理由があります。

ご存知の通り、Rustはパフォーマンス、安全性、そして並行処理に強みを持つモダンなプログラミング言語です。特に、ガベージコレクタを持たずにメモリ安全性を保証する「所有権」システムは、非常にユニークで強力な特徴と言えます。

私たちのチームでは、現時点でRustを全面的に導入しているプロジェクトはありません。しかし、将来的な技術選定の選択肢を増やすこと、そして何よりエンジニアとして新しい設計思想に触れ、知見を広げることは非常に重要だと考えています。

「まずは有志で集まって、この魅力的な言語を学んでみよう!」

そんな思いから、今回の勉強会はスタートしました。

基礎学習編:The Book輪読会 - Rustの壁とコンパイラの優しさ

概要と進め方

まずはRustの公式ドキュメントである「The Rust Programming Language」(通称: The Book)の日本語版を教材に、輪読会形式で勉強会をスタートしました。

doc.rust-jp.rs

  • 目的: Rustの基本的な文法や概念(特に所有権!)を全員で理解する
  • 期間: 約3ヶ月間、週に1回1時間
  • 参加者: バックエンドからフロントエンドまで、様々なバックグラウンドを持つエンジニア約10名
  • 進め方:
    1. 毎週1章ずつ、事前に各自で担当範囲を読んでくる
    2. 参加者のうち数名を指名し、感想や疑問点をドキュメントにまとめてもらう(他の方は任意)
    3. 当日はそのドキュメントを元に、主催者である〇〇が質問に回答。より深い質問は技術顧問の方にも協力を仰いだ

この「数人だけ指名する」という方式は、「全員必須だと負担が大きいけど、誰も書かないと議論が始まらない……」というジレンマを解消するのに非常に効果的で、参加者の負担と議論の質のバランスを取る良い工夫だったと思います。

成果と学び:参加者の注目を集めたトピックたち

The Bookを読み進める中で、参加者からは様々なトピックについて多くのコメントや質問が寄せられました。特に印象的だったテーマをいくつかご紹介します。

開発体験の良さ:親切なコンパイラと強力なツール群

勉強会の序盤で、多くの参加者から驚きの声が上がったのが、Rustの開発体験そのものでした。

「Cargoがビルドから依存関係の管理まで面倒を見てくれるのは嬉しい」

「rustfmtでコーディングスタイルが保証されるのは良い文化」

そして何より、学習の強力なサポーターとなったのがコンパイラです。

「コンパイラのエラーメッセージが非常に親切。まるで先生のように導いてくれる」

難しい概念でつまずいても、コンパイラがエラー箇所と解決策のヒントを示してくれる。この体験は、Rust学習のハードルを大きく下げてくれました。

コンパイラがエラー箇所から関連する情報(関数のシグネチャ)、修正方法まで提示してくれる

思考のパラダイムシフト:所有権、そしてEnumとパターンマッチ

Rust学習の最大の関門であり、同時に最も奥深いテーマが 「所有権」 でした。

&s&mut s が出てきたあたりからだいぶ混乱し始めた…」

「所有権はちゃんと理解しておいたほうが良い…?Javaよりは意識したほうがいい、ぐらいの感覚?」

「スマートポインタ(Rc<T> , RefCell<T>)は難しい…本当に日常的に使うのか?」

ムーブ、借用、ライフタイムといった概念は、他の言語に慣れている参加者ほど思考の転換を求められ、多くの質問やコメントが寄せられました。

一方で、所有権と並んでRustの思想を体現しているのが enumとパターンマッチ です。

「enumがデータを持てるのが強力。Option<T>Result<T, E> もただのenumだと知ってハッとした」

「matchで全てのパターンを網羅しないとコンパイルエラーになるのは、バグを未然に防げて安心」

これにより、より安全で堅牢なコードを書けるという手応えを感じた参加者が多かったようです。

細かいけれど奥が深い:式、シャドーイング、エラー処理

その他にも、Rustならではの言語仕様が度々議論の的となりました。

  • 式と文の違い: 「セミコロンを付けないと値を返す『式』になる」という仕様は、慣れるまで少し戸惑いがありましたが、ifmatchが値を返せることの便利さも同時に実感しました。
  • シャドーイング: 「同じ変数名で型を上書きできるのは便利?それとも混乱の元?」というテーマでは、スコープを小さく保つモダンな書き方と相性が良いのでは、といった意見が出ました。
  • エラー処理: panic!による回復不能なエラーと、Resultによる回復可能なエラーの使い分け、そして?演算子の便利さと挙動の直感的な分かりにくさは、実用的な観点から多くの質問が寄せられました。

輪読会の課題と次へのステップ

一方で、この形式ならではの課題も見えてきました。これらの課題を解決することが、第2部のモブプログラミング勉強会を企画する直接の動機となりました。

  • インプット過多による定着率の課題:
    • The Bookから多くの知識を得ましたが、「読む」だけでは所有権のような複雑な概念を本当に「使える」レベルに引き上げるのは難しいと感じました。知識と実践のギャップを埋めるため、実際にコードを書き、コンパイラと対話する機会が不可欠だと痛感しました。
  • 学習ペースと深掘りのトレードオフ:
    • 週に1章というペースは、通常業務と両立するにはやや駆け足でした。これにより、各章の内容をじっくりと消化し、議論を深める時間が不足しがちでした。より腰を据えて一つのテーマに取り組むことで、理解を深める必要があると考えました。

これらの課題意識が、私たちを次のステップ、すなわち「手を動かし、対話し、共に学ぶ」モブプログラミング形式の勉強会へと導いてくれたのです。

実践開発編:Rustの練習帳モブプロ - TDDとの出会い

概要と進め方

第2部では「O'Reilly Japan - Rustの練習帳」を教材に、モブプログラミング形式でCLIツールを作成しました。

www.oreilly.co.jp

この取り組みは現在進行形ですが、ここまでの活動で得られた特に大きな学びをご紹介します。

  • 目的: The Bookで得た知識を、手を動かすことで定着させ、Rustのリアルな開発体験を知る
  • 期間: 2週間に1回1時間
  • 参加者: エンジニア5名+技術顧問
  • ツール: VSCode Live Share, MobTime *1
  • 進め方:
    • 7分ごとにドライバー(コードを書く人)を交代
    • ナビゲーター(指示を出す人)は特に設けず、全員で意見を出し合いながら進める

成果と学び:コードと対話する中で見えた景色

モブプログラミング形式で実際に手を動かしたことで、私たちは座学だけでは得られない多くの貴重な体験をしました。コンパイラに導かれ、テストに支えられ、仲間と議論しながらコードを書いていく中で見えてきた景色を、いくつかのトピックに分けてご紹介します。

テストが導く大胆なリファクタリング:TDDとclapがくれた安心感

このモブプロで最も大きな収穫は、多くの参加者がTDD(テスト駆動開発)の本当の価値を体験できたことでした。

「最初は"テストを通す最低限のコード"の繰り返しで、いつまでも納得いくコードができないのでは?と感じていた。でも、リファクタリングフェーズに入ると一気に改善していく様に感動した!」

私たちはまず、コマンドライン引数パーサーライブラリである clap を使わずにTDDサイクルを回し、すべてのテストをパスさせました。そして最終段階で、その実装を clap を利用した形へと全面的に書き換える、という大胆なリファクタリングに挑戦しました。 この時、既に存在するテスト群が「仕様の番人」として機能してくれたおかげで、私たちは安心してコードの構造を大きく変更できたのです。

さらに、引数を構造体にマッピングする clap の設計思想は、Rustの静的型付けの恩恵を最大限に活かすものであり、「なるほど、これはRustらしいやり方だ」という感覚を得ることもできました。

コンパイラとの対話:スライス、所有権、そして借用

輪読会で学んだはずの所有権システムも、いざ自分でコードを書くと新たな壁として立ちはだかります。特に、コマンドライン引数を扱う場面では、多くのメンバーがRust独特の考え方に少し苦戦しました。

// これはコンパイルエラーになる
let args = env::args().collect::<Vec<_>>()[1..];

「コマンド名を除いた引数部分のスライスを変数に束縛しようとしたら、サイズ不定だとコンパイラに怒られた。&を付けて『参照』にすることで解決すると知り、所有権や借用の概念を実践で痛感した」

このように、コンパイルエラーと向き合い、そのメッセージを読み解き、解決策を探すという体験は、まさにコンパイラとの対話そのものでした。The Bookを「読む」だけでは得られない、深いレベルでの理解に繋がったと感じます。

至れり尽くせりの開発体験:言語サーバーの強力なサポート

第1部でも話題に上がったRustの開発体験の良さは、実践の場でさらに輝きを増しました。特に、言語サーバー(rust-analyzer)の支援は絶大でした。

&の付け忘れによる借用エラー、消し忘れたmutimport漏れといったありがちなミスを、エディタがリアルタイムで警告し、クリック一つで修正(クイックフィックス)してくれる。これは本当に快適だった」

さらに、少し長くなった処理を別関数に切り出したい時も、クイックフィックスから一発で実行でき、引数や戻り値の型シグネチャまで自動生成してくれます。こうした強力なサポートのおかげで、私たちは細かな文法ミスに気を取られることなく、ロジックの組み立てに集中することができました。

rust-analyzerによる関数への切り出し

そして、この学びを加速させたモブプロの力

ここまでに挙げたような深い学びや気づきは、一人ではなくチームで取り組むモブプログラミングだったからこそ得られたものだと感じています。

  • 知識の再確認と定着: スライスで詰まった時も、エラーを全員で読み解くことで理解が深まりました。
  • 思考の可視化と多様な視点: 他の人のリファクタリングの意図を直接聞くことで、自分の引き出しが増えました。
  • モチベーションの維持向上: 何より、みんなで集まってワイワイと一つのものを作り上げる体験は非常に楽しく、学習の強力な推進力となりました。

まとめ:私たちが得たものと今後の展望

2つのフェーズにわたる勉強会は、私たちに技術的なスキルだけでなく、開発者として大切な多くのことをもたらしてくれました。

パフォーマンスと安全性を両立するRustという強力な選択肢が手に入り、テストに支えられて開発を進めるTDDの心地よいリズムを体感しました。さらに、言語の垣根を越えて設計を豊かにするパターンマッチなどの新しい思考法も身につけることができました。

これらは、今後の技術選定や日々の実装において、私たちの大きな力となるはずです。今後は社内ツール開発などを足がかりに、この学びをチーム全体に広げていきたいと考えています。

おわりに

本記事では、私たちのチームが手探りで始めたRust勉強会の全記録をご紹介しました。知識ゼロの状態から輪読会でインプットし、モブプロで手を動かすことで、参加者は「Rustで開発できる」という確かな手応えを得ることができました。

この記事が、これからRustを学ぼうとしている方や、社内勉強会の開催を考えている方にとって、一歩を踏み出すための参考に少しでもなれば幸いです。

*1:モブプログラミングを管理するタイマー。時間になったらサウンドが鳴り、ドライバーなどをローテートしてくれる