盛玉強(qiáng) 楊春花
摘 要: 軟件量化對(duì)軟件項(xiàng)目管理有著至關(guān)重要的作用,便于進(jìn)行開(kāi)發(fā)成本和開(kāi)發(fā)時(shí)間的估算,合理規(guī)劃軟件生命周期。目前應(yīng)用比較廣泛的方法大多是以歷史經(jīng)驗(yàn)為基礎(chǔ)進(jìn)行量化管理,由于在過(guò)程中存在很多不確定性因素,量化的結(jié)果不能準(zhǔn)確反映實(shí)際情況??紤]到實(shí)際開(kāi)發(fā)需求,本文提出一種依據(jù)變更數(shù)據(jù)對(duì)軟件開(kāi)發(fā)過(guò)程進(jìn)行量化管理的方法,通過(guò)對(duì)日常變更內(nèi)容的分析,獲取基礎(chǔ)數(shù)據(jù),進(jìn)一步建立量化指標(biāo),對(duì)團(tuán)隊(duì)或個(gè)人的工作量、效率、活躍度等進(jìn)行衡量?;贘ava EE技術(shù),設(shè)計(jì)了一個(gè)量化管理系統(tǒng)對(duì)該方法集中展開(kāi)研發(fā)實(shí)現(xiàn)。最后,以Tomcat版本庫(kù)為例,闡述了具體的實(shí)現(xiàn)過(guò)程及結(jié)果。
關(guān)鍵詞: 軟件量化;變更分析;過(guò)程管理
Abstract:Software quantification plays an important role in software project management which makes it easy to estimate the development cost and development time and reasonably plan the software life cycle. Most of the current methods widely used is based on historical experience to realize a quantitative management because there are many uncertainty factors in the process the quantitative results cannot accurately reflect the actual situation. Considering the actual development requirement this paper proposes a quantitative management method of software development process based on change data which could through the analysis of the daily change of content obtain basic data then establish the quantitative indicators therefore evaluate the team or individual work such as efficiency active measure.Based on the Java EE technology a quantitative management system is designed to implement this method. Finally the implementation process and results of the Tomcat version library are illustrated.
Key words: software quantification;change analysis;process management
引言
軟件度量研究是一個(gè)在過(guò)去30多年中始終處于發(fā)展活躍期的軟件工程領(lǐng)域,研究主流是關(guān)心軟件的品質(zhì)和軟件的定量化度量。
目前行業(yè)對(duì)軟件度量和項(xiàng)目管理的研究,主要集中于對(duì)已有度量模型和方法的優(yōu)化上。如基于IFPUG功能點(diǎn)分析法的改進(jìn)方法[1]、基于CMMI的量化方法[2-3]、基于Delphi技術(shù)對(duì)軟件規(guī)模和進(jìn)度進(jìn)行估算的方法[4]、基于偏最小二乘回歸的方法校準(zhǔn)度量因子,并結(jié)合COCOMO模型[5]進(jìn)行量化的方法[6]、基于GQM模型[7],利用PUGH矩陣的決策機(jī)制進(jìn)行過(guò)程控制和軟件量化的方法[8]等。這些方法多以軟件的結(jié)構(gòu)為主體提供度量,將軟件按照功能點(diǎn)、方法、模塊等元素進(jìn)行拆分后,設(shè)置加權(quán)參數(shù),實(shí)現(xiàn)整體的度量。缺點(diǎn)是只能在軟件項(xiàng)目設(shè)計(jì)階段進(jìn)行估算或者在軟件開(kāi)發(fā)完成后,對(duì)整個(gè)項(xiàng)目進(jìn)行回顧,無(wú)法應(yīng)用到軟件開(kāi)發(fā)過(guò)程中創(chuàng)建實(shí)時(shí)的管理,缺乏靈活性。
現(xiàn)有的軟件度量方法,可以做到對(duì)代碼復(fù)雜度、每日版本可用率、代碼質(zhì)量缺陷指數(shù)[9]等進(jìn)行度量,但無(wú)法做到對(duì)變更內(nèi)容生成定量化分析。為對(duì)開(kāi)發(fā)過(guò)程定制有效的量化管理,本文提出基于軟件開(kāi)發(fā)過(guò)程中的變更數(shù)據(jù)進(jìn)行量化管理的方法。結(jié)合項(xiàng)目開(kāi)發(fā)過(guò)程中的具體變更數(shù)據(jù),對(duì)變更內(nèi)容進(jìn)行分析,包括變更的代碼行、文檔行,變更文件的個(gè)數(shù)、類型、內(nèi)容,所屬的模塊名等統(tǒng)計(jì)代碼、文檔的增、刪、改等的操作,建立研究對(duì)象的模型??梢愿鶕?jù)這些基礎(chǔ)數(shù)據(jù),對(duì)指定時(shí)間段內(nèi)團(tuán)隊(duì)效率、活躍度、工作量,成員效率、修改內(nèi)容、產(chǎn)出量以及文件修改的內(nèi)容、類型、個(gè)數(shù)等展開(kāi)分析,從而調(diào)整開(kāi)發(fā)計(jì)劃,對(duì)軟件開(kāi)發(fā)過(guò)程進(jìn)行實(shí)時(shí)調(diào)控,實(shí)現(xiàn)軟件開(kāi)發(fā)過(guò)程量化管理。
1 基于變更分析的量化管理方法
1.1 方法概要
現(xiàn)代軟件的開(kāi)發(fā),大多基于版本控制系統(tǒng)。版本控制系統(tǒng)可以支持完備的版本管理功能,用于存儲(chǔ)、追蹤目錄和文件的修改歷史。本系統(tǒng)對(duì)使用了SVN版本管理系統(tǒng)(Subversion)的軟件項(xiàng)目進(jìn)行分析,首先需要確定軟件項(xiàng)目,即SVN倉(cāng)庫(kù),然后對(duì)軟件開(kāi)發(fā)過(guò)程中的變更數(shù)據(jù)進(jìn)行獲取、分類整理并輔以數(shù)據(jù)處理后,形成本系統(tǒng)的數(shù)據(jù)源,由此將有效確保后續(xù)數(shù)據(jù)量化管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。研究中,系統(tǒng)設(shè)計(jì)如圖1所示。
其中,數(shù)據(jù)提取是指從軟件版本倉(cāng)庫(kù)獲取版本變更數(shù)據(jù)并存儲(chǔ)到本地?cái)?shù)據(jù)庫(kù);數(shù)據(jù)處理是指對(duì)抓取到的數(shù)據(jù)進(jìn)行過(guò)濾優(yōu)化和分類;軟件開(kāi)發(fā)過(guò)程量化管理是指對(duì)變更數(shù)據(jù)進(jìn)行分析、統(tǒng)計(jì)、量化,并續(xù)接此后的數(shù)據(jù)可視化和開(kāi)發(fā)過(guò)程量化。
1.2 量化管理系統(tǒng)設(shè)計(jì)
本系統(tǒng)基于SVNKit研發(fā)設(shè)計(jì)。SVNKit是一個(gè)Java工具包,用于訪問(wèn)和操作SVN版本庫(kù)。SVNKit不僅是一個(gè)純Java的SVN類庫(kù),而且還適用于主流的絕大多數(shù)操作系統(tǒng),基于SVNKit開(kāi)發(fā)軟件,可以實(shí)現(xiàn)版本庫(kù)的管理和信息的獲取。
1.2.1 變更數(shù)據(jù)的獲取
基于SVNKit提供的API,使用Java語(yǔ)言開(kāi)發(fā)一套數(shù)據(jù)獲取和管理工具,對(duì)變更數(shù)據(jù)進(jìn)行獲取。獲取內(nèi)容包括:
(1)該軟件項(xiàng)目的所有已提交版本。包括版本號(hào)、提交者、提交日期、影響的文件名或目錄以及注釋信息;
(2)所有已提交的版本包含的信息。包括指定版本包含的文件、變更的文件名、變更時(shí)間、變更類型等;
(3)所有文件內(nèi)容。包括文件被增加時(shí)的初始內(nèi)容、變更后的內(nèi)容,以及文件變更時(shí)所對(duì)應(yīng)的版本信息等;
(4)所有文件變更內(nèi)容。包括文件變更前后對(duì)應(yīng)的版本信息、變更類型、變更內(nèi)容等;
(5)其它項(xiàng)目信息的獲取。包括開(kāi)發(fā)團(tuán)隊(duì)、項(xiàng)目相關(guān)信息等。
1.2.2 數(shù)據(jù)分析與處理
對(duì)獲取到的源數(shù)據(jù)進(jìn)行過(guò)濾優(yōu)化和分類。分類方法主要包括:
(1)按文件類型分類。主要區(qū)分軟件代碼和說(shuō)明文檔;
(2)按修改類型分類。主要區(qū)分文件的增、刪、改操作;
(3)按修改內(nèi)容分類。主要區(qū)分是否為修復(fù)bug、執(zhí)行代碼重構(gòu)、添加測(cè)試、添加注釋等。
由于獲取到的原始數(shù)據(jù)包含大量冗余數(shù)據(jù),并且會(huì)產(chǎn)生由于文件名相同、文件內(nèi)容無(wú)法識(shí)別、文件編碼方式不同等導(dǎo)致的數(shù)據(jù)異常,所以需要對(duì)數(shù)據(jù)進(jìn)行優(yōu)化處理。經(jīng)數(shù)據(jù)優(yōu)化處理后,形成本系統(tǒng)的數(shù)據(jù)源,用于后期的數(shù)據(jù)分析和展示,統(tǒng)計(jì)變更內(nèi)容研究。
1.2.3 量化管理
以得到的數(shù)據(jù)為基礎(chǔ),應(yīng)用B/S架構(gòu)、MVC設(shè)計(jì)模式、MySQL數(shù)據(jù)庫(kù),使用SpringMVC、MyBatis等Java EE后端技術(shù),Ajax、Echarts等前端技術(shù),設(shè)計(jì)實(shí)現(xiàn)量化管理系統(tǒng),對(duì)軟件開(kāi)發(fā)過(guò)程進(jìn)行量化管理。
2 系統(tǒng)實(shí)現(xiàn)-以Tomcat為例
2.1 選取版本庫(kù)
本文選取流行的Web應(yīng)用服務(wù)器軟件Tomcat的版本庫(kù)作為數(shù)據(jù)源。Tomcat是Apache軟件基金會(huì)(Apache Software Foundation)的Jakarta系統(tǒng)中的一個(gè)核心項(xiàng)目,由Apache、Sun 和其它一些公司及個(gè)人共同開(kāi)發(fā)而成。由于有了Sun公司的參與和支持,使得最新的Servlet 和JSP 規(guī)范總是能在Tomcat 中得到體現(xiàn),在現(xiàn)代軟件開(kāi)發(fā)中提供了業(yè)界范本的作用。
Tomcat版本庫(kù)創(chuàng)建時(shí)間為2007年11月10日,截止2017年12月20日,該項(xiàng)目共有26位開(kāi)發(fā)者,5 123個(gè)文件,約18 000個(gè)提交版本、56 000次文件變更記錄,具體可見(jiàn)表1。
2.2 獲取變更數(shù)據(jù)
2.2.1 獲取原始數(shù)據(jù)
基于SVNKit開(kāi)發(fā)版本庫(kù)數(shù)據(jù)獲取工具,對(duì)Tomcat版本庫(kù)獲取版本數(shù)據(jù),形成原始數(shù)據(jù)庫(kù)。該數(shù)據(jù)獲取工具提供的主要功能如下:
(1)showlogs:獲取版本庫(kù)所有提交版本記錄和文件變動(dòng)記錄,記錄到數(shù)據(jù)庫(kù)的actions表中;
(2)displayFile:獲取文件首次提交時(shí)的初始內(nèi)容,用于后續(xù)比較變更內(nèi)容,記錄到數(shù)據(jù)庫(kù)的contents表中;
(3)showDiff:獲取所有內(nèi)容發(fā)生變動(dòng)的文件列表,記錄到數(shù)據(jù)庫(kù)的diffs表中;
(4)getHunks:獲取所有文件變更內(nèi)容的具體變更片段,記錄到數(shù)據(jù)庫(kù)的hunks表中。
2.2.2 數(shù)據(jù)處理
獲取原始數(shù)據(jù)后,由于對(duì)變更分析的需要,需要對(duì)數(shù)據(jù)進(jìn)行進(jìn)一步加工處理。內(nèi)容闡釋如下:
(1)根據(jù)版本信息,提取版本對(duì)應(yīng)的提交者,存儲(chǔ)到user表;
(2)根據(jù)版本信息,提取所有版本的版本號(hào)相關(guān)信息,存儲(chǔ)到revisions表;
(3)根據(jù)文件首次提交的信息,提取項(xiàng)目中所有的文件信息,存儲(chǔ)到files表;
(4)按照文件類型、修改類型、變更類型對(duì)數(shù)據(jù)進(jìn)行標(biāo)記;
(5)對(duì)文件的MIME類型、編碼、字符集等進(jìn)行識(shí)別與優(yōu)化處理;
(6)異常數(shù)據(jù)處理。如不同目錄下的同名文件,系統(tǒng)會(huì)默認(rèn)為是同一個(gè)文件,這會(huì)導(dǎo)致后續(xù)對(duì)變更代碼的分析混亂。處理方法是:為每個(gè)文件添加時(shí)間戳進(jìn)行區(qū)分。
2.2.3 形成數(shù)據(jù)源
經(jīng)原始數(shù)據(jù)獲取和數(shù)據(jù)處理后,形成本次量化管理系統(tǒng)的數(shù)據(jù)源,數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)可見(jiàn)表2。
2.3 變更數(shù)據(jù)量化管理
以獲取到的變更數(shù)據(jù)為數(shù)據(jù)源,使用JavaEE相關(guān)技術(shù),開(kāi)發(fā)變更數(shù)據(jù)量化管理系統(tǒng)。
2.3.1 數(shù)據(jù)更新
數(shù)據(jù)更新模塊提供版本庫(kù)信息展示與更新功能。對(duì)此可展開(kāi)研究分述如下:
(1)設(shè)置版本庫(kù)。設(shè)置要進(jìn)行量化管理的SVN版本庫(kù)地址,支持http、https、svn、file協(xié)議;
(2)數(shù)據(jù)更新。設(shè)置對(duì)版本庫(kù)的數(shù)據(jù)更新方式,可選手動(dòng)更新或自動(dòng)定時(shí)更新。用于實(shí)時(shí)跟蹤開(kāi)發(fā)進(jìn)度;
(3)信息展示。默認(rèn)展示版本庫(kù)中最新信息,包括版本庫(kù)地址、最新版本號(hào)、最新提交日期和提交者。進(jìn)行數(shù)據(jù)更新時(shí),實(shí)時(shí)顯示系統(tǒng)狀態(tài)。
2.3.2 代碼統(tǒng)計(jì)
設(shè)置擬研究的開(kāi)發(fā)者和時(shí)間段進(jìn)行統(tǒng)計(jì)。首先指定開(kāi)發(fā)者,可選全部或單一開(kāi)發(fā)者;然后指定時(shí)間,可選某天、某月、某年或任意時(shí)間段。研究可得,該項(xiàng)技術(shù)主題的分析闡釋可見(jiàn)如下。
(1)代碼修改量。對(duì)指定的開(kāi)發(fā)者在指定時(shí)間段內(nèi),針對(duì)代碼的增加和刪除行數(shù)進(jìn)行統(tǒng)計(jì),方便用于一些指標(biāo),諸如活躍度、開(kāi)發(fā)效率的分析。為此,可給出某成員的統(tǒng)計(jì)運(yùn)行效果如圖2所示;
(2)影響文件類型。對(duì)指定的開(kāi)發(fā)者在指定時(shí)間段內(nèi),提交的所有版本影響的文件類型進(jìn)行統(tǒng)計(jì),區(qū)分代碼文件、配置文件或非文本文件;
(3)修改文件個(gè)數(shù)。對(duì)指定的開(kāi)發(fā)者在指定時(shí)間段內(nèi),提交的所有版本影響到的文件進(jìn)行統(tǒng)計(jì);
(4)變更類型分析。對(duì)指定的開(kāi)發(fā)者在指定時(shí)間段內(nèi),發(fā)生的代碼修改進(jìn)行歸類分析??煞譃樾薷姆椒w、增加方法、代碼重構(gòu)、修復(fù)bug等。
2.3.3 量化指標(biāo)
(1)團(tuán)隊(duì)
① 團(tuán)隊(duì)效率。該團(tuán)隊(duì)在指定時(shí)間段內(nèi),對(duì)代碼的增、刪行數(shù)的平均值;
② 團(tuán)隊(duì)活躍度。該團(tuán)隊(duì)在指定時(shí)間段內(nèi)的活躍情況;
③ 團(tuán)隊(duì)成員貢獻(xiàn)量。團(tuán)隊(duì)所有成員在指定時(shí)間段內(nèi)的工作量查看和比較,呈現(xiàn)效果如圖3所示。
(2)成員
① 開(kāi)發(fā)效率。該成員在指定的時(shí)間段內(nèi),對(duì)代碼的修改量,以及與團(tuán)隊(duì)平均水平的比較;
② 修改文件類型。該成員在指定的時(shí)間段內(nèi),所有對(duì)軟件項(xiàng)目的修改所影響到的文件類型;
③ 活躍度。顯示該成員在指定時(shí)間段內(nèi)的活躍時(shí)間與活躍度;
④ Bug修復(fù)量。指定時(shí)間段內(nèi)修復(fù)的Bug數(shù)量,以及修改指定Bug所耗時(shí)間;
⑤ 產(chǎn)出量。指定時(shí)間段內(nèi)的代碼產(chǎn)出量和功能產(chǎn)出量,可以查看月產(chǎn)出、季度產(chǎn)出等。
2.3.4 內(nèi)容查看
對(duì)指定文件的任意版本內(nèi)容進(jìn)行查看,并可以比較任意版本之間的變更內(nèi)容。研究重點(diǎn)可概述如下。
(1)文件內(nèi)容查看。指定文件名(文件路徑)、版本號(hào),展示文件的增加時(shí)間、修改時(shí)間、文件類型及文件內(nèi)容;
(2)變更內(nèi)容查看。指定文件名、變更前后的版本號(hào),展示該文件在這2個(gè)指定版本間的變更內(nèi)容。
3 結(jié)束語(yǔ)
本軟件開(kāi)發(fā)過(guò)程量化系統(tǒng),通過(guò)獲取軟件開(kāi)發(fā)過(guò)程中的變更數(shù)據(jù)并協(xié)同數(shù)據(jù)處理,實(shí)現(xiàn)了對(duì)軟件開(kāi)發(fā)過(guò)程的量化管理。后續(xù)根據(jù)量化結(jié)果,可以對(duì)工作量、缺陷數(shù)、熟練度、開(kāi)發(fā)能力等具體數(shù)據(jù)進(jìn)行度量,確定開(kāi)發(fā)者的開(kāi)發(fā)能力等級(jí),進(jìn)而獲得對(duì)人員、團(tuán)隊(duì)、公司的生產(chǎn)率的度量、項(xiàng)目進(jìn)度管理和進(jìn)度預(yù)警;并可以結(jié)合COCOMOⅡ模型,形成適用于該機(jī)構(gòu)的工作量估算模型和軟件成本估算模型。
參考文獻(xiàn)
[1] 侯成功,譚裴,葉敏. IFPUG功能點(diǎn)分析方法在電信行業(yè)軟件中的應(yīng)用[J]. 軟件導(dǎo)刊,2017,16(9):142-144,147.
[2] 張旭,劉浩馳. 基于CMMI的量化管理在項(xiàng)目中的應(yīng)用與研究[J]. 電腦與電信,2016(4):62-65.
[3] 羅娟,陸東暉,徐霞. 基于CMMI4的軟件項(xiàng)目量化質(zhì)量管理研究[J]. 軟件導(dǎo)刊,2016,15(6):8-10.
[4] 楊培培,趙海生,張金棟. Wideband_Delphi技術(shù)在軟件估算中的應(yīng)用[J]. 電子質(zhì)量,2017(10):39-42.
[5] BOEHM B W CLARK HOROWITZ et al. Software cost estimation with Cocomo II with Cdrom[M]. Upper Saddle River NJ USA: Prentice Hall PTR 2000.
[6] 魏來(lái),劉海濤,付祎. 基于偏最小二乘回歸的COCOMO模型校準(zhǔn)方法[J]. 統(tǒng)計(jì)與決策,2016(8):73-76.
[7] 李亞紅,郝克剛,葛瑋. 基于GQM模型的軟件項(xiàng)目進(jìn)度的度量過(guò)程[J]. 計(jì)算機(jī)應(yīng)用,2005,25(6):1448-1450.
[8] 戴炳榮,王凌,李超,等. 一種在GQM度量方法中的決策機(jī)制研究[J]. 計(jì)算機(jī)應(yīng)用與軟件,2017,34(5):19-23.
[9] 姜文,劉立康. 基于持續(xù)集成的軟件度量[J]. 計(jì)算機(jī)測(cè)量與控制,2017,25(5):136-139.