RustでWebバックエンドの所感

2021年12月10日

Profile
曽根敬雄 Takao Sone
ソフトウェアエンジニア
Twitter

こんにちは曽根敬雄(そねたかお)です。

僕は2021年の5月からWebバックエンドの第一言語としてRustを選択しています。
今日はRustをWebバックエンドの第一言語とすると決めてから今日までの所感をまとめてみようと思います。

要約

  • Rustとactix-webを使用したバックエンド開発には満足
  • 連携したいサービスのSDKがRustで提供されていない場合あり
  • 問題解決は英語ベース

前提

僕はプログラミング言語、フレームワーク、ライブラリについて特定の好みはありません。 Rustを選択している今でも「Rust最高!」みたいな思いはありません。 かと言って様々な実測値をもとに他の言語と比較してロジカルに使用技術を決める人間でもありません。 チームで動いている場合はチーム環境を最優先し、そうでなければ好奇心をもとに技術選定をしています。

そんな人間の感想だと割り引いて読んでください。

Rustを選択した理由

信頼しているエンジニアの友人複数から「Rustはいいぞ」という意見を聞いたことが主な理由です。
優秀な人達に気に入られているRustはどんなものなのか、とても気になりました。

上記に加え、

  • Stack Overflowの調査で最も愛されている言語である
  • ガーベージコレクションがない
  • C/C++寄りの言語(個人的印象)

という要素が僕の好奇心を見事にとらえました。

習得難易度が高いとの意見も見られましたが、 ソフトウェアエンジニアとしてのキャリアを選んだ以上難易度を理由に諦めるということはしないと決めているので無視しました。

基礎知識の学習方法

  1. ネット上で基本的な文法を確認
  2. Rust Web Programming でRustとactix-web(webフレームワーク)とdiesel(ORマッパー)の基礎を学習
  3. Github上のactix-webとdieselを使用したRealworld系のリポジトリをリバースエンジニアリング
  4. リバースエンジニアリングして得た知識をもとに実プロジェクト構成に近いアプリを作成

特に重要なのは3のリバースエンジニアリングだと思います。
世界中の良心的な方々が公開してくれているコードを解析し実践的な実装方法を学ばせていただくことができます。 読み解けないコードが出てきたら都度公式レファレンスを確認していました。
Fromトレイトを利用したエラーハンドリングの方法など、重要な実装の理解はこのリバースエンジニアリングによるところが大きいです。

リバースエンジニアリングは根気のいる作業ですが、Rustの学習に限らずどんなプログラミングの学習にも活かせる優れた方法だと思います。 巨人の肩を貸していただきましょう。

4ではリバースエンジニアリングでインプットした知識をアウトプットするため、機能が簡易なアプリケーションを本番構成に近い形で実装してみます。
僕の場合は workplus というアプリをRust・actix-web・dieselに加え、インフラとしてECS・BLUE/GREEN Deploy・Aurora PostgreSQLを組み込むことを必要条件として作りました。
(現在workplusはより縮小したインフラ構成で運用しています。)

また、2以降はSlackやDiscord上でやり取りできるRustコミュニティに参加し情報収集を併行しました。

特に初心者用の質問チャンネルに流れてくる投稿を自分が理解しているかどうか判断し、理解していない場合は回答を読んだりレファレンスを調べたりして知識を補完していきました。

困ったこと

ライフタイムや所有権など慣れない概念もあり素早く理解できたとは言えませんが、これらは慣れの問題だと考えていたので想定内に収まったと思います。

しかし、連携したいサービス側でRust用の公式SDKが提供されていない場合があり、そのような場面ではSDKが存在するプログラミング言語よりも実装に時間がかかっていると思います。

僕の場合は以下サービスが該当しました。

  • Stripe (決済)
  • Google Identity (認証)
  • AWS (インフラ)

詳細な理由は省きますが、上記の公式Rust用SDKが存在しないサービスは以下の対応をしました。

  • StripeはSDKで提供される機能を自前で実装
  • Google IdentityはRustでの自前SDK実装を諦め、JavaScript用の公式SDKを使用しAWS Lambdaの一関数としてactix-web側から呼び出し
  • AWSはサードパーティライブラリの Rusoto で対応
    (AWS SDK for Rust が公式から出ていますが現在のステータスは developer preview であり、2021年12月10日時点では本番環境への導入は推奨されていません。)

RustでWebバックエンド開発に挑む人へ

困ったことで挙げたように、Webバックエンド開発にメジャーな言語と比較するとRustのWeb開発エコシステムは弱い印象があります。
しかし、ある程度の経験がある開発者の方なら対処法は容易に思いつく可能性が高いのではないでしょうか。
「RustでWebバックエンド開発をする!」という意気込みがあれば大丈夫かなと僕は考えています。

また、日本語の情報は限られているので英語で情報を探すことができない場合はかなり苦しむと予想されます。
DeepLやブラウザの翻訳機能を使えば対応できそうな気もしますが、僕自身が使わないのでどこまでできるかはわかりません。

まとめ

RustをWebバックエンドの第一言語にすると決めてから今日までのことなどをざっくりと書いてみました。

KotlinとSpring、GoとGinの組み合わせと同様にRustとactix-webで問題なく開発できているので現状満足しています。
RustでのWeb開発は他の言語と比較してエコシステムが弱い気がしますが、 便利なものがないからこそ自分で考える機会が増えてソフトウェアエンジニアしてるなと感じる機会も増えています。

低レイヤーの分野では言わずもがな、Webフロントエンド領域でもRustの存在が大きくなりつつある気配がしています。
そんなRustに期待しながら、ヒープ領域を無駄に使いがちなコードからの脱却を目指して日々精進していきたいと思っています。




余談


以下、募集終了させていただきました。 (2021-12-24)



知的負荷が高い仕事にケリが付いたので時間ができました。

週3程度の稼働なら可能になったので大変そうな仕事があればお話待ってます。準委任でも請負でも。 以前誘っていただいた方は後日必ず連絡するので少しお待ちを。

技術スタックは昔と変わりませんが載せておきます。
PHP、Ruby、Pythonは久しく触ってないので避けていただければ。

フロントエンド

  • TypeScript . React . Vue . Next.js . Nuxt.js

バックエンド

  • Rust . actix-web

インフラ

  • AWS . Terraform