Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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から生まれた文化であり、そのプラクティスを実践することが 正しいとは限らない