關鍵字: CVS, VSS, Version Control, Configuration management system
CVS 由於開放原始碼並且完全免費贏得了很多商業軟體公司的芳心,在項目開發中使用 CVS 進資料列版本設定。但是根據我的理解,CVS 並不適合於商業公司。
這要從 CVS 的特點說起。
CVS 最初面向開發原始碼項目,提供檔案的版本控制功能。這類項目的特點是:在 Internet 上面架設一台伺服器,每個項目參與人員都可以從中擷取最新的開發代碼和文檔資料。鼓勵每個人開發其中任何一個功能模快,並且提交代碼。這樣一來,對於同一功能模快,就存在多種代碼可供選擇。這時候,項目負責人出面查看/比較各個人提交的代碼並且採用其中之一或者在所有版本基礎上提交一個改進版本。對於項目中出現的 bug, 也同樣鼓勵多個人同時提交不同的解決方案,由項目負責人選用最好的一個。這樣做的好處在於,集中大家的智慧。並且所有人提交的代碼都儲存在 CVS 中,大家可以互相交流學習,共同促進提高。CVS 這種方法被成為 copy-modify-merge。
然而,商業軟體公司的情況並不如此。
對於商業軟體公司來說,幾個人同時就同一個功能修改同一個檔案,是絕對必須避免的,因為著意味著重複勞動,意味著人力成本的浪費。除非是為了進行能力測試比賽。從這一方面來說,商業軟體公司所用的版本控制軟體需要防止幾個人同時修改同一個檔案。一種基於檔案鎖的版本控制軟體對於商業軟體公司非常需要。包括 VSS 在內的幾種版本控制軟體提供了這種功能。 CVS 並沒有提供這種功能。CVS 的擁護者包括 CVS 的開發人員,將 VSS 的 lock-modify-commit 方式視為落後的開發方式,而將 CVS 的 copy-modify-merge 的工作方式視為先進的開發方式,顯然是忽略了商業使用者的實際特點和需求。
另外一方面,組態管理 (configuration management) 系統所管理不應該只是原始碼,還應該包含開發文檔資料。對於 Unix/Linux 使用者來說,大部分文檔資料都是文字格式設定的,這沒有什麼問題,即使有幾個人同時修改,也可以通過檔案比較和合并功能,合并成一個人人滿意的文檔,達到一個好的結果。但是對於 windows 使用者來說,大部分文檔資料都不是文字格式設定的,比如 Office 文檔, Visio 文檔,UML 文檔,ER Win 文檔等等。對於這些文檔,如果有兩個人同時修改同一個檔案, copy-modify-merge 的工作方式並不奏效。因為這些檔案並不好比較,也不好合并。在這種情況下面,只能採用其中一個人的版本,其他人的版本作廢,在新版本上面再重新修改。
由於我在項目中使用 CVS 經常碰到幾個人同時修改一個文檔最終導致其中只有一個人的文檔有用,而其他人不得不從頭再來的情況。最慘的一次,三個人同時修改一個 Word 檔案,整整一天,下午快下班的時候開始提交,三個人陸續提交,問題來了!因為每個人修改的地方都不連續,如果開始每個人都記錄自己修改了哪個地方也好說,偏偏沒有!吵了半天,讓三個人列印三份,逐字比較,另外一個人記錄修改,又弄了半天,才總算搞定。並且傷了和氣:所有人都覺得,其他人不好說話,怎麼不讓著我一點?呵呵。
煩心的事情一多,我開始到處詢問解決方案。
我在 google 上面搜尋的時候,經常碰到文章說 copy-modify-merge 的工作方式怎麼怎麼好, lock 的工作方式怎麼怎麼不好,勸大家都用 copy-modify-merge 的工作方式,如何如何;對於尋求用 CVS 按照 lock 工作方式的人也這樣相勸,大概會讓提問者牙痒痒的,呵呵,我一邊看一邊樂。這就好像, Oracle 網站上面每年都有大量使用者詢問,怎麼樣在 Oracle 資料庫裡面使用自動成長欄位。 Oracle 公司每年都有人耐心地回答, Oracle 的 Sequence 欄位怎麼怎麼比自動成長欄位好,勸別人忘了自動成長欄位,按照 Oracle 的習慣做法來。煩不煩啊!讓我看著都嫌累。加個自增長欄位有什麼技術難度?許多小型資料庫都有,象 Access 這種 Oracle 公司看不上眼的資料庫都支援。加唄!這是客戶的需求哦!不重視客戶需求,還想不想活啊?扯遠了。
有一天我搜尋到一個有用的資訊,說可以通過 perl 編程,怎麼怎麼地修改 CVS 什麼東西,就可以了,留下了幾個連結,我開心地跑去倒了一杯咖啡。回來找了半天,沒有找到他說的 perl 代碼,差點嗆住。讓我失望了很長時間。
公司經常有員工內部培訓。一天收到 CVS 使用培訓的 email 公告信,說感興趣的歡迎參加。想來我也是蠻感興趣的,就參加了。培訓結束後照例是學生提問。培訓老師是品質部門的一個牛人, CVS 狂熱者,MS 的痛恨者,曾經熱情地查看 CVS 的原始碼,熱情地提交 bug,熱情地提交 bug 修複代碼,培訓過程中將 VSS 隔三拉四地提出來批一通。培訓結束,我問問題了,公司規定用 CVS 做項目版本控制軟體,我想讓 CVS 使用 lock 機制工作,不想用 copy-modify-merge 的工作方式,怎麼辦?牛人講了一通 copy-modify-merge 怎麼好,為何不用呢?講得興趣昂然,我插不上話。等他將完,我說,CVS 開發人員應該考慮到使用者吧?我應該算是 CVS 的使用者,對不?牛人說算是。我為了防止幾個人同時修改一個 Office 檔案,避免重複勞動,算不算一個合理的使用者需求呢?牛人想了一會兒說,這麼說,算是一個合理的需求,不過 CVS 根本不支援這種工作模式,這個問題我回去再查查資料。我說,如果 CVS 開發人員覺得 copy-modify-merge 好,沒有關係,他們可以將 lock 的功能加入,讓使用者安裝 CVS 的時候可以配置成使用 copy-modify-merge 方式還是使用強制 lock 方式,由使用者決定他們的 CVS 用什麼工作方式,豈不更好?牛人說,那感情好,不過現在 CVS 做不到。事情不了了之。
前不久我看了 CVS 開發的 todo list, 短期內他們並沒有將強制 lock 作為一個功能進行開發的計劃。