Slide 1

Slide 1 text

Fairy DevicesでのRust活用 2024-04-17 Fairy Devices株式会社 プロダクト開発部 部長 吉川哲史 Findy Job LT 1

Slide 2

Slide 2 text

本日のトピック 1. 自己紹介 2. 会社・プロダクト紹介 3. Fairy DevicesにおけるRust開発 4. 中長期での課題・今後の展望 2

Slide 3

Slide 3 text

自己紹介 ● X (ex. Twitter)/GitHub: @emergent ● Fairy Devices株式会社 プロダクト開発部 部長 ● Publication ○ 『実践Rustプログラミング入門』共著 ○ WEB+DB PRESS No.129 インタビュー ○ WEB+DB PRESS No.131 特集「Rust入門」 ○ 『RustによるWebアプリケーション開発 設 計からリリース・運用まで』共著 Satoshi Yoshikawa / 吉川哲史 new! 3

Slide 4

Slide 4 text

4 会社紹介:Fairy Devices コーポレートサイト https://fairydevices.jp/

Slide 5

Slide 5 text

5 会社紹介:Fairy Devices × ウェアラブル デバイス AI コーポレートサイト https://fairydevices.jp/

Slide 6

Slide 6 text

Fairy Devicesが提供するサービス 6 音声テクノロジースタック ウェアラブルデバイスによる 遠隔業務支援サービス

Slide 7

Slide 7 text

7

Slide 8

Slide 8 text

8 ウェアラブルデバイス THINKLET

Slide 9

Slide 9 text

9

Slide 10

Slide 10 text

ウェアラブルデバイス THINKLET 10 https://mimi.fairydevices.jp/technology/device/thinklet/ Androidアプリが動作する カメラ マイク(計5個)

Slide 11

Slide 11 text

Fairy DevicesにおけるRust活用 ● Rust技術選定理由 ● 技術スタックの概観 11 Zennでもいろいろな技術情報を発信しています https://zenn.dev/p/fairydevices

Slide 12

Slide 12 text

(まだ事業がmimiだけだったころ) ● プロダクト(サーバー、クライアントライブラリ等)にはC++で実装されたもの が多くあった ● 音声処理はマルチスレッドでの非同期処理実装が必要なケースが多く、C++のま ま改善・改修を行うのは難しいと考えた ● より安全に開発できるプログラミング言語を探した結果、Rustがフィットした Rust採用の経緯 12

Slide 13

Slide 13 text

技術スタックの概観 ● mimi クラウドAIの構成概要 ● LINKLETの構成概要 ○ LINKLET関連のシステム ● サービスごとの技術スタック 13

Slide 14

Slide 14 text

mimi クラウドAIの構成概要 14 音声入力 エンドポイント クライアント プログラム 中間サーバー (or エンジンのラッパープ ログラム) 音声処理 エンジン WebSocket WebSocket エンジンごとに 異なる接続仕様 ⋮ ひとつの音声入力のストリー ムに対し、複数の音声処理を 同時にかけられるよう共通の メッセージング仕様で統一 音声ストリーム 音声処理結果(テキスト)

Slide 15

Slide 15 text

LINKLETの構成概要 15 フロント エンド バック エンド THINKLET 制御基盤 デバイス制御リクエスト デバイス制御リクエストへの応答 デバイス内のデータ ウェアラブルデバイス THINKLET リクエストごとの実行時間は デバイス依存なので、制御リ クエストはすべて非同期化 LINKLET

Slide 16

Slide 16 text

LINKLET関連のシステム 16 LINKLET 遠隔業務支援+デバイス管理 LINKLET管理Web(社内用) 映像解析システム(開発中) 顧客管理 映像活用

Slide 17

Slide 17 text

サービスごとの技術スタック バック エンド フロント エンド mimi THINKLET 制御基盤 運用ツール LINKLET LINKLET管理Web (社内用) 17 映像解析システム (開発中)

Slide 18

Slide 18 text

エンジニアの業務(サーバーサイド) フロントエンド(TypeScript)・バックエンド(Rust)・インフラ(AWS/GCP)に対し 「一人二役(以上) 」のエンジニアのチーム構成 ● 元々は大半のメンバーがバックエンドエンジニア ○ フロントエンドは外部パートナーに委託することが多かった ○ チーム能力的に不足している部分はパートナーの方で補いつつ自社内 エンジニアの能力拡大を図っている 18 バックエンド クラウド インフラ フロントエンド バックエンド クラウド インフラ フロントエンド デバイス デバイス

Slide 19

Slide 19 text

直近の機能開発内容(LINKLET) ● Web画面からのBluetoothイヤホン設定機能 ● 遠隔支援リクエストのUX改善 ● デバイス追跡機能(位置情報表示) ● その他、軽微なUI/UX改善、各種バージョン更新等多数 19 大きい機能追加をする時は、だいたいデバイスの ファームウェア改修も伴うので、関係メンバーとの密 なコミュニケーションやインタフェース設計が重要

Slide 20

Slide 20 text

業務にRustを採用してどうだったか ● Rust採用当初〜現在まで ○ C++より安心して開発できる ○ 楽しい ● 人材採用面 ○ Rustでの仕事に興味を持って応募してくれる人が増えた ● 今のエンジニアたちにとっては ○ Rustがふつう ○ TypeScriptの型システムがRustと違うので戸惑い… 20

Slide 21

Slide 21 text

Rustを採用して5年経った現在の課題 ● プロダクトごとの使用クレートにばらつきが出ている ○ その時のトレンド等でプロダクトに採用したクレートが異なる ■ Webフレームワーク:Actix Web、axum、warp ■ DB接続:Diesel、SQLx ○ そもそもasync/awaitが言語機能に乗る前に作ったサーバーとか もいる ● Rustやクレートの進化に追いつくのが大変 ○ バージョンアップ追従などが結構たいへん ○ Clippyで新しい警告が出るようになる ■ 次のバージョンで出なくなることもある 21

Slide 22

Slide 22 text

Rustを採用して5年経った現在の課題 ● プロダクトごとの使用クレートにばらつきが出ている ○ その時のトレンド等でプロダクトに採用したクレートが異なる ■ Webフレームワーク:Actix Web、axum、warp ■ DB接続:Diesel、SQLx ○ そもそもasync/awaitが言語機能に乗る前に作ったサーバーとか もいる ● Rustやクレートの進化に追いつくのが大変 ○ バージョンアップ追従などが結構たいへん ○ Clippyで新しい警告が出るようになる ■ 次のバージョンで出なくなることもある 22 特定のクレートに依存するコードが限定的になるよう、 レイヤードアーキテクチャなどを用いて設計をしっかりしよう! CI/CDを整備して、更新や非推奨化に対応しやすくしよう

Slide 23

Slide 23 text

Rustを採用して5年経った現在の課題 ● プロダクトごとの使用クレートにばらつきが出ている ○ その時のトレンド等でプロダクトに採用したクレートが異なる ■ Webフレームワーク:Actix Web、axum、warp ■ DB接続:Diesel、SQLx ○ そもそもasync/awaitが言語機能に乗る前に作ったサーバーとか もいる ● Rustやクレートの進化に追いつくのが大変 ○ バージョンアップ追従などが結構たいへん ○ Clippyで新しい警告が出るようになる ■ 次のバージョンで出なくなることもある 23 特定のクレートに依存するコードが限定的になるよう、 レイヤードアーキテクチャなどを用いて設計をしっかりしよう! CI/CDを整備して、更新や非推奨化に対応しやすくしよう Rustでも 「Web開発で大事なこと」 は普通に大事

Slide 24

Slide 24 text

Rustを採用して5年経った現在の課題 ● プロダクトごとの使用クレートにばらつきが出ている ○ その時のトレンド等でプロダクトに採用したクレートが異なる ■ Webフレームワーク:Actix Web、axum、warp ■ DB接続:Diesel、SQLx ○ そもそもasync/awaitが言語機能に乗る前に作ったサーバーとか もいる ● Rustやクレートの進化に追いつくのが大変 ○ バージョンアップ追従などが結構たいへん ○ Clippyで新しい警告が出るようになる ■ 次のバージョンで出なくなることもある 24 特定のクレートに依存するコードが限定的になるよう、 レイヤードアーキテクチャなどを用いて設計をしっかりしよう! CI/CDを整備して、更新や非推奨化に対応しやすくしよう Rustでも 「Web開発で大事なこと」 は普通に大事

Slide 25

Slide 25 text

Rustならではの課題(ビルド時間) 25 https://zenn.dev/fairydevices/articles/59cd718341da58

Slide 26

Slide 26 text

中長期での課題・チャレンジ ● 既存プロダクトにおける生産性・保守性の向上 ○ 使用クレート・ライブラリの共通化 ○ AI系ツールの開発チームへの導入 ● プロダクトの新規領域へのRustの導入と活用(の検討) ○ Webフロントエンド(TypeScript) ○ 音声処理ライブラリ(C++) ○ Androidアプリ・ライブラリなど(Kotlin) 26 ただやればいいってわけではないので プロダクトへの適用は慎重に…

Slide 27

Slide 27 text

今後の展望 ● 現在、会社は新しいフェーズに向けて進行中 ● 開発チームの拡大に伴う組織づくりも悩みどころ 27

Slide 28

Slide 28 text

Fairy Devicesでは一緒に働く仲間を募集中です ● Webアプリケーション ○ バックエンド ○ フロントエンド ● クラウドエンジニア ● デバイスソフトウェア ● Androidアプリ ● QA(品質保証) etc 28 採用ページのQRコード Rustにこだわらず、多様なご経験者を歓迎します

Slide 29

Slide 29 text

ご清聴ありがとうございました 29