利用者の生産性をどう上げるか 中規模モノレポの苦しみ
by
noyan
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
利用者の生産性 をどう上げるか 中規模モノレポの苦しみ
Slide 2
Slide 2 text
自己紹介 ● 名前: 岡本 済 ● 所属: 合同会社DMM.com プラットフォーム事業本部 Developer Productivity Group ● 仕事: モノレポのメンテナンス
Slide 3
Slide 3 text
生産性とスケール可能性
Slide 4
Slide 4 text
「社長、人増やしたけど速度が遅くなってます」 - 組織が大きくなるにつれ、徐々に進みが緩やかになっていく感覚を感じたことはな いか? 話すこと - 組織のスケーラビリティにはソフトウェアのアーキテクチャが重要 - モノレポのスケーラビリティに何が必要か
Slide 5
Slide 5 text
人員が増えると、かえって遅くなる - コミュニケーションパスの急激な増加 - 5 人だった時は10通り - 10人だと45通り - 20人だと190通り!! - 種類 - オンボーディングコスト - 承認・コミュニケーションのオーバーヘッド - チーム化による分割統治は本質的解決にならない
Slide 6
Slide 6 text
横断的関心とエコシステム チーム間のコミュニケーションには一定のパターンがある - デプロイ - QA - 複数チームで開発 組織のスケーラビリティにはエコシステムが重要である - 「組織規模が倍になっても通用するか?」
Slide 7
Slide 7 text
Main
Slide 8
Slide 8 text
DMM プラットフォーム事業本部とは 主な扱う領域 - 認証認可 ・ 決済・不正対策・会員・ポイント・カスタマーサポート 組織規模: 100人強 フロントエンドプロダクト: 40個以上
Slide 9
Slide 9 text
DMM プラットフォームのエコシステム フロントエンドチームでは、プラットフォームのFEを集約したエコシステムを作っている フロントエンドチームにやっていること - モノレポ基盤 - デザインシステム - 静的アセット配信基盤 - 実装・アーキテクチャレビュー
Slide 10
Slide 10 text
今回扱う事例 - 事業部のフロントエンドAppを集約したモノレポ - Nx - 差分検知, 変更対象の自動テスト - GHAによる、すぐに使える CI - デザインシステムや破壊的変更を検知 - PRごとにStorybookなどが自動的にデプロイされ、 cloneせずとも動作検証できる仕組み - 自信を持ってマージできる仕組み - フロントエンド専任が少ないが、プロダクトは多いという組織特性にマッチ
Slide 11
Slide 11 text
課題の変遷 新たに開発されるアプリケーションはReactで行うことが当たり前になった一方で、変化 するニーズに機敏に対応しきれないところが見えてきた 昔: メンテが難しくなったプロダクトのリプレース & React化 現在: Reactでより効率よく開発を行いたい
Slide 12
Slide 12 text
抱えていた問題 1. CIの低速化と遅いフィードバック 2. CIの低い拡張性と多様化するニーズ 3. モノレポ管理ツール周辺の対応コスト
Slide 13
Slide 13 text
抱えていた問題 - CIの低速化と遅いフィードバック - CIの低い拡張性と多様化するニーズ - モノレポ管理ツール周辺の対応コスト - →律速、強制的なマルチタスク化 - →やりたいことができない - →新しい施策が行えない
Slide 14
Slide 14 text
具体例1: テストが遅い 特定のチームでCIがかなり遅くなり、数ヶ月後にOOMで失敗するように 実施からテスト失敗まで20分 → 辛い https://github.com/nodejs/node/pull/50682
Slide 15
Slide 15 text
具体例1: テストが遅い Jest のヒープサイズを調査したところ、他のアプリケーションでも増加していた → アプリケーション起因ではなさそう、Jest側の問題を調査 根本原因は、Jestが使用しているvm.ScriptがGCできていない > vm: fix V8 compilation cache support for vm.Script Node.js 20.10.0 で修正
Slide 16
Slide 16 text
具体例2: yarn installが遅い 開発マシンでもクリーンインストールで5分かかっていた Nxの特性上、node_modulesのサイズが肥大化しやすい GitHub Actionsのキャッシュ制限からキャッシュミスが多発していた 解決策: PNPMに移行し、Yarnのグローバルキャッシュ分の高速化 Docker buildも高速化し、デプロイが40分から20分に🎉
Slide 17
Slide 17 text
具体例3 最も大変なのはモノレポ管理ツール Nxのアップデート - 13 → 15のアップデート: 所要時間 2ヶ月 Nxは nx migrate latest で自動化できると言っている - 全然そんなことはない!! - https://github.com/nrwl/nx/issues/13192 - 現象: Next.jsのカスタムサーバーが本番環境でもwatchモードになっていて、No space left on device でコンテナが立ち上がらない
Slide 18
Slide 18 text
Nxのつらみ - ExecutorがAdapterではなく、「いい感じのオプション」を追加してくる - ドキュメントに乏しい - 定期的にバグる - 問題の切り分けが面倒 NxでTypeScript, Nextなどを実行するためには、Nxが提供しているプラグインを使用す る
Slide 19
Slide 19 text
Nxのつらみ 例えば、 - nodeでスクリプトを実行するには @nx/js:node が必要
Slide 20
Slide 20 text
Nxのつらみ Executorは次の形で利用する
Slide 21
Slide 21 text
Nxのつらみ 簡単に利用できるように見えるが、大きな落とし穴がある この例だと、デフォルトで以下のオプションがオンになっている - デバッガー有効化、 - ファイルウォッチによる自動更新 → 本番環境でデバッガーを常に有効 簡単さはあるが、あまり安心して使えない
Slide 22
Slide 22 text
Nxのつらみを解決する NxのメリットはExecutorが簡単に使用できるというメリットだったが、 現状を考えると、Executor自体メリットが低い →Nxをやめることを決め、最適な方法を検討している
Slide 23
Slide 23 text
Monorepo in General
Slide 24
Slide 24 text
スケールするモノレポ - 疎結合性 - Sparse Checkoutとの相性の悪さ - モノレポ化はGoでいうサブパッケージレベルのモノだったり - 現時点のモノレポは分割実行のための作為的な分割 - 自動化 - One Version Policy
Slide 25
Slide 25 text
組織の課題に見合ったソリューション 組織規模に見合った解決方法を考案しなければならない - Google, Facebook, … - DMMの組織規模やメンバー構成・スキルセット 初期のDMMのモノレポ化は、レガシーなphpからの移行プロセス モノレポツールはBig Techから生まれた文化であり、そのプラクティスを実践することが 正しいとは限らない