65-バージョン管理システムを使う

プログラマが知るべき97のこと」の65個目のエピソードは、バージョン管理システムに関する話です。そろそろ都市伝説になってもいい気もしますが、バージョン管理システムが導入されていなかったり、導入していても適切に運用されていない開発現場は存在しています。自動的に履歴が残っているにも関わらずコードの削除を禁止しコメントアウトするルール、誰がいつ更新したかが解るメリットを捨てて共通のユーザ名での利用、システムテストが通り完成したコードしかコミットが許されないリポジトリバージョン管理システムを導入してながらソース(クラス)のリリースに関してリリース台帳と呼ばれるスプレッドシートと判子による管理など、それほど昔に経験した経験というわけではありません*1
バージョン管理は、モダンなソフトウェア開発の3本柱の1本です。しかし、残り2本のユニットテストと自動化に関しては、バージョン管理ありきという側面もあります。ユニットテストが十分だとしてもそのコードがバージョン管理されていない開発やなんでも自動化が進んでいるがコードがバージョン管理されていない開発というのは考えられません。しかし、幸いにもバージョン管理システムの導入だけであればそれほど難しい事はありません。Subversion、Git、Mercurialなどフリーで十分な機能を持ったソフトウェアがありますし、インストールして利用する事も簡単です。
また、バージョン管理システムを利用することも難しい事ではなく、アップデートとコミットさえ学べば基本的な利用ができます。しかし、問題なのは適切に運用することです。バージョン管理システムを適切に運用するには、開発プロセス・ビルド・リリース管理などに関する知識と経験が必要になってきます。
例えばSubversionを使ったバージョン管理の運用の基本ルールは次の通りです。初めにtrunk, branches, tagsの3つのディレクトリをリポジトリに作成します。開発のメインラインはtrunkを使ってコミットしていきます。そして、リリースを迎える段階になったならばbranchを作成します。そのリリースで残った作業やテストの不具合に関する修正はbranchにコミットしていき、同時に次のバージョンに向けた開発がtrunkにコミットされていきます。ここでbranchとtrunkに差分が発生してしまうため、適切にマージする作業が発生します。システムテストが終わりリリースが出来る段階になったならば、branchからtagを作成します。tagはある時点でのスナップショットです。通常はリリースタイミングでバージョンを付与したtagを作ります。その他なんらかの区切りでtagを作成する事もありますが、tagにはコミットしません。このような開発の流れとバージョン管理については知識として覚える事も重要ですが、実際に行うという経験が必要です。
ソースコードを書くプログラマにとって、バージョン管理は最も重要なスキルの1つです。書き捨てるコードもありますが、ソフトウェアとしてユーザに提供するならば、その元となるソースコードを適切に管理する事は当然のことです。適切に管理されている事で安心してコードを書き、それを修正していく事ができます。そして、リリースを適切に管理する事も必要とされます。つまり、バージョン管理なくしてソフトウェア開発は成り立たないのです。利用するならば誰にでも簡単にできますが、真に求められるのは適切な管理スキルです。

プログラマが知るべき97のこと

プログラマが知るべき97のこと

*1:全て3−7年以内の実話