Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
出前館Webフロントエンドリプレイスプロジェクトの取り組みと反省について
Search
株式会社出前館
November 01, 2023
Technology
1.9k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
出前館Webフロントエンドリプレイスプロジェクトの取り組みと反省について
株式会社出前館
November 01, 2023
More Decks by 株式会社出前館
See All by 株式会社出前館
中期計画、2回作ってみた ~業務委託と正社員、両方の視点から~
demaecan
1
1.1k
複雑にからみあう複数のシステムを要する出前館QAの実情、展望
demaecan
0
210
QA業務を変える(!?)AIを併用した不具合分析の実践
demaecan
0
230
出前館アプリの品質を支えるリリーストレインとその実践
demaecan
0
270
出前館アプリ進化論 アーキテクチャと組織のリアルな変⾰の舞台裏
demaecan
0
870
Flutterにしてよかった?出前館アプリを2年運用して気づいたことを全部話します
demaecan
1
1.3k
Boxを“使われる場”にする統制と自動化の仕組み
demaecan
1
500
生成AI導入における「短期ROIを超えた」共存戦略
demaecan
0
180
Okta Identity Governanceで実現する最小権限の原則
demaecan
1
500
Other Decks in Technology
See All in Technology
サイバー捜査員研修(後半)
nomizone
1
870
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.9k
ブラウザ研修 2026
recruitengineers
PRO
6
990
【CEDEC2026】Creative Approaches to Localizing the Dialects and Unique Speech of Umamusume: Pretty Derby Characters in English
cygames
PRO
3
20k
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
19k
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
280
20分でわかるセキュアAPI
nwiizo
2
270
修正PRを食べてレビュースキルが賢くなる:Claude Codeによる自己改善サイクル
yuyaumetsu
6
1.5k
[ChatGPT Work LT]事務作業が苦手な人のための バックオフィスの「半」自動化
chimaki_iot
0
280
Sets in Go
ramalho
1
640
20260804_Q4AzureUpdateBite_FabricDataAgentの精度を高める設計.pdf
matayuuu
1
130
ハーレムエンジニアリング
kazuma777777
0
150
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
698
190k
Un-Boring Meetings
codingconduct
0
380
Side Projects
sachag
455
43k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Producing Creativity
orderedlist
PRO
348
40k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
160
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
4.3k
Writing Fast Ruby
sferik
630
63k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
520
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
360
How to build a perfect <img>
jonoalderson
1
5.9k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Transcript
出前館Webフロントエンドにおけるリプレイス プロジェクトの取り組みと反省 株式会社出前館 Taiki Shiraishi / 白石 泰己
自己紹介 株式会社出前館 フロントエンドグループ グループマネージャー Taiki Shiraishi / 白石泰己 ユーザー向け Web
サイト開発 UI制作が好きなフロントエンドエンジニア
• 個人発表ではなくチームを代表して発表 • チームの取り組んできた内容について • チーム構成 12 名 発表の内容について
1 2 3 4 5 目次 PHP から Next.js への刷新
BFF パターンの採用 GraphQL の採用 モノレポの採用 コンポーネントディレクトリの変更
出前館 Web フロントエンドリプレイス • 開発体制の内製化 • フロントエンドチーム • 2021年からビッグ・リライト中 •
PHP + jQueryからNext.jsへの刷新 ◦ より効率的な開発が可能 内製化 技術刷新
出前館 Web フロントエンドリプレイス Before Browser PHP App Legacy API Redis
DB
出前館 Web フロントエンドリプレース After Browser BFF App Legacy API Redis
DB Micro Service A Micro Service B
1 2 3 4 PHPからNext.jsへの刷新理由 フロントエンドチームに PHP 知見ある人が少なかった 既存のコードの保守性の問題 MVCフレームワークでありながらControllerが肥大化
内製化によるPHPの知識不足 フロントエンドのベストプラクティスを適用しやすい環境に バグを減らして、できるだけ早くコードをリリースしたい SSG、SSR、 CSRを同時にできるフレームワークは当時は一択 採用活動にも有利 Reactコミュニティの大きさ
Next.js に満足
1 2 3 BFF(Backend For Frontend)パターンの採用理由 バックエンドのマイクロサービス化 セッション管理 PHP で行っていたセッション管理の構成を引き継ぐ
Aggregation Gateway層の必要性 アプリと Web で処理が重複 → BFF で共通化 • 待ち時間の計算 • 店舗の商品の時間帯別ソート • 暗号化/復号化 アプリと Web で 1 つの BFF にすることとした モバイルアプリと Web のロジックの共通化
Good 👍 BFFパターンの採用 その後 • ViewModel の共通化 • テストコードもかけた •
フロントチームだけで整形を完結でき る • 開発組織内でも責務の認識齟齬 ◦ ビジネスロジックを持ちオーケストレーション 層だと思われる • アプリの改修時にもフロントエンドチーム の稼働が発生 • フロントエンドエンジニアがインフラを構 築・運用管理したり、オブザーバビリティ をきちんとするまでにいたるのには大変 • 今までブラウザサイドの経験しかないメン バーでやるのは大変 One more 😒
One more 😒 • 開発組織内でも責務の認識齟齬 ◦ ビジネスロジックを持ちオーケストレーション 層だと思われる • アプリの改修時にもフロントエンドチームの
稼働が発生 • フロントエンドエンジニアがインフラを構築 ・運用管理したり、オブザーバビリティをき ちんとするまでにいたるのには大変 • 今までブラウザサイドの経験しかないメンバ ーでやるのは大変 • BFF という名前が一人歩きしないようにコ ミュニケーションがアーキテクチャ図を作 るべきだった • Web チームがアプリの人を巻き込んで作る べきだった • 初期構築時にインフラエンジニアがチーム にいてほしかった • オブザーバビリティに知見のある人が欲し かった Ideal ✨ BFFパターンの採用 その後
1 2 GraphQLの採用理由 アプリと Web 両方から利用されるため柔軟に利用できるように データオーバーフェッチの削減 リクエストの最適化 クライアントドリブンなアプローチ
Good 👍 GraphQL採用 その後 • ApolloClient のキャッシュが良い ◦ SPA 遷移したときにリフェッチせずキャ
ッシュが優先される • 既存 API の設計に依存し再利用性と柔軟 性が低い ◦ GraphQL のベストプラクティスを実現できていな い。 ◦ 昔の DB のデータ構造や API の改修になしに GraphQL サーバーだけでは柔軟なデータ構造の構 築には至れなかった • REST API と変わらぬ設計 One more 😒
One more 😒 GraphQL採用 その後 • 既存 API の設計に依存し再利用性と柔軟 性が低い
◦ GraphQL のベストプラクティスを実現できていな い。 ◦ 昔の DB のデータ構造や API の改修になしに GraphQL サーバーだけでは柔軟なデータ構造の構 築には至れなかった • REST API と変わらぬ設計 • DB~マイクロサービス まで 1 チームと なりデータ構造を作りたかった • これからのリアーキテクトに期待 Ideal ✨
1 2 3 monorepo の採用理由 SSRと BFF の負荷を分散することで可用性 UP リスク分散
別サーバーにすることで Web サーバーが動かなくとも BFF が動けばアプリは動く 負荷分散 Next.js の API routes だったため、クライアントサイドとサーバーサイドのコードが混在 より明確なコードベースとディレクトリ構造
Good 👍 monorepo 採用 その後 • パフォーマンス向上 • 実際に Web
で障害が発生したが、 BFF は稼働し続けた • クライアントサイドとサーバーサイド でコードベースが分離されてわかりや すく • Web と同じリポジトリの場合に他チーム がカジュアルに参加できない • クライアントとサーバーで util 関数など が共通化できておらず、monorepo の良 さを活かしきれていない One more 😒
One more 😒 monorepo 採用 その後 • Web と同じリポジトリの場合に他チーム がカジュアルに参加できない
• クライアントとサーバーで util 関数など が共通化できておらず、monorepo の良さ を活かしきれていない • 完全な別リポジトリにすべきだった • monorepo での共通関数の modules 作成 を最初にすべきだった Ideal ✨
Before Component ディレクトリの変更 src └─components ├─atoms ├─molecules ├─organisms ├─templates └─pages
1. Atomic design の粒度と React Component の粒度が合わない a. Headless な UI はどうすれば🤔 2. Templates と Layouts が役割が重複してい る a. Pages も同じく One more 😒
After Component ディレクトリの変更 src ├ shared ……………………………… # 特定の機能に関心を持たない汎用モジュール群 │
├ components │ │ ├ functionals ………………… # 見た目に対して関心を持たないコンポーネント群 │ │ └ ui ……………………………… # その他の汎用コンポーネント │ └ hooks ……………………………… # 汎用hooks └ features ……………………………… # 特定の機能に関心を持つモジュール群 ├ shop │ ├ components │ └ hooks └ cart ├ components └hooks
1 2 3 4 改善できる背景 GitHub Discussion や MTG の開催で新しい取り組みへ
前向きに議論 毎週木金に翌週リリースの資材でコア機能のテスト チームでの議論 QA によるリリース判定テスト フロントチームも取り組んでいるがサーバーチームか らも報告がある オブザーバビリティ 自分たちで使って自分たちで直す 社員にユーザーがいる
• チーム内の認識合わせの重要性 • ビジネス変化や考慮不足による負債は不可避 • 改善と組織・環境の重要性 • 新しい取り組みと慎重さのバランス感 まとめ
ありがとうございました! ご質問などお気軽にお尋ねください。😄