🍣

Rustの学び方

2024/04/15に公開

はじめに

Rustを学んでいる最中です。完全に理解したとは全く言えない状態ですが初心者は脱しつつあり、それなりに知見が蓄えられつつあります。

そこで、学習の流れを振り返ることにしました。何をどのような順序で学んだらスムーズに理解が深まるか、自分なりにまとめてみたので学習の手助けとして、ひとつの参考になれば幸いです。

目指すべき状態

私はIDEの補完や生成AIを全く利用せず、コードを読み書きできる状態を目指しています。具体的にはメモ帳・rustc(Rustコンパイラ)・cargo(Rustのパッケージマネージャ)の3つがあればコードの読み書きができる状態を目指しています。

極端に思えるかもしれませんが、自力でコードを読み書きできることはRustのコンセプトに習熟するのと同義であると考えています。当たりのコードが出るまで生成や補完を繰り返して、ビルドが成功したらOKという方法を否定はしませんが、そのスタイルを貫くならそもそもプログラミング言語を学ぶ理由がなくなってしまいます。

学習の期間

学習の期間は無制限です。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で復習するのがおすすめです。

その他

Rustの学習に関連しそうな項目についてまとめます。

cargoとrustup

cargoはRustのパッケージマネージャです。rustupはcargoやrustcなど開発に必要なツールをセットアップするためのツールです。

NodeJSを例に大雑把な説明をすると、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がへそを曲げたり人類に反乱を起こしたりする心配はないので、気にせず質問をぶつけましょう。

Rustは所有権やライフタイムに代表されるように、他のプログラミング言語には存在しない概念が含まれています。また、関数プログラミングのパラダイムがほぼゼロコストで実現されていたりと、他のプログラミング言語とは勝手が異なる要素が数多く含まれています。

Rustはいわゆる写経が通用しないプログラミング言語です。AIが生成したコードや適当にネットから拾ったコードの断片を雑につなぐだけでは、まずうごくものができません。AIに教わるのがRustの学習を進める上でのコツだと私は考えています。

Rust関連の書籍

いくつか書籍を購入したので、印象をまとめます。

プログラミングRust 第2版

良い書籍です。が、しかし、この書籍でRustに入門すると、ほぼ確実にRustが嫌いになります。特に普段JavaScript / TypeScriptを利用していて、最近Rustが使われる場面が増えているから勉強してみよう、とお考えの方はまずbookを読んでください。

この書籍はC / C++のシステムプログラミング経験のある方がRustを学ぶのに適した校正になっています。bookをざっと読み終えたのちにC / C++と比較しながらRustを学ぶことでより理解が深まる印象です。裏を返せば、そのあたりの勘所がわからない状態で読み進めると頭がパンクします。

Rustの練習帳

タイトルのとおり練習帳であり入門書ではありません。多少Rustが書けるようになった段階で、腕試しの練習問題として読み進めると良さそうです。

RustとWebAssemblyによるゲーム開発

積読になっていて、まだ読めていません。ゲーム開発という具体的なゴールがあると楽しく学べそうです。

その他

とりあえず購入しただけでまだ読めていませんが、以下の書籍もおもしろそうです。どれも入門書ではありませんが、Rustで何ができるのかを把握しておくと学習のモチベーションが上がりそうです。

おわりに

なにか書き加えたいことが出てきたら追記します。

Discussion