Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

KEPPLE DB リプレースにおける技術的負債のバランス感覚

KEPPLE DB リプレースにおける技術的負債のバランス感覚

株式会社ビットキーさん主催のイベント「フロントエンドリプレイスにおける苦悩と工夫 〜React/Next.js編〜」で発表させていただいた際に使用したスライドです。

喋り主体だったのでスライドに書いていない内容も多いですが参考になれば嬉しいです。

Yuichiro SERITA

February 29, 2024
Tweet

More Decks by Yuichiro SERITA

Other Decks in Programming

Transcript

  1. • 株式会社ケップル KEPPLE CREATORS LAB 所属 • エンジニアとして働き始めてほぼ7年 • ケップルにジョインして2年弱

    • フルスタック的に Web まわりのエンジニア をやっています • とにかくコーヒーが好き 芹田 悠一郎 Yuichiro SERITA
  2. KEPPLE DB の性質 • スタートアップ・投資家の数は 2 万社くらい (どんどん増える) • スタートアップ

    1 社あたり、フロントで表示しているプロパティは ざっくり数十個くらいのオーダー (じわじわ増える)
  3. 課題 • KEPPLE DB は高頻度でリリースしたい が…… • KEPPLE DB は

    KEPPLE CRM の一機能だった • KEPPLE CRM はリリース時にサービス停止が必要 • KEPPLE CRM は 2018 年リリースで、 リプレースを決断した時点で 5年間機能追加したり消したりしていろいろしんどくなっている
  4. 課題 (フロント) • React で書かれている素の SPA で規模拡大に課題 • いろいろなライブラリのバージョンが古い •

    魔改造されたコンポーネントが多くてバージョンが上げられない • かつて Internet Explorer に苦しめられた結果残ったメンテしづらいコード
  5. フロントで何が負債になっていたか? • React Router と密に結合したロジック • 既成の UI ライブラリを魔改造した独自コンポーネント •

    URLクエリ文字列を直接触って状態を保存するコード • 特定のブラウザ専用のロジック → 具体的なものに密に結合している
  6. ライブラリに依存しないコードを書くのは無理 • React (と Next.js) を使う以上はがっつり乗っかっていくしかない • たとえば UI コンポーネントライブラリを使うなら「そのライブラリの流儀」に

    従わないとつらい • ライブラリの流儀に添うことで負債になりやすくなるが開発スピードは上がる このトレードオフのバランスを取りたい
  7. KEPPLE DB におけるバランス • 負債を踏み倒せないので、開発スピードに全振りはできない ◦ 長く続けるサービスなので長くメンテできるようにする ◦ リプレースは今回限りにしたい。定期的に作り直す式年遷宮方式にはしない ◦

    返済できない負債を作ってはいけない • 開発スピードが必要なので、負債になりづらさに全振りはできない ◦ リプレース作業の間、通常の機能追加のペースが落ちてしまう
  8. ルーティング • 独立させやすさ中〜低、独立してほしさ中〜低 • どの Router ライブラリを使っても依存を剥がしづらい • Next.js Pages

    Router 採用してる時点でがっつり依存するのが確定 • もし方式を変えるなら (ルーティングまわりは) 諦めて作り直したほうが早い
  9. UI ライブラリを魔改造しないで済むように進める • 実現したい UI/UX がどうにも実現できない、という状況にしない • 実現したい UI/UX の解像度が低いと魔改造に走りがち。

    「前にできてたあれをそのままやりたい!」 リプレースあるある • UI ライブラリのデザインシステムに従う。従うことができるように進める • ビジネス側、デザイナーを巻き込んでライブラリを選定する • Storybook で早くフィードバックをもらい、軌道修正する
  10. ディレクトリ構成はfeatureベースにする • ディレクトリ構成はフレームワークに依存させずユースケースに合わせ、 feature ベースにする • 種類別はフレームワークへの依存度が高い (種類別とは、component, hooks, libs,

    のよ うなディレクトリの下に機能名のディレクトリがぶら下がる方式を指しています) • ルーティングだけは仕方ないのでフレームワークに従う。
  11. ライブラリの流儀に添いつつ剥がしやすくする • 容易に剥がせないことがわかっているライブラリは枯れたものを採用 ◦ App Router ではなく Pages Router を採用したのはそのため

    ◦ (新しいライブラリや新機能を使いたい欲求は別プロダクトで……) • 破壊的変更を頻繁にするライブラリは容易に剥がせるときのみ採用 ◦ Storybook とか