「Money Forward Tech Day 2024」に参加してきました

マネーフォワードのエンジニアリング進化論

  • Shota Kurodaさん/VPoE

マネーフォワード

  • 2012年設立
  • 2400人
    • エンジニアは4割
  • 60以上のプロダクト
  • エンジニアの40%異常が外国籍

エンジニアリングの進化の歴史

  • スタートアップ期
    • アカウントアグリゲーションを活用
      • いろんな金融データ
    • B2B SaaSの拡大
    • Railsモノリス
      • 共有DBに数百億レコード
      • ここが止まると全部止まる
  • 充電期
    • 上場による資金調達
    • モノリスからの脱却
      • 個別DBへの移行
    • AWSを開発チームが扱う
    • PdM.QA,SREなどの職種
    • ベトナム拠点
  • 拡大期
    • 中小から中堅向けのサービス進出
    • 個々のプロダクトの拡大
    • エンジニアのグローバル採用開始
    • 大規模プロダクトのマイクロサービス化
    • 爆発的にプロダクト数がのびた
  • 再編期
    • 個別最適化しすぎたことによる効率低下
    • グローバル化進展し多拠点開発増加
    • 標準化や共通化
    • 多拠点開発の環境整備
    • 横断組織強化

2ヶ月かかるDBアップグレード検証を最大2週間に短縮した自作Go製CLIツール「Platinum」を紹介する

  • VTRyo(Inaba Ryo)さん/SRE

Dbエンジンの変更

  • DBエンジンの変更
    • pt-upgradeでチェックしてる
    • 異なる2バージョンの互換性をチェックしレポートを出す
    • レポートを得るまでに2ヶ月かかった
  • ハードル
    • 社内制約
      • 本番環境のデータをprodのAWSの外に出してはいけない
      • prodに検証環境を作らないといけない
    • 準備の手間
      • general.logの準備
    • 実行中の手間
      • 実行してほしくないクエリを地道に除外
  • 自前でツールを作った

横断組織として考える共通DBの課題解決 〜 桃園の誓いアーキテクチャ

桃園の誓いアーキテクチャ

  • DBを共有しサービスが止まるときは皆一緒というアーキテクチャ
    • 規模が小さい頃は効率的に開発できていた
    • 規模が大きくなってSlowQueryで障害にもつながっていた
  • 脱却
    • 共通DBではなくサービスDBを使うように移行していく
      • 特定テーブルを分離して別DBに分離させて段階的に

Rubyにおける並行処理

  • Edric(Pham Vuong Trieu)さん/Backend Engineer

Rubyで並行処理

  • 並行処理ははやいけどコストがかかる
    • CPU/メモリ
  • 子プロセスを作っての実行は効率がよくない
    • Paralleというgem
  • Process/Thread/Fiber/Reactor

Money Forward UIの紹介

Money Forward UI

  • マネーフォーワードクラウド向けのUI
    • 30を超えるプロダクト
  • デザインから実装にかかる時間を短縮
  • 見た目や振る舞いの差分を発生させない
    • プロダクト間の連携が多いので大切
  • 一貫性のあるアクセシブルなUI部品
  • GitHubPackagesで4つのnpmパッケージを展開
  • mfui-components
    • UI部品やレイアウト
    • panda css
    • ビルド時には1枚のCSS出力してそれを読み込んでもらう
    • Chromaticでvrtしてる
  • nfui-icons
  • mfui-design-tokens
    • デザイントークンの提供
    • 余白とか色とか
    • Figma VariablesからJSON出力してStyle Dictionaryで変換し提供
  • ドキュメンテーション
    • ADRで記録を残す
    • JSDoc
      • 利用者がエディタ上で確認できる
      • exportするものには全部書いてる
      • コンポーネントのprops型にも書いてる

グローバルなソフトウェアテスト組織における課題と戦略

  • Shun Tsunodaさん/QA Engineer

マネーフォーワードのQA

  • 日本/ベトナム/インドにQAの組織
    • 日本語のみの情報は共通情報とはできない
    • テスト用語は難しいのものが多いからなおさら
  • ISTQB
  • ISO/IEC/IEEE 29119
  • スタンダードは抽象的なものが多い
    • カスタマイズして取り入れていく必要がある
  • テスト計画
    • スケジュールだけじゃない
    • 達成すべきテストの目標
    • スコープ/リスクなど
  • テストプロセス
    • 計画/分析/設計/実装/実行/完了
    • ユーザストーリー
    • テスト条件
      • 何をテストするのか
      • 抽象的なレベルと具体的なレベル
        • ツリー構造にできる
        • 下位に行くほど具体的
    • テストモデル
      • モデルを作成してパラメータ設計などをする
    • テストケース

通知基盤におけるKafka活用事例

  • Ayumi Tamaiさん/Backend Engineer

通知基盤でのKafkaの利用

  • マネーフォーワードクラウドシリーズそれぞれで通知がある
    • 通知設定を個別に行うのはUX的にいまいち
    • 通知基盤で一元管理
  • Kafka
    • ProducerからメッセージをKafkaが受け取ってConsumerに流す
    • Kafka HTTP Proxy
      • HTTPで渡せば良くなる
    • Amazon MSK
    • Amazon MSK metricsとDatadogで監視

マネーフォワードにおけるデータ戦略

  • Kazuhito Nomuraさん/CDAO

マネーフォーワードのデータ

  • 膨大な重要データを持っている
  • DataSource, DataLake, Analysis/Modeling, Application
  • 一箇所にデータが集まってること
    • 使いたい時に使えるように
  • 生成AIの新しいサービスを柔軟に使えるように
    • いろんなのがどんどん出てくるので
  • 運用基盤が整ってること
    • 本番で使う時にちゃんと動かせるように
  • 学習可能なトランザクションデータの蓄積

MEet Flutter Add-to-App: Unlocking Our Productivity

  • Ichiro Hirataさん/iOS App Engineer

Flutter

  • Flutter
    • google
    • iOS/Androidのアプリを作れる
    • Add-to-appという既存アプリに部分的にFlutterを入れる機能がある
  • アプリ開発の課題
    • iOSAndroidのリソースを均等に保つのが難しい
    • デザインが別々に管理されている
      • デザイナーの負担が大きい
    • マーケター向けのメトリクスの計測に差異がある
    • ツールなどもばらばら
    • 古いOSバージョンもサポートするため最新技術をなかなか使えない
  • Flutter導入
    • FlutterのリポジトリにマージされるとiOS/AndroidそれぞれにCIでPR作る
    • 画面単位でFlutterだったりiOS/Androidという設計にした
      • 同じページで混ざるのは大変なのでやめてる
    • デバッグするときはFlutter単体アプリとしてできる
    • デザインはMaterialDesignで統一

Donut + SegFormer ~ Donut で位置を推定する

  • mozz(MORI Masakazu)さん/ML Engineer

AI-OCP

  • 請求書などの文書から記載内容を読み取る
  • 代表的な手法
    • OCRして固有表現抽出
      • テキストにしてから特定する
    • 物体検出してOCR
      • どこに記載されてるか特定してテキスト化
    • End to End
      • 1つのモデルで実現
  • Donut
    • NAVERのEnd to Endのモデル
    • 画像処理とOCR一気通貫でやる
    • 学習する時にどこに書かれているかの情報を使わない
      • 改善の余地がある?
  • Donut + SeggFormer
    • SefFormerのDecoderを入れて場所の情報も出力できるようにした

Passkey Autofill に賭けるマネーフォワード ID

  • nov(Nov Matake)さん/Backend Engineer

パスキー

  • 一番多く使われてるのがパスワード:80%
  • 強力あなパスワードを使い回さずに使えばパスワードも強い
    • 自動生成だとパスワードルールに引っかかることもあって面倒
  • どこかのサイトがパスワードを漏らすと使い回してるサイトにログインされてしまう
  • 生体情報などで認証すると公開鍵が作らて送られる
    • パスキーはパスワードマネージャーに保護されている
  • 複数プラットフォーム間の問題
    • iOS/Android/windows
    • 登録してない端末で使うとエラーになって体験が悪い
  • Passkey Autofill
    • どのユーザでログインするかサジェストしてくれる
    • パスワード使ったかパスキー使ったか意識せずログインできる
    • ログインの体験はよくなる
  • 登録の体験
    • アカウント登録後にパスキー登録を促す
    • 6,7割が登録を押してくれる
    • タッチIDの登録が出てやってくれるのは半分くらい
      • こういうの出したくない
  • Passkey Auto Upgrade
    • パスワードマネージャーでパスワードででログインした時に勝手にパスキーを作る
    • いつの間にかパスキー使うようになってる
    • 結局最初はパスワード登録しないといけない

マネーフォワードが取り組む グローバルテックカンパニーへの挑戦

  • Tuck(Takuya Nakade)さん/CTO

グローバル化

  • サービスの成長はグローバル化したのが大きい
  • 海外の拠点と上下関係になるようなことはしたくなかった
    • リージョナル・イコーリティ
  • 現在CTOはインド在住