「あの人も読んでる」略して「も読」。さまざまな寄稿者が最近気になった情報や話題をシェアする企画です。他のテックな人たちがどんな情報を追っているのか、ちょっと覗いてみませんか?
みなさんこんにちは。
「あの人も読んでる」、第3回目の投稿です。maguro (X @yusuktan)がお届けします。
今回のテーマ: Rustの学習の難しさと取るべきルート
突然ですが、僕はプログラミング言語としてRustを推しています。
高度な抽象化を提供しつつパフォーマンスに妥協しないシステムプログラミング言語であり、そして何より "shared XOR mutable" によって、意図しないタイミングでのデータ書き換えが起きないことを静的に確認してくれるというのが極めて強力です。
パフォーマンスを犠牲にせず「安心」して非同期プログラミングを行えるというのが、個人的な推しポイントです。"fearless concurrency" と表現されたりもします。
一方、Rustの学習曲線は非常に急峻で、独特の概念が多く、スムーズに書けるようになるまでが大変であるという声も多くあります。個々人のそれまでのバックグラウンドにもよりますが、おおむね正しい認識だと思っています。
最近、このRustの学習の難しさについてコミュニティが盛り上がっており、いくつもの記事が公開されました。僕の私見も交えつつ、いくつかご紹介していこうと思います。
「Rustが嫌いです。」から見えるRustの学習障壁
まず最初に紹介するのは、こちら。
この記事では、クロスプラットフォームのリモートデスクトッププロジェクト開発を通じて筆者が経験したRustの「不便さ」が正直に綴られています。
コメント欄でも指摘されていますが、記事で挙げられている不便さのうちの多くは、Rustの独特の概念を理解しきれていない状態で、他言語からの知識を流用してしまっていることが起因だと感じました。
よく「RustはCやC++を経験していた人向けである」と言われますし、実際ある程度は正しいと思います。しかし僕はほぼこれらの言語を触らずRustを学びはじめました。
高レイヤーの言語にしか触れてこなかった人が、よりコンピュータに近い部分の知識を学ぶためにRustを選ぶというのは、かなり「あり」な選択だと信じています。
ただし「Rust嫌い」にならないためにはある程度体系的にRustの概念を学ぶ必要があると思っています。
t-wadaさんのこちらのスライドでも触れられている通り、「試行錯誤から学ぶ」スタイルは挫折する可能性が高いと思います。
「Rust嫌い」への感想から見るRustへの期待値の調整
次に紹介するのは、上記の「Rust嫌い」記事に対する感想記事です。
この記事の著者は、「Rustが嫌いです。」で書かれた問題の多くは以下の2点に集約されると指摘しています:
- WebAssembly固有の問題にハマっている
- Rustをスクリプト言語と同じ枠で見てしまっている
僕もまったく同意見です。Rustを学ぼうというときに、「〇〇を作るぞ!」という気持ちでトライアンドエラースタイルでやろうとすると、〇〇をRustで実装するのは上級者向けのハードモードだった、みたいなことが起きてしまいがちです。
例えば、Rustでは async
/ await
という仕組みがありますが、これは次に紹介する記事でも指摘されている通り、Rustの中でもとりわけ厄介な領域の1つです。
Webサーバーを実装してみたい、といった題材を採用するとだいたい async
/ await
を使うことになり、何らかの挫折ポイントを踏む可能性が高くなります。
Rust初心者のためのアプローチ - 非同期からは始めない
最後に紹介するのは、Rust初心者向けの学習アプローチについての指針を提供してくれる記事です。
著者はまずRustそのものが難しいと指摘した上で、その上に非同期プログラミングという複雑な抽象化を重ねるとすぐに牙をむいてくると警告しています。
代わりに著者が推奨するのは
- CLIツールを作る
- 言語処理系を作る
- LL言語で書いていてCPU boundで遅くなっている処理を部分的に書き換える
といった、非同期処理を必要としない(または最小限に抑えられる)プロジェクトからRustを始めるアプローチです。
僕も完全に同意見で、Rustを学習する際は小さくシンプルなものから始めるのが良いと考えています。
僕はRustを学び始めたころ、競技プログラミングの問題をRustで解くことで学習を進めていました。この選択は偶然だったのですが、今思うと理にかなっていたように思います。
問題を解くことに加えて、競プロで頻出のデータ構造を「自分用ライブラリ」として整備することで、Rustの標準ライブラリ+αだけで完結しつつ、トレイト、代数的データ型とパターンマッチング、所有権と借用、ライフタイムといった概念の理解を深めることのできる題材だからです。async
/ await
も出てきません。
おわりに
これら3つの記事は、Rustという言語の学習アプローチについて多角的な視点を提供してくれます。
僕がRustを推す理由の一つに「安心して非同期プログラミングができる」というポイントを挙げましたが、その「安心」を得るためには、まず基本的な概念をしっかり理解する必要があります。
非同期プログラミングから入ってしまうと、Rustの良さを実感する前に挫折してしまう可能性が高いです。
僕自身の経験からも、競技プログラミングのような小さな問題から始めて、徐々に概念を積み上げていく学習法が効果的だと感じています。既存の知識をunlearnしてRust特有の概念を咀嚼するための時間を確保することが大切です。
Rustの学習曲線は確かに急ですが、乗り越えた先には "fearless concurrency" をはじめとする数々の恩恵が待っています。焦らず、適切な順序で学んでいけば、必ず使いこなせるようになるはずです。
また次回、おすすめコンテンツを紹介していきます。お楽しみに!
maguroさんの「も読」過去記事
- n月刊ラムダノート、実用Raft(3月21日公開)
- MCPことはじめ / MCPサーバーのセキュリティリスク(4月4日公開)