バージョン管理システムって何故必要なの?

皆さん、こんにちは。技術開発グループのn-ozawanです。
東京は週末ごろに桜が満開する予想となっています。ちなみに本日3月27日は「さくらの日」です。

本題です。
皆さんはファイルのバージョン管理システムに何を使っていますか?バージョン管理システムの定番と言えばGitですね。とはいえ、聞いたことあるけど使ったことない、という人もいることでしょう。今回は、そもそも何でバージョン管理システムが必要なのか?何故、今Gitが選ばれているのか?を簡単にお話しします。

バージョン管理システム

概要

システム開発を行う際、バージョンを管理することはとても重要です。ここで言うバージョンとは、開発したシステムそのもののバージョンではなく、ソースファイルなどのリソースごとのバージョンとなります。

1人で開発している分にはバージョン管理システムのお世話になることは少ないかもしれません。しかし複数人でシステムを開発する場合、誰が何の理由で修正したのか、その経緯などが分からないと困ることがあります。

例えば、とあるコードが原因で障害が発生した際、そのコードを単に削除すれば良いのか、適切に修正をする必要があるのかの判断をしなくてはいけません。そのコードに関する説明がコメントで記述されていればいいのですが、コメントされていない場合もあります。バージョン管理システムがあれば、修正履歴を確認することにより、どう対処すれば良いのかの判断材料になることでしょう。また、修正した人が分かれば、その人に詳細を聞くことも出来ます。

バージョン管理システムは、そのソースコードが、いつ、誰が、どのように、どういう目的で修正したのかを細かく管理し、必要とあれば修正以前の状態に戻せるようにする仕組みです。

バージョン管理システムを使わない場合の、バージョン管理

今でもバージョン管理システムを使わないプロジェクトを耳にします。バージョン管理システムを使わないプロジェクトでは、ソースの修正履歴をコメントとして残します。例えば以下のように記述します。

// MOD 2024/03/27 by n-ozawan
// ビックリマークを追加
// System.out.println("Hello World!");
System.out.println("Hello World!!!");

コメントで履歴を残すことにより、誰が何の理由で修正したのか、その経緯などが分かるようになります。開発期間が長く、多くの修正が行われたソースコードは、非常に可読性が下がります。数行のコードに対して、履歴のコメントが100行を超えるのはよくあります。また、コメントを記述するのを忘れた場合などのリスクもあります。

ソースコードは共有フォルダなどに格納されます。人はミスするものです。うっかりファイルを削除したり、古いファイルで上書きなどしてしまうことで、簡単にデグレが発生します。そういった人為的ミスを恐れてか、似たようなファイルが多く生成される傾向にあります。もちろん、厳格な運用を行うことで多少は回避できますが、運用するだけで疲弊してしまい、効率的ではありません。

種類

バージョン管理システムの歴史は古く、Wikipediaによると1962年まで遡れるそうです。本格的なバージョン管理システムは1972年に発表されたSCCSになります。ここでは主なバージョン管理システムを簡単に紹介します。

CVS

集中管理方式として発表されたバージョン管理システムです。ファイル単位でバージョンを管理することが出来ます。通常、何かしらの機能追加や機能修正では、複数のファイルを修正することになります。その場合、その複数のファイルをひとまとめにしてバージョンを管理する必要があります。しかし、CVSではファイルごとにコミットする仕様のため、ソースコード間の修正の関連性が見えないという欠点があります。この欠点は、修正内容を取り消して、複数のファイルを纏めて以前の状態に戻すのが困難となります。

その他にもCVSではファイルやディレクトリの名前変更がうまく出来ないなどの多くの問題を抱えており、後継であるSubversionが使われるようになりました。

Subversion (SVN)

SVNもCVSと同様に、集中管理方式のバージョン管理システムとなります。CVSの問題点を解消することにより、多くの開発者から支持を得ました。集中管理方式では、1つのサーバーに対して、複数人が接続します。その為、プロジェクトの人数が増えると、トラフィックが増加してしまい、速度低下に繋がります。また、オフラインでバージョン管理を利用することが出来ない、という欠点もあります。

Git

これら集中管理方式の欠点を補うために開発されたのが分散型方式のバージョン管理システムとなります。分散型方式で有名なのがGitであり、GitはLinuxカーネルの開発プロジェクトで生まれました。当初、LinuxカーネルはBitKeeperという同じ分散型方式のバージョン管理システムを利用していたのですが、商用ソフトウェアであったことから、Linuxカーネルの生みの親であるリーナス・トーバルズが、2週間でGitのたたき台を作り上げたのが始まりです。

分散型方式の利点は、1つサーバーにトラフィック負荷が生じ辛いことや、オフライン環境下でもローカルでバージョン管理が出来ることにあります。また、Gitは速度性を重視しているため、軽快に使えることも利点です。

分散型方式の欠点は、仕様が複雑になりがちです。Gitを十分に扱うのに学習が必要であり、ランニングコストがかかります。なので、小規模であればSVNで十分と判断するプロジェクトもあるようです。

おわりに

バージョン管理システムについて、簡単にまとめました。バージョン管理システムを使っていない現場では、古いファイルを修正してデグレが発生し、デグレを発生させないように慎重にファイルを扱い、そして疲弊しています。少しでもバージョン管理システムの必要性を理解して頂けると幸いです。

ではまた。

採用情報

「チームアイオス」入団者募集

〜就活で悩むアナタに来て欲しい〜