thinceller blog

最近 Rust を勉強している

2022-01-30 公開

最近、Rustを勉強しています。 今は小さなCLIを作ってみているくらいですが、勉強へのモチベーションがそれなりにあり、次はWebAssemblyもRustで触ってみたいと思っている今日この頃です。

なぜ自分がRustを学ぼうと思ったか、なぜここまでモチベーションを保てているのかを記録しておきます。

今使っている言語

私が普段の業務で使っている言語はRubyやJavaScript、TypeScriptです。 Web系企業に勤めるソフトウェアエンジニアの技術セットとしてはよくあるものだと思われます。 これらに加えてGoもある程度は書ける状態ではあると思っていますが、業務で使った経験がほぼない(コードを読んで小さい変更を加えたくらい)ため微妙なところです。

RubyやJavaScriptは標準ライブラリが充実していたり外部ライブラリが充実していたりするため、プライベートで何かスクリプトを書いたりアプリケーションサーバを書いてみたりするときにもそれらでサクッと書いてしまうことが多いです。 Webエンジニアを始めてそろそろ4年になりますが、最初に取得したスキルセットでずっと戦えてしまっている状態です。 メリットもある一方、システムプログラミング言語どころかあらゆる言語の習得に二の足を踏むような状況にそこそこ危機感を抱くようになっていました。

フロントエンドツールへの Rust の進出

私がRustに興味を持ち始めたのは、WebフロントエンドツールへのRust進出が顕著に増え始めているのを目にしたことが大きいです。

Node.jsのリプレイスプロジェクトであるDenoにおいてRustがコア技術として活用されており、linterやformatterなどもRustで書かれています。 また、Next.jsがbabelからRustで書かれたコンパイラであるSWCに移行し始めたことは、Webフロントエンド界隈に大きな影響を与えたと感じています。

Advanced Features: Next.js Compiler | Next.js

Next.jsのバージョンアップの差分にRustのコードが含まれ始めたあたりに「あ、そろそろ少なくともRustが読めるようになっておかないとWebフロントエンドを主戦場に戦っている人間としてまずいかな」と思ったのが直接的なきっかけです。

Rust でシステムプログラミングに踏み込む

自分が計算機科学を修めていないことは結構なコンプレックスになっており、またコンプレックスよりも基礎力に影響すると考えているため、どこかでシステムプログラミングに踏み込んでみたいと考えていました。

基礎力という言葉は抽象的ですが、具体的に挙げれば計算量とかメモリ周りの理解とかですかね。 これらはソフトウェア開発における教養のように感じています。 なくても業務はこなせるが、深い議論になってくると知識や理解のなさが露呈してくる類いのものです。

私はこれまでこういった知識を雰囲気だけ理解し、つまり子細は置いておいて致命的な勘所だけを押さえて、なんとなく乗り切るといった対処をしてきました。 要は付け焼き刃なのですが、これで乗り切れる局面もあれば理解が足りなくて困ることも多々ありました。

RustがWebフロントエンド領域に進出してきたのを見て、Webフロントエンドエンジニアとしての短期的な技術スタックの充実に加え、ソフトウェアエンジニアとしての長期的な技術力の向上のためにRustを通して様々なことを学びたい、と考えるようになりました。

今のところの手応え

Rustを学ぶにあたっての最初の教材は The Book でしたが、ボリュームが多くてプライベートの隙間時間に読んでいくには多少骨が折れたため、まず何かしらを作ってみることにしました。 会社のRustaceanに手を動かしてRustを学ぶ教材を聞いたところ、Writing an OS in Rust をオススメされました。が、かなり初っ端で躓いてしまいこちらも一旦ストップしました。

次に試したのは Getting started - Command Line Applications in Rust でした。 15分でCLIを作るという言葉通り、すぐに読み終わってCLIをひとつ作成できました。 たまたま作りたいCLIのネタがあったので、完成を目指してRustを学びつつ開発を進めています。

所有権システムは個人的には比較的理解しやすく、一方ポインタ周りがまだ理解するのに時間がかかっているような状態です。 エラーを例外ではなく OptionResult 型で扱うようなデザインは好印象だなーというくらい。 ともあれ、結構楽しんで学べている気がします。

今後

CLIを作ったらWebAssemblyにも触れてみたいと思っています。また、アルゴリズムの勉強がてらRustでの競プロにも挑戦してみたい気持ちがあります。 あれやこれや挑戦してみたいというモチベーション自体が久しぶりなので、これを維持しつつうまく活用していきたい所存です。