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

レガシーフレームワークからの移行

 レガシーフレームワークからの移行

沖縄フロントエンドカンファレンス2022で登壇した発表資料です。
https://frontend-conf.okinawa.jp

PickGoというサービスに採用されているフロントエンドフレームワークが時代に合わなくなってきた状況でどのように移行を行なっているかという現在進行系の話をさせていただきました。

Arakaki Yuji

January 26, 2023
Tweet

More Decks by Arakaki Yuji

Other Decks in Programming

Transcript

  1. 自己紹介 • 新垣 雄志(あらかき ゆうじ) • Twitter: @arakaji • 職歴

    ◦ 琉球インタラクティブ株式会社 ◦ 株式会社Payke ◦ CBcloud株式会社 ← NOW • 現職での役割 ◦ PickGoというサービスのリードエンジニア
  2. 会社概要
 基本情報
 © 2016-2019, CBcloud Co., Ltd
 2
 会社名
 英文社名


    CBcloud株式会社 
 CBcloud Co., Ltd.
 所在地
 東京都千代田区神田練塀町300
 住友不動産秋葉原駅前ビル16階
 代表
 松本 隆一
 設立
 2013年10月
 社員数
 160名(業務委託・アルバイト/派遣除く)(2022年10月24日時点)
 主要株主
 Tokyo Office
  3. 会社概要
 沿革 © 2016-2019, CBcloud Co., Ltd
 3
 2013年設立
 運送会社時代


    「PickGo」の原点
 「軽town」リリース
 本社を神田に移転
 3.6億円資金調達 (シリーズA)
 60億円資金調達 (シリーズC)
 計80億円調達
 沖縄オフィス立ち上げ 
 大阪オフィス
 立ち上げ
 初のテレビCM放送
 愛知、福岡オフィス
 立ち上げ
 急成長フェーズを見込む 
 従業員数(人)

  4. 業界情報
 物流業界の課題
 ラストワンマイル/近距離領域における主な課題 
 © 2016-2019, CBcloud Co., Ltd
 6


    1次請運送会社(元請け)を頂点とした階構造となっており、 2次・3 次・4次運送会社(下請け)は、一般的に低賃金や過重労働時間 などの問題を抱えている 
 2次請運送会社
2次請運送会社
2次請運送会社
 3次請運送会社
 4次請運送会社
 3次請運送会社
 1次請運送会社
 多重下請け構造
 紙の地図に、その日の運行ルートを手書きするなどアナログな現 場作業による不便さが顕在化している 
 アナログ・非効率な業務 

  5. 業界情報
 業界の課題を解決するために 
 業界の課題を解決するために、以下プロダクトを展開 
 © 2016-2019, CBcloud Co., Ltd


    7
 業界課題
 多重下請け構造
 アナログ
 非効率な業務
 提供プロダクト
 概要/説明頁
 荷物を送りたいユーザーと、届けてくれるユー ザーを直接つなげるプラットフォーム 
 これまでのアナログな業務を自動化・効率化 し、一つのプラットフォームで全ての管理が可 能
 宅配サービスの配送効率と品質をあげ、簡単 に宅配事業を効率化 

  6. プロダクト立ち上げ当初の技術 • PickGoというサービスは2016年に「軽town」という名前でサービスローンチ • 当時の技術スタック ◦ バックエンドScala ◦ 荷主が使う配送依頼画面はウェブアプリケーション ◦

    ドライバーがつかうのモバイルアプリ ◦ ウェブアプリケーションは SPA ◦ モバイルアプリなネイティブ (Swift, Kotlin)で実装された一部の画面を除き、大半は WebViewでSPAの画面を表 示 • 今回移行を進めているのはこの時採用した SPAのフレームワーク
  7. なぜこれが技術負債となるのか? • 2016年9月にアーキテクチャが一新された次期バージョンがリリースされる ◦ 実装時の推奨言語が変わる ◦ フレームワークの名称も変更される ◦ フレームワークの仕様が大幅に変更され、既存バージョンとの互換性はない •

    中長期的に見てこのフレームワークでプロダクトを作り続けるのは困難 ◦ バージョンアップ = ほぼ作り直しのため困難 ◦ 現バージョンのままでいることのセキュリティリスク ◦ エンジニアの採用・維持への悪影響 ◦ 古いフレームワーク故の開発生産性の低さ
  8. 移行開始が遅れた背景 • CBcloudでは複数のプロダクトを展開 ◦ PickGo, PickGo ショッピング、Smaryu トラック、Smaryu ポスト, etc..

    ◦ 1~1.5年に一つは新しいプロダクトを爆誕させている ◦ その分エンジニアの人数がその立ち上げに割いていた • PickGoの技術的負債はフロントエンドだけじゃなく、バックエンドにも ◦ 当初Scalaで開発していたが、開発生産性やエンジニア採用の難易度を理由に途中からバックエンドに Railsを 採用 ▪ 新機能のAPIはRails, 既存APIはバグ修正や仕様変更があるたびに徐々に Railsに移行 ▪ ScalaとRailsの変更稼働状態が続く ◦ Rails側も大変 ▪ 移行時にAPI仕様を理解してRails wayで書くではなく、 Scalaのコードをポートする形で実装 • トランザクションスクリプト的なコード、 ARのバリデーションとか使ってない ▪ テストがない ▪ そう、テストがない ◦ バックエンドの課題解決にも工数が取られなかなかフロントの課題に向き合う余力がなかった
  9. 移行先の技術スタックをNuxt -> Flutterへ変更する - アプリ側の新機能開発要件で、どうしてもネイティブで実装しないといけない要件が出てきた - そのときはKotlin, Swiftで別々に実装 - 両方のOSをメンテし続けるの厳しい

    - 別プロダクトでFlutterを採用していたので、PickGoでもFlutterが使えないか技術検証 - いけそう - 両方OS対応をする負荷も減らせるため移行先を NuxtをWebViewで開くではなく、Flutterで実装すると いう風に方針展開
  10. Flutter化プロジェクト - まず既存の少ないネイティブ画面を完全に Flutterに移植することからスタート - 完了したらベータリリースにユーザー協力してもらいながらバグを潰していく - 本リリースへ - その後はボトムメニューを

    Flutter毎にFlutterで実装=>QA=>ベータリリース=>本リリースを繰り返す - 移行中も新機能開発が必要な場合は Flutterで実装する - 新機能開発と移行PJTを並行しながら、2022年8月には移行完了 - 2021年1月スタートなので 1年8ヶ月ほどかかった
  11. フロントエンドにロジックが強く組み込まれていた - 配送依頼画面はサービスの根幹を担う機能 - サービス立ち上げから現在までの試行錯誤や価値提供のためのロジックがたくさん存在する - この仕様を読み解き、取捨選択して移行する難易度が非常に高かった - 本来バックエンドが担うべきビジネスロジックがフロントエンドに漏れ出していた -

    バックエンドの負債とも強い関係 - ScalaのAPIを改修すればいいができないので、別 APIをRailsに作ってフロントエンドでマージ /計算する - Railsの既存APIを改修すればいいがテストなく複雑なコードを触るのが怖いので、別 APIを作ってフロントエンド でマージ・計算する - バックエンドにロジックを組むべきだが他が壊れるのが怖いのでフロントエンドでロジックを組む - 結果、フロントエンドのコードが肥大化していくことに - 技術的負債が重なると更なる負債を生み出すという結果を観測することになってしまった。
  12. スタッフ管理機能の不足による課題 - サービス運営上多数の機能が必要だが、全然たりていない - そのため開発者に依頼して SQLを叩いて行うオペレーションがたくさんあった - それにより負のサイクルが回っている状況 - 管理機能が足りない

    - 開発者に依頼がくる - その依頼対応のために新機能のための時間作れない - 管理機能がたりない - これに加えて負債となっているフレームワーク上に新しい画面を追加して負債を増やしたくないという思い が重なる
  13. まとめ - ビジネスを前に進めるために以前行った決定の上に僕らは立っている - そこを否定しない - とはいえ、これからの数年を今いる人の意思決定が支えるので、現在進行形でレガシーフレームワーク の課題に向き合っている - 技術的な課題も多いが、マネジメントの課題の方が多くここをしっかり向き合って改善していくにはある程

    度長い目線で向き合う覚悟と気合いがいる - だからMPをかなり消費する - ただ、モダンな技術を新規で採用するスキルよりも既存の技術を新しい技術に置き換えていくスキルの方 がエンジニアとしての市場価値もおそらく高い - ここに積極的に向き合えると、逆に難しい課題を解く楽しみを味わえて楽しい