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

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

構成管理:SVN,git,日付つきファイルの違いと、どれもだめなケース

2016-07-13 15:42:20 | Weblog
昨日のMySQLとPostgreSQLとOracleの使い分けがめちゃくちゃ受けているので、2匹目のどじょう。
今日も

◆みずほ銀行次期システム開発を見守るスレ25◆ [無断転載禁止]©2ch.net
http://hanabi.2ch.net/test/read.cgi/infosys/1467962368/

で話題になっていた、構成管理(バージョン管理)を
SVN,git,日付つきファイル
のどれでやるべきか?についての話。

結論から言ってしまうと

・SVNとgitは、同じ構成管理でも、まったく世界観が違う
・ただし、これらは一つのモデルにおける問題を解決しているに過ぎない
・上記のスレで問題になっていることは、このモデルとは違うケースであり、
 それに対して、SVN,git,日付つきファイルのどれも「まったく無力」
 である。だから、何を使っても、「だめだめである」という点で一緒。

以下、「一つのモデルにおける問題」を説明して、「SVNとgitの世界観の違い」
を説明後、「スレで問題になっている、全く違う問題」について説明する。




■構成管理で問題としている1モデル

構成管理は、以下の状況に対する問題を解決しようとしている

・ある大きな1つの機能修正・追加があって、
・この修正をA,B2人以上が
・共通のファイルに対して修正をする時に
・ある(共通の)ファイルに対して、
   Aさんが修正
  その後
   Bさんが修正
 したときに、Bさんが、保存したときにAさんの修正内容が
 なくなってしまうという問題を解決したい
 →AさんBさんの修正をマージしたい

という問題を解決しようとしている。

したがって、このモデルに該当しない、

・Aさんは、Aファイル、BさんはBファイルのように、
 担当ファイルが完全に独立している場合

には、構成管理は関係ない。
SVN,git,日付つきファイルのどれでも、使いやすいものを
選べばよい

また、この問題の制約として
・「ある大きな1つの機能修正・追加」が、Aさんが修正をはじめて
  Bさんが修正が終わるまで、変更しないという前提がある
 →途中に変更があり、それがAさんにしか伝わらない場合、
  AさんBさんのものをマージしたら、わけわからんとなる。




■上記問題の「SVNとgitの世界観の違い」

ここで、SVNとgitは、構成管理上、全く概念が違うことを考慮しないと
いけない

●SVNは集中管理→集中管理リポジトリにあるものを最新に
 SVNはデータを集中管理して、リポジトリにおく。
 したがって、リポジトリにあるものが、最新(コミットしていいもののなかで)
 という前提になっている。

●gitは分散管理→中央のリポジトリは、あるバージョンのもの
 そこからコピーして、Aさん、Bさんは独自に関心事を修正し、
 ある時点でみんなの修正をまとめてマージし、次のバージョンを作る


※ここで、gitで管理する場合、中央のリポジトリは、いつでも稼動できるもの
 にしておく。そうすれば、突然「デモしろ」といわれたときでも、
 いつでもデモできる。また、ある機能だけを見せたいときは、中央レポジトリ
+その機能に関する修正だけをまとめてマージすれば見せられる・・・
 ということで、デモ必須のアジャイルやベンチャーさんなどには向いている
(SVNは、変なものをコミットされると、動かない。。。コンパイルできない!
 なんてこともある)
→このケースではgitが優れている

※しかし、gitは、いつかはマージしないといけない。このマージする人は、
 どういうふうにマージしたらいいか知っていないと、テキトーにマージして
 おかしくなるかもしれない・・・それだったらSVNなら、コミットしたたびに
 Jenkinsで回帰テストをかければ、おかしくなった瞬間に分かるので、まだまし
 という考え方もある

●ちなみに、ファイル名に日時をつけて管理するのは、
 もし、最新のものしか残さないのであれば、上記の問題が解決されないので
 問題あり。
 最新のみならず、すべてのファイルを残す(大福帳)なら、競合したことは
 自動的には分からないが、すべての履歴がのこっているので、まあ、どうにか
 なる。分かりやすいけど・・・それ以上のものではない。




■スレで問題になっている、全く違う問題

しかし、スレで問題になっているのは、全く違う状況で

・ある大きな1つの機能修正・追加があって、
・この修正をA,B2人以上が
・別々のファイルを修正するんだけど、依存性があって
・あるファイルに対して、Aさんが修正
 その後、帰り際に修正があり、
 その帰り際の修正を考慮してBさんが修正して帰ったら
 朝までに、別の修正をしろと話があり
 その朝まで修正をAさんがしたら、
 →Aさんは朝まで修正、Bさんは帰り際修正なので、依存性があったら
  矛盾してしまう(インターフェース合わずにコンパイルできない)

という問題を解決しないといけない。

この問題は、「別々のファイル」なので、SVN,git,日付つきファイル
どれも競合が起こらないので、問題とならない。
しかし、上記の問題が起こって、コンパイルできない。

この問題は、コミットしたらJenkinsで回帰テストを行えば「検知」できる。
しかし、「検知」できても「解決」しない。
徹夜して、朝まで修正して直したAさん、Bさんが対応していないことを「検知」して・・
コミットしなかったら、自分の努力は無駄無駄~
ということで、コミットしてしまう(Aさんのところはデモできるなら特に・・・)

で、この後、Bさんに、「朝まで修正」が伝わらなかったら、どうなるだろう・・・
Aさん、Bさんのインターフェースが取れない状態が続いてしまう。
これがいたるところで起こると、いつかはコンパイルできなくなる。




つまり、横の連携が取れていないで、更新がバンバン来てしまうと、
ソース内に、競合はしないんだけど、矛盾した部分がどんどん出来て、
いつかはコンパイルできなくなる(メソッドの引数や返り値が違って)。

コンパイルに4日かかるというのは、これが「相当」進んだ状態で、
こうなってしまうと、Jenkins入れて回帰テスト・・・する前に
また修正となってしまい、実質、回帰テストは無理なのだ。

このような状況においては、
VN,git,日付つきファイル
どれもだめで、無力である。

※一番強力な解決方法は、「あきらめる」である。
 「すべて捨てる」「逃避する」なども別解にある。

この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« MySQLとPostgreSQLとOracleの... | トップ | 経営者、おなじ資本金でも会... »
最新の画像もっと見る

Weblog」カテゴリの最新記事