Zenn
💢

Rustが難しい唯一の理由

に公開
10
40

覚えることが多い

初心者の主観ですがRustが難しい理由はこれに尽きると思います。初心者の感想として覚えることの多さについて書いていきます。

ちなみに、覚えることは多いですが、全部覚えなくても全然やっていけますし、見返りは大きいのでそのことについても書きます。

メモリ管理が難しい?

よくRustが難しい理由として真っ先にに挙げられるのがメモリ管理です。しかし、これは実はそうでもないということが使い始めると分かってきました。
というのも、Rustの特徴である所有権とか借用とかライフタイムとかはメモリ管理を意識しなくてもいいようにするためのガーベージコレクションに代わる仕組みなのです。例えば私のようにWebフレームワークを使ってWebサーバーを立てるような型にはまったプログラミングを行うときは、ほとんど意識する必要がありません。

独自の言語仕様が多い

先に書いたメモリ管理だけでなく、エラー処理、列挙体やパターンマッチ、トレイトや導出、マクロ、モジュールなどなど、他の言語にもあったとしても、独特な仕様になっているものが沢山あります。
初めてのプログラミング言語がRustという人は稀でしょうから、多くのRust初心者は他のプログラミング言語を使ったことがある人かと思います。他のプログラミング言語の常識は逆に邪魔になるので、0から覚えなおしと思ったほうが良いくらい独特な言語仕様が多いです。

これにより最初は誰もが右も左も分からない状態に陥るので、学習コストが高いと言われる所以だと思います。

型とトレイトが多い

型といってもi32やboolといったプリミティブ型のことではありません。StringやVec<T>、HashMap<K, V>といった他の言語でも馴染みのある型に加えてOption<T>、Result<T, E>、Rc<T>、Arc<T>、Weak<T>、RefCell<T>、Box<T>、Pin<Ptr>, OnceCell<T>, LazyLock<T>, Cowといった型が言語仕様級の標準ライブラリとして出てきます。

その上、トレイトという、型の振る舞いを提供するものがあり、Into、TryInto、Display、Copy、Deref、Error、Debug、Futureなどなど挙げればキリがないほど出てきます。型ほど数を覚えないと厳しいわけではありませんが、頻繁に使うので少しずつでも理解していかなければなりません。

これらの型やトレイトはそれぞれが複数のメソッドを持っており、状況に合わせて使い分ける必要があります。それはどの言語でも一緒じゃないかと思われるかもしれませんが、実際やってみると、似た名前のメソッドや似たことをするメソッドが何個もあるので、どう使い分ければいいのか、これも覚えるのが大変です。

そして厄介なのが、次のような感じで当然のように組み合わさって利用されます(これでも簡単な方です)。

Option<Pin<Box<dyn Future>>>

これはつらい。

デファクトスタンダードになっているライブラリが多い

Rustを使うと必ずと言っていいほどtokioというライブラリに遭遇します。非同期ランタイムと呼ばれるライブラリで、async/awaitを実装するライブラリです。tokio以外にもあるのですがtokioがデファクトスタンダードになっています。

Rustは標準ライブラリが少ない言語です。そのため、他の言語だと標準ライブラリで済ませることのためにライブラリを探して、比較して、覚える必要があります。
プログラミング言語で標準ライブラリを使えないと話にならないように、Rustではデファクトスタンダードになっているライブラリは使えないと話になりません。
デファクトスタンダードまではいかなくても、便利なのでよく使われるライブラリも沢山あります。

url、regex, logといった分かりやすい名前のライブラリもありますが、以下のように名前だけではよく分からないものもあります。

serde、tokio、chrono、anyhow、thiserror

ライブラリは沢山あって大変ですが、ほとんどのライブラリは使ってもらうために分かりやすく設計されますので言語仕様に比べると覚えやすいほうではないかと思います。

未完成のライブラリが多い

Rustのライブラリは上記に挙げたデファクトスタンダード級のライブラリでさえもバージョン1に達していないものがほとんどです。Rustの言語そのものも毎月どんどんアップデートされていますし、ライブラリも活発に開発されています。
今急成長している言語ですので、他の言語以上に、新しい情報を仕入れる必要があります。

そして、ググって出てくる情報は古い使い方だったり、新しいライブラリに置き変わっていたりするので、情報収集力も必要になります。

書き方が多い

プログラムは100人居たら100人の書き方があると言いますが、Rustはそれが特に顕著だと思います。
関数の分け方とか、変数名の付け方とか、そういったことではありません。

例えばOption<T>型をT型にするだけでもいくつも書き方があります。エラー処理も他の言語だとtry-catchほぼ一択ですが、Rustは色々なやり方ができます。
その色々な書き方を、最初は1つしか覚えないと思いますが、他の人のコードを読むためには別の書き方をしているのでそれを覚える必要がでてきます。そしてその中で自分なりのベストプラクティスを見つけていく必要があります。

Rustの楽しい/面白いところ

Rustのすごいところは、覚えることが多いものの、こういったことを全部覚えなくてもやっていけるところです。半年くらいちょこちょこと使っただけで、普通にセキュアなWebサーバーを作れました。この記事で書いた覚えることのほどんどを私は覚えていないどころかまともに理解できてないものもあります。膨大なRustの世界から自分が学んだ一部のパーツだけでアプリケーションを組み立てることができるのです。
これから更に新しいことを学んだらどんなことができるようになるだろう、というわくわく感があります。

そして、ほとんどのライブラリが解説を読まなくても割と使い方が分かります。解説がそもそも日本語対応していなかったり古い情報だったりするので読んでも意味が無いということも一因です。しかし言語仕様がそうさせているのだと思います。

別記事にも書きましたが、Rustはメソッドチェーンが重要な要素になります。何かするときにとりあえずテキストエディタ上で「.」を打てばメソッドがずらーっと出てきます。それを繋げていって得たい値を作ります。
このおかげで「.」を打てば何ができるかがテキストエディタ上で分かりますし、深く知りたいときは https://docs.rs/ で型とメソッドを辿っていくだけで使い方が分かってきます。

さらに、間違ったところがあるとすぐにコンパイラが教えてくれますので、コンパイラが使い方を教えてくれるという側面もあります。(ただしちゃんと設計されたライブラリに限ります。)
とりあえず少し書いてみて、後はコンパイラが出すエラーを潰していけば作りたいものが完成するという開発体験が得られます。これが本当にすごくて、他のプログラミング言語ではただの文字列として扱われるSQL文やドキュメンテーションコメント内のExampleでさえも型チェックしてくれます。複数ファイルを触る修正で、1カ所修正が漏れていたなんてことをRustは許さないのでライトな気持ちでプログラミングできるのです。

おわりに

とにかく覚えることが多い言語です。そして覚えることの一つ一つが他のプログラミング言語にはあまり見られない仕様だったりするので理解するのが大変です。

しかしそれは使いながら少しずつ徐々に覚えていけばいいですし、理解したときに得られるものは大きいです。一つ理解するたびに視野がぐんと広がります。シンプルに書けるようになったり、型システムを活用して楽できるようになったり、高速化できるようになったりします。

Rustは最も愛される言語なのだそうです。私が思うに、Rustは新しいことばかりで使ってみると感動が沢山ある言語なので、長年経験を積んできたプログラマでも、初めてプログラミングに触れたときのような、喜怒哀楽とときめき体験が得られることが理由ではないでしょうか。

メモリ管理を意識せずにメモリ安全に、インタプリタ言語のような書きやすさで高速なバイナリを、しかもテキストエディタをほとんど離れずに、しかも関数型プログラミング風の書き味で提供する驚愕のプログラミング言語です。

Rustに対する不満を書こうとしたら、なぜか最後はRustに対する愛を書いていました。

40

Discussion

パラッコリーパラッコリー

初心者としてRustを学び始めた者です。この記事に心から共感しました。
特に「プールで無くしたコンタクトレンズを探す」比喩が秀逸で、まさに私の体験そのものです。

そして最後の

Rustに対する不満を書こうとしたら、なぜか最後はRustに対する愛を書いていました。

という結論、とても納得です。Rustはツンデレ言語なのかもしれませんね😊
素晴らしい記事をありがとうございました!初心者の背中を押してくれる内容でした。

NakamuraNakamura

コメントありがとうございます!
同じような体験をされた方がいて嬉しいです😄
私も初心者なので一緒に頑張りましょう!

ふがふが

serdeがシリアライズ+デシリアライズと気づくのに時間がかかった私…

NakamuraNakamura

私も最初は何なのかよく分からなくてJSONのパーサーがserdeとserde_jsonの2種類あるのかと勘違いしてました←

乳牛乳牛

お洒落な名前のライブラリは初学者には厳しいですよね(名前だけでなんのためのものか想像がつかない)

NakamuraNakamura

確かに! 「tokioはアイドルグループじゃないんやで」「じゃあ何?」「え?えっと・・・」という感じになってました

乳牛乳牛

城島:「今日は非同期にやっていくでぇー」
非同期タスクたち:「おーーーっ」

nium_devnium_dev

Rustをついこの間スタートさせた入門者です…。
覚えること多いんですね。まだそれすらも見えていません。

ときめき体験

これすごくわかります!!
エラー解消した時に、ドーパミンがすごく出ますよね。
もう少し学習が進んだら、再読します。
良い記事をありがとうございます。

NakamuraNakamura

始めたばかりでRustの楽しさを見いだせるのはすごいですね!
私は実はあまりの苦痛からこの記事を書き始めました・・・半年かけて少しづつ追記していたらいつの間にか嫌いが好きに変わっていましたが^^
私も初心者ですので一緒に頑張りましょう

nium_devnium_dev

この2月くらいにRustのコピペのコードを動かしてみたら、依存性が衝突して、cargo treeとか色々使って、最終ドキュメント読んで解決したことがあって。AIでも解決できなくて丸一日かけてなんとかしたんです。それがすごく楽しかったので^^ きちんと勉強しようって思って、この春スタートしました。
Nakamuraさんが書かれている単語のほとんどがまだわかりません汗
私もまずは半年くらいかけてなんとか、初級くらいになれると嬉しいです。
一緒に頑張りたいです!よろしくお願いします^^

ログインするとコメントできます