参加する会社ごとにレポジトリが分かれたり、チーム単位で別のレポジトリになるのって、コンウェイの法則っぽいですね。わたしはモノレポは良いものだと思っているので、どういうふうになっているかという話をざっと概観したい。
広く知られているようにGoogle社内はモノレポになってて、だいたいのプロジェクトはこのレポジトリにすべて入っている(例外はあるけれど)。で、実際どんなもんですか、という話についての雑感でいえば、モノレポはわたしのような末端の従業員にはけっこういいものだと思っている。
いろいろメリットがあると思うけれど、インフラというかコアの部分を共通化できるというのが大きい気がする。様々なユーティリティは一箇所にまとまっていて再発明をする必要がない(再発明をする楽しみがない、という面はあるかもしれないけど)。GoogleエンジニアといえばProtocol Buffersを詰め替える仕事だという自虐ネタがあるけれど、それほどまでにProtocol Buffersが広まり、使われているのもモノレポゆえだろう。ビルドシステムも共通。こういうのは、いろんな問題を簡単にする。たとえばサービス間のトレースを取るようなユーティリティを作りたくなっても、Protobufのことだけを考えておけばいい。などなど。
コア部分を開発するエンジニアとしても、モノレポの利点は非互換な変更を入れやすいことだと思う。このリビジョンからAPIはこう変わりました、というアナウンスを一本入れる。使ってるところがあっても全部変えればいいだけ。レポジトリが分かれていたら、ユーティリティのバージョンを上げるだけで根回しが必要だったりするし、面倒くさい。コンポーネントごとに依存するライブラリ(たとえばJSONパーサ)やそのバージョンが違ったりして、それで微妙なバグが特定のコンポーネントにだけあったりとか。
モノレポでない世界
つまり、モノレポでない環境の場合、それぞれのレポジトリのあいだの同期を取る必要がある。AndroidやChromeOSはrepoという独自のスクリプトを使って実現している。Bazelのworkspaceで頑張っているプロジェクトもある。でなければgit submoduleという手もある。この辺はずいぶんいろいろ整備されてきたので、だいぶ改善されてるように思うが、いずれにせよメンテナンスのコストがあり、それぐらいならモノレポのほうがいいんじゃないか、という気がする。そういえばIstioというGitHubメインのプロジェクトの仕事をしていたときは、各コンポーネントごとにレポジトリが分かれていたが、レポジトリ間同期の問題に悩まされていた。誰かがrepoを使おうと提案したりして、やめてくれと思った覚えがある。いまはモノレポ化したようだ。
モノレポにはレポジトリに誰が書き込めるか、というコミット権限の問題もある。ふつうにレポジトリが分かれている場合、レポジトリの切れ目がオーナーシップの切れ目になっていて、このレポジトリに書き込めるのは(あるいはapprovalを出せるのは)このチームの人たちだけ、みたいになっているだろう。圧倒的にわかりやすい。あと管理が楽。
モノレポだとこういうことはできないので、何らかの仕組みを導入する必要がある(もしくは、プロジェクト参加者は誰でもオッケーのカオスを受け入れるか、優しい独裁者がすべての権限を握るかだ)。Googleの場合、OWNERSファイルというファイルによってapprovalの権限が記述されている(これはChromiumにも踏襲されている)。OWNERSはたんにファイルというだけではなくて、実際にコミット権限を制限している。つまり、基本的には直接コミットは禁止して、なんらかのボットやCIを経由したコミット以外は通さないようにするということだ。これについては、何らかの仕組みを構築する手間がある。
モノレポの維持コスト
Googleのモノレポがどれぐらいヤバいのか、という点については、一般の利用者である自分からははっきり言えないところがある。が、その維持コストは相当のものなはずだ。
たとえばその傍証としては、もともとPerforceを使っていたのにスケールしなくなったから社内専用のバージョン管理システムを独自に作っちゃう、みたいなことをやってしまっているというのはあるだろう(facebookもMercurialを魔改造していると伝え聞く)。会社が大きくなってきてもモノレポを維持したいなら、どうしてもそういうことは起こる。
あとたとえば、そもそもGoogleの社内レポジトリはレポジトリ全体をチェックアウトしたりできないので、部分的に開発に使うところだけチェックアウトしている。それでもうまく動くような様々な仕組みもたくさんある。そういうのの開発コスト、超大変そう。そこまでして社内全体でモノレポを維持するメリットはあるんだろうか? まあ「ある」と誰かが判断してるからそうなんだろうけれど。
まぁこの辺は想像するだけでやばそうだなと思うし興味深くはあるけれど、一プロジェクト内でレポジトリを分けるかどうかという話とはあんまり関係ないな。
さて、いろいろ書いてみたけれど、私はけっこう社内レポジトリの経験は大昔にしかない。最近は社内レポジトリでないプロジェクトばっかりやってるから、今は社内の実情がわかってない面があるかもしれない。たとえば、昔なら社内レポジトリの大半はようするにみんなWebサーバだったり社内RPCサーバを作ってるだけだったけど、今はそうでもないだろうという話もあるだろう。そこんとこどうでしょう>もりたさん