作者:黃存玲(中國石油集團東方地球物理勘探有限責(zé)任公司)
一、前言
對于一個軟件企業(yè),開發(fā)出滿足用戶需求的、高質(zhì)量的軟件產(chǎn)品是其追求的目標,而實現(xiàn)這一目標的關(guān)鍵是建立起一個穩(wěn)定、可控、可重用的軟件開發(fā)過程。軟件企業(yè)要想永葆競爭優(yōu)勢就必須不斷地改進它的軟件開發(fā)過程,而要進行軟件開發(fā)過程改進就需要有明確的、量化的對現(xiàn)狀的分析和對未來的預(yù)期,這些數(shù)據(jù)來源于對軟件過程的度量,而進行度量的前提和基礎(chǔ)就是軟件配置管理。所以,軟件配置管理工作是以整個軟件過程的改進為目標,是為軟件項目管理和軟件工程的其他領(lǐng)域打好基礎(chǔ),以便于穩(wěn)步推進整個軟件企業(yè)的能力成熟度。而做好軟件配置管理是邁向軟件開發(fā)規(guī)范化管理的第一步。
對于中小型軟件開發(fā),軟件配置管理的作用不是很明顯,但對大型軟件開發(fā),由于開發(fā)人員眾多,程序量大,系統(tǒng)復(fù)雜,軟件配置管理至關(guān)重要。
軟件配置管理對于軟件開發(fā)管理是如此重要,它的主要思想和具體內(nèi)容在于版本控制。版本控制是軟件配置管理的核心思想之一,是指對軟件開發(fā)過程中各種程序代碼、配置文件及說明文檔等文件變更的管理。版本控制最主要的功能就是追蹤文件的變更。它將什么時候、什么人更改了文件的什么內(nèi)容等信息忠實地記錄下來。每一次文件的改變,文件的版本號都將增加。除了記錄版本變更外,版本控制的另一個重要功能是并行開發(fā)。軟件開發(fā)往往是多人協(xié)同作戰(zhàn),版本控制可以有效地解決版本的同步以及不同開發(fā)者之間的開發(fā)通訊問題,提高協(xié)同開發(fā)的效率。并行開發(fā)中最常見的不同版本軟件的Bug修正問題,就可以通過版本控制中分支與合并的方法有效地解決。
二、大型軟件系統(tǒng)
大型一體化系統(tǒng)軟件是為了滿足石油勘探開發(fā)對地震數(shù)據(jù)處理與解釋日益增長的需要,而開發(fā)的大型處理、解釋一體化系統(tǒng),該系統(tǒng)由系統(tǒng)平臺和應(yīng)用系統(tǒng)組成,系統(tǒng)平臺包括數(shù)據(jù)平臺、交互框架平臺、通用顯示工具、可視化顯示平臺。在這個平臺上構(gòu)建處理系統(tǒng)、解釋系統(tǒng)和一體化應(yīng)用系統(tǒng)。項目計劃在兩年內(nèi)完成,預(yù)計程序行數(shù)400萬以上、開發(fā)人員200余人。
經(jīng)驗表明,軟件規(guī)模越大生產(chǎn)率越低。而且隨著軟件規(guī)模增大,軟件開發(fā)成功率也越低,在我們國家,軟件業(yè)還沒有脫離手工作坊的方式。如此大規(guī)模的軟件開發(fā),已往手工作坊式的管理方式要改變,軟件配置管理要創(chuàng)新。與其他的一些軟件工程活動不一樣,軟件配置管理的對象——(軟件)配置項,它們不僅是大量人力物力投入的結(jié)晶,更是開發(fā)經(jīng)驗的積累,是軟件組織最寶貴的財富。
軟件配置管理貫穿于軟件開發(fā)活動的始終,覆蓋了開發(fā)活動的各個環(huán)節(jié),它的重要作用之一就是要全面的管理保存各個配置項,監(jiān)控各配置項的狀態(tài),并向項目經(jīng)理及項目長提交配置報告。配置管理工作更強調(diào)工具的支持,缺乏良好的配置管理工具的話,要做好配置管理的實施會非常困難。軟件配置管理是一項十分繁瑣的工作,同時又和整個軟件的開發(fā)活動緊密地聯(lián)系在一起,為使軟件開發(fā)能夠始終處于受控之中,就必須建立一套體現(xiàn)軟件工程特點的配置管理體系,并依據(jù)體系要求選用軟件配置管理工具。
三、軟件配置管理工具
Firefly是Hansky公司軟件開發(fā)管理套件中的重要組件。Firefly可以對大型軟件開發(fā)的程序代碼和相關(guān)文檔進行管理,具有以下突出的特點:
1、?本地工作區(qū)(Local Workspace)
Local Workspace存儲從服務(wù)器上下載的一個分支的下的文件,開發(fā)人員在工作時首先要從服務(wù)器上將最新修改的項目文件下載到本地工作區(qū),然后才能對項目文件進行編輯、編譯、調(diào)試等工作。有了Local Workspace,可以保持本地的工作文件和服務(wù)器上的工作文件的同步。同時,還可以比較本地工作區(qū)文件與服務(wù)器文件的不同,在每次下載和上傳時不必將所有的項目文件都傳輸一遍,從而提高了工作的效率。
2、?標簽(Label)
Label采用索引技術(shù)提高了操作效率,通過下載Lable的功能為編譯、測試提供了便利。
3、?兩種開發(fā)模式
Firefly支持并行/串行兩種開發(fā)模式,并且提供向?qū)頇z驗和解決文件的沖突,使得團隊的開發(fā)快速、便捷而且高效。
4、?分支
在Firefly中可以方便的建立項目的分支,可以在主分支上建立分支,也可以在次分支上建立分支,還可以在Label的基礎(chǔ)上建立分支;建立分支的時候可以選擇父分支的一部分文件。
在開發(fā)主分支的同時有可能同時開發(fā)修正Bug的分支,當(dāng)主分支的開發(fā)工作告一階段后,通常會把Bug修正分支合并到主分支上去,如下圖:
這種建立和管理項目分支和記錄分支間父子關(guān)系的功能,避免了由于兩方歸并所造成的混亂問題,為軟件產(chǎn)品的多個版本的同時開發(fā)提供了強有力的支持。
4、變更集
Firefly將每一次工作區(qū)的檢入都視作一個變更集,每一個變更集都作為項目分支的歷史被保存下來,管理人員可以通過WEB界面方便的查詢分支的歷史。
5、原子事務(wù)
利用原子事務(wù)的概念,將一個包含多個文件改變的入庫操作作為一個事務(wù)(Transaction)來對待,全部文件的提交只有成功或者不成功兩種情況,沒有中間狀態(tài)(如一部分成功提交,而另一部分提交失敗的狀態(tài))。這樣能夠處理一些操作過程中的異常情況,比如提交過程中網(wǎng)絡(luò)中斷等,保證軟件系統(tǒng)的一致性,防止其他開發(fā)人員取到錯誤的代碼而編譯、運行失敗?! ?br> 6、本地記錄
通過Delta操作支持本地版本的記錄。在某一工作區(qū)中,修改了一個文件,然后通Delta操作,可以在本地記錄下一個新的版本。提交到服務(wù)器上后,其他人也可以訪問這一版本。
7、權(quán)限控制
Firefly采取了類似于NTFS的權(quán)限控制體系,不僅能夠控制項目分支一級的權(quán)限,還可以深入到目錄/文件一級進行權(quán)限設(shè)定,文件的權(quán)限缺省從目錄繼承,還可以手工對特定文件的權(quán)限進行調(diào)整;并且可以細分權(quán)限的等級。這種權(quán)限體系可以保證項目所涉及到的開發(fā)工作都處于受控的狀態(tài)下,從而保障項目不受干擾,能夠順利開發(fā)。
四、建立配置管理體系
1、管理層次
依據(jù)配置管理系統(tǒng)功能特性,結(jié)合我們實際情況和需要,建立自己的管理體系。以往,我們已經(jīng)成功地開發(fā)了其他大中型軟件,但配置管理體系很不完善,一些主要配置項(源代碼和程序文檔)是靠手工管理,由于人員流動性大,又沒有統(tǒng)一的配置管理體系,開發(fā)活動不能受到有效的控制,不能形成團隊財富的積累。有人對配置管理是什么都不清楚,對配置管理系統(tǒng)的使用在思想上不容易接受,認為使用配置管理系統(tǒng)進行程序版本控制使開發(fā)活動受到了限制,給開發(fā)增加了工作量。特別是這次超大規(guī)模軟件系統(tǒng)的開發(fā),時間緊,任務(wù)重,如果配置管理系統(tǒng)使用不當(dāng)影響項目進度或造成源程序丟失,會給開發(fā)帶來巨大損失,后果不堪設(shè)想。
為此,從管理層次和系統(tǒng)集成兩個方面考慮,選擇了降低管理風(fēng)險方案,首先采用了兩層管理層次(圖1? 二層管理層次圖)。
2、存儲庫創(chuàng)建
依據(jù)兩層管理模式,配置管理和版本控制主要在項目級和子項目級配置管理員中使用。從一體化系統(tǒng)的結(jié)構(gòu)來說,盡管該系統(tǒng)龐大,包括許多子系統(tǒng),但是,最終要集成一個系統(tǒng),而且管理模式?jīng)Q定了版本控制是在項目開發(fā)到一定階段,形成初步系統(tǒng)模型時納入版本控制。因此在Firefly服務(wù)器上創(chuàng)建一個程序代碼庫,用來存儲初步集成的源代碼。使用這樣的庫結(jié)構(gòu)有利于對配置項的統(tǒng)一管理和控制,同時也能提高編譯和發(fā)布的效率。
3、權(quán)限設(shè)置
創(chuàng)建一個代碼存儲庫,是為了便于統(tǒng)一管理,但是如何讓開發(fā)人員根據(jù)任務(wù)分工的不同而獲得對相應(yīng)配置項(源代碼)的操作許可,而對于其他源代碼不能操作。為此,利用Firefly提供的文件級訪問權(quán)限設(shè)置,對不同目錄進行用戶權(quán)限設(shè)置,只有對該目錄具有讀寫權(quán)限的用戶才能對其進行操作,為子系統(tǒng)配置管理員授權(quán)一個文件目錄,如圖2權(quán)限設(shè)置圖中src/ap目錄授權(quán)給smq用戶。
圖2 權(quán)限設(shè)置
4、分支的劃分
· 集成分支
為了系統(tǒng)集成測試需要,創(chuàng)建集成分支,并對該分支進行了不同子項目的權(quán)限控制,各子項目必須將開發(fā)成果納入到該分支,凡是對納入到該分支的配置項進行的任何變更,都必須首先從該分支獲得,變更后再上傳到該分支。軟件的集成測試工作在這一分支中進行。項目級配置管理員擁有對該集成分支的管理和讀寫權(quán)限,子項目級配置管理員只有對指定的目錄有讀寫權(quán)限。(圖3分支圖)
· 主干分支
主干分支對應(yīng)的是整個軟件開發(fā)組織的發(fā)布分支。各個子項目在現(xiàn)階段的任務(wù)完成后,將可以發(fā)布的版本歸并到該分支上,由該分支產(chǎn)生發(fā)布版本,對每次的發(fā)布基線和相關(guān)資料,以該分支上的版本為準。該分支的管理工作由項目級配置管理員負責(zé)。(圖4分支及標簽)
上面定義的2類(分支)由配置管理員統(tǒng)一管理,根據(jù)各開發(fā)階段的實際情況定制相應(yīng)的版本選取規(guī)則,來保證開發(fā)活動的正常運作。
比如,軟件已經(jīng)發(fā)布了1.0版本,開發(fā)小組在為該軟件添加新的功能,正在進行2.0版本的開發(fā)。而此時,如果Release 1.0中發(fā)現(xiàn)了Bug必須修正,我們就必須從Release 1.0中建立bugfix分支,進行必要的修正后,發(fā)布修正版Release 1.1,而這個版本的發(fā)布與2.0版本的開發(fā)沒有直接關(guān)系。當(dāng)2.0版本測試結(jié)束后,要與1.0版本中bugfix分支合并,從而發(fā)布2.0的版本。在這個并行開發(fā)過程中,創(chuàng)建分支和分支的合并起了非常重要的作用。
圖3 分支
圖4 分支及標簽
· 產(chǎn)品基線
當(dāng)一個開發(fā)里程碑結(jié)束,或有重大事件發(fā)生時,利用配置管理系統(tǒng)提供的標簽功能,對集成分支和主干分支進行標記,該標記作為產(chǎn)品基線,可以按標記進行版本發(fā)布和再現(xiàn)(圖4分支及標簽)。
· 與分支對應(yīng)的本地工作區(qū)
把相關(guān)配置項納入集中的存儲庫、為不同目的建立了不同分支后,按照初始設(shè)定的管理層次,子項目級配置管理員遵照“檢出/檢入”的工作模式對配置項進行修改,就要為每位子項目級配置管理員設(shè)定本地工作區(qū),對所授權(quán)的目錄進行的任何變更都要在本地工作區(qū)進行。
· 開發(fā)工作區(qū)
開發(fā)人員根據(jù)項目要求在自己的私有工作區(qū)中對配置項進行修改和測試活動,私有工作區(qū)可以是CVS版本控制軟件工作空間或其他,自己的修改活動不會受到他人的影響,也不會影響到其他開發(fā)人員,修改和測試后的配置項提交給子系統(tǒng)配置管理員,由子項目級配置管理員上傳到集成分支。
五、逐步完善分支創(chuàng)建方式
1、依據(jù)開發(fā)需要,創(chuàng)建平臺分支
由管理層次決定的分支是一個主分支一個集成分支,但隨著開發(fā)活動的深入,系統(tǒng)平臺開發(fā)和應(yīng)用開發(fā)之間出現(xiàn)互相牽制問題,平臺程序變更后在沒有與應(yīng)用程序聯(lián)調(diào)之前,會影響到應(yīng)用程序的開發(fā),嚴重時會使應(yīng)用程序開發(fā)工作無法正常進行,為了查找原因,有時需要花上一兩天時間,影響了開發(fā)進度。鑒于這種情況,新創(chuàng)建了系統(tǒng)平臺分支,系統(tǒng)平臺子項目組在該分支開發(fā)集成,待測試通過并與應(yīng)用聯(lián)調(diào)后再利用分支歸并功能,將程序歸并到集成分支,既達到了程序控制的目的,又不影響開發(fā)進度,有效的提高了開發(fā)效率。這一分支方式說明了通過科學(xué)管理可以出效率。
2、為了方便管理,建立鏈接分支
平臺分支和集成分支應(yīng)用一段時間后,又出現(xiàn)了新的問題,平臺的變更,需要通過應(yīng)用程序進行測試。但是,系統(tǒng)平臺分支上的應(yīng)用程序不能時時更新,除非將集成分支的應(yīng)用合并到平臺分支,這樣給管理帶來許多麻煩,為了解決該問題,利用FireflyV3.0版本中提供的鏈接功能,在系統(tǒng)分支上創(chuàng)建了鏈接,鏈接到集成分支的應(yīng)用部分,這樣,平臺分支可以隨時得到應(yīng)用系統(tǒng)變更的文件,大大方便了測試版本的制作。(圖5鏈接點)。
開發(fā)過程中系統(tǒng)分支和應(yīng)用集成分支以及鏈接的應(yīng)用,使平臺開發(fā)和應(yīng)用開發(fā)可以有序進行,消除了平臺變更對應(yīng)用開發(fā)帶來的影響,促進了開發(fā)進度,有效地控制了平臺和應(yīng)用的變更,為開發(fā)階段版本管理和控制起到了很好的作用。
3、為發(fā)布產(chǎn)品,啟用主干分支
在項目開發(fā)階段基本結(jié)束,進入產(chǎn)品發(fā)布階段后,除了建立產(chǎn)品基線外,啟用了主干分支為發(fā)布分支,集成分支上測試通過的程序,及時合并到發(fā)布分支制作發(fā)布版本。在產(chǎn)品發(fā)布初期,用戶和試生產(chǎn)發(fā)現(xiàn)問題比較多,程序變更頻繁,每周要集成一個新版本,為了標示不同時間編譯的版本,除了版本號之外,附加了BuildNumber來標示,如圖4所示的標簽。
六、依據(jù)測試階段,集成軟件版本
從軟件工程化和保證產(chǎn)品質(zhì)量出發(fā),軟件測試采用三級測試方式:單元測試、集成測試和生產(chǎn)性測試(試生產(chǎn)),由于項目開發(fā)時間緊,不能一級測試結(jié)束,再開始下一級測試,而均采用滾動開發(fā)測試方式進行,多數(shù)情況下是同時進行,這給版本控制和集成帶來很大困難,為此,建立了三種集成環(huán)境。三個版本的版本控制和集成是通過分支、測試基線、分支合并來完成。
1、單元測試
單元測試由開發(fā)人員在相對穩(wěn)定的系統(tǒng)開發(fā)平臺上進行,其中,相對穩(wěn)定的系統(tǒng)平臺需要集成一個系統(tǒng)平臺版本。
2、集成測試
集成測試是將各個子系統(tǒng)組成一個可運行系統(tǒng)的重要階段。由于一體化軟件是系統(tǒng)平臺與應(yīng)用系統(tǒng)幾乎同時開發(fā)的項目,系統(tǒng)平臺內(nèi)部、應(yīng)用系統(tǒng)內(nèi)部,以及平臺與應(yīng)用之間的組裝都需在集成測試階段完成。
3、生產(chǎn)測試
生產(chǎn)測試要求集成測試后比較穩(wěn)定的版本,該版本利用標簽進行標示。
4、版本回溯
在測試中,經(jīng)常出現(xiàn)新修改的程序版本有問題,需要回溯到上一個版本,這是,使用配置管理系統(tǒng)提供的版本管理功能非常方便地回到任意一個程序版本。
七、完善和改進配置管理體系
在兩年來的開發(fā)管理和版本控制中,有成功也有教訓(xùn),最初使用配置管理系統(tǒng)時,對其功能和使用方式不熟悉,出現(xiàn)了許多問題,對項目開發(fā)產(chǎn)生了一些影響,一度出現(xiàn)了放棄配置管理工具的念頭,最終在各方面人員的支持下,使得配置管理系統(tǒng)得以繼續(xù)在管理中發(fā)揮作用。
1、?改進管理層次
在系統(tǒng)集成階段使用配置管理系統(tǒng)進行版本控制,解決了許多問題,促進了開發(fā)效率,為項目按期完成提供了有利保證。但是,在管理層次中,開發(fā)人員的開發(fā)活動沒有納入統(tǒng)一的控制之中,這種方式容易造成修改的版本不是最終版本問題。
針對上述現(xiàn)象和兩年來的使用經(jīng)驗,在項目開發(fā)進入一個新的階段時(開發(fā)2.0版本),將版本控制范圍擴大到每一位開發(fā)人員,使每個開發(fā)人員的開發(fā)活動始終處于版本控制之中,管理層次如圖6所示。
2、?增加子分支
為達到上述目的,子系統(tǒng)配置管理員也應(yīng)該是分支管理員,為此,在集成分支下創(chuàng)建應(yīng)用子系統(tǒng)的子分支,子分支分別由子系統(tǒng)配置管理員管理并設(shè)置用戶權(quán)限,進行子系統(tǒng)集成,然后再歸并到集成分支。
3、?本地工作區(qū)
每位開發(fā)人員的工作空間都使用與配置管理系統(tǒng)相連的本地工作區(qū),開發(fā)活動始終處于受控之中。
八、經(jīng)驗與體會
在版本控制和管理方面的經(jīng)驗主要體現(xiàn)以下幾個方面:
1、創(chuàng)建以“版本控制”為中心的大規(guī)模軟件配置管理體系
對于一體化系統(tǒng)這樣前所未有的超大規(guī)模、且開發(fā)周期僅兩年的軟件開發(fā)項目,如何保證軟件開發(fā)在有序與受控方式下進行,是項目成功開發(fā)要解決的關(guān)鍵問題。
首先,要制定一套體現(xiàn)項目特點的軟件配置管理體系,才能使開發(fā)處于受控之中。據(jù)此,項目組決定引進配置管理系統(tǒng)進行配置管理和版本控制,這也是首次在如此大規(guī)模的軟件項目中使用配置管理系統(tǒng)。由于是初次使用,基于過去軟件開發(fā)的經(jīng)驗,結(jié)合本項目的特點和軟件配置管理的現(xiàn)狀,制定了適合本項目的版本控制層次結(jié)構(gòu)(見圖1),分支策略和權(quán)限控制。
2、依據(jù)軟件開發(fā)的需要,創(chuàng)建配置管理體系
在項目開發(fā)過程中,依據(jù)每個開發(fā)階段的具體運作實踐,對版本控制層次結(jié)構(gòu)和分支策略進行完善與實用化改進。配置管理體系的建立,使開發(fā)機構(gòu)的開發(fā)模式逐步邁入工程化開發(fā)管理的新時期。
九、結(jié)束語
通過兩年項目開發(fā)實踐,許多開發(fā)人員對版本控制的概念有了新的認識,從最初的抵觸情緒到后來主動要求要使用配置管理系統(tǒng),基本形成了軟件工程化的開發(fā)氛圍。
兩年來,在項目長、各級子項目長和項目部主管領(lǐng)導(dǎo)的支持下,一體化系統(tǒng)配置管理體系得到了有史以來的發(fā)展和完善,管理人員和開發(fā)人員的觀念得到了轉(zhuǎn)變,初步形成了一套適合大規(guī)模應(yīng)用軟件項目開發(fā)的版本控制與管理體系,積累了比較豐富的技術(shù)與管理經(jīng)驗。配置管理體系的建立,增強了開發(fā)團隊對大規(guī)模軟件開發(fā)的版本控制能力,為開發(fā)團隊的可持續(xù)發(fā)展奠定了技術(shù)基礎(chǔ),積累了軟件財富。
有效地記錄并控制軟件開發(fā)過程產(chǎn)品版本演化進程,是搞好過程控制的基礎(chǔ)。軟件配置管理體系的有效實施,使軟件開發(fā)活動合理有序,為進一步搞好軟件項目管理和開發(fā)管理奠定了基礎(chǔ)。建立開發(fā)、測試受控庫,確定受控基線,對源程序、運行環(huán)境進行嚴格的版本管理與變更控制,確保項目過程產(chǎn)品的一致性、正確性和安全性,有效地降低了開發(fā)風(fēng)險,縮短了產(chǎn)品的開發(fā)周期。因此,配置管理體系作為開發(fā)管理的主要過程之一,對處理、解釋一體化系統(tǒng)的開發(fā)成功起到了不可替代的作用。
十、參考文獻
1、《軟件配置管理及其工具應(yīng)用》人民郵電出版社;
2、《Firefly配置管理系統(tǒng)》Hansky產(chǎn)品培訓(xùn)手冊。