ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

CVSを使った構成管理の問題と対策

2005-11-29 14:22:49 | 開発ネタ

 確か、日経システム構築の今月号(2005年12月)に、CVSを使って、ドキュメント管理とソース管理、システムの自動生成テストを行い、オフシェア(中国利用)で開発した例が載っていたと思います。
 ですが、そこでは、単に成功事例だけで、一般的に、どういう問題が起こり、どういう対策ができるか?なぜ、そういう手法をとったのかについては、かかれていなかった気がします。
 そこでウィリアムのいたずらが、今日はまず、CVSによる構成管理の問題点と、その対応策について(この点に注意すれば、けっこうおおきな開発でも使えそうという話)を書きます。




 まず、CVSによる集中型の構成管理(1箇所をCVSサーバーにして、すべてそこに成果物をおき、管理する方法)は、そこにも指摘されていたように、オフショアでは問題ありますし、そうでなくても難しいと思います。

 そこに指摘されていたのは、中国の通信事情でした。

 これは、中国の一般的なソフトハウス(注:中国の場合、大学が直営?のソフトハウスを持っている場合があり、その場合は、事情が違うかもしれない)の場合、通信回線が(厳密に言うと)「遅くなることがある」ということです。

 これについては、中国のIXについての事情があるかもしれません。
 日本と違い、外国への通信をするためのIXは。。。(いわないでおこう。。壁に耳あり商事にメアリー:ちょっとちがう?調べれば分かる)。

 (中略)

 てなわけで、通信事情に、問題がある「場合がある」のですよ。
 それに、日本でも、ある場所にサーバーをおいてソース管理するといった場合、わけもわかんないフリーの人や、大手競合会社が入ってきていいのか?という問題があります。
(最近のシステムでは、FNHIの複数が部分的に受託するということがある)




 ということで、自然と、分散型の構成管理になります。

 この方法は、ある一定時間に、自動的あるいは手動的に、ネットワークあるいはフットワーク(だれかが持っていくということ、別にフットワークの配送に限ったわけでなく、一般名称)を使って送り、全体を構成管理するサーバー(CVSサーバーでも、なんでもいいんだけどね)に送ります。

 このとき、構成管理の追加、変更の申請書があると、作業的に、実はバグ発生時のバージョン管理で楽なんですけど、そんなことは、OSS信奉者には、「面倒になるだけだ」といって、受け入れられないことなんで、書いてもらえない気がします(といいつつも、この書類を、「やみくもに」書かされることもある。その場合は、この書類を十分に使いきれていない。つーか、なぜ書くのか分かっていないことも多かったりする。結合テスト以降のバグのときにつかう)。




 この場合の問題は、多くは結合テスト以降で起こります(それ以前では、起こらない。また、中小規模では起こらない。開発場所がある程度多くないと起こらない)。

■問題1 (集中型でも、分散型でも起こります)
 ある会社が、呼び出されるほうの”インターフェース(引数または返り値などの)の”修正を行ったとき、一部の会社は対応しているが、ほかの会社は対応していないため、コンパイルができなくなることがある。
 この場合、バグフィックスを確認するためのテスト確認作業が(コンパイルができなくなるので)遅れる。

■問題2 CVSから、更新されたソースだけを入れ替えて、独自で、コンパイルしてテストされた場合に問題が起こる。

 あるいは、jarファイルの一部だけを持ち帰ってテストされたときなどで。。

 そうすると、バグが起こっても、どの状態のソースのときに、バグがおきたのか分からない

 たとえば、ソースA,B,C、D,Eとあったとき、

 10:30分にソースBが
 10:50分にソースDが
 11:00分にソースB、Cが更新されたとする。

 このとき、勝手に最新版をとってきて、テスターがテストしていいとしたとき、
 (ありえないけど)

 テスター甲は、10:45分にソースを落とし、10:55分に、ソースEの箇所で起きたバグを発見し、11:10分に報告したとする。
 その時点で、Eの担当が11:15分に、ソースを入れ替えて見ても、再現しなかった場合、何が原因なのか、わからない。(この場合、ソースBのバグがEに影響したもので、11:00の修正版で直ってて、今のソースでは、自然治癒している可能性がある)。バグ票に、発見時間が書いてあったとしても、更新が頻繁に行われ、かつ、すべての時計の時刻が必ずしも正確でないという状況の場合は、意味がない。

→この問題は、実は起こらない。必ず対策が行われるので。

 そして、このための対策として行われることのために、実はCVSの利用は広まっていない。




■■ 対応策

●問題2についての対応策

・後者の対応として、ビルド番号(ないしはバージョン番号)をいれて、一定時刻にコンパイルするようにしています。

 そして、バグ票には、かならずビルド番号をいれます。

 テスト対象になるのは、このビルド番号を持っているオブジェクトのみです。

 上記の例の場合、10:30、Bがいれたあと、一斉ビルドを行い、bild no 200511291145というものだったとしたら(めんどーなので、NOを時刻とした)、バグ票にそうかかれるので、開発の人は、現在のバージョンで再現しない場合、このビルドNOのオブジェクトとソースを取り出して確認するので、問題箇所を再現できます。

 ふつう、このような形で管理していると思います。

 あの日経システム構築の場合も、この手法でしたよね。一定時間でのコンパイル。

 だからこの問題は、起きません。

 しかし、こうやってやる場合、そのコンパイル時間前までに、ソースをある場所にFTPで送って(HTTPやHTTPSでアップロードでも、いいけど)、そのあとmakeでプログラムを実行して、ビルドしたオブジェクトを公開、ソースを退避させ、保存しておけばいいじゃん!っていうことになります。

 そのとおりです。。

 でもそうすると、CVSいらないです。

 事実、CVSのような構成管理ルーツは使わないということも多いですよね。

 ちなみに、このため、バグ票に、ビルド番号(ないしはバージョン番号)は絶対入れてね!




●問題1についての対応策

 前者の問題は、現在、マネージャーレベルで、打ち合わせして、「いっせのせ!」で、ある日のバージョンに入れるということで対応していますが、連絡ミスなどの問題が発生することが多いです。
(なお、このためにも、バージョン(一定時間のビルド)という概念が必要になってきます)

 なので、それへの抜本的な対策は、インターフェースを基本的に共通にして、新旧、どちらの引数でも送れるようにして、引数内にバージョンをいれ、そのバージョンを見て、それなりの処理をすればいいです。

 この方法として、ハッシュマップや連想配列を使う方法については、前にブログに書きました。
ここ

 なお、前のバージョンで使ったソースは、できるだけ消さないほうがいいです。
 前に戻すこともけっこうありますので。。。

 ただ、そーすると、みにくくなっちゃうんですよね。ソースが。
//DEL Ver1.0
//
//
//DELEND
 とかが、いっぱいでてきちゃって。。

 なので、メソッドレベルで、たとえば、
バージョン1.0なら、a_1_0,
  バージョン1.1なら、a_1_1
 というかんじで、バージョンごとにメソッドをつくっちゃって、こぴぺで対応するのも、いいかもお。。そー言う意味でも、コントローラーが必要だったりする。




●そのほかの構成管理の問題と対策

 そのほかの問題として、デグレードと、それを起こさないための、リグレッションテスト(回帰テスト)の実行方法の問題があります。
 これについては、テストの自動生成って言う話になるのですが、それについては、その日経システム構築の記事にもかいてあったし、まあ、ここのブログでも書いた気がする(どの記事かは忘れた)なので、今回は省略




 思いついたところは、こんなかんじ。
 結局、まとめると、日経システム構築の記事は、成功の秘訣がCVSによる管理のように読めてしまうんだけど、CVSによる管理は、基本的には集中型に向いている(常時ネットワークが見れる)のであって、記事のように分散型にするのであれば、CVSでなくても、別にかまわない。

 むしろ、あの記事での成功事例は、テストの自動生成と確認部分にあって、それを実現するには、インターフェースのミスマッチ(上記問題(1)のこと)を防ぐということで、そのインターフェースミスマッチを防がないと、オフシェア開発は難しいんだけど、そこの部分の対策については書いてなかったね。

 つーような、オフシェアの話は、今度、気が向いたときに。。。

 もう、長くなりすぎちゃったので。。

この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« PHPでつくる、仕様書からのプ... | トップ | PHPでつくる、仕様書からのプ... »
最新の画像もっと見る

開発ネタ」カテゴリの最新記事