5年前:一人のミドルレベルエンジニアがチームに「巨大な重荷」のモノレポを引き継いだ時の驚愕

5年前、私はシンプルのリポジトリ(ポリレポ)できれいに整理された環境に身を置き、ぬるま湯のコンフォートゾーンに浸っていたミドルレベルエンジニアでした。そんなある日、経営陣からのアナウンスが青天の霹靂のように舞い込んできたのです。私のチームが、他チームからコアプロジェクト群全体の管理と今後の開発を引き継ぐ(トランスファーされる)ことになった、と。
相手チームのテックリードが、そっけない態度で「コードは全部これに入ってるから。モノレポだよ!」と言いながら、たった一つのGitリンクを送ってきた日のことを、今でも鮮明に覚えています。
そして、それを git clone して開いた瞬間……当時の私のソフトウェアアーキテクチャに対する世界観は、完全にひっくり返りました。
1. 他人の「領土」を引き継いだ時の衝撃
ディレクトリ構造を開いてみても、見慣れた単体のNode.jsやJavaのプロジェクトは見当たりませんでした。目の前に広がっていたのは、3つのフロントエンドアプリ、4つのバックエンドマイクロサービス、そして共通設定や社内ライブラリが1か所に押し込まれた、複雑に絡み合う「網の目」のような構造でした。
その時の感覚は、単に圧倒されたというだけでなく、極度の不安と困惑そのものでした。
変更への恐怖: このコードは、自分たちのチームがゼロから書いたものではありません。それが今や、すべてつのリポジトリに同居しています。「こっちの隅っこにある共通のユーティリティ関数を1つ修正しただけで、隣のチームが動かしている本番サービスが落ちたりしないだろうか?」と、常にビクビクしていました。
ツール類での迷子: 5年前のモノレポは、ただコードを書けばいいという単純なものではありませんでした。その巨大なリポジトリを動かすための、複雑なビルド設定、キャッシュ、CI/CDパイプラインの数々を目にした時、私はプロジェクトのビジネスロジックだけでなく、このビルドシステム(Tooling)との「対話方法」も学ばなければならないのだと痛感しました。
2. なぜこのシステムはモノレポでなければならなかったのか
引き継がれたコードの山と格闘し、頭の中で構造を整理しながら読み解くこと2週間。ようやく、前任のチームがなぜこの道を選んだのか、その理由が身に染みて理解できるようになりました。
このプロジェクトは、各コンポーネントが非常に密結合しているシステムだったのです。もし当時、彼らがこれらを7〜8つの独立したシンプルリポジトリ(ポリレポ)に分割していたら、我がチームへの引き継ぎは十中八九、大惨事になっていたでしょう。
私たちは、リポジトリごとに1つずつアクセス権限を申請して回る羽目になっていたはずです。
どのバックエンドのバージョンが、どのフロントエンドのバージョンと互換性があるのかを、自分たちで手探りでマッピングしなければならなかったはずです。
モノレポは私たちを救ってくれました。すべてが1か所に収まっているおかげで、コミット履歴の全容、サービス間の関係性、そしてそれらがどう呼び出し合っているのかが、まるで1枚の地図のようにクリアに目の前に広がっていました。私たちのチームは、その「地図」を見るだけで、システム内での現在地を特定することができたのです。
3. プロジェクト引き継ぎ時にモノレポがもたらしてくれたもの
最初の「手痛い洗礼」の時期を乗り越えると、そのモノレポを所有していることは、ミドルレベルだった私のエンジニアとしての思考に大きな転換期(パラダイムシフト)をもたらしてくれました。
新規プロジェクトのオンボーディング時間を80%短縮 プロジェクトごとに個別に環境構築をしたり、5〜6か所で
npm installやgo mod downloadを実行したりする代わりに、ルートディレクトリでたった1つのセットアップコマンドを実行するだけで済みました。すべてのサービスは、内部のSymlinkやWorkspacesの仕組みを介して自動的にリンクされます。ローカル環境でシステム全体(E2E)をテストすることが、これほど簡単だったことはありません。「アトミックコミット」による根本的なバグ修正 最初のバグ修正タスクをアサインされた時のことです。それはバックエンドとフロントエンド間のデータ不整合に関するバグでした。もし古い構造(ポリレポ)であれば、バックエンド側でPR(プルリクエスト)を作成してマージを待ち、それからフロントエンド側に移動して修正を続ける必要がありました。しかしモノレポでは、
sharedディレクトリにあるデータ定義関数を修正し、バックエンドのロジックを更新し、フロントエンドのUIを修正する――これらすべてが、たった1つのプルリクエストにきれいに収まります。テストが通れば、すべてが同時に本番環境へデプロイされ、デプロイ順序のズレを心配する必要もありません。思考のステージを「コード書き(コーダー)」から「システムエンジニア」へ引き上げる これが、おそらく最大の果実でした。モノレポを引き継いだことで、ミドルレベルだった私は「自分のコードだけ知っていればいい」という局所的な思考から強制的に脱却させられました。依存関係をより厳密に管理する方法を学び、最適化されたCI/CD設定(Affected Build:変更があった箇所だけをビルドする仕組み)を理解し、他のモジュールに影響を与えないコードの書き方を意識するようになりました。モノレポは、私にシステムをマクロな視点(俯瞰的な視点)で見ることを強制したのです。
結び
5年前を振り返ると、あの「ヘビー級」なリポジトリを前にして呆然としていたミドルレベルエンジニアの私が、モノレポの引き継ぎという経験を通じて、成長のスピードを一気に加速させたのだと気づかされます。それは単なるソースコードの管理ツールではなく、大規模な組織におけるアーキテクチャの設計方法と、システム思考を学ぶための、極めて価値のある教科書だったのです。
関連する読み物

AI時代、本当の知識はどこから来るのか?
AIの答えは常に自信満々だが、それは真実を意味しない。誤りを見抜けるのは、その分野の土台を持つ者だけだ。本、一次資料、実践など6つの情報源の使い方を分析し、AIに振り回されない知識の土台の築き方を示す。最終判断は常に自分の手に残せ。

六つの駅、六つの死に方:あるHTTPリクエストの生存の旅
技術ノートと省察 —— すべてのリクエストが辿らねばならない道について、そしてなぜその道を辿るのかについて。

10年間、盲目的に信じてきたものを理解するために、DNSサーバーを自作した
毎日使っているのに、一度も正面から向き合ったことのない技術がある。私にとってDNSがまさにそれだった。 10年間、ドメイン名を打ち続けてきた。ドメインを買い、レコードを設定し、「伝播(propagation)」を待ち、上がらないと悪態をつき、上がると喜ぶ——なのに、なぜ上がるのかを本当には理解していなかった。私にとってDNSは壁のスイッチのようなものだった。押せば部屋が明るくなる。壊れたら電気屋を呼ぶ。 あるデプロイの夜まではそうだった。サイトが落ちた。IPへのpingは通る。IPに直接curlするとページが返ってくる。ただドメイン名だけが沈黙していた。私はそれを見つめながら、少し情けない事実に気づいた。どこから直せばいいのかすら分からない。なぜなら、壊れているその当のものを、一度もきちんと理解したことがなかったからだ。 そこで、おそらくエンジニアだけが合理的だと思えることをやった。ドキュメントをざっと読む代わりに、座ってRustでDNSサーバーを丸ごと書いたのだ。プロジェクト名は mini-dns。この記事は、ようやく蓋を開けたとき、そのブラックボックスが私に語ってくれたことの記録である。
ディスカッション
0 件のコメント
最初のコメントを投稿しましょう。