凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 46859
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

MVCの概念が特に有名ですが、近年の巨大システムは多層化された設計になっています。層間のやりとりは外部設計書という名目の書類で取り決められることが多いでしょう。このインターフェースを跨いだ両側の層の開発者はこの設計書という「契約」に基づいてプログラムします。そのため「契約に基づくプログラミング(programming by contract)」と呼ばれるわけです。
今回は、こうした多層化システムの開発でのバージョン管理についての考察です。

バージョンを管理するのはなぜか

そもそもなぜバージョンを管理する必要があるのでしょう?
一人で作って一人で使うようなプログラムでは特にバージョンを意識する必要はありません。不都合があれば直せばよいし、バージョン違いの複製も存在しないのであれば、そもそもバージョン番号なんていらないのです。

しかし、プログラムを配布するならば、利用者は自分以外を含めた複数となりますし、やれ障害が出ただとか、使い方がわからないだとか、そういった問い合わせへのサポートが少なからず発生するわけです。

その際に、バージョン番号というモノが必要になってきます。バージョンごとに挙動が異なるのですから、バグが出たのは何バージョンなのか、そこを確認できるようにしておく必要があります。そうしないと、修正したバグについての問い合わせがあるたびに既知のバグか未知のバグか調査する必要が出てきます。

多層化システムでは層ごとのバージョンが必要

業務で作る巨大なシステムは利用者の問い合わせに対応するためのバージョン番号は当然のことながら、層ごとに分割統治してバージョンをつける必要があるのではないでしょうか。このバージョンは利用者には提示されないバージョンですが、開発を円滑にするために必要なバージョンなのです。

例えば層が明確に分かれている例として、クライアント・サーバ方式のシステムを思い浮かべてください。
分からなければWebシステムとブラウザを想像してもらえば大丈夫。
システム全体としてのバージョンだけではなく、クライアントアプリケーションのバージョンとサーバアプリケーションのバージョンをそれぞれ管理しておく必要があることが容易に想像できるでしょう?

契約に基づくプログラミングをしていて、層の両側で開発者が異なるなら、層を挟んだ開発時のやり取りに互いのバージョン番号を知らせるのは効率のよい手法です。
開発チーム間でのやり取りが円滑になって憎き開発チームのメンバーに対する嫌がらせを考える時間を節約することも出来ます :-P

しかし、それではちょっと足りないのです。それは、「契約に基づくプログラミング」の「契約」の部分です。
契約にもバージョンを振る必要があるのです。

層ごとに組み替え可能なシステム

各層を独立したシステムと考え、層間の契約のバージョンも管理すれば、究極的には層ごとのバージョン組み換えが可能になります。このシステムはA契約1.03版とB契約1.12版に対応しているC層1.22版です、といった情報が管理されていれば、契約の部分が合致する範囲内でバージョンの差し戻しが可能です。

また、層の両方のバージョンが合わない場合でも、近いバージョンに対応していたソースを元に派生プロジェクトを作って対応することが出来ます(CVSやSubversionでのブランチを想定しています)。

もっとも、「契約」の部分はころころと仕様変更するべきではないのですが、現実問題として機能拡張の際に不足した分を追加するなどの修正が入るのが常です。この際に、契約のバージョンが変わるということを意識して見てください。すると、その契約をしているシステムのパーツはすべてバージョンアップが必要になるのです。

このような話題は、言われて見れば当たり前のようなことなのですが、無意識でいるか意識しているかで大きく変わってきます。多層化したシステムを設計されているなら層ごとのバージョンを意識して見てください。もっとフレキシブルに組み替え可能なシステムにすることができるかもしれません。

投稿日時 : 2007年10月2日 11:00
コメント
  • # re: 多層構成のシステムに置けるバージョン管理
    シャノン
    Posted @ 2007/10/02 11:25
    広義に考えれば、プロトコルのバージョンということですね。
    HTTP 1.0 とか 1.1 とかも。
  • # re: 多層構成のシステムに置けるバージョン管理
    かつのり
    Posted @ 2007/10/02 11:31
    未だに年月日フォルダ管理するアフォもいますね。
    チラチラと話は聞きます。

    最近はCVSをやめました。ディレクトリ移動が出来ないので。
    (削除、新規ということになる)

    使っているのはSVN/Trac辺りを使って、
    サブモジュール間はMaven2で依存性解決しています。

    この辺のツールで分散開発が結構楽になった気がします。
  • # re: 多層構成のシステムに置けるバージョン管理
    凪瀬
    Posted @ 2007/10/02 11:52
    > 広義に考えれば、プロトコルのバージョンということですね。

    そうです。契約に基づくプログラミングの「契約」は承認されていないオレオレプロトコルですし。

    > 未だに年月日フォルダ管理するアフォもいますね。

    もっとも簡素なバージョン管理ですからねぇ。
    一般の人の場合はこれで十分な場合もある。
    IT業界の人間だとそんな方法論では手に負えないわけですから
    早急にバージョン管理ソフトを導入しろと一喝するところです。
    Mavenはまだ評価できていない…。試して見たいもののひとつなのですが。

    ところで、DBのテーブル構成のバージョン情報はどうやって持つべきなんでしょう?
    バージョンを表すためだけのテーブルをひとつ作るのかな?
  • # re: 多層構成のシステムに置けるバージョン管理
    かつのり
    Posted @ 2007/10/02 12:02
    テーブル構成のバージョンなら、
    定義書とDDLファイルをバージョン管理していますね。
    ドキュメントもSVNで管理していますよ。

    Maven2は最初はjarの依存関係解決から行うとよいです。
    Eclipseだとイチイチ自分でjarを取り込まなくても、
    Maven2のプラグインでクラスパスを解決してくれます。

    よくEclipseにJavaプロジェクトを作るときとかに、
    libフォルダを作って、jarを一式探して、ビルドパスを設定して・・・
    という作業を行うと思いますが、
    MavenRepositoryで公開されているJarに関しては、
    一切そういう作業が不要になります。

    慣れると、複数プロジェクト、サイト構築、Javadoc、デプロイ、配布形式作成・・
    と色々出来るようになると思います。
    例のHerringroeプロジェクトは取りあえずMavenizeしたので、
    pom.xmlを読んでみると参考になるかもです。
  • # re: 多層構成のシステムに置けるバージョン管理
    凪瀬
    Posted @ 2007/10/02 12:58
    DBの仕様のバージョンは定義書とかでいいんですが、
    今動いているDBってバージョンいくつ?というのをどうやって知るのか、という話なんですよ。

    私がやっているプロジェクトが特殊なんでしょうが、環境が100ぐらい稼動しているため、
    個別に手作業で管理するだけでは厳しくなってるんですね。
    それで、システムが層を跨いだ相手に対して「お前バージョンいくつよ?」って
    聞けるようにしておきたいのです。

    その際にDBってのが曲者なんだよなぁ、という話なんです。
    やっぱり特殊なケースなのかな。
  • # re: 多層構成のシステムに置けるバージョン管理
    かつのり
    Posted @ 2007/10/02 13:33
    大本のDB構造は同じはずだったけど、
    サブシステム単位でDB構造がバラバラになったってパターンでしょうか。

    DBバージョン1ならFooテーブルのbarカラムがないから、
    結合しないようにSQLを変更するみたいな感じかな。

    バージョン情報をクエリするしかないんでしょうかね。
    自分の場合だったら、DB管理テーブルを作るか、
    どこかの共通リソースを用意してバージョン情報管理をするか。
  • # re: 多層構成のシステムに置けるバージョン管理
    凪瀬
    Posted @ 2007/10/02 14:23
    バージョンアップに伴ってDBの列が増えた、とかそういうケースがあるのですよ。
    そして、全環境が足並みをそろえてバージョンアップするわけではない、という状況です。

    やはりDB管理テーブルですかねぇ。
タイトル
名前
Url
コメント