1 週間 Rust を学習して完全に理解したのでファーストインプレッション
こんにちは、Nash です。最近、Rust 学習をしていたのですが、インプットが一段落がついたので、ファーストインプレッションのまとめです。
RustでHelloWorldはじめてる
— Nash⚡️React書いてる (@snamiki1212) July 13, 2020
Rust を学習した背景
「お前 React 大好きフロントエンジニアじゃん。なんで Rust 学習してるん?」に対する回答ですが、いくつか理由があります。
なんで Rust?⇒ システムプログラミングなどの低級レイヤーに興味を持っているので
学位として CS ではあるけれども、不真面目だったのでなんちゃって Developer です。
ただ、どこかで低級レイヤーの知識を洗い直したいと思っていることもあります。
んで、そのときの学習時に使う言語選定として
- 「C/C++を 2020 年の今から学び直すのも微妙だなー」
- 「あ、Rust を使って低級レイヤーの学習をできれば一石二鳥じゃん」
という目論見です。
ただ、このファーストインプレッションなインプットが終わってから思うのは、低級レイヤーの学習以前に Rust が予想以上に学習と習熟がシンドイ!!
低級レイヤーを学びたいなら簡単 or 慣れ親しんだ言語で学習したほうが良いのかもです。自分は Rust という言語が好きになったので、このまま学習しようかと思ってますが。
なんで Rust?⇒ 低級レイヤーのデファクトになりそうなので
言語特性の良さだけでなくて、OSS 界隈+一部の会社がすでに Rust を採用し始めてて低級レイヤーのデファクトになりそうだと思ったので。
Microsoft の自社にて C/C++を Rust へ乗り換えるための、プレ調査でかなりポジティブな動向とか、Deno などの一部の OSS のコアにて Rust が採用され始めてるのを見て、低級レイヤーの Rust 推しを感じてる今日このごろ。
低級レイヤーなら息が長いので、仮に学習コストが高くても長い目で見たときに早めに学習しておくほうがメリットが多そう、という目論見。
なんで Rust?⇒ 楽しそう
まぁ、つらつら適当に理由も書いたけど、新しい言語とか学ぶの楽しいやん?
というわけで、Rust 学んでみました。
やったこと
時間としては、だいたい 1 週間〜10 日くらい。仕事が終わってからの数時間と休日とかに、いそいそと学習してた。
具体的には、下記の情報について読んで手元で写景してました。
- 1)最速で知る! プログラミング言語 Rust の基本機能とメモリ管理【第二言語としての Rust】
- 2)The Rust Programming Language
- 3)Rust ツアー - Let’s go on an adventure!(途中までしか読んでない)
1)は、ボリュームが少なめながらわかりやすく Rust を説明してくれるので、まずはここから入るのが良いかと思います。
2)にて、言語全体のチュートリアルです。ありがたいことに日本語訳されています。ただ、オリジナルの最新の情報には追いついてないので Rust のバージョンを最新にしているとうまく動かないことも時々あるので、そういうときはオリジナルの文章を見に行きましょう。
3)は途中まで進めてたんですが、日本語に翻訳されてなくて「英語で新しい概念を理解するのはシンドイ」と思って途中でやめました(過去にそのスタイルで Elixir を学んだけど効率悪かったので)。
ところで、「新しい技術を学ぶときにどうやって学ぶ?」という議論で、
- なにかをとりあえず作るアウトプット先行型
- チュートリアルや本などから情報を入れるインプット先行型
があるかと思います。
今回はインプット先行型で学習していて、上記の記事を見ながら写景でアウトプットをしました。
では次に、Rust を学習してみてわかったこと・おもったことを書いていきます。
わかったこと、おもったこと
「Rust 難しい」=マルチパラダイム+所有権
よく巷で「Rust 難しい」って言われる所以がなんとなく理解できました。
この2つが殺しにかかってきてる。
- 「マルチパラダイムから来る多種の構文」
- 「所有権」
それぞれ難しくて、しかも「どのレイヤーから来たか?」によって死ぬ先が違う両構え。
具体的には下記の通り。
- マルチパラダイム=低級レイヤーから来た人を殺す(推測)
- 所有権=高級レイヤーから来た人を殺す(殺された)
これらの理由について、それぞれ説明してみる。
Rust 難しい問題:マルチパラダイム
言語知識の経験が狭いと、マルチパラダイムから来る様々な構文の理解がシンドイと思います。(自分は違うこのケースではないので、この結論は推測です。)
まず、Rust はマルチパラダイムプログラミング言語で、手続き型・OOP・FP の特性を持つわけです。実際に Rust を書いて感じたのは、マルチパラダイムよろしくで構文自体も各パラダイムから色々輸入されるなー、ということ。そのため、広いパラダイムで使われる構文・概念をそれぞれ理解しないといけないぞ、と感じたわけです。
実際、Rust に影響を与えた言語たち - Qiitaで見る限りでも、様々な言語の構文などが使われてるのがわかります。
つまり
- 言語・思想の経験が狭い
- 2020 年のモダンなプログラミングを知らない
みたいなプレイヤーは、次から次へと新しい構文・概念の知識習得が必要になるわけなので「Rust 難しい」になってシンドイ気がします。
それこそ、「今まで、C/C++でメモリ管理とかはゴリゴリにできます!」みたいな低級レイヤーから来た人はマルチパラダイムに殺される、と思います。(とはいえ推測です。こういう人いたら実際はどうなのか教えて。。。)
逆に言うと、今まで様々な言語の学習・思想を知っていれば、
- 「あぁ、これは Go で言うところのこれのことね」
- 「これ、Haskell でみたことある!」
- 「Ruby じゃん」
みたいになって学習コストがそこまでしんどくないんじゃないかな。
実際、自分も今まで色々な言語の学習をしてきたので、マルチパラダイムにおける多種の構文について、詰まることはほぼなかったです。
Rust 難しい問題:所有権
メモリ管理に詳しくない人は、所有権まじわけわからん。
Rust のファーストインプレッションな学習が終わった後に「Rust 完全に理解した(理解してない)」ってドヤろうと思ってたけど、その虚勢を張れないくらい「所有権」周りが難しくて全然理解できなかったです。。。
逆に、C/C++上がりの人なら所有権は理解できそう。理由は、所有権はメモリ管理を自前で行う上で、「どうにか仕組み化しようぜ」って試みだから。(後続の追記1で言及してますが、そもそも所有権は C++から生まれた機能でした)
そのため、低級レイヤーから来た人は
- 「メモリ管理ってどうやるの」
- 「メモリ管理の勘所はここだよね」
- 「メモリ管理のここが辛いよ」
を理解しいるわけです。なので、所有権を理解するための前提知識+導入したことによるメリットはわりと理解しやすいんじゃないかなー、と勝手に思った。
ただ、高級言語から来るとそのバックボーンが無い。そのため、高級レイヤーから来た人は所有権に殺される、と思った。というか殺された。まじわからん。
というわけで、「Rust 難しい」と言われる所以についてでした。次は Rust の言語特徴についてで、ここらへんも学習を通して理解が深まった気がするのでまとめます。
Rust vs Go:GC の有無
GC が不要なら Rust、それ以外なら Go。
よく巷で
- 「Rust か Go か、どっちが良い?」
- 「これらで比較した」
みたいな記事を見るけれども、このファーストインプレッションを得て、これらの比較があんまり意味ないのでは?と感じるようになった。
というのも、この2つの言語特性における一番の違いは「GC の有無だから」と学習してて気付いたので。実際、Microsoft の年次イベントでもこの点が何度も強調されていたらしい。
何度も Go との比較がコメントされたが、「ガベージコレクションが許されないシステムレベルのソフトウェアを書くなら Rust である」と結論付けられていることが印象的だ。
Microsoft の年次イベント Build 2020 でメモリーセーフなプログラミング言語 Rust を紹介 | Think IT(シンクイット)
Rust の GC 無しによるツラミ
Rust では GC がない。そのため、GC に相当するメモリ管理をプログラマーが自前で書かないといけない。だが、C/C++などでのメモリ管理は「プログラマーが気をつけてどうにかする」系の問題解決方法なのでバグがよく出るわけだ。
その解決としての所有権という仕組みにて解決する。
ただ、ここで問題なのは所有権という仕組み・ルールを理解できないと、まともにプログラミング/コンパイルができないくらいに、Rust におけるプログラミングではコアな特徴になっている。
そのため、簡単な Todo アプリすら、所有権を理解してないと作るのは辛いはず。つまり、ハードルが高い。
Rust 以外の選択肢
確かに Rust は低級レイヤーの仕事をこなすことができるのに、高級言語並の表現を獲得しているように感じているが、それでも所有権の概念はつきまとってくる。
世の中のアプリケーションにおいて、GC なしのレベルでカリカリにチューニングを行う必要のあるモノはかなり少数。もちろん、このクラス・レイヤーのアプリケーションが必要なときに Rust は活きると思う。
逆にいうと、それ以外の場合は違う言語のほうが良い。そのため、Web アプリケーションのバックエンドにおいて Rust を採用する動きは今後も弱いんじゃないかな、と感じた。
けど、2020 年の JetBrains の技術調査にて、他言語への乗り換えにて 3 大言語の golang/Python/Kotlin に次いで第 4 位に Rust が来てる点で、TypeScript よりも上位なのかよ!うーん、個人的には Web アプリケーションのバックエンドに Rust は採用されないかとは思ってるんだけど、この調査でこれだけ採用されてる背景がわからんなー。とはいえ、少なくとも日本ではプロダクションに使われる話をあまり見ないんだよね。
ちなみに、2020 年の個人的に具体的な押しの言語は golang と TypeScript で、Ruby は静的型付けな型システムを導入しない Matz の方針があるので今後も言語レイヤーで型が無くてチーム開発の仕事で書くアプリケーションレベルのボリュームでは辛そう。
Rust の書き心地は良い
書いてて気持ち良いです。
Stackoveflow の調査にて Developer に愛される言語の部門にて 2016 年~2020 年の連続 No1になり続けた実績は伊達じゃない。
メモリ管理という低級レイヤーの仕事を担う言語でありながら、現代的な構文ばっかりだし、cargo によるエコシステムも使いやすい。
対比として golang は「なんで最近出てきたモダンなプログラミングなのに 2020 年にもなって for 文を非イテレータで回さなきゃならんのじゃ、、、」という思い出が根深く、第一印象はあんまりよくないです。まぁ、書くんだけど。
仕事は少なめ
興味本位で仕事を探してみたけれども、日本においては Rust による仕事はかなり少なめ。
まぁ、Rust の技術選定として「優位な点が GC なしのカリカリチューニング」なので、その点が必要なアプリケーションはマイノリティなのでどうあがいても仕事も少ないよね、と思ってる。
とにかく、Rust の仕事に興味があればここのリポジトリを Watch しておくのが良いかと。
おわりに
以上で、ファーストインプレッションで得たことのまとめでした。
次はアウトプット先行型でなにか手を動かして見ようかと思う。個人的には Deno に興味を持ってるので、コントリビュートできるか見てみようかな。
いったんインプットは一通り終わったけれども所有権周りがあまりにも難しくて、「Rust 完全に理解できなかった」という結末なんだけど、まぁ様式美として締めの一言。
「Rust 完全に理解した」
追記1:所有権は Rust 独自ではなくて、C++の機能
んで、Rust はあくまで、所有権を主軸にすて新しい言語として構成しなおした言語というポジションみたいです。
なので、C++のエンジニアは所有権周りを知ってるので、割と簡単に Rust を始められそうですね。
というか、所有権が Rust で新しく生まれた技術的な特異点だと誤解してる人多いし、Rust の公式ドキュメントもミスリードを誘う文章はやめてほしいな。。。C++から来たよって書いてほしい