🙄

「Webアプリ開発で学ぶ Rust言語入門」完走した感想

2022/12/16に公開

Rust に興味があったので、以下の書籍で入門してみました。

https://www.shuwasystem.co.jp/book/9784798067315.html

Rust で Todo アプリの API サービスを構築しつつ、TypeScript+React を使って作った API を利用するフロントエンドも構築する、といった内容になっています。

きっかけ

KOBA789 さんが WEB+DB Press Vol.122 に寄稿した「Rustで実装!作って学ぶRDBMSのしくみ」を拝見したのがきっかけです

https://diary.hatenablog.jp/entry/2021/04/08/190000

https://youtu.be/eWDkIz9BN0A

https://github.com/KOBA789/relly

もともと低レイヤーやデータベースの仕組みに興味があって、その文脈でこの方のアウトプットを見つけました。この特集で Rust を使っているとのことで興味が出ました。

なお、以前にチュートリアルした後 relly のコードを見ましたが、構文理解の時点で詰まってしまいまっっったく歯が立ちませんでした。未だにこちらのコード読めてないんですが、本書読了後の今なら多少状況はマシになってると願いたいです

成果物

こちら。

https://github.com/hassaku63/rust-webapp

一部の章の進捗は git tag でピンしてます。

あと、雑に wiki にメモを残しています。6章付近で大迷走してて、わからんなりに sqlx のソースとドキュメントを往復したりしてました。当時のメモを雑に貼っておきました。

なお、上記の最新コミットはフロントエンド側の主役コンポーネントにあたる Todo のリスト & 編集を行う UI コンポーネントの実装が不完全です。レイアウトが書籍の完成イメージから乖離してて、しばらく悩んでたのですが本書のメインコンテンツではないので(不本意ながら)棚上げして進めました。

前提知識

本書にトライする前の私の状況です。

言語経験

Lang Description
Python 人に教えられる程度
TypeScript まれに AWS CDK で触る程度
JavaScript ES5 の時代に jQuery と一緒に戯れてたくらい
Rust The Rust Programming Language 日本語版 に出てくる内容を途中まで履修した程度。字面に慣れてなく目が滑る。サンプルコードを見ても、構文上の意味を理解できないコードがちょいちょいあった
C 学生時代に「アルゴリズムとデータ構造」的な単元でやってた程度。ポインタ等の概念は理解している

言語以外の技術スタック

Skill Description
フロントエンド 大昔に ES5 + jQuery ベースで素朴なマップアプリを組んだことがあり多少の知識はある。ちゃんとしたアプリを単独で開発するのは厳しい。また、マークアップとそのレンダリングに関係する仕様の理解度がキツい
バックエンド バックグラウンドのグルーやバッチ系アプリケーションは単独で作れる程度。Web アプリケーションバックエンドは多少わかるがスクラッチでサクサク作れるほどではない
React FC や useState, useEffect を使った構成をなにかの書籍でやったことがある、、という程度
Docker 雰囲気しか知らない。開発環境で最低限の docker-compose を作ったりはする程度
PostgreSQL 雰囲気しか知らない。実務経験少なめ

総評

自分は大変飽きっぽい性分で完走しないまま積ん読が増える、的なことが多かったんですが、今回久しぶりに書籍を1冊完走した気がします。

Web アプリケーションの構築という題材で見ても、docker-compose を用いたローカル環境の整備やバックエンドのテストシナリオ実装、フロントエンドの構成など、Rust のみならず Web アプリケーション開発の初学者にとって大変実践的な内容と感じました。ボリュームもちょうどよい塩梅ですし、大変満足しています。お値段もお手軽すぎます。1,980円ってもはや布教用のサービス価格ですよねこれ...。

総合評価としては大満足なのですが、あえて不満よりのフィードバックを挙げるとすれば以下の3点です。いずれも総評を覆すほどのものではないです。

(1) コードスニペットの幅と行数が紙面に対して膨れ気味で読みづらかった

サポートページに GitHub へのリンクがあるので、いざとなればそっちを見れば良いです。さほど大きな障害ではないと思います。
あと、確かに読みづらさのストレスこそありましたがその分構文やロジックの要素を細かい粒度でチェックしながらタイプすることが多かったので結果的に自分のような基礎構文習得中の人間にはそれでよかったのかもしれません

(2) 最終成果物の実装ボリューム

API 実装や DB のデータ構造は最小限という感じでしたので、もうちょい本格的な要件に立ち入ったサンプルを見たかった感はありました。ただ、その領域は Rust 入門の主旨から外れていくし紙面も嵩むので、今のボリューム感がちょうどよいバランスであろうと思います。

(3) DBレイヤーのテストコードについて

6章冒頭セクションで実装したデータアクセス層のテストシナリオ (TodoRepository, LabelRepository) が、テストデータの内容とテストの実行回数に依存して失敗しうる不安定な構成に見えました。

細かいことを書くと長くなるのでその内容は wiki のメモ(後半部分)に譲りますが、要するに TodoRepository と LabelRepository のテストケース間で重複するラベル名を用いると1回目の副作用で2回目以降のDBテストが外部キー制約により失敗する、という事象です。個人的にはデータ依存で失敗するテストはあまりお手本としては好ましくないような?と感じました。

DB レイヤーを含むテストシナリオを今回のように構成するのであれば、実行の不安定さを取り除くためにできる工夫や押さえておくと良い知識を一緒に言及していただきたかったかな、と思います。たとえば cargo のテストランナーの仕様に関する解説とか、テストケースを構成する上での留意点とかです。まぁ、これらは Rust というよりアプリケーション開発の一般的な話題に寄っている話なので本書のコアからは少々外れる話かな、という気もします。

本書の読み進め方

The Rust Programming Language 日本語版 での予習は本書を読み進めるにあたって非常に有用でした。他の言語での開発経験がある人であれば、いったんはこのサイト(もしくは別の書籍・ドキュメント等)で基礎を多少履修してから取り掛かった方が読み進めやすいと思います。所有権やらトレイト境界やらの概念は押さえておいた方が良いと思います。本書でも前半パートで解説がありますが、それほど紙面を割いていません。
また、Python のようにさほどジェネリックが一般的でない言語のユーザーであれば、どこかしらのタイミングで概念理解を補完する必要があると思います。本書以外のコードもいくつか眺めてみて感じたことですが、Rust ではジェネリックとトレイトを組み合わせた書き方を多用します。これらの概念を理解していないと進捗効率はだいぶ下がると思います。

全6章のうち、最後の2章はフロントエンドのトピックが多くなります。が、TypeScript や React の知識は最悪なくてもOKで、最悪読み飛ばしても進められるようなアプリ構成と章立てになっていると思います。
フロントエンドの章が始まったあとでバックエンドの実装に戻ってくるタイミングがあるので、その時点でフロントエンドが何をしているかうっすら把握できてれば補完できると思います。そもそも今回作るのは API サービスなので、フロントエンドがなくとも curl で動作検証は代用可能です。安心して購入しましょう。

Discussion