SlideShare ist ein Scribd-Unternehmen logo
1 von 29
フロントエンドリプレース戦略
2021. 03. 10 Tsuji Yuko
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
自己紹介
• 辻 祐子 (@osunu)
• 2018年 株式会社カカクコム入社
• 食べログフロントエンドチームリーダー
• リプレースプロジェクト推進、採用、チームビルディング
• テニミュ、特撮、アニメが好き
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
目次 1. 食べログフロントエンドの
リプレースプロジェクトについて
2. リリース戦略について
3. リリース戦略の実現手段について
4. まとめ&今後の課題
1. 食べログフロントエンドの
リプレースプロジェクトについて
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
食べログフロントエンドリプレースプロジェクト
 2005年サービス開始で、歴史あるサービス食べログ
 いろいろあってフロントエンドがそこそこカオス!
 メンテナンス性が高いシステムに構築しなおしたい…
 jQueryからReact/TypeScript にリプレースしよう!
 詳しくはブログを読んでね 😚
 食べログ フロントエンドエンジニアブログ
 https://note.com/tabelog_frontend
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
食べログフロントエンドリプレースプロジェクト
React !!
jQuery
jQuery
jQuery
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
どうして一部だけ?
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
っていうか
どうやって共存?
2. リリース戦略について
Ruby on Rails上で部分的にリプレースを進めている理由
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
食べログって、いろんなページがあります!
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
食べログの状況とプロジェクトの規模感
Ruby on Rails アプリケーション 25個
エントリーポイント 1532ファイル
JSファイル行数 210,760行 ※node_moduleは含まず
1週間にリリースされるissue 100件〜
 短期/中期での全体的なリプレースはスコープ外
 長期戦!!
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
なぜページ毎のリリースを選択しなかったか
 リリースの単位が大きくなりすぎるから
• 食べログは多機能&複雑で、ページごとのリリースは数ヶ月〜半年レベル
• 開発期間が長引くほど、機能開発の追従のコストが嵩む
• リリースが単位が大きいほどリスクが大きくなる
 大量のコンポーネント2重管理がメンテナンス性を下げるから
• Reactへの移行期間が長く、その間のメンテナンス性低下を許容できない
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
部分毎リリースのメリットとデメリット
 メリット😚
• リリースのスパンが短く、機能開発の追従のコストが最小限
• コンポーネント2重管理を抑制できる
• 共存状態が長期間に渡っても、メンテナンス性を下げにくい
 デメリット🥺
• 参考情報・事例が少ない
→しょうがない!そもそもこの規模の事例が殆どない
→重要度の低い小さい機能から段階的に検証&リリースをする
• ページ内読み込みファイル数が増え、パフォーマンスが低下
→既存のjQuery領域のパフォーマンスを改善する
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
ページごとの分離を諦めたわけじゃない
Ruby on Rails Ruby on Rails Next.js?
部分的にReactを導入する ページ内のReact領域を増やす ページ内が全てReactになった時点で
Ruby on Railsから切り離す
→ →
3.リリース戦略の実現手段について
どうやってRuby on Rails上で共存させるか
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
分離するまで、どうやって共存するのか
Ruby on Rails Ruby on Rails Next.js?
部分的にReactを導入する ページ内のReact領域を増やす ページ内が全てReactになった時点で
Ruby on Railsから切り離す
→ →
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
共存手段選定の観点
共存期間が長くなっても大丈夫なように!
jQueryとReactが
疎結合であること
 jQueryのカオスを引き継ぎたくない
 Reactのリプレースリリース時にjQueryのテストをしたくない
運用が容易であること  共存ページでjQueryの機能開発を今まで通りすすめられるように
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
共存手段選定の観点
手段1 Reactのコンポーネントを別パッケージとし、
jQueryベースの既存エントリポイントからimportする
手段2 Reactベースの新規エントリポイントから
ReactのコンポーネントとjQueryのコンポーネント両方をimportする
手段3 jQueryベース,Reactベースのエントリポイントを共存させる
採用!
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
手段1:Reactのコンポーネント別パッケージとし、
jQueryベースの既存エントリポイントからimportする
※イメージです
Ruby on Rails
(slim or erb)
<html>
<head>
<script src=“jquery.js“></script>
<script src=“jquery-bundled.js“></script>
</head>
<body>
<p>食べログだよ!</p>
<a class=“js-click-shop”>店舗ページへ</a>
<div class=“react-hoge-a”>
<!— ここにreactがレンダリングされる —>
</div>
</body>
</html>
jQuery-component-a
jQuery-entrypoint
jQuery-component-b
React-entrypoint
React-component-b
React-component-a
jQuery関連ファイルだけBundle
React関連ファイルだけBundle
React-bundled.js
❌ 不採用
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
手段1:Reactのコンポーネント別パッケージとし、
jQueryベースの既存エントリポイントからimportする
• メリット
• jQueryとReactのコンポーネントが疎結合になる
• ビルドは2回必要だが、それぞれやることはシンプル
• デメリット😨
• Reactの機能をjQueryに組み込んだ状態でおかしな表示や挙動を見つけた時に、ビルド
後のJSの場合、デバッグがしづらく原因の特定が困難。
🙅不採用
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
手段2:Reactベースの新規エントリポイントから
ReactのコンポーネントとjQueryのコンポーネント両方をimportする
※イメージです
Ruby on Rails
(slim or erb)
<html>
<head>
<script src=“react-bundled.js“></script>
</head>
<body>
<p>食べログだよ!</p>
<a class=“js-click-shop”>店舗ページへ</a>
<div class=“react-hoge-a”>
<!— ここにreactがレンダリングされる —>
</div>
</body>
</html>
jQuery-component-a
jQuery-component-b
React-entrypoint
React-component-b
React-component-a
jQuery, React関連ファイル全てを1度にBundle
❌ 不採用
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
手段2:Reactベースの新規エントリポイントから
ReactのコンポーネントとjQueryのコンポーネント両方をimportする
• メリット
• React公式ドキュメントの「DOM 操作プラグインとのインテグレーション」で紹介され
ており、お手本実装がある
• デメリット😨
• jQueryとReactが疎結合にならない
• ReactベースとjQueryベース両方のページで使われている既存モジュールは、
React/jQuery両方エントリポイントで動くことのテストが必要になる
🙅不採用
🙅不採用
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
手段3:jQueryベース, Reactベースのエントリポイントを共存させる
※イメージです
Ruby on Rails
(slim or erb)
<html>
<head>
<script src=“jquery.js“></script>
<script src=“jquery-bundled.js“></script>
<script src=“react-bundled.js“></script>
</head>
<body>
<p>食べログだよ!</p>
<a class=“js-click-shop”>店舗ページへ</a>
<div class=“react-hoge-a”>
<!— ここにreactがレンダリングされる —>
</div>
</body>
</html>
jQuery-component-a
jQuery-entrypoint
jQuery-component-b
React-entrypoint
React-component-b
React-component-a
jQuery関連ファイルだけBundle
React関連ファイルだけBundle
⭕ 採用
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
手段3:jQueryベース, Reactベースのエントリポイントを共存させる
• メリット
• jQueryとReactのコンポーネントが疎結合になる
• ビルドは2回必要だが、それぞれやることはシンプル
• デメリット
• ページ内にランタイムが複数存在する
→jQuery/React双方が影響しあわないよう運用でカバー
• 1ページの読込ファイル数が増え、パフォーマンスに影響する
→既にリリースされた機能は規模も小さく許容範囲だった
→jQuery側のパフォーマンス改善をリプレースと並行して行う
🙆採用
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
実際に手段3でやってみた感想
 jQueryとReactを疎結合にできて良かった✨
• 完全に別でビルドができて、
jQuery,Reactそれぞれのテストだけでリリースが出来るので、機能改善のペースをキープ
 jQueryベースのカオスを引き継がず、Reactはキレイな世界✨
• テストカバレッジ: Branch 95%
• インテグレーションテスト環境の整備(APIのモック化)
• Schemaドリブン、コンポーネントドリブンな開発
• アクセシビリティを意識した実装 👈詳しくはブログで!
 1ページにランタイムが2つあっても運用可能✨
• お互いのDOMを触らない運用ルールで無事故
 パフォーマンスの懸念🥺
• React導入した場合のバンドルサイズを確認できた
• 今後SPのリプレースを進めるときより厳しくパフォーマンスの調整が必要
4. まとめ&今後の課題
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
まとめ
 食べログのフロントエンドリプレースプロジェクトは長期戦
 ページごとのリリースは最新機能の追従や2重管理の発生によるコストが大きく
なるため、コンポーネントごとにリリースします
 ページ内でjQueryベース,Reactベースのエントリポイントを共存させ、
コンポーネント毎のリリースを実現しています
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
今後の課題
 Next.jsの導入!
• 1ページまるごとReactにできる未来が見えてきた
• Server Side RenderingでSEO対策をしたい
• Client Side Renderingだけじゃまだ駄目だって
• 絶賛進行中!!
• もう少し進んだらブログに書けたらいいな
• 食べログ フロントエンドエンジニアブログ
• https://note.com/tabelog_frontend
Next.js!!!
ページ内が全てReactになった時点で
Ruby on Railsから切り離す
Copyright (c) Kakaku.com, Inc. All Rights Reserved.
さいごに
 We are hiring!!!!
 一緒に大規模システムのリプレースに取り組みませんか?
 フロントエンド以外の職種も募集中です❤
 https://www.wantedly.com/projects/254221

Weitere ähnliche Inhalte

Was ist angesagt?

SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
Batchは作ったことあるけど、 初めてSpring Batchを使ってみた
Batchは作ったことあるけど、 初めてSpring Batchを使ってみたBatchは作ったことあるけど、 初めてSpring Batchを使ってみた
Batchは作ったことあるけど、 初めてSpring Batchを使ってみたHideyuki SASAKURA
 
Fantiaから学ぶgcp運用のノウハウ
Fantiaから学ぶgcp運用のノウハウFantiaから学ぶgcp運用のノウハウ
Fantiaから学ぶgcp運用のノウハウ虎の穴 開発室
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDeleteYu Yamada
 
Webアプリケーションは難しい
Webアプリケーションは難しいWebアプリケーションは難しい
Webアプリケーションは難しいTakafumi ONAKA
 
データ活用をするための組織
データ活用をするための組織データ活用をするための組織
データ活用をするための組織Kon Yuichi
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)NTT DATA Technology & Innovation
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Shin Ohno
 
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Toshiaki Maki
 
Qiita Night 足場固めからやるマイクロサービス
Qiita Night 足場固めからやるマイクロサービスQiita Night 足場固めからやるマイクロサービス
Qiita Night 足場固めからやるマイクロサービスTomoki Kuriyama
 
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツpospome
 
グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発Takafumi ONAKA
 
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)NTT DATA Technology & Innovation
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。sasezaki
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
 
Githubを使って簡単に helm repoを公開してみよう
Githubを使って簡単に helm repoを公開してみようGithubを使って簡単に helm repoを公開してみよう
Githubを使って簡単に helm repoを公開してみようShingo Omura
 
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
ストリーム処理勉強会 大規模mqttを支える技術
ストリーム処理勉強会 大規模mqttを支える技術ストリーム処理勉強会 大規模mqttを支える技術
ストリーム処理勉強会 大規模mqttを支える技術Keigo Suda
 

Was ist angesagt? (20)

SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
Batchは作ったことあるけど、 初めてSpring Batchを使ってみた
Batchは作ったことあるけど、 初めてSpring Batchを使ってみたBatchは作ったことあるけど、 初めてSpring Batchを使ってみた
Batchは作ったことあるけど、 初めてSpring Batchを使ってみた
 
Fantiaから学ぶgcp運用のノウハウ
Fantiaから学ぶgcp運用のノウハウFantiaから学ぶgcp運用のノウハウ
Fantiaから学ぶgcp運用のノウハウ
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDelete
 
Webアプリケーションは難しい
Webアプリケーションは難しいWebアプリケーションは難しい
Webアプリケーションは難しい
 
データ活用をするための組織
データ活用をするための組織データ活用をするための組織
データ活用をするための組織
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
 
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
 
Qiita Night 足場固めからやるマイクロサービス
Qiita Night 足場固めからやるマイクロサービスQiita Night 足場固めからやるマイクロサービス
Qiita Night 足場固めからやるマイクロサービス
 
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
 
グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発
 
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
Githubを使って簡単に helm repoを公開してみよう
Githubを使って簡単に helm repoを公開してみようGithubを使って簡単に helm repoを公開してみよう
Githubを使って簡単に helm repoを公開してみよう
 
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
ストリーム処理勉強会 大規模mqttを支える技術
ストリーム処理勉強会 大規模mqttを支える技術ストリーム処理勉強会 大規模mqttを支える技術
ストリーム処理勉強会 大規模mqttを支える技術
 

Ähnlich wie 食べログのフロントエンドリプレース戦略

20140823 LL diver Angular.js で構築した note に関して
20140823 LL diver Angular.js で構築した note に関して20140823 LL diver Angular.js で構築した note に関して
20140823 LL diver Angular.js で構築した note に関してShoei Takamaru
 
WebデザイナのためのjQuery入門。
WebデザイナのためのjQuery入門。WebデザイナのためのjQuery入門。
WebデザイナのためのjQuery入門。Yossy Taka
 
Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Makoto Haruyama
 
Spath for enterprise
Spath for enterpriseSpath for enterprise
Spath for enterpriseKoichiro Sumi
 
HTML5の前のJavaScript入門
HTML5の前のJavaScript入門HTML5の前のJavaScript入門
HTML5の前のJavaScript入門Hiroki Toyokawa
 
全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験AdvancedTechNight
 
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]David Buck
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーAyumu Kawaguchi
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーションssuser070fa9
 
5分でわかる!ownCloudアドオンの作り方
5分でわかる!ownCloudアドオンの作り方5分でわかる!ownCloudアドオンの作り方
5分でわかる!ownCloudアドオンの作り方Yuki Takahashi
 
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習Hori Tasuku
 
Autonomous を支える技術、Oracle Database 18c デモンストレーション
Autonomous を支える技術、Oracle Database 18c デモンストレーションAutonomous を支える技術、Oracle Database 18c デモンストレーション
Autonomous を支える技術、Oracle Database 18c デモンストレーションオラクルエンジニア通信
 
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアルリクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアルRecruit Technologies
 
Project Management Plan Sample Creative Content Lab Tokyo
Project Management Plan Sample Creative Content Lab TokyoProject Management Plan Sample Creative Content Lab Tokyo
Project Management Plan Sample Creative Content Lab TokyoCreativeContentLabTo
 
20190319 xtech recochoku_15m_pub
20190319 xtech recochoku_15m_pub20190319 xtech recochoku_15m_pub
20190319 xtech recochoku_15m_pubDai Fujikawa
 
TeachmeBizを支えるフロントエンドのアーキテクチャと品質担保
TeachmeBizを支えるフロントエンドのアーキテクチャと品質担保TeachmeBizを支えるフロントエンドのアーキテクチャと品質担保
TeachmeBizを支えるフロントエンドのアーキテクチャと品質担保Shingo Sasaki
 

Ähnlich wie 食べログのフロントエンドリプレース戦略 (20)

20140823 LL diver Angular.js で構築した note に関して
20140823 LL diver Angular.js で構築した note に関して20140823 LL diver Angular.js で構築した note に関して
20140823 LL diver Angular.js で構築した note に関して
 
WebデザイナのためのjQuery入門。
WebデザイナのためのjQuery入門。WebデザイナのためのjQuery入門。
WebデザイナのためのjQuery入門。
 
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
 
Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介Rails on GKEで運用するWebアプリケーションの紹介
Rails on GKEで運用するWebアプリケーションの紹介
 
Spath for enterprise
Spath for enterpriseSpath for enterprise
Spath for enterprise
 
YJTC18 A-1 大規模サーバの戦略
YJTC18 A-1 大規模サーバの戦略YJTC18 A-1 大規模サーバの戦略
YJTC18 A-1 大規模サーバの戦略
 
HTML5の前のJavaScript入門
HTML5の前のJavaScript入門HTML5の前のJavaScript入門
HTML5の前のJavaScript入門
 
全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験全部入り!WGPで高速JavaScript+HML5体験
全部入り!WGPで高速JavaScript+HML5体験
 
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
Ahead-of-Time Compilation with JDK 9 [Java Day Tokyo 2017 D1-A1]
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web ServiceアプリケーションAngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
AngularとSpring Bootで作るSPA + RESTful Web Serviceアプリケーション
 
5分でわかる!ownCloudアドオンの作り方
5分でわかる!ownCloudアドオンの作り方5分でわかる!ownCloudアドオンの作り方
5分でわかる!ownCloudアドオンの作り方
 
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
 
Autonomous を支える技術、Oracle Database 18c デモンストレーション
Autonomous を支える技術、Oracle Database 18c デモンストレーションAutonomous を支える技術、Oracle Database 18c デモンストレーション
Autonomous を支える技術、Oracle Database 18c デモンストレーション
 
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアルリクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
 
Project Management Plan Sample Creative Content Lab Tokyo
Project Management Plan Sample Creative Content Lab TokyoProject Management Plan Sample Creative Content Lab Tokyo
Project Management Plan Sample Creative Content Lab Tokyo
 
20190319 xtech recochoku_15m_pub
20190319 xtech recochoku_15m_pub20190319 xtech recochoku_15m_pub
20190319 xtech recochoku_15m_pub
 
TeachmeBizを支えるフロントエンドのアーキテクチャと品質担保
TeachmeBizを支えるフロントエンドのアーキテクチャと品質担保TeachmeBizを支えるフロントエンドのアーキテクチャと品質担保
TeachmeBizを支えるフロントエンドのアーキテクチャと品質担保
 
JDK: 新しいリリースモデル解説
JDK: 新しいリリースモデル解説JDK: 新しいリリースモデル解説
JDK: 新しいリリースモデル解説
 
決済金融から始めるデータドリブンカンパニー #yjmu
決済金融から始めるデータドリブンカンパニー #yjmu決済金融から始めるデータドリブンカンパニー #yjmu
決済金融から始めるデータドリブンカンパニー #yjmu
 

Kürzlich hochgeladen

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 

Kürzlich hochgeladen (9)

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 

食べログのフロントエンドリプレース戦略

  • 2. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 自己紹介 • 辻 祐子 (@osunu) • 2018年 株式会社カカクコム入社 • 食べログフロントエンドチームリーダー • リプレースプロジェクト推進、採用、チームビルディング • テニミュ、特撮、アニメが好き
  • 3. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 目次 1. 食べログフロントエンドの リプレースプロジェクトについて 2. リリース戦略について 3. リリース戦略の実現手段について 4. まとめ&今後の課題
  • 5. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 食べログフロントエンドリプレースプロジェクト  2005年サービス開始で、歴史あるサービス食べログ  いろいろあってフロントエンドがそこそこカオス!  メンテナンス性が高いシステムに構築しなおしたい…  jQueryからReact/TypeScript にリプレースしよう!  詳しくはブログを読んでね 😚  食べログ フロントエンドエンジニアブログ  https://note.com/tabelog_frontend
  • 6. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 食べログフロントエンドリプレースプロジェクト React !! jQuery jQuery jQuery
  • 7. Copyright (c) Kakaku.com, Inc. All Rights Reserved. どうして一部だけ?
  • 8. Copyright (c) Kakaku.com, Inc. All Rights Reserved. っていうか どうやって共存?
  • 9. 2. リリース戦略について Ruby on Rails上で部分的にリプレースを進めている理由
  • 10. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 食べログって、いろんなページがあります!
  • 11. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 食べログの状況とプロジェクトの規模感 Ruby on Rails アプリケーション 25個 エントリーポイント 1532ファイル JSファイル行数 210,760行 ※node_moduleは含まず 1週間にリリースされるissue 100件〜  短期/中期での全体的なリプレースはスコープ外  長期戦!!
  • 12. Copyright (c) Kakaku.com, Inc. All Rights Reserved. なぜページ毎のリリースを選択しなかったか  リリースの単位が大きくなりすぎるから • 食べログは多機能&複雑で、ページごとのリリースは数ヶ月〜半年レベル • 開発期間が長引くほど、機能開発の追従のコストが嵩む • リリースが単位が大きいほどリスクが大きくなる  大量のコンポーネント2重管理がメンテナンス性を下げるから • Reactへの移行期間が長く、その間のメンテナンス性低下を許容できない
  • 13. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 部分毎リリースのメリットとデメリット  メリット😚 • リリースのスパンが短く、機能開発の追従のコストが最小限 • コンポーネント2重管理を抑制できる • 共存状態が長期間に渡っても、メンテナンス性を下げにくい  デメリット🥺 • 参考情報・事例が少ない →しょうがない!そもそもこの規模の事例が殆どない →重要度の低い小さい機能から段階的に検証&リリースをする • ページ内読み込みファイル数が増え、パフォーマンスが低下 →既存のjQuery領域のパフォーマンスを改善する
  • 14. Copyright (c) Kakaku.com, Inc. All Rights Reserved. ページごとの分離を諦めたわけじゃない Ruby on Rails Ruby on Rails Next.js? 部分的にReactを導入する ページ内のReact領域を増やす ページ内が全てReactになった時点で Ruby on Railsから切り離す → →
  • 16. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 分離するまで、どうやって共存するのか Ruby on Rails Ruby on Rails Next.js? 部分的にReactを導入する ページ内のReact領域を増やす ページ内が全てReactになった時点で Ruby on Railsから切り離す → →
  • 17. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 共存手段選定の観点 共存期間が長くなっても大丈夫なように! jQueryとReactが 疎結合であること  jQueryのカオスを引き継ぎたくない  Reactのリプレースリリース時にjQueryのテストをしたくない 運用が容易であること  共存ページでjQueryの機能開発を今まで通りすすめられるように
  • 18. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 共存手段選定の観点 手段1 Reactのコンポーネントを別パッケージとし、 jQueryベースの既存エントリポイントからimportする 手段2 Reactベースの新規エントリポイントから ReactのコンポーネントとjQueryのコンポーネント両方をimportする 手段3 jQueryベース,Reactベースのエントリポイントを共存させる 採用!
  • 19. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 手段1:Reactのコンポーネント別パッケージとし、 jQueryベースの既存エントリポイントからimportする ※イメージです Ruby on Rails (slim or erb) <html> <head> <script src=“jquery.js“></script> <script src=“jquery-bundled.js“></script> </head> <body> <p>食べログだよ!</p> <a class=“js-click-shop”>店舗ページへ</a> <div class=“react-hoge-a”> <!— ここにreactがレンダリングされる —> </div> </body> </html> jQuery-component-a jQuery-entrypoint jQuery-component-b React-entrypoint React-component-b React-component-a jQuery関連ファイルだけBundle React関連ファイルだけBundle React-bundled.js ❌ 不採用
  • 20. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 手段1:Reactのコンポーネント別パッケージとし、 jQueryベースの既存エントリポイントからimportする • メリット • jQueryとReactのコンポーネントが疎結合になる • ビルドは2回必要だが、それぞれやることはシンプル • デメリット😨 • Reactの機能をjQueryに組み込んだ状態でおかしな表示や挙動を見つけた時に、ビルド 後のJSの場合、デバッグがしづらく原因の特定が困難。 🙅不採用
  • 21. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 手段2:Reactベースの新規エントリポイントから ReactのコンポーネントとjQueryのコンポーネント両方をimportする ※イメージです Ruby on Rails (slim or erb) <html> <head> <script src=“react-bundled.js“></script> </head> <body> <p>食べログだよ!</p> <a class=“js-click-shop”>店舗ページへ</a> <div class=“react-hoge-a”> <!— ここにreactがレンダリングされる —> </div> </body> </html> jQuery-component-a jQuery-component-b React-entrypoint React-component-b React-component-a jQuery, React関連ファイル全てを1度にBundle ❌ 不採用
  • 22. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 手段2:Reactベースの新規エントリポイントから ReactのコンポーネントとjQueryのコンポーネント両方をimportする • メリット • React公式ドキュメントの「DOM 操作プラグインとのインテグレーション」で紹介され ており、お手本実装がある • デメリット😨 • jQueryとReactが疎結合にならない • ReactベースとjQueryベース両方のページで使われている既存モジュールは、 React/jQuery両方エントリポイントで動くことのテストが必要になる 🙅不採用 🙅不採用
  • 23. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 手段3:jQueryベース, Reactベースのエントリポイントを共存させる ※イメージです Ruby on Rails (slim or erb) <html> <head> <script src=“jquery.js“></script> <script src=“jquery-bundled.js“></script> <script src=“react-bundled.js“></script> </head> <body> <p>食べログだよ!</p> <a class=“js-click-shop”>店舗ページへ</a> <div class=“react-hoge-a”> <!— ここにreactがレンダリングされる —> </div> </body> </html> jQuery-component-a jQuery-entrypoint jQuery-component-b React-entrypoint React-component-b React-component-a jQuery関連ファイルだけBundle React関連ファイルだけBundle ⭕ 採用
  • 24. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 手段3:jQueryベース, Reactベースのエントリポイントを共存させる • メリット • jQueryとReactのコンポーネントが疎結合になる • ビルドは2回必要だが、それぞれやることはシンプル • デメリット • ページ内にランタイムが複数存在する →jQuery/React双方が影響しあわないよう運用でカバー • 1ページの読込ファイル数が増え、パフォーマンスに影響する →既にリリースされた機能は規模も小さく許容範囲だった →jQuery側のパフォーマンス改善をリプレースと並行して行う 🙆採用
  • 25. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 実際に手段3でやってみた感想  jQueryとReactを疎結合にできて良かった✨ • 完全に別でビルドができて、 jQuery,Reactそれぞれのテストだけでリリースが出来るので、機能改善のペースをキープ  jQueryベースのカオスを引き継がず、Reactはキレイな世界✨ • テストカバレッジ: Branch 95% • インテグレーションテスト環境の整備(APIのモック化) • Schemaドリブン、コンポーネントドリブンな開発 • アクセシビリティを意識した実装 👈詳しくはブログで!  1ページにランタイムが2つあっても運用可能✨ • お互いのDOMを触らない運用ルールで無事故  パフォーマンスの懸念🥺 • React導入した場合のバンドルサイズを確認できた • 今後SPのリプレースを進めるときより厳しくパフォーマンスの調整が必要
  • 27. Copyright (c) Kakaku.com, Inc. All Rights Reserved. まとめ  食べログのフロントエンドリプレースプロジェクトは長期戦  ページごとのリリースは最新機能の追従や2重管理の発生によるコストが大きく なるため、コンポーネントごとにリリースします  ページ内でjQueryベース,Reactベースのエントリポイントを共存させ、 コンポーネント毎のリリースを実現しています
  • 28. Copyright (c) Kakaku.com, Inc. All Rights Reserved. 今後の課題  Next.jsの導入! • 1ページまるごとReactにできる未来が見えてきた • Server Side RenderingでSEO対策をしたい • Client Side Renderingだけじゃまだ駄目だって • 絶賛進行中!! • もう少し進んだらブログに書けたらいいな • 食べログ フロントエンドエンジニアブログ • https://note.com/tabelog_frontend Next.js!!! ページ内が全てReactになった時点で Ruby on Railsから切り離す
  • 29. Copyright (c) Kakaku.com, Inc. All Rights Reserved. さいごに  We are hiring!!!!  一緒に大規模システムのリプレースに取り組みませんか?  フロントエンド以外の職種も募集中です❤  https://www.wantedly.com/projects/254221