摘要: 軟件配置管理包括對(duì)代碼、文檔、數(shù)據(jù)等的管理,其優(yōu)劣受限于項(xiàng)目成員的實(shí)際操作。開發(fā)人員對(duì)于工作區(qū)如何使用;成員之間的代碼是不是可以及時(shí)更新與同步;怎樣使用分支,如何進(jìn)行變更合并,才能減少物理空間浪費(fèi)和事件延遲。這些問題在實(shí)際的項(xiàng)目開發(fā)中往往被忽視,亦或團(tuán)隊(duì)并沒有對(duì)成員行為作細(xì)節(jié)的規(guī)范,因而許多軟件項(xiàng)目出現(xiàn)了工期推遲或代碼質(zhì)量不高等問題。為此提出了一系列管理措施,通過優(yōu)化軟件配置管理規(guī)范項(xiàng)目各成員的行為,以保證高效的軟件配置管理的實(shí)施。
關(guān)鍵詞: 軟件配置管理; 工作區(qū); 代碼; 分支與合并; 過程及規(guī)范
中圖分類號(hào):TP311.5 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2012)10-67-03
引言
軟件配置管理(SCM,Software Configuration Management)是軟件項(xiàng)目中一個(gè)非常重要的活動(dòng),存在于整個(gè)軟件項(xiàng)目周期當(dāng)中,管理項(xiàng)目的所有代碼、數(shù)據(jù)、文檔等,以保證軟件項(xiàng)目過程的可控,變更歷史可追溯。本文從六個(gè)基本角度:工作區(qū)、開發(fā)線、分支、合并、編譯以及過程規(guī)范,探討軟件配置管理優(yōu)化的方案。希望項(xiàng)目成員能夠以優(yōu)化自己的日常工作為起點(diǎn),與團(tuán)隊(duì)一起共同提高軟件項(xiàng)目的配置管理水平。
1 工作區(qū)優(yōu)化
工作區(qū)是開發(fā)者進(jìn)行代碼開發(fā)、測(cè)試、變異的特定分配區(qū)域,幾乎每種SCM系統(tǒng)都存在“工作區(qū)”這個(gè)概念,它界定了開發(fā)人員的工作領(lǐng)域,避免開發(fā)人員之間的工作相互影響。
1.1 不共享工作區(qū)
為了便于管理,工作區(qū)應(yīng)該遵循分離原則。工作區(qū)的共享,實(shí)質(zhì)上顯示了開發(fā)人員工作空間的物理?xiàng)l件的共享性,這樣一來,某個(gè)開發(fā)人員的修改,就會(huì)導(dǎo)致共享此工作區(qū)的其他人員工作的混亂。物理空間并非高價(jià)之物,不要為了節(jié)省磁盤空間而浪費(fèi)時(shí)間,在軟件項(xiàng)目中,分秒必爭(zhēng),時(shí)間不可浪費(fèi)。
1.2 禁止工作區(qū)外開發(fā)
背著SCM進(jìn)行暗地操作,其歷史的追蹤將成為不可能。為了開發(fā)團(tuán)隊(duì)的交流,每個(gè)開發(fā)者的工作區(qū)內(nèi)容,可以被其他成員查看,而不允許其他成員修改。如果開發(fā)人員在工作區(qū)外部進(jìn)行開發(fā),其工作不能與團(tuán)隊(duì)共享,且修改歷史不能被跟蹤,這將沒有辦法在發(fā)生問題時(shí)回滾到之前正確的狀態(tài),造成工作的徒勞。
1.3 避免由外至內(nèi)的影響
對(duì)于自己工作區(qū)內(nèi)的文件,應(yīng)該極力避免非意志性的文件更改。主要是,不受SCM系統(tǒng)管理的外部物理空間發(fā)生的活動(dòng),引起了SCM工作區(qū)內(nèi)的文件的更改。例如,軟件的編譯行為,可能會(huì)增加SCM控制區(qū)內(nèi)文件。為了保證項(xiàng)目受控工作區(qū)域的文件穩(wěn)定性,應(yīng)避免工作區(qū)外部行為對(duì)內(nèi)部文件的增刪改。
1.4 同步項(xiàng)目庫(kù)代碼
開發(fā)人員check-in代碼時(shí),需先將自己的工作區(qū)與版本庫(kù)進(jìn)行同步,在沒有沖突的情況下進(jìn)行本地修改的check-in,當(dāng)有較大沖突時(shí),需要配置管理者對(duì)沖突進(jìn)行手動(dòng)修正。如果可以減少這樣的沖突,及時(shí)將工作區(qū)本地版本與服務(wù)器同步,保持SCM管理下的代碼最新,可以減少代碼最終提交時(shí)的尚待解決的沖突,避免延遲工期。
1.5 及時(shí)check-in
當(dāng)多名開發(fā)人員協(xié)同開發(fā)時(shí),開發(fā)告一段落,開發(fā)人員需要通過check-in代碼去告知其他開發(fā)者自己的變更,而及時(shí)的check-in可以保證其他人員能夠及時(shí)得到庫(kù)內(nèi)的新版本,減少?zèng)_突的出現(xiàn)。當(dāng)然配置管理組,也需要建立支持頻繁變更的機(jī)制,避免對(duì)代碼變更過于復(fù)雜保守的評(píng)價(jià)。變更審查的時(shí)間越久,就會(huì)造成越大的項(xiàng)目時(shí)間的浪費(fèi)。
2 代碼行為優(yōu)化
代碼在配置管理的過程中會(huì)分成不同的版本,不斷更新完善,最后發(fā)布。代碼的管理是軟件項(xiàng)目配置管理的重要工作部分。
2.1 制定代碼策略
代碼策略指對(duì)于代碼正確使用的方法、如何審定check-in的代碼,而確立的規(guī)則,這些策略將是代碼部分管理的重要手冊(cè)。代碼變更如何進(jìn)行書面化描述,怎樣進(jìn)行編譯、測(cè)試,check-in后的代碼安定性預(yù)期值等,都需要在規(guī)則中進(jìn)行明確規(guī)定。沒有規(guī)則化的代碼開發(fā),從軟件配置管理的角度而言,可以說等同于失去可控性。
2.2 設(shè)立開發(fā)控制責(zé)任人
有了代碼策略,也不能排除規(guī)則不適用或者含糊不清的特殊情況,為了解決這些特殊情況,開發(fā)者可以通過控制人員得到統(tǒng)一的解決方法。設(shè)定開發(fā)控制責(zé)任者,使其承擔(dān)特定部分代碼的責(zé)任以及規(guī)則把握,避免開發(fā)者遇到問題時(shí)擅自解決,并將遇到的特殊情況書面化,以便項(xiàng)目組積累經(jīng)驗(yàn),為后續(xù)開發(fā)奠定基礎(chǔ)。
2.3 使用主線開發(fā)模式
如圖1所示的基于主線的開發(fā)模型,可以看到從主線分出了幾條發(fā)布線(\"ver1\"、\"ver2\"、\"ver3\")與開發(fā)線(\"projA\"、\"projB\"、\"projC\")。開發(fā)者在主線與開發(fā)線上進(jìn)行開發(fā)活動(dòng),發(fā)布線用于測(cè)試以及bug修正。發(fā)布線與開發(fā)線上進(jìn)行的變更,最終需合并到主線中。主線開發(fā),支持并行開發(fā),大大減少軟件產(chǎn)品在其生存周期成熟之前的管理開銷,并且主線模型可以避免代碼凍結(jié),使項(xiàng)目順利進(jìn)行。
3 分支優(yōu)化方案探討
分支功能是軟件配置管理下最容易產(chǎn)生問題的部分。不同的軟件配置管理方案,對(duì)分支進(jìn)行不同方式的支持,或者可以說,根據(jù)不同的規(guī)則,分支機(jī)能也得到不同程度的活用。
3.1 需用才用
所有分支的變動(dòng)幾乎都會(huì)引起項(xiàng)目人員的工作量的增加(編譯工作、代碼的變更傳達(dá),分支合并等)。增加分支同時(shí),需要充分意識(shí)到對(duì)項(xiàng)目工作量的增加,減少不必要的分支的增加,并盡可能避免在分支上再建分支,以降低對(duì)項(xiàng)目進(jìn)度的影響。
3.2 傳遞靠分支不靠備份
當(dāng)開發(fā)線全部或者一部分需要轉(zhuǎn)交時(shí),不要進(jìn)行復(fù)制傳遞。復(fù)制傳遞需要將一條生產(chǎn)線上的全部文件都復(fù)制到新位置,作為新的文件在新的開發(fā)分支上進(jìn)行使用。由于復(fù)制之后文件的增加,不僅增加了物理空間的負(fù)擔(dān),同時(shí)對(duì)于相同的文件,SCM系統(tǒng)仍需要管理這些新分支的“新”實(shí)體以及他們的歷史記錄,這將增大配置管理的復(fù)雜度。
3.3 不同原則不同分支
如果開發(fā)人員遵循著不同的檢入/檢出原則,則應(yīng)該在不同分支上進(jìn)行開發(fā)。例如:負(fù)責(zé)軟件發(fā)布的小組,要求進(jìn)行嚴(yán)密的測(cè)試之后才可以進(jìn)行check-in;而開發(fā)組需要及時(shí)同步代碼版本,只要進(jìn)行簡(jiǎn)單的測(cè)試就可以check-in。像這樣依據(jù)完全不同的工作原則時(shí),分支開發(fā)是必須的。
3.4 不到必要時(shí)不創(chuàng)建分支
不談建立分支的物理消耗,為了最小化分支之間變更傳遞的復(fù)雜性,應(yīng)將分支建立盡可能向后推延。例如,過早為新功能建立發(fā)布分支,該分支上新功能的測(cè)試以及bug修正不得不同時(shí)向主線上合并,這是時(shí)間和工作量上的浪費(fèi)。發(fā)布分支建立前,在開發(fā)主線上進(jìn)行測(cè)試與bug修正的話,分支之間傳遞的變更信息將會(huì)大大減少,可以節(jié)省時(shí)間與精力。
3.5 以分支緩和凍結(jié)
有時(shí),項(xiàng)目需要對(duì)代碼進(jìn)行凍結(jié)以便進(jìn)行測(cè)試工作,而這對(duì)于開發(fā)者而言,在測(cè)試完成之前,開發(fā)產(chǎn)生的變更無法與項(xiàng)目代碼進(jìn)行整合。這種情況下,為了使開發(fā)人員的工作得以正常進(jìn)行,應(yīng)該在代碼凍結(jié)之前盡可能早地建立新分支。
4 合并優(yōu)化方案探討
合并指的是某一分支的變更向目的分支的更新整合操作。這是我們不得不直面的SCM中的一個(gè)重要且普遍的問題,而這并不是一個(gè)簡(jiǎn)單的工作。
4.1 變更合并相似分支
分支時(shí)間越長(zhǎng),沖突就越多,合并開銷就越大。對(duì)于一次變更,與其與經(jīng)過較多修改的分支進(jìn)行合并,不如與變化不大的分支合并來的容易。例如,主線模型中,應(yīng)該在發(fā)布分支上進(jìn)行bug修正等操作,功能穩(wěn)定后合并到開發(fā)主干上。若在主線上進(jìn)行bug修正,合并時(shí)原本不需要的修改可能也會(huì)傳給發(fā)布分支,而這些無關(guān)變更可能造成開發(fā)人員工作混亂。
4.2 勤于合并
要盡量頻繁地進(jìn)行合并。及時(shí)合并處于穩(wěn)定點(diǎn)的分支,讓自己的修改盡快被其他相關(guān)開發(fā)人員得知,這可以有效地減少開發(fā)成員之間的代碼沖突。同時(shí)變更的合并,趕早不趕晚,及早進(jìn)行合并,以減少延遲合并可能產(chǎn)生的沖突。
4.3 設(shè)立合并責(zé)任人
開發(fā)修改的變更合并很大可能會(huì)存在沖突,如果由恰當(dāng)?shù)拈_發(fā)人員進(jìn)行解決的話,那么沖突所帶來的負(fù)擔(dān)便會(huì)大大減輕??赡軗?dān)任合并責(zé)任人的開發(fā)者包括:(a)目標(biāo)分支的所有者;(b)執(zhí)行合并的開發(fā)者;(c)a、b之外的開發(fā)者。與c相比,a、b更適合作為合并的負(fù)責(zé)人員。
5 編譯優(yōu)化方案探討
編譯即是通過使用眾多源代碼文件,生成可以使用的軟件產(chǎn)品的過程。
5.1 源碼+工具=軟件產(chǎn)品
源文件以及編譯工具是編譯的重要組成部分。如果編譯需要通過腳本進(jìn)行自動(dòng)執(zhí)行,或者手動(dòng)執(zhí)行時(shí),那么安裝使用的順序等應(yīng)落實(shí)文本化。且操作系統(tǒng)、編譯器、庫(kù)文件、動(dòng)態(tài)鏈接庫(kù)、編譯文件以及各項(xiàng)規(guī)范等,所有編譯涉及到的文件都應(yīng)該進(jìn)行文本描述,以保證通過正確的相同的順序,相同的文件,相同的編譯器,產(chǎn)生相同的結(jié)果。
5.2 check-in所有源
為了保證不論誰(shuí)在哪里按照相同順序都可以編譯得到同樣的結(jié)果,編譯活動(dòng)所需源文件需要無遺漏地進(jìn)行check-in。Makefile、安裝腳本、編譯腳本、編譯手冊(cè)、規(guī)范等,這些都是編譯不可少的文件。應(yīng)該時(shí)刻銘記:源碼+工具=軟件產(chǎn)品。
5.3 編譯與源庫(kù)分離
將編譯生成的目標(biāo)代碼文件轉(zhuǎn)移到獨(dú)立或者外部目錄下,與版本庫(kù)目錄中的文件進(jìn)行隔離,避免目標(biāo)代碼文件混于配置管理版本庫(kù)中造成混亂。這種分離,將軟件配置管理簡(jiǎn)化在源文件層級(jí),減少SCM系統(tǒng)對(duì)冗余文件的管理負(fù)擔(dān)。
5.4 相同工具編譯
開發(fā)者、測(cè)試人員、發(fā)布人員,所有的項(xiàng)目成員應(yīng)該保證使用同樣的編譯工具,以便相同操作順序產(chǎn)生相同結(jié)果,避免問題情景不能重現(xiàn),減少找不到問題根本而造成的時(shí)間浪費(fèi)。
5.5 頻繁編譯
即使項(xiàng)目時(shí)間充裕,項(xiàng)目所有分支部分的編譯以及回歸測(cè)試也應(yīng)該定期、頻繁地進(jìn)行,以保證開發(fā)主線、各分支的正確性。伴隨回歸測(cè)試頻繁進(jìn)行的全項(xiàng)目編譯,具有兩個(gè)優(yōu)勢(shì):一是明確check-in之后項(xiàng)目集成可能出現(xiàn)的問題;二是通過編譯得到可使用的鏈接庫(kù)。
5.6 存檔編譯結(jié)果
在編譯正確執(zhí)行并產(chǎn)生預(yù)想結(jié)果時(shí),所經(jīng)過的正確操作以及操作順序,以及源文件、編譯工具與操作系統(tǒng)版本信息、編譯工具輸出、被編譯項(xiàng)目、測(cè)試結(jié)果等,連同編譯日志一起應(yīng)及時(shí)存檔。例如:編譯產(chǎn)生的中間件轉(zhuǎn)交使用時(shí),可能需要重編譯才能使用,而編譯存檔將避免在重編譯時(shí)遇到相同問題。編譯存檔是經(jīng)驗(yàn)的積累,可減少重復(fù)工作,節(jié)約時(shí)間。
6 SCM過程探討
6.1 追溯目錄變更
開發(fā)過程中各類別的文件都具有自己的變更歷史,而文件的變更只有在特定階段,相關(guān)文件集合中,才具有實(shí)際意義。例如:foo.c文件,在某一時(shí)期發(fā)生變更的同時(shí),還有哪些文件發(fā)生了變更·為了更好地回答這個(gè)問題,就需要目錄的變更跟蹤,不是針對(duì)單一文件,而是對(duì)相關(guān)文件集合的跟蹤。選擇可以追蹤目錄的SCM系統(tǒng)也是SCM的首要任務(wù)。
6.2 關(guān)注相關(guān)合并
目錄變更跟蹤的一個(gè)優(yōu)勢(shì)在于可以很明顯看出分支之間邏輯上的變更蹤跡。哪些變更集合進(jìn)行了合并,哪些處于保留狀態(tài),哪些是合并分支,哪些是目標(biāo)分支,通過對(duì)目錄變更的跟蹤,可以明確bug A的修正是不是影響發(fā)布分支X,是不是被合并到了測(cè)試分支Y上。SCM系統(tǒng)的此功能,可以提高項(xiàng)目變更的可見性與邏輯性。
6.3 設(shè)立配置項(xiàng)責(zé)任人
SCM過程所涉及的管理項(xiàng)包括:規(guī)則規(guī)范、產(chǎn)品、構(gòu)件、代碼、分支、任務(wù)等,需要項(xiàng)目組針對(duì)所有項(xiàng)設(shè)立責(zé)任人,以規(guī)范所有單項(xiàng)的正確執(zhí)行,核實(shí)所有的變更活動(dòng),在有沖突之時(shí)進(jìn)行決斷,避免項(xiàng)目成員各自為營(yíng),給好不容易建立的SCM體系效果減分。
6.4 使用有效文檔
項(xiàng)目過程中產(chǎn)生的文檔可能伴隨項(xiàng)目進(jìn)行而更新,同樣需要SCM對(duì)其進(jìn)行歷史管理。有效文檔是項(xiàng)目可用的最新的版本,應(yīng)保證它們的可訪問性,無論是從哪種工作開發(fā)環(huán)境,甚至根據(jù)需要在家里,都可以訪問這些文檔。對(duì)于項(xiàng)目的安裝使用說明文件等,涉及保證成員相同操作的文件,需要保證其變更審核的簡(jiǎn)易性,以便盡快使這些文件的更新得到應(yīng)用,以保證項(xiàng)目成員統(tǒng)一規(guī)范的行為活動(dòng)。
7 結(jié)束語(yǔ)
基于軟件開發(fā)項(xiàng)目的大規(guī)模性、需求多變更性,以及多技術(shù)人員開發(fā)、高質(zhì)量化、費(fèi)用控制等方面的必要性,軟件配置管理成為了保證項(xiàng)目高效順利進(jìn)行的一個(gè)重要課題。借助于良好的軟件配置管理工具,加之規(guī)范的項(xiàng)目開發(fā)行為,才會(huì)有高效配置管理。
本文著眼于日常開發(fā)人員的工作,從配置管理伊始到最后項(xiàng)目結(jié)束,乃至后期的軟件維護(hù)等,都離不開軟件配置管理。從創(chuàng)建分支,到變更合并,再到項(xiàng)目文檔體系,雖然都是我們每天面對(duì)的習(xí)以為常的事情,卻更需要多加注意,從小處杜絕配置管理上的物理空間浪費(fèi)和管理復(fù)雜化,從而在有效的配置管理的護(hù)航下,順利實(shí)現(xiàn)項(xiàng)目按時(shí)、保質(zhì)、保量的完成。
當(dāng)然以上所提及的問題并不是全部,如果想要更完美地實(shí)現(xiàn)配置管理,還需要我們?cè)谧约旱捻?xiàng)目開發(fā)過程中不斷發(fā)現(xiàn)問題,不斷尋找最佳解決方案,不斷總結(jié)經(jīng)驗(yàn),以成就成功的軟件項(xiàng)目。
參考文獻(xiàn):[1] 嚴(yán)曉光,王小剛,陳曼煜.軟件配置管理的問題、目的、層次和策略[J].
計(jì)算機(jī)工程與科學(xué),2009.5:90-92,101
[2] 朱寅非.淺析配置管理在軟件開發(fā)中的作用[J].南京廣播電視大學(xué)學(xué)報(bào),2010.4:93-96
[3] 孟顯英.企業(yè)中實(shí)施軟件配置管理過程中的誤區(qū)[J].科技信息,2010.21:588
[4] 勃克扎著,黃明成譯.軟件配置管理模式[M].中國(guó)電力出版社,2004.