RustでTodoアプリを実装
はじめに
昨年に掲げた目標通り、開発の基礎学習としてRustでTodoアプリを実装しました。1月中に終わらせようと思っていましたが、意外と大変で、2月までかかってしまいました...
Rustの勉強として、以前RustによるWebアプリケーション開発の読書日記に記載の通り作ってみました。 ただ、本を読んだだけだと自分の中で理解できていないところが多いなと感じたので、実際に自分が作りたいTodoアプリに沿って作ってみました。
作ったもの
パブリックリポジトリとして公開しました。
以前、学習の参考にさせていただいたRustによるWebアプリケーション開発 設計からリリース・運用までをベースに、以下のような機能を実装しました。
- ユーザのCRUD
- TodoのCRUD
- ログイン機能
アーキテクチャもほぼ同じで、以下のようにしています。
| 名前 | 概要 |
| --- | --- |
| api/ | 画面からの入力情報を受け取るレイヤー。axumのルーティング周りを描いている |
| kernel/ | 受け取った入力情報をアプリケーションが扱いやすいデータ形式に変換しつつ、必要な処理をかける |
| adapter/ | 永続化層(今回だとPostgreSQLとRedis)にアクセスし、データを保存するレイヤー |
ただし、kernel層にusecase層を追加しました。api層の中でkernel層のリポジトリインターフェースを呼び出していたり、adapter層の中でトークンのチェックをしていたりすることに違和感を覚えたため、AIと相談してusecase層を追加しました。
あくまでも個人的な考えなので、ベースを否定するつもりはありませんし、これが正解というわけでもないと思います。
あとは自分がオブザーバビリティ屋なので、GooseとGrafanaを追加しました。 Rustの学習がメインなのでフロントエンドは動作確認のおまけ程度にAIで作成しました。
実装の進め方
AIを活用
今回は短期間で終わらせたいということもあってAIを活用しました。今回のAIの使い方は以下の通りです。
- アーキテクチャ・実装方針の壁打ち
- コードの書き方・文法などわからないことがあれば徹底的に聞く
- テストやリファクタリングを積極的にAIに実装してもらって、自分は機能実装に集中する
- 自分の設計やタスクは積極的にMarkdownに残す
本をベースにしているとはいえ、文法的にもやっていることとしても理解できていないところがたくさんあり、AIに教えてもらいながらゼロから書くことで自分の理解が深まった気がします。 AIを活用することで理解力が下がらないように以下を心がけました。
- 1回正解を聞いて終わりではなく、自分の解釈をぶつけてみて合っているか聞く
- 教えてもらったことでわからないことがなくなるまで聞き続ける
- 翌日わからないことがあったら反復して聞く
- 勉強なので今のコードベースではなく、一般的なアーキテクチャとしてどうあるべきかを考える
テスト駆動開発
今回はテスト駆動開発を試みました。大まかな流れは以下の通りです。
- 実施するテストケースの認識合わせをする
- 自分がテストケースを承認したらサブタスクとして列挙する
- 列挙が完了したらAIがテストを実装する
- 実装後、AIが自分に対して必要な実装を列挙する(AIは実装はしない)
- AIが作成したテストに対して自分が実装を行い、実装してOKになったら次のテストケースへ行く
良かった点は2つあって、1つはテストケースの作成の中で毎回仕様を意識してきちんと決められたことです。2つ目は、実装する中でリファクタリングしたくなることが何回かあったのですが、テストがきちんと実装されているので安心して自分(あるいはAI)でリファクタリングできたことです。
欠点はほぼないのですが、強いて言うならば、単純な機能開発でも少し時間がプラスされるのと、AIにテスト実装を任せると機能の大半を実装して勉強にならないことがあるくらいです。対策として少し先回りして自分でやったり、AIにやらないでと明示的に指示しました。 事前に聞いていたり、仕様駆動開発が出てきたりとなんとなくわかっていましたが、実際にやってみてAIとテスト駆動開発の相性はいいですね。
感想
やればやるほど、これ実装したいなと思うことが増えていきますが、他の勉強がひかえているので今回はこれまでにしておきます。JWT周りの実装の備忘として残したいなと思ったので、別記事で書く予定です。
AIを通して学習の仕方が変わったなと感じる体験でした。今まで新しいことをやるのにハードルが高かったのですが、隣にAIという先生をおくことで、そのハードルが一気に下がったと感じました。 ただ、教えてもらうだけになってしまうと定着しないので、学ぶもの・目標値に合わせて使い方を気をつけないといけないですね。
最後まで読んでいただきありがとうございました。