ふつうのウェブエンジニア向けRust入門書『RustによるWebアプリケーション開発 設計からリリース・運用まで』

私たちがRustを学ぶ際の障壁

ウェブエンジニアにとってRustを学ぶ際の最大の障壁は、その適用分野がもともと高度である点です。
Rustは主にシステムプログラミングやC++の置き換え、ビルドツールの最適化といった専門的な領域で活用されています。
これらの分野に馴染みがないウェブ開発者にとって、Rustのエコシステムを学ぶことは簡単ではありません。
本書はそのようなエンジニアが、既存の仕事の道具をRustに置き換える時のガイドとして最適です。
システムの一部をマイクロサービスに切り出すケースや新規プロジェクトのバックエンドでRustの採用を検討したりする場面で活用できます。
そのため、この書籍はウェブのバックエンドエンジニアがRustエコシステムを実践的に学ぶための最適なリソースといえるでしょう。

本書の特徴

本書の特徴は、バックエンド開発者が普段行う作業をRustに置き換えて学ぶことができる実践的な内容にあります。
その中心は、ハンズオン形式でシンプルなCRUDアプリケーション(蔵書管理システム)のバックエンドWeb APIを開発するというアプローチです*1
本書は、C++で行うシステムプログラミングの置き換えやWasmを用いたブラウザで動くアプリケーション機能の実装、またRust言語そのものの体系的なリファレンスではありません。
ウェブ開発という領域で、よりリアルワールド志向で、フロントエンドやインフラチームとの協調を念頭に置いた現場のチーム開発に即した内容を重視しています。

Rust自体の副読本の併用を推奨

本書は、シンタックスレベルでのRustの基本的な言語機能についての理解を前提としています。
そのため、Rust自体をはじめて使う読者へは副読本の併用が推奨されます。
私自身は、Oreillyから出版されている『プログラミングRust』を活用しました。
この本は、Rustの細かい構文や仕組みについてもっとも詳細に解説されている一冊だと思います。
また、テスト駆動開発(TDD)の第一人者であるt-wadaさんもこの書籍でRustの理解が捗ったと言及されています。

speakerdeck.com

システム全体の技術スタック

本書で提案されているシステム全体の技術スタックは、リアルワールドのプロジェクトにおいて採用されやすい最大公約数的な構成となっています。
バックエンドでは、非同期ランタイムのデファクトスタンダードであるtokioをベースにしたWebフレームワークのAxumを使用し、データベース操作にはsqlx、ビルドツールとしてcargo-make、そしてテストにはcargo-nextestをはじめから用いてcargo-workspaceのモノレポ構成でスタートします。
フロントエンドにはReact系のNext.jsを採用していますが、バックエンドのAPIとは分離されているので他のフレームでも問題なく適応可能です。
本書内ではフロントエンドの実装解説はありませんが、バックエンドAPIをシンプルに利用するGUI構築を念頭に置いており、理解するのは容易です。
インフラ部分では、バックエンドのデプロイにAWS App Runner、フロントエンドにAWS Amplify、そのIaCツールとしてTerraformを使用します。
書籍内にデプロイ関係の詳細な解説はありませんが、運用・監視のための設計に関する説明が後半に含まれています。
現実の新規プロジェクトでもそのまま参考にしやすい実践的な提案と言えるでしょう。

完成形のコードがGitHubリポジトリで公開されており、フロントエンドやインフラ構築コードも含まれているため、読者が自分でAWS環境にデプロイ可能な形になっています。

本書の実装範囲のリポジトリ:
https://github.com/rust-web-app-book/rusty-book-manager

フロントエンドを含むデプロイのドキュメント:
https://github.com/rust-web-app-book/rusty-book-manager-template

独自のレイヤードアーキテクチャの提案

本書の最大の特徴は、独自のアプリケーションレイヤーを通じて、Web APIの構築に焦点を絞った独自のレイヤードアーキテクチャを提案している点です。
広義のレイヤードアーキテクチャは、プレゼンテーション層からインフラストラクチャ層まで、システムを外から内へと水平に層を分けるアーキテクチャパターンです。
このアプローチでは、たとえばレイヤー毎にモジュールやディレクトリ構造を分け、依存先の参照ルールをチーム内で統一することで、プロジェクトの保守性や可読性の向上を目指します。
書籍『ソフトウェアアーキテクチャの基礎 ―エンジニアリングに基づく体系的アプローチ』ではレイヤードアーキテクチャは「小規模なコードベースに対してもコストパフォーマンスの良い形で適用可能な点」が評価されています。
本書では、モジュールの境界をapi, kernel, adapterのレイヤーごとに設定し、registryにrepositoryのインターフェイスを定義して依存します。
それをCargo Workspaceを用いて各レイヤーを個別にビルドできるように設計されています。

このアーキテクチャの考え方は、Rustに限らず、さまざまな薄いフレームワーク(マイクロフレームワーク)でも適用できる点で興味深いです。
たとえば、GoやPythonのFastAPI、TypeScriptのHonoなどで実装している時にも同じ課題を抱えます。
これらのマイクロフレームワークは、MVCのように機能ごとのモジュール構成をあらかじめ提案するのではなく、設計方法に意見を持たない構造であるため、開発者が自らアーキテクチャを設計し、実装していく必要があります。
なので、フレームワークのコミュニティごとに解決するミドルウェアやライブラリが活発に開発されています。
この自由度の高さにより、言語ごとの特性を活かした構成が可能になるため、本書ではRustのエコスステムを学ぶ上でも優れたアプローチといえます。
本書の設計思想は先のとうり現場での実践を想定しているので、著者陣が「今仕事でRustを書くならこんな構成」という意見を提供してくれていると言えるでしょう。

とはいえ、まだRustを使ったWeb開発にはデファクトなパターンが存在しないため、読者もそれを考慮する必要があるでしょう。
実際、本書の刊行後にも著者のhelloyukiさんによって改善案が検討されており、たとえばエンティティを横断するロジックをService層に集約する構成が提案されています。

speakerdeck.com

このService層の考え方についても、各コミュニティには異なる流派があり、DDD(ドメイン駆動設計)やマイクロサービスの実践においてさまざまなアプローチが存在しておもしろい点です。

おわりに

『RustによるWebアプリケーション開発 設計からリリース・運用まで』は、現場のエキスパートによる実践的な知見が詰まった一冊です。 Rustを学びたいが、どこから手をつければよいかわからないというバックエンドエンジニアにとって、最適な入門書といえるでしょう。

PS: 電子版が出るそうです

*1:似ている本:詳解Go言語Webアプリケーション開発のRust版のような構成です