Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rust、何もわからないので頑張らないWeb開発 …とこれから頑張るために

Rust、何もわからないので頑張らないWeb開発 …とこれから頑張るために

Rust、何もわからない登壇資料
https://estie.connpass.com/event/259713/

yuta kadotamai

October 06, 2022
Tweet

More Decks by yuta kadotamai

Other Decks in Technology

Transcript

  1. • 読み方は「かどたみ」 ◦ 世界に20人の絶滅危惧種、イジメ、ダメ、ゼッタイ • 出戻りテックリード ◦ 創業時はインターンでフロントエンド開発 ◦ 新卒でメガベンチャーからの出戻り

    • 社会人ではもっぱらレガシー改善 ◦ 前職でもレガシー改善 😭 ◦ 現職でもレガシー改善 😭 ◦ 最近モダン化リプレース 🎉 ▪ Rustで認証認可基盤開発 門田見 侑大
  2. • 「IT × 統計 × コンサル」 で日本の経済を成長させるサービス ◦ コストカット・効率化ではなく「 企業の事業成長のお手伝い

    」 • 自身・仲間の経験(キャリア、履歴書)をより豊かに ◦ チャレンジ推奨 ◦ チームで働く • Actix Web, NestJS, Ruby on Rails, Angular, GCP, AWS • ちょっとでも気になったらカジュアル面談にぜひ! ◦ estieさんと同じビルなので estieさんに行くついででも! 株式会社エモーションテック
  3. こんな感じで • 所有権が〜 • unwrapはダメ〜 • みたいなことはいっぱい見かける • web開発Tipsの記述はあまり見かけなかった •

    re-exportも本当に正しい解決なのかはわからない • 前の問題を解決して、「現状、困ってない」程度 • と、おもったら1.64からワークスペース共通の crateが定義できるようになった • すごい、、、わからない、、、
  4. 頑張らなかった点 • Rustらしい構文 ◦ 強制したのは組み込みフォーマッターくらい ◦ clippyすらあとからCIに入れた ◦ ライブラリのエラー型ごとに map_errに渡す関数書いてたりしてた

    • crate選定 ◦ デファクトスタンダードがあるのかもわからない ◦ awesome rustからとりあえず使って、比較して、直感で良かったもの • パフォーマンス ◦ to_owned()やclone()連発 ◦ collect()連発
  5. なんで頑張らなかったのか? 【建前】 • 複数言語でのマイクロサービス開発を少人数でやる ◦ らしさを求めすぎても構文的なコンテキストスイッチのコスト大 ◦ sqlx で生SQL書いてるのもそのため •

    toBコンポーネントのWebのバックエンドから始まった ◦ toC側に比べてトラフィックが少ない ◦ メモリ領域とかそこまでシビアでない (String vs &strみたいなよくある話) ◦ Webの処理速度問題大抵の場合 DBのIO説… 【本音】 • らしさを追求し続けることでの開発速度・モチベーション低下 • どこまで頑張る問題 ◦ 未経験言語でどこまで頑張るか決めるの難しくないですか?
  6. 開発最初期は基本に則っていた Presentation層 Application層 Domain 層 Infrastracture層 • そのまま本番コードの下に書いていた • Domain層はファイル自体が短めだったため

    C2カバレッジを意識しても 300行ほどだった • 認証認可を制御する契約組織のドメインから開発 • 単純なCRUDしかないのでシンプルに書けた
  7. ファイルを分けたくなったのでtestsへ Presentation層 Application層 Domain 層 Infrastracture層 • infra層のテストを書く上で辛くなった • sqlxで生SQLを書くので本番コード自体が長くなる

    • テスト合わせるとかなりファイルが巨大になり 辛さが出てくる • 全部testsディレクトリへ tests dir tests dir tests dir tests dir
  8. 新たな課題 Presentation層 Application層 Domain 層 Infrastracture層 • DB含めてテストを全部並列で動かすには テスト毎に影響しないデータが必要 •

    infra層のunitテストとpresentation層の結合テストでは特に複雑 なステータスのデータが必須となる • 例 ◦ 招待済みだが、有効化されてないユーザー ◦ ユーザーとアクセス許可されていないリソース ◦ そもそも普通のユーザーもトークンチェックとかある から作成面倒 tests dir tests dir tests dir tests dir
  9. 案1: tests dirにfactory作る Presentation層 application層 Domain 層 infrastracture層 • infra層のtestsの中にUserDataFactoryを作ってみた

    • データの作成が1箇所にまとめられ、 仕様変更にも耐えやすくなった tests dir tests dir tests dir tests dir user_data_factory.rs
  10. 案1: tests dirにfactory作る Presentation層 application層 Domain 層 infrastracture層 • infra層のtestsの中にUserDataFactoryを作ってみた

    • データの作成が1箇所にまとめられ、 仕様変更にも耐えやすくなった • しかし、testsディレクトリはexportされないため workspaceで構築しているアプリでは他の層で使えない tests dir tests dir tests dir tests dir user_data_factory.rs
  11. 案2: infra層にfactoryを作る Presentation層 application層 Domain 層 infrastracture層 • 普通に本番コードと同等の扱いにする •

    exportできるので他の層から利用できる • これでヨシ!って一旦なった tests dir tests dir tests dir tests dir user_data_factory.rs
  12. 案2: infra層にfactoryを作る Presentation層 application層 Domain 層 infrastracture層 • 普通に本番コードと同等の扱いにする •

    exportできるので他の層から利用できる • これでヨシ!って一旦なった • 不安との戦い、、、 • 前述の通り本番コードとしてはありえないユースケース ◦ 設計のほころびはいずれ生まれるかも? • 開発Buildだとtestにしか使ってなくても バイナリに含まれる ◦ 開発コンテナの肥大化につながるかも? tests dir tests dir tests dir tests dir user_data_factory.rs
  13. 案3: test projectを作る Presentation層 application層 Domain 層 infrastracture層 • projectを分けて外部crate化

    • factoryは絶対に本番コードから参照できない • APP側でビルドすればバイナリに含まれない APP TEST testcase tests dir user_data_factory.rs
  14. 案3: test projectを作る Presentation層 application層 Domain 層 infrastracture層 • projectを分けて外部crate化

    • factoryは絶対に本番コードから参照できない • APP側でビルドすればバイナリに含まれない • CIの時間が爆増、、、 • TESTとAPP両方でbuildしないとダメ APP TEST testcase tests dir user_data_factory.rs
  15. まとめ • 頑張らない理由と頑張るためのテスト構成を紹介した • 頑張らないからこそRust特有ではない部分で頑張ると Rustを頑張る投資になりそう • エモテクではテストは別 crateに分けて書いている ◦

    正解かどうかもわからないですが、困ってないです ◦ 我々こうやってうまくいってるよ!みたいなのあれば教えて下さい • みなさんも頑張りすぎず気軽に RustでWeb開発やってみませんか?