Findy Engineer Lab

エンジニアの"ちょい先"を考えるメディア

Rustは難しい言語ではない。気軽に始めてみるところからスタートしよう。Rust活用企業の現場に聞いてみた

f:id:poniki:20211015163306p:plain

2021年8月に約1000名のエンジニアに対し「今後、習得・強化したいプログラミング言語」と題してアンケートを実施したところ、多くのエンジニアが今後習得したい言語はRustであると判明しました。

Rustに関する知見を深めるため、2021年9月7日(火)には「最新バックエンド井戸端会議vol.2」と題し、オンラインイベントを開催。『実践Rustプログラミング入門』の著者である吉川さんと松本さんをお招きし、お話を伺いました。

本稿では、イベント内で語られたRustを導入するポイントや、エンジニア採用のコツについて一部抜粋してまとめています。

Rustに関心のある方や技術選定を任されている方は、ぜひご一読くださいね!

パネリスト
吉川 哲史さん/(フェアリーデバイセズ株式会社)[@emergent]
2018年にフェアリーデバイセズ株式会社入社。 マネージャー兼ソフトウェアエンジニアとして、顧客とのフロントに立ちつつ開発チームを主導している。自身でも普段からRustを用いてアプリケーションを実装しており、自社プロダクト中のRust比率を徐々に高めている。 「実践Rustプログラミング入門」著者。

松本 健太郎さん/(フォルシア株式会社)[@matsu7874]
フォルシア株式会社技術研究所所属のエンジニア。新卒入社後WebエンジニアとしてECサイトの開発・運用を担当後、現在はRustで検索プラットフォームSpook内で使うためのインメモリデータベースの開発を行っている。エンジニア採用や技術広報の仕事も担当している。「実践Rustプログラミング入門」共著。

モデレーター
佐藤 将高/(ファインディ株式会社) [@ma3tk]
東京大学 情報理工学系研究科 創造情報学専攻卒業後、グリーに入社し、フルスタックエンジニアとして勤務する。2016年6月にファインディ立上げに伴い取締役CTO就任。

Rustを導入するのに重要なこととは?

──本日はよろしくお願い致します。吉川さん・松本さんの順で自己紹介していただけますか?

吉川さん:吉川です。フェアリーデバイセズ株式会社に所属しています。2018−2019年頃にRustを学び始めました。その過程の中で、松本さんとLT会でご一緒させていただき、「実践Rustプログラミング入門」を共同執筆しました。社会人歴は15年くらいですが、エンジニア歴は短いので、Rust以外のところはあまり詳しくありません。もし変なことを言っていたら率直に皆さんからコメントいただきたいです(笑)

松本さん:松本です。フォルシア株式会社で働いていて、様々な企業の検索機能を開発しています。最近は主にRustで検索モジュールを作るための開発をしています。 3年前からRustを書いていて、イベント登壇や書籍執筆などのご縁がありました。社内でもまだRustを書く人が多いわけではなく、どう広めていくか頑張っているところです。その辺りについてお話しできればと思っています。

──それでは「技術選定でRustを選定する際のメリット・ポイント」というテーマでお話をお伺いします。こちらは松本さんからお話しいただけますか。

松本さん:はい。私が考えるRustを選ぶ際のメリット・ポイントは下記の通りです。

現状の問題が処理速度やソースコードの品質にあるのであれば、Rustの導入で解決できる可能性があります。あとは「チームとしてRustを使いたいのか?」という点を押さえておくことも大事かなと。新しい言語を使う時には当然勉強をする必要がありますし、Rust特有の概念についても他のメンバーに伝えていかないといけない。その作業を自分ができるのかどうか、そういったところを考える必要があると思います。

あと、Rustの場合はどこをどういう風に修正すれば良いのか、​​コンパイラが丁寧に教えてくれるので、何を学習すればいいのか明確になっている分、学習コストが高くないのもメリットだと思います。

吉川さん:チーム内にモチベーションが高い人がいることが必須で、その人がどういうポジションにいるのかというのも重要ですよね。例えば自分に決定権があってRustを使いたいと思うのであれば、「Rustでやろう!」と声をかけるだけでもいいのかなと。

決定権のないポジションなのであれば、課題にフォーカスして、それをRustで解決できるということを示して周りを巻き込んでいくことが大切です。

──技術を導入する上で、チーム内にもさまざまな意見がありますし、メンバードリブンで進めることが大切なのでしょうね。

吉川さん:現場じゃない上司や上の人に説明するときは、技術課題とセットで何かを提案することも必要かもしれませんが、チームで決めていいのであれば、メンバードリブンで進めていいと思います。

現状ではRustエンジニアの採用難易度は高い

──続いては「Rustエンジニアの採用・教育」というテーマです。他の言語と比べ、Rustは採用の難易度が高いと思うのですが、実際どうなのでしょう?

吉川さん:採用に関しては難易度が高いと感じています。弊社はFindyで求人を出させて頂いていて、求人票にも「Rustで開発しています」と明記しているのですが、Rust経験者でRustをやりたいエンジニアの採用はまだ出来ていないです。“流れのRustエンジニア”を採用するのは、まだハードルが高いのかなと。

──松本さんはいかがですか?

松本さん:吉川さんと同じく、Rustを書いているエンジニアは現状ではほぼいないように感じています。ただ、「Rustに興味があります」という方は面接に来てくれることがあるので、Rustを書ける人に絞って採用するのではなく、Rust以外の面でスキルの高いエンジニアに、仕事の中でRustを勉強していってもらうことがいいのかなと思っています。

──なるほど。最初からできるエンジニアを採用するのではなく、教育していくということですね。

吉川さん:そうですね。ちなみに、弊社の場合はまだ小さい会社なので教育制度はなく、私がRustでプロダクトコードを書いてそれをメンバーに見せて、1on1などをする中で「自分もRustを書きたいです」という声が上がったら取り込んでいくという感じで進めています。よく言えばOJTですね。

Rustの教育方法についてもいくつかあげてみたのですが、やはり「仕事で使う」というのが一番効果的かつ早く身に付く方法だと思います。

──実務とプライベートだと少し違うところもありますしね。図ではSlackのコミュニティやLTイベントも挙げていただいていますが、こちらはどのような感じなのでしょう?

吉川さん:LTイベントはフォルシアさん主催のLT「Shinjuku.rs」というイベントがありますし、それ以外にも都内では大きいイベントが二つほどあります。年に1度の大きなイベントとして、9月に「Rust.Tokyo」も開催されました。勉強会もありますし、rust-jpのSlackで質問を投げれば、誰かしらが答えてくれます。

──コミュニティが盛り上がってきていて、とても面白そうな状況なんですね。ある種の過渡期でもある中で、言語の進化に携われるというのは大きな魅力だと感じました。

Q&Aセッション

──参加者より「async/awaitは、実務で有用なレベルなのでしょうか」という質問が来ているのですが、こちらはいかがでしょうか?

吉川さん:非同期async/await自体は使える状態ではあると思いますし、私は実務としてプロダクトにも投入しています。個人的にはtokioを主に使っています。少し前にバージョン1になってから、すごい勢いでバージョンが上がっているんですよ。AWSがtokioを採用しているというところで、開発が加速しているそうで。今はまだ群雄割拠ではありますが、今後は急速に安定化していくでしょうし、現状でもプロダクト投入は可能だと思っています。

──ありがとうございます。「Go言語より優れている点を知りたいです」「GoとRustを使い分けするなら、どのようなケースが考えられますか?」という質問も来ていますね。

吉川さん:正直な意見をいうと、そこまで大きな差はないと思っています。Rustを採用する前に、Goについても使ってみたのですが、GCがあるかないかというくらいで、特別優劣があるようには感じませんでした。よく言われるベンチマークの速度などについても、大きな差はなかったように思います。

使い分けるという話では、私自身がちゃんとGoを使えていないので、あくまで予想ではありますが、サーバーアプリケーションやデバイス上のアプリケーションはRust、その周辺ツールはGoで作るというのが良さそうだなと思いました。

──なるほど。続けて「入門レベルから次にステップアップするときに参考にした書籍があれば教えてください」という質問も来ているのですが、こちらはいかがですか?

松本さん:Web上の資料であれば『Rust by Example』(以下:ドキュメント)が一番いいと思います。わかりやすくまとまっているので、これを一通り見ればある程度の知識はつけられます。

本であれば『実践Rust入門[言語仕様から開発手法まで]』です。私はこれを読んで勉強しました。ドキュメントを読んだだけでは整理しきれない部分をカバーできるので、良書だと思います。

吉川さん:あとは『実践Rustプログラミング入門』もぜひ。

松本さん:そうですね。ドキュメントを読んでRustにハマった方は、『実践Rustプログラミング入門』を読んでいると楽しくなると思います(笑)。いろいろなものを作りながらRustを勉強していこうという本ですね。

──僕もまだ読めていないので、『実践Rustプログラミング入門』を読んでHello World!したいと思います(笑)。

Rustを広めるためには、まずは自分がやってみる

──次は「ShellやPython、Nodeなどの言語経験者にどうやってRustを広めるのか」「技術選定でRustを推す場合にチームメンバーをどのように説得していったか」というテーマでお話を伺います。吉川さんからお話しいただけますか。   

吉川さん:はい。そもそもなぜ弊社がRustを選択したかという理由から説明すると、Rustを使いたいからではなく、さまざまな言語を触ってみた中で、Rustが一番いいと思ったからなんです。

理由は上記の図の通りです。弊社はデバイスのプロダクトとサーバーのプロダクトが両方あり、どちらも同じ言語で書きたいけれど、C++のままメンテナンスしたくなかった。そこで、デバイスでもC++と同じぐらいの速度で動いて、サーバーとデバイスの両方を同じ言語で書けるものを探した時に、Rustが条件に当てはまったと。

さらに、当時は私を含めて6~7名しか開発メンバーがいなかったというのも大きいです。アプリケーションチームや品質チーム、テストチームなどを組める状態ではなく、コードレビューに十分な時間を割く余裕もなかった。そのため、コンパイラがある程度までの品質を担保してくれるRustに大きな魅力を感じました。そこからRustの魅力を社内にプレゼンして、自分でもプロダクトを作ってみて、やっとRustを広める土台ができたという感じです。

会社背景的にも、弊社は社長自身がエンジニアで、メインとなるC++のところは、ほぼ社長が作ったものであり、社長の書いたC++を誰がメンテナンスするのかというのが課題でした。当時は組織が拡大している途中で、社長自身がコードを書かないといけないし、社長業もやらないといけないし……、というかなり忙しい状態だったので、「Rustであればコンパイラが品質を担保してくれるので、みんなの技術力も押し上げられますよ」と話して、社長を説得しました。

──最後の一言がかなり効果的だったのでしょうね。フォルシアさんの場合は、松本さんがRust導入を決められたのですか?

松本さん:弊社の場合は、私より上のレイヤーのエンジニアが「Rustでやってよう」と提案してくれて、特に反対もなくRustを導入することになりました。

Rustを導入する前にJavaを試してみていたのですが、GCがネックになるという課題があり、検索を作っている会社なので「GCがある=一定期間止まる=レスポンスが遅くなる」というのを避けたかったんです。そのため「GCのない言語を試してみよう」というのは、自然な流れでした。

Rustを社内に普及させるのは難しくて、まだチームの中だけで使っています。挑戦した方法でいうと、私はまずハンズオンを行いました。そうすると「趣味でRustを書いています」というメンバーが数人出てきたのですが、大多数は「なんとなく理解できた」というところで止まってしまいました。その後はチームに入ってもらって、仕事の中でコードを書いてもらって、私がレビューをするという流れを一緒に回して、その中で解説することで少しずつ馴染んできているのかなと思います。

あとgrepコマンド同等のコマンドラインツールでripgrepというものがあり、Rustで書かれているんですよという話をすると食いつきが良かったりします

吉川さん:Shell Scriptは多分プログラミングとは少し毛色が違うと思うのですが、Rustで書かれた既存の有名コマンドの代替コマンドがたくさんあるんですよ。そういうのを使って「今までfindコマンド使っていたけどfdを使ってみよう」とか、そういったことはShell Scriptユーザーからしてもいいきっかけとなるのではないかと思います。

──ありがとうございます。「RustからC++で実装されたライブラリを呼び出す場合に、性能面や不利な点、不具合を感じた事はありますか?」という質問が来ているのですが、いかがですか?

吉川さん:弊社はC++のライブラリーがあるのでやりたいなと思っているのですが……、本を書くためにインターフェースシートの架け橋の部分をRustで実装してみたというくらいで、実はやったことがないんです。

ただ、そんなに性能面で不利な点はないのではないかと思います。普通のCライブラリ同士のやりとりと、RustとCライブラリのやり取りを比べても、そんなに差を感じることはありません。

Rustを使いたいところというのは、ライブラリ間のやりとりが頻繁にあるというよりは、片方のライブラリもしくはバイナリでの処理が一定時間あって情報を渡すという形だと思うので、RustとCとの界面以外のところではボトルネックになりそうなところはないように設計するのが、アプリケーションの設定として正しいんじゃないかなと考えています。

Rustは難しい言語ではない。気軽に始めてみるところからスタートしよう

──最後にメッセージをいただけますか。

吉川さん:チャットの流れが速くて全部の質問を追えていないのですが、全部答えたかったなと思うくらい、話しても話しても話し足りないという感じで、非常に楽しいイベントでした。これからRustがより広まっていくといいなと思っているので、今日のようにお話しする機会があれば、どこへでも馳せ参じます。みなさん、今後ともRustをよろしくお願いします。本日は楽しい時間をいただき、ありがとうございました。

──ありがとうございます。続けて松本さんお願いいたします。

松本さん:今日伝えたかったのは、「Rustは難しい言語ではない」ということです。今回のイベントを通して「Rustに興味が出てきたぞ」という方は、プライベートからでも始めていただけたら嬉しく思います。本日はありがとうございました。

──吉川さん、松本さん、本日はありがとうございました!

Findyでは、このような技術イベントを定期的に開催しています。

Goをテーマにしたイベントです findy.connpass.com

Rustをテーマにしたイベントの第2弾です findy.connpass.com