Rustの学び方
はじめに
Rustを学んでいる最中です。完全に理解したとは全く言えない状態ですが初心者は脱しつつあり、それなりに知見が蓄えられつつあります。
そこで、学習の流れを振り返ることにしました。何をどのような順序で学んだらスムーズに理解が深まるか、自分なりにまとめてみたので学習の手助けとして、ひとつの参考になれば幸いです。
具体的な学習の資料や書籍は後ほど紹介します。
目標
IDEの補完や生成AIを全く利用せず、コードを読み書きできる状態を目指します。具体的にはメモ帳・rustc(Rustコンパイラ)・cargo(Rustのパッケージマネージャ)の3つがあればコードの読み書きができる状態を目指します。
極端に思えるかもしれませんが、自力でコードを読み書きできることはRustのコンセプトに習熟するのと同義であると考えています。Rustの言語機能はGCなしでメモリ安全を実現し、かつコンピュータの性能を最大限生かすために存在しています。
当たりのコードが出るまで生成や補完を繰り返して、ビルドが成功したらOKという方法を否定はしません。ただ、そのスタイルを貫くならRustの良さを行かせないかもしれません。
学習の期間
学習の期間は無制限です。book(後ほど紹介するRust公式の学習資料)がちょうど20章あるので、1日1章のペースで読み進めて1ヶ月後にはRustをマスターしよう、という計画的な進め方は少なくとも私には無理でした。
Rustの習熟には年単位の時間が必要になるかもしれません。もちろん、ある程度基礎が固まった段階でコードは書けるようになります。実際、bookは第12章でちょっとしたCLIツールを開発します。
しかし、中途半端な状態で学習を終えて何か実用的なものを開発しようとすると、おそらくclone()
だらけでC言語の手続きスタイルのコードをRust風の見た目に置き換えただけのコードが量産されます。ゴールの設定をどうするかにもよりますが、Rustの習熟には終わりがないと覚悟してください。
Rustは難しい
Rustは難しい言語です。難しくないと言っている人もいますが、あなたが難しいと感じたなら、間違いなく難しい言語です。
難しさにはいくつか種類があります。いずれにせよ学習中、必ずどこかで足が止まります。シンタックスが独特でライフタイムの'a
をどこに書くんだっけ、という表面的なものからderef coercionのようなRustのコンセプト、あるいはその背後にある計算機の構造に関わるものまで、そこらじゅうに地雷が埋められています。
ひとつ確かなことは、地雷を放置して歩みを進めると大怪我するので、丁寧に除去する心がけが必要だ、ということです。一度にすべての地雷を除去する必要はなく、地雷が埋まっているかもしれないと意識するだけでも十分です。
学習資料
抽象的な話が続いたので、ここからは具体的な話をします。
bookとasync-book
bookとasync-bookはRust公式の学習資料です。特にbookは最初から最後まで読み進めるのがおすすめです。遠回りに思えますが、最初に読み終えると後々役立ちます。私の場合、何周か繰り返し読み返して、ようやく頭に入ってきた感覚があります。
async-bookについてはbookより優先度を下げて構いません。ただし、Rustで非同期処理を扱う、例えばWeb関連の開発をする予定があるなら軽く目を通した方が良いかもしれません。
rustlings
rustlingsはクイズ形式のRust問題集です。歯抜けになっていたり不具合のあるRustコードを修正できたら正解です。ターミナルを開きrustlings watch
コマンドを実行するとクイズの解答状況がリアルタイムに更新されます。ゲーム感覚で楽しく学習できます。
すべての項目が連動しているわけではありませんが、おおむねbookで説明されている内容とクイズの内容が対応しています。bookを読み終えたらrustlingsで復習するのがおすすめです。
100 Exercises To Learn Rust
Rustの入門書Zero To Production In Rustの著者、Luca Palmieri氏が作成されたRust学習用の資料です。twitterでたまたま知ったので内容をまだ把握できていませんが、目次を読んだ限り良さそうです。
その他
Rustの学習に関連しそうな項目についてまとめます。
cargoとrustup
cargoはRustのパッケージマネージャです。rustupはcargoやrustcなど開発に必要なツールをセットアップするためのツールです。
JavaScriptを例に大雑把な説明をすると、cargoはyarn、rustupはnodenvのようなツールです。NodeJSエコシステムに詳しくないのでyarnやnodenvが時代遅れのツールになっていたら、すみません。
そうすると、他により良い選択肢があるのでしょうか、流行り廃りがあるのでしょうか?rustupとcargoを使い続けて問題ないのでしょうか?
結論として、rustupとcargoを使い続けて問題ありません。どちらも標準ツールとして安定した開発が続いています。
ツールの流行りに惑わされたり、流行りを追いかける必要がないのもRustの魅力のひとつです。
C言語は知っておくべき?
知っておいた方が役に立ちます。とはいえ、Cの言語使用を丸暗記する必要はありません。Head First Cを読み終えるだけで十分です。
余談になりますが、Cの入門書としてHead First Cは最も読み進めやすい書籍ではないかと思います。入門書だからと手抜きをせずスタックやヒープについての説明もされていますし、のちでRustと比較した際に適切なメモリ管理がいかに難しいか身に染みて理解できるはずです。
C++は知っておくべき?
知っておいて損はありませんが、C++はCよりもかなり優先度が下がります。例えばRustのスマートポインタやmove / copyの概念はC++に馴染みがあれば理解しやすいかもしれません。ただしRustを学ぶ上で必要かと聞かれたら、bookで説明されているので、知らなくても問題ありません。
ChatGPTなどのAI活用
今まで触れていませんでしたが、最も重要な項目かもしれません。Rustを学ぶ上でChatGPTなどの自然言語で質問できるAIの利用は必須です。GitHub Copilotによるコードの自動生成ではなく、自然言語で質問するのが重要なポイントです。
例えばrustlingsで回答につまったら、すぐに質問しましょう。不明点が解消するまで、根掘り葉掘り質問を続けてください。今のところ、AIがへそを曲げたり人類に反乱を起こしたりする心配はないので、気にせず質問をぶつけましょう。
AIが生成したコードを鵜呑みしていては理解の助けになりません。一方で、理解を深めるためAIに質問するのがRustの学習を進める上でのコツだと私は考えています。AIを使う・使わないといった観点ではなく、自分の理解を深めるために役立つかを意識してAIと付き合うと良さそうです。
Rust関連の書籍
いくつか書籍を購入したので、印象をまとめます。
プログラミングRust 第2版
良い書籍です。しかし、この書籍でRustに入門すると確実にRustが嫌いになります。
普段はJavaScript / TypeScriptを利用していて、最近Rustが使われる場面が増えているから勉強してみよう、とお考えの方、そしてコンピュータサイエンスの基礎知識がない方には絶対おすすめしません。知識がないことを後ろめたく思う必要はありませんし、Rustを嫌いになってほしくありません。ぜひRust公式のbookを読んでください。
この書籍はC / C++のシステムプログラミング経験のある方がRustを学ぶのに適した校正になっています。bookをざっと読み終えたのちにC / C++と比較しながらRustを学ぶことでより理解が深まる印象です。
Rustの練習帳
タイトルのとおり練習帳であり入門書ではありません。ある程度Rustに慣れてきた段階で、腕試しの練習問題として読み進めると良さそうです。
RustとWebAssemblyによるゲーム開発
積読になっていて、まだ読めていません。ゲーム開発という具体的なゴールがあると楽しく学べそうです。
その他の書籍
とりあえず購入しただけでまだ読めていませんが、以下の書籍もおもしろそうです。どれも入門書ではありませんが、Rustで何ができるのかを把握しておくと学習のモチベーションが上がりそうです。
情報収集
Rust界隈の動向を知るのに役立ちそうなWebサイトをまとめます。
おわりに
なにか書き加えたいことが出てきたら追記します。
Discussion