Rustプロダクトのキャッチアップフェアリーデバイセズ株式会社 プロダクト開発部加藤学
View Slide
目次- 自己紹介- 当社プロダクトの説明- Rust開発①既存サーバの改修- Rust開発②中間サーバの新規開発2
どんな人間?C / C++ / アセンブラ3PHP / Go C++ / Python / Rust8 年 2 年 2 年今ココ
入社前のRustへの印象は?- ポストC言語として興味はあった- 長らくCに関わって、その発展形に興味があったから- Golang, Nim, vlang, Rust など軽く触っていた- 天才以外に使えるの?- 所有権を「完全に理解」しても、「書けるか」という不安があった4
目次- 自己紹介- 当社プロダクトの説明- Rust開発①既存サーバの改修- Rust開発②中間サーバの新規開発5
6
加藤の業務(例)7speechrecognitionengineEndPoint Proxymachinetranslation・・・ProxyProxy・エンジン提供元の会社・社内R&Dチームmimiチーム
加藤の業務(例)8speechrecognitionengineEndPoint Proxymachinetranslation・・・ProxyProxymimiチームエンジン提供元の会社社内R&Dチーム
目次- 自己紹介- 当社プロダクトの説明- Rust開発①既存サーバの改修- Rust開発②中間サーバの新規開発9
何をしたかった?10speechrecognitionengineAudio streamText EndPoint ProxyAudio streamMessage new JSONに
⏬ 辛かった- GitHub で読もうとして、頭がパンクする- 便利な機能を全部ONにして、超重力を味わう- 言語仕様をよく読まないせいで、沼る- 先入観で crate を使おうとして、時間をゴミにする11
⏬ GitHub で読もうとして、頭がパンクする- コードだけ見ても、状況がよくわからない- 明示的な型宣言を(あまり)しないから- 関数をドットでつなげていくから12- エディタに rust-analyzer を入れて読むべし- アサインされると、まず GitHub で読みがちだが、非推奨
⏬ 便利な機能を全部ONにして、超重力を味わう- rust-analyzer- ないと変数の中身がわからない- cargo watch- コード変更と同時に check できる- ブラウザ- わからない時は検索に頼る- 気づくと数十個のタブ・・・13超重力ハイスペックPCor取捨選択
⏬ 言語仕様をよく読まないせいで、沼る14- ドキュメントを流し読みしていた- 基本は C++ や Java ぽいし、読んでるうちにわかるはず- わからない部分を検索しよう- ?の意味がわからなかった- ?は記号なので、「rust」「?」で検索しても答えが出なかった- 言語仕様はちゃんと読もう- 特に Result, Option 周辺
⏬ 先入観で crate を使おうとして、時間をゴミにする- serde で json パースができない- crate は feature で指定することで機能ONするらしい- serde の feature に json って入れたら動くはず!- 失敗!- serde / serde_json は違う crate だった- ちゃんと公式ドキュメントを読もう- 公式ドキュメントを見れば、ちゃんと serde_json と書いてある15
⏫ 良かった- 光速で開発環境が整った- 天才じゃなくても使えた- テスト見ながらコードを読めた16
⏫ 光速で開発環境が整った- Cを使ってた頃- 現場に伝わるドキュメントを探す- 更新漏れが数か所あったりなかったり- OSのバージョン、gccのバージョン、ライブラリのバージョンを調査- たまにライブラリのパスが特殊な位置に固定されていたりする- Rustの場合- rustup.rs でインストール- リポジトリを git clone- cargo build- Cargo.toml がコンパイルを保証してくれる17
⏫ 天才じゃなくても使えた- Clippyがめちゃくちゃ優秀だった- 静的解析ツール- インストールすると最初から入っている- 天才じゃなくても、事細かに教えてくれる18
⏫ テスト見ながらコードを読めた- 関数の単体テストが同じファイル内に書ける- 本体は「こうしたい」、テストは「こうなってて欲しい」- 両方を合わせてコードを読めるので、わかりやすい- テストを書いてくれていたから- 後から来る人のためにもテストを書こう・・・19
目次- 自己紹介- 当社プロダクトの説明- Rust開発①既存サーバの改修- Rust開発②中間サーバの新規開発20
何を作ったの?21outputfiltertoolTextText EndPoint ProxyTextText Hello.helloCUIツールを外部コマンドとして実行
沼ポイント- Tokioの履修を後回しにして、理不尽な気持ちになる- おまじない気分だった標準的 derive、やっと視界に入る- 外部コマンドの crate 探し、手間取る22
Tokioの履修を後回しにして、理不尽な気持ちになる- AsyncRead で read 関数を使おうとした- ドキュメントの↑を読み落としていた- スタンダードぽい名前だから read はあるはず・・・- AsyncRead から AsyncReadExt に行き着く方法が他にない- 「Rust」「AsyncRead」検索しても「AsyncReadExt」出ない- read 指定すると Clippy はエラーをはくが、サジェストはしてくれない- Rust公式の次は、Tokioチュートリアルを読みましょう- (zennの日本語訳した有志に感謝)- 事実上 Ext が標準的 trait なの、なぜ・・・?23
おまじない気分だった標準的 derive、やっと視界に入る- 既存プロダクトでは、標準的 derive を意識していなかった- Clone, Copy だけ字面からわかった気でいた- テストで assert_eq すると、怒られる- Clippy もサジェストしてくれなかった- PartialEq を入れないと自作 struct は比較してくれない- ↓のドキュメントでそこまで察するの、無理では・・・?24- println! しても変数の中身を出力してくれない- Debug のつけ忘れ- あらゆるものに Debug を継承させたくなる・・・
外部コマンドの crate 探し、手間取る- 非同期の crate が見つからなかった- 標準の std::process::Command は「同期」処理だった- tokio::process::Command になかなか行き着かなかった- 継続的に標準入出力を操作する方法がわからなかった- サンプルはLinuxコマンドを一発実行するだけのものが多い- サンプルではなく、理解して書いた第一歩- spawn すると child が取得できる- ChildStdin / ChildStdout は BufWritrer / BufReader に入れると管理しやすい25
心がけたこと- パーツ交換を前提にした構成- まれによくある「いつの間にか crate 更新止まってる」問題- 「止まらない crate 探し」→「更新止まってもすぐ交換できる設計」- 密結合しないファイル構成- 再利用しやすく、ライブラリに- (当社)構成の似たサーバを量産する需要- 共通部分をライブラリに、無理そうでもテンプレ化しやすく26
We are hiring!● Frontend / Backend developer● Device Engineer● Product Manager● …and more27Please check the job board out!