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

不動産データの複雑さをRustで解きほぐす話

 不動産データの複雑さをRustで解きほぐす話

estie | エスティ

April 04, 2023
Tweet

More Decks by estie | エスティ

Other Decks in Programming

Transcript

  1. 不動産データの複雑さを
    Rustで解きほぐす話
    2022/03/15
    Rust、何もわからない… #7
    yassan

    View Slide

  2. 1
    発表者紹介
    Kazushige Ando (yassan)
    estie Software Engineer
    東京大学情報理工学系研究科中退後、
    ノーコードツールの開発に従事。
    2022年4月estieに入社。主に不動産デー
    タの管理を担当。Rustで新規データ
    の管理システムを開発中。

    View Slide

  3. 2
    estie (エスティ)

    オフィス賃貸業の羅針盤となる
    不動産データ分析基盤の構築を
    目指す不動産テック企業です

    View Slide

  4. 3
    複雑な不動産データを
    正確に扱いたい!

    View Slide

  5. 不動産データの複雑さ

    View Slide

  6. データソースからのデータの例
    募集ビル名,階,募集面積,募集賃料,貸付予定日,募集開始日,…
    テストビル,1F,123.45坪,@12345円,即入居可能,2023/01/02,…
    テストビル,2F,123.45坪,@12345円,即入居可能,2023/02/03,…
    テストビル,3F,123.45坪,@12345円,2023年07月,2023/03/04,…
    テストビル,4F,123.45坪,@12345円,2023年08月,2023/04/05,…
    テストビル,5F,123.45坪,@12345円,2023年09月,2023/05/06,…
    テストビル,6F,123.45坪,@12345円,2023年10月,2023/06/07,…

    5
    不動産データはどう複雑なのか?

    View Slide

  7. データソースからのデータの例
    募集ビル名,階,募集面積,募集賃料,貸付予定日,募集開始日,…
    テストビル,1F,123.45坪,@12345円,即入居可能,2023/01/02,…
    テストビル,2F,123.45坪,@12345円,即入居可能,2023/02/03,…
    テストビル,3F,123.45坪,@12345円,2023年07月,2023/03/04,…
    テストビル,4F,123.45坪,@12345円,2023年08月,2023/04/05,…
    テストビル,5F,123.45坪,@12345円,2023年09月,2023/05/06,…
    テストビル,6F,123.45坪,@12345円,2023年10月,2023/06/07,…

    6
    税込?
    税抜?
    共益費は
    いくら?
    坪単価?
    総額?
    税込?
    税抜?
    坪単価?
    総額?
    賃料xヶ月分?
    不動産データはどう複雑なのか?

    View Slide

  8. データソースからのデータの例
    募集ビル名,階,募集面積,募集賃料,貸付予定日,募集開始日,…
    テストビル,1F,123.45坪,@12345円,即入居可能,2023/01/02,…
    テストビル,2F,123.45坪,@12345円,即入居可能,2023/02/03,…
    テストビル,3F,123.45坪,@12345円,2023年07月,2023/03/04,…
    テストビル,4F,123.45坪,@12345円,2023年08月,2023/04/05,…
    テストビル,5F,123.45坪,@12345円,2023年09月,2023/05/06,…
    テストビル,6F,123.45坪,@12345円,2023年10月,2023/06/07,…

    7
    税込?
    税抜?
    共益費は
    いくら?
    坪単価?
    総額?
    税込?
    税抜?
    坪単価?
    総額?
    賃料xヶ月分?
    データを正確に扱うには隠れた属性の管理が必要
    しかも隠れた属性はある日突然現れる
    不動産データはどう複雑なのか?

    View Slide

  9. 8
    それ、Rustで解決できますよ!

    View Slide

  10. Rustのenumでのデータ管理

    View Slide

  11. データソースからのデータの例
    募集ビル名,階,募集面積,募集賃料,貸付予定日,募集開始日,…
    テストビル,1F,123.45坪,@12345円,即入居可能,2023/01/02,…
    テストビル,2F,123.45坪,@12345円,即入居可能,2023/02/03,…
    テストビル,3F,123.45坪,@12345円,2023年07月,2023/03/04,…
    テストビル,4F,123.45坪,@12345円,2023年08月,2023/04/05,…
    テストビル,5F,123.45坪,@12345円,2023年09月,2023/05/06,…
    テストビル,6F,123.45坪,@12345円,2023年10月,2023/06/07,…

    10
    税込?
    税抜?
    共益費は
    いくら?
    坪単価?
    総額?
    税込?
    税抜?
    坪単価?
    総額?
    賃料xヶ月分?
    // 共益費
    // Common Area Maintenance Fee
    enum CamFee {
    // 共益費なし
    None,
    // 共益費(総額, 税有無)
    TotalAmount(u32, bool),
    // 共益費(坪単価, 税有無)
    PerArea(u32, bool),
    // 共益費(賃料比)
    Relative(f64),
    }
    共益費をenumで表してみる

    View Slide

  12. • 選択肢と値を一緒に持てる
    • C++だと選択肢だけ
    • Pythonだとできなくはないが煩雑
    11
    Rustのenumの良さ
    // 共益費
    // Common Area Maintenance Fee
    enum CamFee {
    // 共益費なし
    None,
    // 共益費(総額, 税有無)
    TotalAmount(u32, bool),
    // 共益費(坪単価, 税有無)
    PerArea(u32, bool),
    // 共益費(賃料比)
    Relative(f64),
    }

    View Slide

  13. • match式で網羅性チェックされる
    • C++もPythonも網羅性チェックなし
    12
    Rustのenumの良さ
    let total_cam_fee = match cam_fee {
    CamFee::None
    => ...,
    CamFee::TotalAmount(_, _)
    => ...,
    CamFee::PerArea(_, _)
    => ...,
    CamFee::Relative(_)
    => ...,
    }; C++ですら網羅性チェックがあったとしても危険
    CamFee fee = (CamFee)12345; が合法なため

    View Slide

  14. • 気軽にシリアライズできる
    • C++はライブラリ組み込みが大変
    • Pythonはデシリアライズの前後で
    型を合わせるのが大変
    13
    Rustのenumの良さ
    #[derive(Serialize, Deserialize)]
    enum CamFee {
    ...
    }
    let json: String =
    serde_json::to_string(&old_fee)?;
    let new_fee: CamFee =
    serde_json::from_str(&json)?;
    JSONのままDBに保存すればいいし、
    型がそのままスキーマになる

    View Slide

  15. 14
    複雑なデータでも
    Rustのenumで解きほぐせる!

    View Slide

  16. 新規プロダクトでのデータ管理

    View Slide

  17. 16
    • estieではWhole Product構想で新規プロダクトを複数開発中
    • 新規プロダクトの開発では、未知の属性に次々遭遇する
    • データは正確に表現しつつ、状況の変化への柔軟な対応が必要
    新規プロダクトの立ち上げ時は特に大変!

    View Slide

  18. 17
    • 最初はデータ管理処理をPythonで実装した
    • 主な理由は、スキルセットと実装初速の速さ
    • 賃料よりも格段に複雑なデータと判明し、やがて実装が破綻
    • 強力なenumの使えるRustに移行して実装を進められるように
    新規プロダクトの立ち上げ時の言語選定

    View Slide

  19. 18
    • 鬼門とされる所有権システムは意外と気にならない
    • 変数をあちこちで書き換えないスタイルに慣れていれば十分
    • 人間の注意力に頼っていた部分をコンパイラに任せられて楽
    • enumの選択肢を追加したときの影響範囲の考慮など
    • 他のRustチームから飛び地的に使ってもメリットのほうが勝る
    Rustに移行した感想

    View Slide

  20. 19
    型の強力さだけでも
    Rustを選ぶ価値は十分ある!

    View Slide

  21. まとめ

    View Slide

  22. 21
    • プロダクトの立ち上げ時のデータ管理は特に大変
    • Rustのenumは複雑な構造のデータを扱うのに便利
    • 型の強力さだけでRustを選ぶ価値は十分ある
    まとめ

    View Slide

  23. 22
    プロダクトの立ち上げ時こそ
    Rustを使おう!

    View Slide