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

Rustプロダクトのキャッチアップ

kato manabu
December 07, 2022
1.5k

 Rustプロダクトのキャッチアップ

kato manabu

December 07, 2022
Tweet

Transcript

  1. Rustプロダクトのキャッチアップ
    フェアリーデバイセズ株式会社 プロダクト開発部
    加藤学

    View Slide

  2. 目次
    - 自己紹介
    - 当社プロダクトの説明
    - Rust開発①既存サーバの改修
    - Rust開発②中間サーバの新規開発
    2

    View Slide

  3. どんな人間?
    C / C++ / アセンブラ
    3
    PHP / Go C++ / Python / Rust
    8 年 2 年 2 年
    今ココ

    View Slide

  4. 入社前のRustへの印象は?
    - ポストC言語として興味はあった
    - 長らくCに関わって、その発展形に興味があったから
    - Golang, Nim, vlang, Rust など軽く触っていた
    - 天才以外に使えるの?
    - 所有権を「完全に理解」しても、「書けるか」という不安があった
    4

    View Slide

  5. 目次
    - 自己紹介
    - 当社プロダクトの説明
    - Rust開発①既存サーバの改修
    - Rust開発②中間サーバの新規開発
    5

    View Slide

  6. 6

    View Slide

  7. 加藤の業務(例)
    7
    speech
    recognition
    engine
    End
    Point Proxy
    machine
    translation



    Proxy
    Proxy
    ・エンジン提供元の会社
    ・社内R&Dチーム
    mimiチーム

    View Slide

  8. 加藤の業務(例)
    8
    speech
    recognition
    engine
    End
    Point Proxy
    machine
    translation



    Proxy
    Proxy
    mimiチーム
    エンジン提供元の会社
    社内R&Dチーム

    View Slide

  9. 目次
    - 自己紹介
    - 当社プロダクトの説明
    - Rust開発①既存サーバの改修
    - Rust開発②中間サーバの新規開発
    9

    View Slide

  10. 何をしたかった?
    10
    speech
    recognition
    engine
    Audio stream
    Text

    End
    Point Proxy
    Audio stream
    Message

    new
     JSONに

    View Slide

  11. ⏬ 辛かった
    - GitHub で読もうとして、頭がパンクする
    - 便利な機能を全部ONにして、超重力を味わう
    - 言語仕様をよく読まないせいで、沼る
    - 先入観で crate を使おうとして、時間をゴミにする
    11

    View Slide

  12. ⏬ GitHub で読もうとして、頭がパンクする
    - コードだけ見ても、状況がよくわからない
    - 明示的な型宣言を(あまり)しないから
    - 関数をドットでつなげていくから
    12
    - エディタに rust-analyzer を入れて読むべし
    - アサインされると、まず GitHub で読みがちだが、非推奨

    View Slide

  13. ⏬ 便利な機能を全部ONにして、超重力を味わう
    - rust-analyzer
    - ないと変数の中身がわからない
    - cargo watch
    - コード変更と同時に check できる
    - ブラウザ
    - わからない時は検索に頼る
    - 気づくと数十個のタブ・・・
    13
    超重力
    ハイスペックPC
    or
    取捨選択

    View Slide

  14. ⏬ 言語仕様をよく読まないせいで、沼る
    14
    - ドキュメントを流し読みしていた
    - 基本は C++ や Java ぽいし、読んでるうちにわかるはず
    - わからない部分を検索しよう
    - ?の意味がわからなかった
    - ?は記号なので、「rust」「?」で検索しても答えが出なかった
    - 言語仕様はちゃんと読もう
    - 特に Result, Option 周辺

    View Slide

  15. ⏬ 先入観で crate を使おうとして、時間をゴミにする
    - serde で json パースができない
    - crate は feature で指定することで機能ONするらしい
    - serde の feature に json って入れたら動くはず!
    - 失敗!
    - serde / serde_json は違う crate だった
    - ちゃんと公式ドキュメントを読もう
    - 公式ドキュメントを見れば、ちゃんと serde_json と書いてある
    15

    View Slide

  16. ⏫ 良かった
    - 光速で開発環境が整った
    - 天才じゃなくても使えた
    - テスト見ながらコードを読めた
    16

    View Slide

  17. ⏫ 光速で開発環境が整った
    - Cを使ってた頃
    - 現場に伝わるドキュメントを探す
    - 更新漏れが数か所あったりなかったり
    - OSのバージョン、gccのバージョン、ライブラリのバージョンを調査
    - たまにライブラリのパスが特殊な位置に固定されていたりする
    - Rustの場合
    - rustup.rs でインストール
    - リポジトリを git clone
    - cargo build
    - Cargo.toml がコンパイルを保証してくれる
    17

    View Slide

  18. ⏫ 天才じゃなくても使えた
    - Clippyがめちゃくちゃ優秀だった
    - 静的解析ツール
    - インストールすると最初から入っている
    - 天才じゃなくても、事細かに教えてくれる
    18

    View Slide

  19. ⏫ テスト見ながらコードを読めた
    - 関数の単体テストが同じファイル内に書ける
    - 本体は「こうしたい」、テストは「こうなってて欲しい」
    - 両方を合わせてコードを読めるので、わかりやすい
    - テストを書いてくれていたから
    - 後から来る人のためにもテストを書こう・・・
    19

    View Slide

  20. 目次
    - 自己紹介
    - 当社プロダクトの説明
    - Rust開発①既存サーバの改修
    - Rust開発②中間サーバの新規開発
    20

    View Slide

  21. 何を作ったの?
    21
    output
    filter
    tool
    Text
    Text

    End
    Point Proxy
    Text
    Text

    Hello.
    hello
    CUIツールを
    外部コマンドとして実行

    View Slide

  22. 沼ポイント
    - Tokioの履修を後回しにして、理不尽な気持ちになる
    - おまじない気分だった標準的 derive、やっと視界に入る
    - 外部コマンドの crate 探し、手間取る
    22

    View Slide

  23. Tokioの履修を後回しにして、理不尽な気持ちになる
    - AsyncRead で read 関数を使おうとした
    - ドキュメントの↑を読み落としていた
    - スタンダードぽい名前だから read はあるはず・・・
    - AsyncRead から AsyncReadExt に行き着く方法が他にない
    - 「Rust」「AsyncRead」検索しても「AsyncReadExt」出ない
    - read 指定すると Clippy はエラーをはくが、サジェストはしてくれない
    - Rust公式の次は、Tokioチュートリアルを読みましょう
    - (zennの日本語訳した有志に感謝)
    - 事実上 Ext が標準的 trait なの、なぜ・・・?
    23

    View Slide

  24. おまじない気分だった標準的 derive、やっと視界に入る
    - 既存プロダクトでは、標準的 derive を意識していなかった
    - Clone, Copy だけ字面からわかった気でいた
    - テストで assert_eq すると、怒られる
    - Clippy もサジェストしてくれなかった
    - PartialEq を入れないと自作 struct は比較してくれない
    - ↓のドキュメントでそこまで察するの、無理では・・・?
    24
    - println! しても変数の中身を出力してくれない
    - Debug のつけ忘れ
    - あらゆるものに Debug を継承させたくなる・・・

    View Slide

  25. 外部コマンドの crate 探し、手間取る
    - 非同期の crate が見つからなかった
    - 標準の std::process::Command は「同期」処理だった
    - tokio::process::Command になかなか行き着かなかった
    - 継続的に標準入出力を操作する方法がわからなかった
    - サンプルはLinuxコマンドを一発実行するだけのものが多い
    - サンプルではなく、理解して書いた第一歩
    - spawn すると child が取得できる
    - ChildStdin / ChildStdout は BufWritrer / BufReader に入れると管理しやすい
    25

    View Slide

  26. 心がけたこと
    - パーツ交換を前提にした構成
    - まれによくある「いつの間にか crate 更新止まってる」問題
    - 「止まらない crate 探し」→「更新止まってもすぐ交換できる設計」
    - 密結合しないファイル構成
    - 再利用しやすく、ライブラリに
    - (当社)構成の似たサーバを量産する需要
    - 共通部分をライブラリに、無理そうでもテンプレ化しやすく
    26

    View Slide

  27. We are hiring!
    ● Frontend / Backend developer
    ● Device Engineer
    ● Product Manager
    ● …and more
    27
    Please check the job board out!


    View Slide