Slide 1

Slide 1 text

普段TypeScriptとか書いてる 普通のWebエンジニアが Rustで新規プロダクト開発に 挑んでみた 株式会社アダコテック 谷口 俊博

Slide 2

Slide 2 text

Confidential & Proprietary | 2 自己紹介 谷口 俊博(toshiokun) / @toshiokun_0322 株式会社アダコテック プロダクト開発部 エンジニア 好き: 麻雀 - アダコテック麻雀部所属 - 元セガサミーフェニックスの魚谷侑未推し ランニング - フルマラソン完走経験あり - 最近腰を痛めて走れていない

Slide 3

Slide 3 text

Confidential & Proprietary | 3 自己紹介

Slide 4

Slide 4 text

Confidential & Proprietary | 4 自己紹介 としおくんのスペック ● TypeScriptを中心にキャリアを積んだフロントエンドエンジニア ● Java、Ruby、PythonでのAPI開発の経験もあり ● Rust歴は2024年6月時点でゼロ

Slide 5

Slide 5 text

Confidential & Proprietary | 5 本日の内容 - 本日の発表の主な対象者、ゴール - アダコテックでRustを採用した経緯 - Rustを採用してみてどうだったか? - RustによるREST APIの具体的な実装方針の紹介

Slide 6

Slide 6 text

Confidential & Proprietary | 6 本日の発表の主な対象者、ゴール

Slide 7

Slide 7 text

Confidential & Proprietary | 7 本日の発表の主な対象者、ゴール 主な対象者 RustによるWebアプリケーション開発に興味があるけど、社内での導入に は至っていないRust未経験の方 ゴール Rust未経験者である自分の、等身大の技術選定過程を伝え、今後Rustを採 用する際の参考になること

Slide 8

Slide 8 text

Confidential & Proprietary | 8 アダコテックでRustを採用した経緯

Slide 9

Slide 9 text

Confidential & Proprietary | 9 アダコテックでRustを採用した経緯 弊社採用サイトから引用

Slide 10

Slide 10 text

Confidential & Proprietary | 10 アダコテックでRustを採用した経緯 アダコテックのプロダクトの構成について Webアプリケーション 画像処理基盤 機械学習基盤 Windows アプリケーション 画像処理基盤 機械学習基盤 フロントエンド API

Slide 11

Slide 11 text

Confidential & Proprietary | 11 アダコテックでRustを採用した経緯 アダコテックのプロダクトの構成について Webアプリケーション 機械学習基盤 Windows アプリケーション 機械学習基盤 ここをRustで書いていた 画像処理基盤 画像処理基盤 フロントエンド API

Slide 12

Slide 12 text

Confidential & Proprietary | 12 アダコテックでRustを採用した経緯 アダコテックのプロダクトの構成について Webアプリケーション 画像処理基盤 機械学習基盤 Windows アプリケーション 画像処理基盤 機械学習基盤 こっちもRustで書けるかも? フロントエンド API

Slide 13

Slide 13 text

Confidential & Proprietary | 13 アダコテックでRustを採用した経緯 Pythonでの開発で何が不都合だったのか?

Slide 14

Slide 14 text

Confidential & Proprietary | 14 アダコテックでRustを採用した経緯 研究開発 性能判定 プロダクトへの 組み込み - アダコテックの主な開発の流れ

Slide 15

Slide 15 text

Confidential & Proprietary | 15 アダコテックでRustを採用した経緯 研究開発 性能判定 プロダクトへの 組み込み 試行回数が重要なので、簡単にスクリ プトを組めるPythonが最適 原則、研究開発用の個人の環境で完 結するため、メンテナンス性は意識し ない

Slide 16

Slide 16 text

Confidential & Proprietary | 16 アダコテックでRustを採用した経緯 研究開発 性能判定 プロダクトへの 組み込み 試行回数が重要なので、簡単にスクリ プトを組めるPythonが最適 原則、研究開発用の個人の環境で完 結するため、メンテナンス性は意識し ない 研究開発で使用したメンテナンス性が考慮さ れていないPythonコードのまま組み込まれる メンテナンスをするのは、研究とは別のメン バーのため、保守運用のコストがかさむ 転用

Slide 17

Slide 17 text

Confidential & Proprietary | 17 アダコテックでRustを採用した経緯 研究開発 性能判定 プロダクトへの 組み込み 試行回数が重要なので、簡単にスクリ プトを組めるPythonが最適 原則、研究開発用の個人の環境で完 結するため、メンテナンス性は意識し ない 研究開発で使用したメンテナンス性が考慮さ れていないPythonコードのまま組み込まれる メンテナンスをするのは、研究とは別のメン バーのため、保守運用のコストがかさむ Pythonの言語仕様の問題だけではないが、 プロダクトに組み込む際には言語仕様で実装を縛ることで、 上記の問題を解決したかった

Slide 18

Slide 18 text

Confidential & Proprietary | 18 アダコテックでRustを採用した経緯 Web開発関連のエコ システム 社内ノウハウ 弊社AIエンジニアのコ ンバートしやすさ TypeScript ◯ ◯ △ Java ◯ ✕ ✕ Rust △ ◯ ◯ - 静的型付け言語の中でアダコテックと相性の良い言語を選定 - TypeScriptと悩んだが、画像処理基盤と同じ言語で開発できるの で、Rustを採用することにした

Slide 19

Slide 19 text

Confidential & Proprietary | 19 Rustを採用してみてどうだったか?

Slide 20

Slide 20 text

Confidential & Proprietary | 20 Rustを採用してみてどうだったか? Q. Rustは難しくなかったか?

Slide 21

Slide 21 text

Confidential & Proprietary | 21 Rustを採用してみてどうだったか? A. 難しかった。けどなんとかなった

Slide 22

Slide 22 text

Confidential & Proprietary | 22 Rustを採用してみてどうだったか? ● なんとかなった理由① ○ キャッチアップ するための学習素材は十分にあった ■ Rustツアー ■ Rustlings ■ 『手を動かして考えればよくわかる 高効率言語 Rust 書き かた・作りかた 』

Slide 23

Slide 23 text

Confidential & Proprietary | 23 Rustを採用してみてどうだったか? ● なんとかなった理由② ○ 社内に実績があり相談相手がいた ■ ztd_rustというチャンネルで Rustで困ったことを相談 ■ 週次の技術LT会でRustに関す る知見を共有

Slide 24

Slide 24 text

Confidential & Proprietary | 24 Rustを採用してみてどうだったか? ● なんとかなった理由③ ○ 困ったときのChatGPT ■ 普通に検索しても出てこな い質問に対しても適切に回 答してくれた

Slide 25

Slide 25 text

Confidential & Proprietary | 25 Rustを採用してみてどうだったか? よかったこと

Slide 26

Slide 26 text

Confidential & Proprietary | 26 Rustを採用してみてどうだったか? ● よかったこと① ○ 言語仕様で適切に実装に対する縛りをしたいというニーズは満 たせた

Slide 27

Slide 27 text

Confidential & Proprietary | 27 Rustを採用してみてどうだったか? 変数は基本的にイミュータブル なので、想定外の副作用を含む 関数が実装されない (変更するなら mut が必要) 所有権の考え方を使うと、変 数の扱う範囲を明確にするこ とができる

Slide 28

Slide 28 text

Confidential & Proprietary | 28 Rustを採用してみてどうだったか? ● よかったこと② ○ Result型を使うことで、シンプルかつヌケモレのない例外処理がで きる

Slide 29

Slide 29 text

Confidential & Proprietary | 29 Rustを採用してみてどうだったか? Result型を返すことで、 例外処理を呼び出し元に 強制することができる Pythonだと、 try~exceptが なくても動作は してしまう

Slide 30

Slide 30 text

Confidential & Proprietary | 30 Rustを採用してみてどうだったか? ● よかったこと③ ○ Lintエラーやテスト基盤が言語仕様として組み込まれている ■ 以下は使用されていない変数に関するwarning

Slide 31

Slide 31 text

Confidential & Proprietary | 31 Rustを採用してみてどうだったか? 大変だったこと

Slide 32

Slide 32 text

Confidential & Proprietary | 32 Rustを採用してみてどうだったか? ● 大変だったこと① ○ コンパイルに時間がかかる ■ インクリメンタルビルドで49秒かかる(20000行規模)

Slide 33

Slide 33 text

Confidential & Proprietary | 33 Rustを採用してみてどうだったか? ● 大変だったこと② ○ RustのWebアプリケーション周りのエコシステムはまだ成熟してい ない ■ デファクトスタンダードになるようなフレームワークはない ■ ORM周りがRailsやSQLAlchemyに慣れていると、かゆいところ に手が届かない

Slide 34

Slide 34 text

Confidential & Proprietary | 34 Rustを採用してみてどうだったか? https://codezine.jp/article/detail/17528?p=3

Slide 35

Slide 35 text

Confidential & Proprietary | 35 Rustを採用してみてどうだったか? ● 不親切すぎるORMのエラーメッセージ ○ 以下はRustのstructの型とテーブルのカラムの型が一致してい ないときに発生するエラー

Slide 36

Slide 36 text

Confidential & Proprietary | 36 Rustを採用してみてどうだったか? 結論

Slide 37

Slide 37 text

Confidential & Proprietary | 37 Rustを採用してみてどうだったか? RustでWebアプリケーション開発、、、 やれなくは、、、ない!

Slide 38

Slide 38 text

Confidential & Proprietary | 38 RustによるREST APIの具体的な実装方針の紹介

Slide 39

Slide 39 text

Confidential & Proprietary | 39 RustによるREST APIの具体的な実装方針の紹介 ● 技術選定 ○ Webフレームワーク ■ Actix Web ○ ORM ■ Diesel ○ エラーハンドリング ■ thiserror, anyhow ○ OpenAPI ■ utoipa

Slide 40

Slide 40 text

Confidential & Proprietary | 40 RustによるREST APIの具体的な実装方針の紹介 ● 設計 ○ Actix Webは基本的なリクエストルーティングの機能しかない ため、全体構成は自分で考える必要がある ○ 以下リポジトリを参考にしてレイヤードアーキテクチャっぽく 設計した ■ https://github.com/snamiki1212/realworld-v1-rust-a ctix-web-diesel

Slide 41

Slide 41 text

Confidential & Proprietary | 41 RustによるREST APIの具体的な実装方針の紹介 ● 設計

Slide 42

Slide 42 text

Confidential & Proprietary | 42 RustによるREST APIの具体的な実装方針の紹介 ざっとコードをお見せするので、 大まかな雰囲気を掴んでいただければ幸いです

Slide 43

Slide 43 text

Confidential & Proprietary | 43 RustによるREST APIの具体的な実装方針の紹介 ● Entry Point

Slide 44

Slide 44 text

Confidential & Proprietary | 44 RustによるREST APIの具体的な実装方針の紹介 ● Controller

Slide 45

Slide 45 text

Confidential & Proprietary | 45 RustによるREST APIの具体的な実装方針の紹介 ● Usecase

Slide 46

Slide 46 text

Confidential & Proprietary | 46 RustによるREST APIの具体的な実装方針の紹介 ● Domain

Slide 47

Slide 47 text

Confidential & Proprietary | 47 RustによるREST APIの具体的な実装方針の紹介 ● Repository

Slide 48

Slide 48 text

Confidential & Proprietary | 48 RustによるREST APIの具体的な実装方針の紹介 ● ORM(Diesel) ○ テーブル結合のクエリ ○

Slide 49

Slide 49 text

Confidential & Proprietary | 49 RustによるREST APIの具体的な実装方針の紹介 ● ORM(Diesel) ○ 集計をしたりする場合には、生SQLをstructにマッピングする 方が簡単なケースが多い

Slide 50

Slide 50 text

Confidential & Proprietary | 50 RustによるREST APIの具体的な実装方針の紹介 ● カバレッジ計測 ○ llvm-covというクレートを使うとCodeCovでカバレッジを計測 できる

Slide 51

Slide 51 text

Confidential & Proprietary | 51 結び Webアプリケーション開発の手段としてRustを採用するには、まだ関連の ライブラリが整っているとは言えません ただ、Rustの言語仕様にはそれ自体の魅力があり、今後Web側の開発事例 が増えていく可能性はあると思っています 興味が少しでもある方は、ぜひ一緒にRustのWeb開発のエコシステムを 作っていきましょう

Slide 52

Slide 52 text

アダコテックでの開発に興味のある方 (正社員、業務委託問わず) ぜひtoshiokun0322 まで DMにてご連絡ください!

Slide 53

Slide 53 text

Thank you very much for your time!!