天の月

ソフトウェア開発をしていく上での悩み, 考えたこと, 学びを書いてきます(たまに関係ない雑記も)

Webアプリ開発で学ぶRust言語入門 - Forkwell Library #15に参加してきた

forkwell.connpass.com

こちらのイベントに参加してきたので、会の様子と感想を書いていこうと思います。

会の概要

以下、イベントページから引用です。

これまで Forkwell のイベントで登壇されたエキスパートの方々は、先達が記した書籍から「気づき」を得て実践し、振り返り、再現性のある「学び」として身に付けていく中で、実績を築いてこられました。

しかし、日々限られた時間の中で知識や情報をアップデートし続けるのはそう簡単ではありません。 Forkwell Library では、著者・訳者・実践者らを登壇者として招き、そんな思いを抱えた開発者の皆さまが「学びのきっかけ」を得られる勉強会を目指します。

今回の第15回目では2022年9月30日に発売された『Webアプリ開発で学ぶRust言語入門』を取り上げます。RustはフロントエンドのエコシステムやMicrosoft/Google/AWSでも採用されるなど、近年高い注目を集めています。Rustは安全性・並行性・速度にフォーカスしながらも、非常に優れた開発者体験も提供してくれる言語ですが、多くのWeb開発者にとって学習の敷居が高いと感じられています。そこで本書の著者である佐藤 昭文氏をお招きしてRustに入門するためのRustの概要やWebアプリ開発における勘所をお伺いします。

会の様子

基調講演〜Webアプリ開発で学ぶRust言語入門〜

まずは著者の佐藤さんから話がありました。本の宣伝といえばそれまでですが、本を買ってほしいというよりもRustが流行ってほしい気持ちが強いためこの本を書いたということです。

Rustとは

まずRustの特徴の話がありました。

なぜRustでWeb開発するのか?

続いて、どうしてRustでWeb開発をするのか?という話がありました。

  • フロントエンド界隈で、Web Assemblyが台頭したことで、Rustベースのエコシステムが充実してきた(JS以外も動かせるように高い計算量を求められ始めた文脈で登場)
  • 基盤側(AWS, Android, ブラウザの一部)でRustが書けるようになった
Web開発から見たRustの難しさ

低レイヤにフォーカスした入門書が多かったりメモリ管理への恐怖があったりといった理由で、開発者からするとRustに入門しにくいという話がありました。

Rust超入門

ここからは、Rustを0から学ぶために環境構築やHello, worldから説明がありました。以下、触れられていたポイントを幾つか箇条書きで記載していきます。

  • 環境構築は、rustup(バージョン上げるときに使う管理ツール)/rustc(Rustコンパイラ)/cargo(JavaでいうMavenなどと同じ立ち位置のビルドパッケージマネージャ)の3つがあればできる*1
  • 個人の感想だが、エディタはVSCodeがおすすめ(rust-analyzerが優秀)。佐藤さんはずっとIntelliJ派だったがRustに関してはどうしてもVSCodeに軍配があがってしまう
  • cargo new hello_world --bin 後に cd hello_world した先にあるmain.rsが実行エントリポイント
  • 基本データ型は整数型/浮動小数点型/論理値型/文字型/タプル/配列型。低級言語らしく、文字列型はない
  • 変数はデフォルトで再代入できない
  • クラスがなく、構造体が存在する
  • traitで共通の振る舞いを定義できる
axum超入門

Rustに続いて、佐藤さんが推しているRust Webフレームワークのaxumに関して紹介がありました。

  • フルスタックフレームワークではなく、ミニマムフレームワーク(Node.jsのExpressに近いイメージ)
  • actix-webと似た使い勝手だが、axumはマクロフリーで非同期ランタイムが一択
  • axumはtokioという開発者グループが開発しているが、ここはコアライブラリの開発にも携わるようなグループであるため、今後もメンテナンスが続くことが期待できる

といった説明と、簡単なサンプルコードを用いた開発がありました。

sqlx超入門

続いて、DB周りのフレームワークとしてsqlxの説明がありました。

  • シンプルなSQLライブラリ
  • ORMではない
  • コンパイル時にクエリチェック可能だが、チェックしないこともできる
  • dieselDSLベースで多機能なので、よりシンプルで純粋なSQLに近いかたちで使えるのがsqlx

Q&A

基調講演の後は、Q&Aがありました。以下、常体で一問一答形式で内容を記載していきます。

Webアプリ開発言語の中でRustの優位点は?

速度と開発効率と将来性の3点が挙げられる。

速度という話だと、アセンブラやC以外でRustより速く作れることはない。
開発効率という話だと、cargoの存在が大きい。テストやlintがconfigなしで入れられることが大きい。
将来性という話だと、コミュニティやライブラリが拡大傾向にあるのが大きい。

ただ、デメリットももちろんあって、学習難度の高さや市場におけるエンジニアの少なさは現状デメリットだと思っている。(人の出入りが激しいようなPJでは学習コストの高さからRustに向かない)

エコシステムの成長度合いやコミュニティの活発度は?

コミュニティは、日本だとRust好きが集まっているSlackグループ一つだけしかない。エコシステムもまだ発展途上だと思う。

低レイヤー部分に関しては、割と古くからRust使っていこうよという動きがあったので、もっと盛り上がってくるはずだと考えている。

Rust+axumとNode+Expressの比較

Node+Expressのほうが成熟度は高いし関連ライブラリも豊富。

一方でRust+axumの方が実行速度と開発効率も良いという部分が挙げられる。テストがシンプルに書きやすいという点はメリット。

axumとRocketの比較

Rocketにあんまりデメリットはないのだが、axumの方が将来的にメンテンスし続けられるだろうというのポイントとしてある。

今からRustを学ぶおすすめの方法は?

静的型付け言語に慣れているならすぐRustを学べばいいし、静的型付け言語になれていないならTSから学ぶのがよいかな?と思う。
あとは題材には注意。低レイヤーの方にいくとRustよりも題材の難しさに足を取られる。これはRustを学ぶときだけに限った話ではないが、まずはAPIを使ってみようというったように雰囲気を掴むのが重要

WindowsMacどちらで開発するのがよいか?

Windowsに関してはわからない。M1 Macに変えてからDockerでRustをBuildするのにめちゃくちゃ時間がかかるようになってしまったのはある。(M1とDockerの相性が悪いという話な気はする)*2

学習コストが高い原因は何か?

メモリ管理の話が出てきたりと、低レイヤーの知識が必要なことが挙げられる。

axumのルーター実装は分割できるのか?

ルーティング自体の分割自体はできる。axumのドキュメントに書いてあるが、.mergeなどでできる。

シャドーイングの存在理由はないのでは?

意見は分かるが、Rustだと所有権という考え方があって、意図せず参照した場合はコンパイルエラーが発生するのでシャドーイングが危険に感じたことはあまりない。

ライフタイム攻略の勘所が知りたい

他の言語だとほぼない概念なので非常に難しい。勘所というのは現状だとない。

Rustのコンパイル時間はネックにならないのか?

個人の感想になってしまうが、ある程度パッケージを落としていれば割と速い。API開発だとめちゃくちゃ速い。

佐藤さんがRust書いていて一番楽しいときは?

関数型言語っぽさや抽象化のしくみがうまくできているところがすごく好き。

会全体を通した感想

Rust未経験でも分かるくらい丁寧に説明してくれて、Rustの魅力が伝わる会でした。

元々Rustに興味があったということもありますが、今日の会を聞いてRustの面白さやはまるポイントがある程度わかったので、佐藤さんの本を買って動かしていこうと思います。

*1:https://restup.rscurl実行

*2:なお、M2 Macだとdocker-compose.ymlのenvironmentにCARGO_BUILD_TARGET_DIR: /tmp/targetを書くと速くなったという声もありました