Rustの採用背景・特徴・学習の難易度について【イベント登壇レポート】

Tech Blog 初投稿で緊張している、岡野です。(キャディでエンジニア採用を担当しています)

2021年11月11日に開催されたFIndyさん主催のイベント

注目の言語Rust、開発現場でどう使われる?活用企業の現場に聞くVol.2

こちらにキャディのバックエンドエンジニア長田歌菜さん(@ngtkana)が登壇しました。今回は、その内容をまとめましたので当日参加できなかった方にも目を通して頂けると嬉しいです!

注目されている言語の1つとして取り上げられることも多いRust。実際に開発の現場で使う機会は限定的な面もあり、実際に使っているエンジニア目線でどうなのか

Rustを業務に取り入れてみたいと考えていらっしゃる方、技術選定の候補として検討されている方の参考になればととても嬉しいです。

[toc]

Rustをキャディで採用した背景は?

長田:私自身は、言語選定そのものに関わっていないので、聞いた話や残っている資料ベースでの説明となります。

キャディでは生産管理や原価計算などのプロダクトを内製していくプロジェクトがあり、大きなサービスを展開するのが初めてというフェーズがありました。

それまでは、C++ とか Python など様々な言語を使っていたのですが、堅牢なものを作るにはどのような言語・フレームワーク・技術を使うべきか?

社内でディスカッションを重ねていました。

最終的にはRustを選定したポイントは、コンパイル時の型や検査に強いこと。

その理由は、数値1つ取っても、

・長さなのか重さなのか? ・金額であっても「売り」なのか、「買い」なのか?

など数値の意味を定義しないと間違ったことが書けてしまうため、計算・検査がしっかりできることが必要でした。

そんな背景から、Rust , Go, Kotlin などが候補に上がるも、

・キャディのプロダクトによってはスピードが要求されること ・元々キャディに数名Rust使える人がいた

ということからRustに決定した背景があるようです(あくまで伝聞です)

例えば、グラム(重さ)とメートル(長さ)が勝手に足し算されてることがあれば、圧倒的に信頼性を失いますからね。

実際にRustを使ってみて特徴を挙げるとすると?

3点あるかなと思っていて、それは「速い」「安全」「エンジニアに優しい」です。

「速い」というのは、Rustは実行時間も速いし、実装時間も速いと思います。

エンジニアによっては、まどろっこしいという先入観もあるかもしれませんが、実装がしやすくなるよう考えられて作られている言語なので、「早い」という特徴がまずありますね。

次に「安全」というのは、メモリリソースの管理で悩むことがない点です。

Rustには所有権という概念があり、1つのメモリリソースは1つの変数が持つというものです。

最初はつまづくかもしれませんが、慣れてくるとこの所有権のおかげで実装がしやすくなります。

最後の「エンジニアに優しい」というのは、コンパイル時に実装の誤りを指摘してくれることが多いからです。

私が Rust を勉強し始めたバージョン1.30くらいからを比較しても、書きやすくバージョンアップしています。

詳しくはRust公式や、初心者向けの入門のまえがきにもありますが、まどろっこしい書き方をしなくて良くなるのがいいです。

フレームワークについてはどうか?

キャディが作っているプロダクトはWebサービスがメインです。インフラは共通しているもののチームによってアーキテクチャや使用技術はバラバラです。

私のチームは warp を使っていますが、これの良さはサーバを立てるところがそんなに長くならない点ですね。

設計者は偉いなあと感じるのですが、サーバやFPIやフロントエンドなどがきっちり分かれていて、とても読みやすいと感じました。

どのくらい型の恩恵をうけているか?

直接的なメリットとしては2点。

1つ目は、ドキュメントが小さくなるところです。

これは、型が要件を表しているので、関数にわたすものも細かく指定しなければいけません。

ところが Rust だと、 ”こういう意味で実装しました” というのが分かりやすく伝えられるので、コミュニケーションコストが下がる点はメリットですね。

2つ目は、テストが減ることです。

C++はテンプレートが実体化していないとコンパイルが通る保証がないため、全てのコードポイントを通るように気をつける必要があります。

そのような点で、テスト時に注意する要素が減るのは嬉しいポイントになりますね。

私が以前担当していたプロダクトで原価計算をするときは、とても細かく型をつけていました。

uom というライブラリがありまして、これは物理的なもの(長さ・重さなど)を扱うときに、「長さ」「重さ」を区別できるようになり、掛け算して面接を算出できたりするものです。私たちは、さらにお金の単位も追加して利用していました。

Rust を実際に使ってみてのメリットは?

メリットは3つあると思っています。

1つ目は、環境構築が楽でビルドの再現性が高い点ですね。

比較対象とする言語にもよりますが、例えば ・コンパイルのプロバージョンが入っている・入っていない ・ライブラリがどのパスに入っている・入っていない などビルドは難しい感じがします。

それと比較すると Rust の難易度は低い方かなと思いますね。

2つ目は、型が強いということ。

そして3つ目は、実行速度が速いことですね。

オブジェクトを作るとどうしても遅くなったり、抽象化すると抽象化コストがかかるので、コードの読みやすさと実行速度はトレードオフの関係になるのが普通かなと思います。

だけど Rust は”書きやすくて速い”というのを実現できるのがいいですね。

逆にデメリットは?

こちらは2点あります。

まず1つ目が、ビルドに時間がかかること。

キャッシュが大きく、ビルドでの待ち時間が長いのはネックですね。

キャディのバックエンドのプロジェクトは、だいたいが Rust を利用しているのですが、様々なプロジェクトを経てビルドを行うと、すぐデータがいっぱいになってしまいます。

なので、泣く泣くプロジェクトを消したり、ローカルから落とすなどで対応しているのですが、もう少しキャッシュが小さくなると嬉しいというのはあります。

2つ目は、まだ発展途上の言語ということです。

以前と比較すると書きやすく、機能も増えている事実はあります。

ただ、例えば Rust のエラー処理まわりに関して何のライブラリを使うか?でいうと、

私のチームは anyhow を使っていますが、部分的にちょっとこの辺はまだまだだな・・という点は正直ありますので、そこは我慢して使っているのが実情です。

また乱数を扱うときに、rand というものを使うのですが、数ヶ月前にアップデートがあり、その巻き添えになって大変だったこともありました。

またまだ、発展する余地がある印象です。

人によってデメリットと感じるか、メリットと感じるか個人差があると思いますが、大きなフレームワークがないのも Rust の特徴です。

“とりあえずこのフレームワークを使えば何でもできる” というものがないのです。

よって、Rust を使うということはアーキテクチャを自分たちでイチから考えることになるので、これとこれを組み合わせてこうしたプロダクトを作ろうなど、自分たちで構成を考えなければいけません。

これは楽しくもあり、大変なことでもありますよね。

Rust を学習するときの難易度はどうか?

元々どういう言語ができるエンジニアなのかにもよると思います。

例えば C++ ができるのであれば、それほど難しくないのではないでしょうか。

逆に Python や JavaScript をメインに扱っている方だと難しいかもしれません。

Rust そのものが特別に難しい言語とは思っていませんが、あらためて所有権という概念は難しいかもしれませんので、その点くらいでしょうか。

ライブラリについては、公式が管理しているものが広範囲で、crates.ioでみると一覧で出てきます。

基本的にはライブラリは1箇所に集まっています。

ドキュメントの生成も、コンパイラと一緒になっているので同じフォーマットでまとまるようになっていますし、ドキュメントを集積する場所はdoc.rsにあり、crates.ioから簡単にジャンプできます。

なので、情報がどこにあるのか?ということで迷わないですし、それは知らなかったということもなく、独学で学習するには向いている言語だと私は思います。

また、コミュニティの皆さんの面倒見がよかったりもします。

Twitter で質問するといろいろな人が教えてくれたりしますし、rust-jp のslackにも初心者向けチャンネルがありますので、ぜひとも学習してみてください。

採用・育成の観点ではどうか?

コンパイルが通りやすいのは、初心者にやさしい点ですよね。レビューする側としても安心できるのかなと。

ただ、Rust はまだマイナー言語なので、元々 Rust がかける人は集まってこないと思います。

なので、これは Rust に限らずですが、書けない言語を書けるようにするために、勉強していく必要があるのはデメリットかもしれません。

Rust そのものが普及すれば、そうしたデメリットも減るでしょう。

日本で Rust を使っている会社一覧があったりするので、私はそういうのをみて仲間意識を育んだりもしています 笑

Rust 習得の具体的な手順は?

Rust-by-Exampleを一通り読んでいれば、あとはOJTで大丈夫かなと思っています。

そこから興味を持てたら、公式のリファレンスやチュートリアルを見たり、ライブラリは標準のドキュメントを見たり。

いずれにしろ公式が提供しているコンテンツを読むと勉強が進むし、情報がまとまっているのでチェックしやすいです。

開発に参加するだけであれば、そんなに知識は必要ないかなと思います。 あとは、プログラミングで何をやりたいのか?

Tech Blog をご覧になっている皆さんによって、書きたいものや解決したいことは違うと思いますが、それを Rust を使ってやってみるといいのかなと思っています。

新しいメンバーがチームに参加するときの GAP は?

私自身が Rust を使うチームに2週間後に移動となったとき、そこからがんばって勉強しました。

新しいプロジェクトにつくと、このコマンドにはこうしなければいけない、これをインストールしなければ、など環境を整えるのが大変ですよね。

そういう意味で、Rust のプロジェクトはビルドが簡単なので、オンボーディングは楽かなと思っていますので、あまり GAP は感じません。

C++ で開発されているところから Rust への切り替えは?

C++ でやっていてよかったのは既存のライブラリがあったことですね。

Open CASCADE というライブラリですが、C特有のメモリー管理が難しかったりしました。

Rust に切り替えると、既存の大きなライブラリを使えなくなるので、自分で作っていくしかないところは私的にはよかったです。

最後に

今回は、FIndyさん主催のイベントに登壇させていただいた長田歌菜さんの発表内容を記事にしました。

着飾らない等身大のお話ですので、Rust に触れる機会のあるエンジニアにとって有益な情報になっていればとても嬉しいです。

キャディでは、バックエンド、フロントエンドなどのWebアプリを得意とするエンジニアやアルゴリズム、ML、データサイエンスなどの数学の知識を活用したエンジニアリングを得意とされる方にも興味を持っていただきたいなと思っています。 cto letter contact us ご興味をお持ちくださった方は、ぜひこちらからエントリーください!カジュアルにお話できると嬉しいです。

最後までお読みくださり、ありがとうございました。