Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
【Gen-AX】20250417開催_Findyオンラインイベント_Rust開発の裏側 各社が...
Search
Gen-AX株式会社
May 08, 2025
Technology
0
47
【Gen-AX】20250417開催_Findyオンラインイベント_Rust開発の裏側 各社が語る課題と今後の挑戦とは
2025.04.17に開催された、Findyオンラインイベント「Rust開発の裏側 各社が語る課題と今後の挑戦とは?」のGen-AX株式会社の登壇資料です。
Gen-AX株式会社
May 08, 2025
Tweet
Share
More Decks by Gen-AX株式会社
See All by Gen-AX株式会社
【Gen-AX】20251101開催_KotlinFest2025_PowerAssert
genax
0
110
【Gen-AX】Gen-AX株式会社_採用カンパニーデック
genax
0
12k
【Gen-AX】20250514開催_Findyオンラインイベント_技術選定を突き詰める
genax
0
2.3k
【Gen-AX】Gen-AX株式会社_カンパニーデック
genax
0
1.3k
Other Decks in Technology
See All in Technology
技術以外の世界に『越境』しエンジニアとして進化を遂げる 〜Kotlinへの愛とDevHRとしての挑戦を添えて〜
subroh0508
1
430
Playwright x GitHub Actionsで実現する「レビューしやすい」E2Eテストレポート
kinosuke01
0
570
SSO方式とJumpアカウント方式の比較と設計方針
yuobayashi
7
600
Debugging Edge AI on Zephyr and Lessons Learned
iotengineer22
0
170
AWS Trainium3 をちょっと身近に感じたい
bigmuramura
1
140
AWS CLIの新しい認証情報設定方法aws loginコマンドの実態
wkm2
6
710
寫了幾年 Code,然後呢?軟體工程師必須重新認識的 DevOps
cheng_wei_chen
1
1.3k
AWS Security Agentの紹介/introducing-aws-security-agent
tomoki10
0
160
[JAWS-UG 横浜支部 #91]DevOps Agent vs CloudWatch Investigations -比較と実践-
sh_fk2
1
250
最近のLinux普段づかいWaylandデスクトップ元年
penguin2716
1
690
eBPFとwaruiBPF
sat
PRO
4
2.6k
[CMU-DB-2025FALL] Apache Fluss - A Streaming Storage for Real-Time Lakehouse
jark
0
110
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Context Engineering - Making Every Token Count
addyosmani
9
500
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.7k
Automating Front-end Workflow
addyosmani
1371
200k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
Practical Orchestrator
shlominoach
190
11k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
390
Transcript
© Gen-AX Corp. All Rights Reserved. 1 B2B向け⽣成AI SaaSプロダクト開発で Rust採⽤の理由
2025年4⽉17⽇ テックリード 中村秀樹
© Gen-AX Corp. All Rights Reserved. 2 ⾃⼰紹介 • 中村
秀樹 • テックリード • Gen-AX(ジェナックス)初期⽴ち上げメンバー • 組込エンジニアからキャリアをスタートして、Web系へ • Rust歴 1.5年 • 猫好き • “さかがみ家”でお世話した保護猫の最初の⾥親
© Gen-AX Corp. All Rights Reserved. 3 本発表で話すこと • Rustで開発しているプロダクトの概要
• Rust採⽤の理由 • Rustでの開発の良い点・悪い点
© Gen-AX Corp. All Rights Reserved. 4 会社紹介 ※ ジェナックスと読みます
※
© Gen-AX Corp. All Rights Reserved. 5 Gen-AXのプロダクト
© Gen-AX Corp. All Rights Reserved. 6 X-Boost(クロスブースト) • コンタクトセンター特化型のRAG
RAG: Retrieval-Argumented Generation
© Gen-AX Corp. All Rights Reserved. X-Boost(クロスブースト) • 検索データの作成、AIモデルのファインチューニングをセルフサービスで実⾏可能 7
© Gen-AX Corp. All Rights Reserved. 8 X-Boost システム構成図
© Gen-AX Corp. All Rights Reserved. 9 X-Boost 技術スタック Frontend
• Typescript • Next.js Backend • Rust • axum IdP • Keycloak AI • Python 開発環境 • Cloud︓Azure • GitHub Enterprise(Cloud) • Monorepo開発 • CI︓GitHub Actions • CD︓ArgoCD • Notion/Jira
© Gen-AX Corp. All Rights Reserved. 10 X-Boost 技術スタック Frontend
• Typescript • Next.js Backend • Rust • axum IdP • Keycloak AI • Python 開発環境 • Cloud︓Azure • GitHub Enterprise(Cloud) • Monorepo開発 • CI︓GitHub Actions • CD︓ArgoCD • Notion/Jira レガシーコードをRustに移⾏するのではなく、 Backendの新規開発で”Rust“を採⽤
© Gen-AX Corp. All Rights Reserved. 11 なぜRustを選んだのか︖ • 技術選定⽅針
① チーム開発に最適な静的型付け⾔語を前提 ② 関数型的アプローチを取り⼊れて質の⾼いコードを⽬指す • 関数型⾔語を採⽤する意味ではない • 具体的には・・・ • 型の表現⼒を⽣かす • Railway Oriented Programmingによるエラーハンドリング BtoB向けSaaS ⾼信頼な製品が求められる 開発対象
© Gen-AX Corp. All Rights Reserved. 12 Railway Oriented Programming(ROP)とは
• 成功時の結果とエラーの両⽅を扱える”Result型”を関数の戻り値にする書き⽅で、処理 のパイプラインを構築するという設計⼿法 • Webアプリでよく⾒かける、エラーが発⽣する可能性がある関数を複数回呼び出し、エ ラーが発⽣したらエラーレスポンスを返すような実装に向いている • メリット • エラーハンドリングの実装をシンプルにでき、正常系処理の流れの⾒通しをよくする F# for Fun and Profit Railway Oriented Programmingより(https://fsharpforfunandprofit.com/rop/)
© Gen-AX Corp. All Rights Reserved. 13 なぜRustを選んだのか︖ ① チーム開発に最適な静的型付け⾔語
Java Kotlin Go Rust Java Kotlin Go Rust Python Ruby Javascript Typescript
© Gen-AX Corp. All Rights Reserved. 14 なぜRustを選んだのか︖ ② 関数型的アプローチを取り⼊れて質の⾼いコードを⽬指す
A) 型の表現⼒を⽣かす B) Railway Oriented Programmingによるエラーハンドリング • Option型/Result型がサポートされるか Kotlin Rust Java Kotlin Go Rust
© Gen-AX Corp. All Rights Reserved. 15 なぜRustを選んだのか︖ • 技術選定⽅針以外の観点で⽐較
• プロダクトの特性との親和性 • データ前処理が多い • リバースエンジニアリングのしにくさ • ⼤企業向けにはSaaSではなくパッケージ提供も想定 → どれも決め⼿に⽋ける • 0から開発するタイミングだからこその選択 • エンジニアに愛される⾔語 • 最悪、ダメなら別の⾔語に変更も視野に⼊れて選択 最終的には、よりチャレンジングな⾔語(Rust)を選定
© Gen-AX Corp. All Rights Reserved. 16 型の表現⼒ • Newtypeパターンによる型安全性向上
• 「中⾝は同じ型」だが「意味論的に異なる型」を定義、引数不⼀致などをコンパイラで検知 • (例)各種ID、⼀部のIDの型はULIDだが、種類によって異なるケース async fn bulk_replace( &self, org_id: &OrgId, model_id: &ModelId, testset_ids: Vec<TestsetId>, user_id: &UserId, revision: Revision, ) -> AppResult<()> { if testset_ids.is_empty() { return Ok(()); } self.repository .bulk_replace(org_id, model_id, testset_ids, user_id, revision) .await?; ・・・
© Gen-AX Corp. All Rights Reserved. 17 型の表現⼒ • Newtypeパターンによる型安全性向上
• 「中⾝は同じ型」だが「意味論的に異なる型」を定義、引数不⼀致などをコンパイラで検知 • (例)各種ID、⼀部のIDの型はULIDだが、種類によって異なるケース async fn bulk_replace( &self, org_id: &OrgId, model_id: &ModelId, testset_ids: Vec<TestsetId>, user_id: &UserId, revision: Revision, ) -> AppResult<()> { if testset_ids.is_empty() { return Ok(()); } self.repository .bulk_replace(org_id, model_id, testset_ids, user_id, revision) .await?; ・・・ pub struct ModelId(ulid::Ulid); pub struct TestsetId(ulid::Ulid);
© Gen-AX Corp. All Rights Reserved. 18 Railway Oriented Programming(ROP)
• 成功時の結果とエラーの両⽅を扱える”Result型”を関数の戻り値にする書き⽅で、処理 のパイプラインを構築するという設計⼿法 → Rustのエラーハンドリング設計⽅針に合致 • 特に、エラーが発⽣したらエラーを呼び出し元に返す実装は、”?”(question mark operator)で簡潔に書ける tx, err := db.Beginx() if err != nil { return nil, err } _, err = tx.NamedExec(“INSERT INTO person・・・ “) if err != nil { return nil, err } ・・・ (例) Transaction実装 let mut tx = db.begin().await?; sqlx::query!(”INSERT INTO person・・・”, ・・・) .execute(&mut tx) .await?; ・・・ Go Rust 対応
© Gen-AX Corp. All Rights Reserved. 19 Railway Oriented Programming(ROP)
(Rustだからの問題ではないが) • ROPを採⽤しても以下の考慮は必要 • エラーを返すべきなのか、異常終了させるべきなのか • Rustでは以下を推奨 • 回復可能なエラー → Resultで返す • 回復不可能なエラー → panic!(unwrap, expect)を呼び出す※ ※axumでは、panic!を呼び出しても異常終了せず、500エラーが返る • エラーの種別、粒度をどうするか • エラー種別を細かくしすぎても、”エラー定義地獄” • 細かくハンドリングできず、コードの⾒通しが悪くなるだけ • まとめすぎると、情報が⽋落し、デバッグ時に必要な情報が残っていない
© Gen-AX Corp. All Rights Reserved. 20 Rustを採⽤したメリット • コンパイルが通った場合の品質への安⼼感が⾼い
• 他⾔語ではテストコードで担保することが多いが、コンパイルが通ることがある意味テスト • コンパイラーによるエラーハンドリングの抜け漏れ排除 • エラーをenumで定義し、Rustの強⼒なパターンマッチ機構により、バグを排除 • コードの⾒通しが良くなった • if⽂による分岐が減り、ハッピーパスの⾒通しがよくなった • Rust固有のSyntaxのおかげ • 独⾃型の導⼊の敷居が低く、関数宣⾔である程度実装の意図も残せる • トレイトにより、独⾃型も、簡単にPrimitive型と同じような演算が定義できる • 独⾃型の導⼊が進むと、関数宣⾔で、実装の意図も残せる
© Gen-AX Corp. All Rights Reserved. 21 Rustの⾟み • 使い⽅やサンプルコードの情報が少ない
• Docsを⾒ても説明が少なく、サンプルコードもほとんどない • 直接実装コードを⾒て確認 • ChatGPT(o3-miniなど)に聞いても、ハルシネーションが起きやすい • CrateのVersion upで破壊的変更が⼊ることも多い • 多くのcrateが1.0未満のVersionも多く、安定していないことが起因 • 今後、時間が経てば解決する問題 • ビルド、lintに多くのリソースを消費する • rust-analyzerや、ビルド時にメモリも多く消費 • rust-analyzerも3GB程度消費、 • ビルド時間も結構かかる(依存するcrateが多いとコンパイル対象が多く時間がかかる)
© Gen-AX Corp. All Rights Reserved. 22 今後の課題 • 依存crateの⾒直し
• crateのVersion Upで破壊的変更が⼊るものあるので、適宜Upgradeも対応していく • Feature設定の⾒直し、依存crateが少ないものに変更 • azure core/azure storage/azure storage blobsなど • データ処理実装の最適化 • サービスリリース初期は、データ量も多くはないので、機能実装を優先 • 今後、データ量が増えたとき、効率的なデータ処理が必要 • 処理速度だけでなく、メモリ使⽤量も考慮した最適化 • CI時間の短縮 • ⾼速リンカー(mold)への変更 • ビルドキャッシュの⾒直しなど
© Gen-AX Corp. All Rights Reserved. 23 エンジニアを募集しています • ⽣成AI照会業務⽀援プロダクト(X-Boost)
• 機能改善・新機能開発 • RAGの精度改善 • データ処理実装の最適化 • 外部CRM連携 など • ⾃律思考型AIの⾳声応対プロダクト • 新規開発 • 電話・⾳声処理(PBX連携、⾳声ストリームの取り回しなど) • 管理・モニタリング機能 • お客様毎の業務カスタマイズ機能 • プロダクトを作って価値提供していきたいエンジニアを募集中︕ • Rust⾃体は未経験でも問題ありません