未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

集中型バージョン管理システムと分散型バージョン管理システムって

集中型バージョン管理システム(以下CVCSとする)と分散型バージョン管理システム(以下DVCS)って何がどうよかったり嬉しかったりするのだろうか。というようなことをつらつら考えてみた。きっかけは、gitの話とか、そのあたりから。(gitって難しいのかなー http://d.hatena.ne.jp/hyoshiok/20140201/p1

バージョン管理システムVCS)のキモは複数人での共同開発を支援するということにつきるかと思う。http://d.hatena.ne.jp/hyoshiok/20140204/p1

一人で開発していればコミュニケーションロスはないので、ひたすらズンズン開発するだけである。一方で複数で開発していれば、どのようにしてコードを共有し統合しテストするかという問題があって、その作業を支援するのがVCSやソフトウェア構成管理と呼ばれるものである。ソフトウェア構成管理(SCM)はVCSより広い概念だ。

DVCSの概念を理解するために、CVCSの概念を理解しないといけないということはなくて、VCSのキモを理解していれば、おのづと理解できる。

昔のツールはCVCSを前提に作られていたので、歴史的な経緯としてCVCSを先に知って、その後DVCSを使い始めたという人は多いかもしれない。だけど、CVCSのツールを勉強した後にDVCSを勉強しなければいけないということでもない。

ソフトウェア製品やウェブサービスの開発を考えてみる。どっかのサーバーにリポジトリを置く。それには、ソースコードや、テストなどを置いておく。コードのメインラインをそこで育てていく。実際の開発は、自分の手元のPCとかワークステーションに用意したプライベートなワークスペースで行うことになる。

集中型の場合、コードの管理はすべて中央のリポジトリだけで管理されているというのが通常のスタイルになる。

一方、分散型の場合は、中央のリポジトリとそのコピーを各自のローカルなワークスペースに置いたものとになる。管理の対象はずんずんローカルのリポジトリに開発ブランチを切って行われる。ブランチを作る精神的・文化的なコストは非常に低い。

集中型の場合も中央のリポジトリでブランチを作るわけであるが、マージのコストが高いために、各自が勝手にずんずんブランチを作りまくってずんずんコミットしてずんずんマージするということは行われない。

マージのコストが高いというのはsubversionというツールに起因することなのか、それとも集中型バージョン管理システムそのものの特徴なのかはわからないが、そのような傾向にある。

そのために、ブランチの管理はかなり厳密にされ、実験的な機能の開発をずんずんやって、その成果をチームで共有するというようなことは、文化的、ツールの機能としても難しい。

一方DVCSであれば、リポジトリはそれぞれ独立で親子関係はないので、自分のローカルなリポジトリ上にいろいろな機能ブランチを作って、そのタスクブランチ上で実験的な機能の実装や他のビルドを壊すような実装なども簡単に行える。

またマージのコストが安いので、そのタスクブランチ上でメインラインのコードをマージして、他のコードを壊していないことをローカルに確認できる。そのコストは安い。

そして、ローカルにずんずん開発したものをリモート上の自分の公開レポジトリにコピーしておけばメンバーからも容易に参照できて、他のメンバーが、自立的にマージしたり、あるいは他のメンバーへプルリクエストを出して、取り込んでもらったりできる。

CVCSの場合は、実験的なコードについても、そうじゃないものについても、ブランチ上のマージは簡単ではないし、失敗した場合のコストは非常に高い。

DVCSの場合は、ブランチのマージは、自分のローカルなリポジトリで行って、確認するので、他のメンバーへの影響は少ない。それでも、メインラインを壊す奴やいる。

CVCSに比べれば、DVCSの方が小さい単位でずんずんマージできるので、精神的にも開発者の負担は少ない。

中央レポジトリのコピーを持つか持たないかというだけの違いだが、それが運用上大変大きな違いを生んでいる。

中央レポジトリのコピーを作ることをフォークするとかクローンするとか言う。かつてはフォークするというのが管理対象や複雑さを増やすことなのでよくないことと思われていた。

ところがDVCSによって、その文化的コストも管理コストも下がった。むしろローカルのレポジトリを持つことのメリットの方が大きい。すなわち中央のレポジトリにアクセスできなくても、ローカルにどんどんコードを変更でき、それは開発のスピードを加速する。

CVCSの場合は、中央リポジトリでの作業がボトルネックになり、開発がスケールしにくい。

継続的インテグレーションなどもローカルでずんずんやったり、リグレッションテストをローカルに流して、他のブランチを壊していないことを安く確認できるが、CVCSの場合、他の人のブランチを自分のコードラインにマージすることが簡単ではないので、実験的にマージして確認するなどということが難しく、開発を加速するのが難しい。

歴史的にCVCSを使っていて移行が難しいという事情がある場合を除いて、これからの開発でCVCSを利用すると言うメリットはないと思う。

教育的な観点から言えばDVCS一押しだ。わざわざCVCSを教えることもないような気がする。実務者のコメントを聞きたい。