鄭喆穎 王歡 唐飛 程必偉 申力
(1.東方證券股份有限公司 上海市 200010 2.南京航天數(shù)智科技有限公司 江蘇省南京市 210012)
科學(xué)技術(shù)的不斷進(jìn)步和經(jīng)濟(jì)的不斷發(fā)展促使全球化市場競爭日趨激烈,組織敏捷化成為企業(yè)最新發(fā)展方向。
軟件維護(hù)的不透明,我們軟件代碼當(dāng)中存在很多質(zhì)量問題;項目完成質(zhì)量參差不齊;開發(fā)過程不透明,一個團(tuán)隊和開發(fā)人員實際開發(fā)的效能,程序員的工作難以評價;軟件資產(chǎn)沒有得到有效的記錄,很多代碼難以理解,無法準(zhǔn)確把握代碼意圖。如何度量一個研發(fā)組織的產(chǎn)品質(zhì)量,一個項目的研發(fā)效能,如何客觀評價研發(fā)人員的工作完成質(zhì)量,如何運(yùn)用考核指標(biāo)促成員工成長,達(dá)到考核的管理目標(biāo)。
真正實現(xiàn)數(shù)據(jù)驅(qū)動的研發(fā)效能提升,不是對效能指標(biāo)進(jìn)行簡單的統(tǒng)計,更需要對研發(fā)活動建模,進(jìn)而改進(jìn)研發(fā)活動過程。
如上分析,以某公司信息技術(shù)研發(fā)部門為例,組織敏捷化進(jìn)程可能使用的場景有:
(1)數(shù)字化實施:如何衡量各個二級部門、項目在研發(fā)數(shù)建設(shè)以及主航道工具的使用情況?
(2)橫向效能比較:如何跨二級部門、跨項目進(jìn)行橫比較?衡量研發(fā)效能產(chǎn)出、資源投入?
(3)人員效能評估:如何跨項目、跨角色、跨編程語言,衡量研發(fā)人員效能?以及對優(yōu)質(zhì)供應(yīng)商的評估?
(4)研發(fā)效能看板:如何實時度量當(dāng)前研發(fā)現(xiàn)狀,包括人力、需求、缺陷、代碼、用例數(shù)據(jù),通過數(shù)據(jù)指導(dǎo)改進(jìn)?
互聯(lián)網(wǎng)時代,軟件行業(yè)爆發(fā)式發(fā)展,用戶需求頻繁變更,企業(yè)組織成員協(xié)同更復(fù)雜,敏捷項目管理也越來越盛行,快速反應(yīng),鼓勵試錯和不停迭代,適應(yīng)變化的輕量級敏捷開發(fā)管理日益被接受。敏捷組織中,知識工作的不確定性更高、組織成員相互協(xié)同更復(fù)雜。組織的效能評估和度量也更有挑戰(zhàn)和難度。這是一項有意義的工作:首先,讓目標(biāo)更明確,對目標(biāo)有共同的認(rèn)識。其次,讓現(xiàn)狀更清晰,度量可以告訴我們現(xiàn)狀如何、效率如何、質(zhì)量如何、流程如何以及問題所在。第三,讓改進(jìn)更精準(zhǔn)。
評估度量系統(tǒng)中,指標(biāo)是主觀事件客觀呈現(xiàn)的效果。數(shù)據(jù)指標(biāo)是評估系統(tǒng)最直接的支撐,也是數(shù)字化的底層結(jié)構(gòu)??傆嫎I(yè)界經(jīng)驗,我們認(rèn)為進(jìn)行指標(biāo)設(shè)計時應(yīng)遵從以下幾個原則:
(1)全局性。在敏捷交付過程中,包含很多關(guān)鍵路徑,項目管理、資源管理、研發(fā)管理、測試管理,交付管理、項目后評價,全局指標(biāo)可以進(jìn)行過程管理也可以進(jìn)行結(jié)果回溯。
(2)細(xì)分性。以交付為例,項目經(jīng)理負(fù)責(zé)管控整個交付流程,開發(fā)經(jīng)理關(guān)注代碼提交質(zhì)量,而部門負(fù)責(zé)人關(guān)注人力投入效率。整個交付階段的全局性指標(biāo)應(yīng)該分解到需求、開發(fā)、測試、發(fā)布、運(yùn)維各個關(guān)鍵節(jié)點(diǎn)中。將主指標(biāo)切成若干塊,這樣可以避免平均數(shù)陷阱和團(tuán)隊的虛榮指標(biāo)。如空間維度,區(qū)分部門、項目和個人不同考察指標(biāo),再如,通過年,季度和月長期時間維度度量組織的健康度。
(3)制衡性。需要用多個指標(biāo)來互相制約以求得平衡。
(4)演進(jìn)性。績效指標(biāo)應(yīng)該隨著組織的發(fā)展不斷調(diào)整。
效能評估模型的設(shè)計,依據(jù)康威定律而來。
馬爾文·康威在1967年的論文中闡述了系統(tǒng)設(shè)計與組織架構(gòu)的內(nèi)在聯(lián)系,“設(shè)計系統(tǒng)的架構(gòu)受制于產(chǎn)生這些設(shè)計的組織的溝通結(jié)構(gòu)”。通俗的來講,產(chǎn)品必然是其(人員)組織溝通結(jié)構(gòu)的縮影。溝通問題會帶來系統(tǒng)設(shè)計問題,進(jìn)而影響整個研發(fā)組織的開發(fā)效率及最終產(chǎn)品結(jié)果?;诳低ɡ恚O(shè)計組織的效能評估基準(zhǔn)以推動組織的改進(jìn)。
研發(fā)效能的模型設(shè)計,基于輸入、輸出、質(zhì)量進(jìn)行抽取,選擇最最關(guān)鍵指標(biāo):產(chǎn)出及質(zhì)量作為核心指標(biāo),計算效能公式,如圖1所示。
圖1:研發(fā)效能模型設(shè)計
接著,模型設(shè)計從兩個維度出發(fā),空間維度和時間維度。空間包括完成部門、項目、個人,三個層級顆粒度的效能評估模型,以支撐系統(tǒng)研發(fā)總部的管理顆粒度;時間維度包括年、季度、月的維度,查看各個空間維度的數(shù)據(jù),較長時間段進(jìn)行跟蹤。
第三步,進(jìn)行模型設(shè)計。以項目評估為例,效能E=產(chǎn)出*產(chǎn)出權(quán)重R1+質(zhì)量*質(zhì)量權(quán)重R2。最終,針對項目維度細(xì)化后,其評估模型為,E =(I1*R1/B1+I2*R2/B2+I3*R3/B3+I4*R4/B4+I5*R5/B5 +(I6_MA3-I6)*R6/B6)/項目研發(fā)人力
同樣,按照角色,設(shè)計本系統(tǒng)的開發(fā)人員,測試人員及UED等人員的績效模型。
羅盤系研發(fā)效能評估系統(tǒng)按照DaaS 結(jié)構(gòu)設(shè)計,平滑支持演進(jìn)。其架構(gòu)設(shè)計如圖2所示。
圖2:羅盤系統(tǒng)架構(gòu)
2.2.1 配置管理模塊
建立部門、項目、人員的歸屬關(guān)系,建立項目與需求、代碼(分支)、用例、缺陷的對應(yīng)關(guān)系,完成整個關(guān)系的建模及填報系統(tǒng);
2.2.2 數(shù)據(jù)采集模塊
此模塊主要功能,建立JIRA、Git、ALM、人力投入等系統(tǒng),完成量化數(shù)據(jù)的采集。
2.2.3 數(shù)據(jù)關(guān)聯(lián)及計算模塊
此模塊根據(jù)對應(yīng)關(guān)系數(shù)據(jù)、工作產(chǎn)出數(shù)據(jù),根據(jù)模型進(jìn)行計算;
采集和計算模塊每天定時對組織代碼進(jìn)行掃描,并采集前一天最新提交代碼,進(jìn)行計算分析,繪制上升和下降趨勢圖形,對組織中某時間段內(nèi)代碼質(zhì)量進(jìn)行統(tǒng)計,對開發(fā)人員每月增量代碼質(zhì)量進(jìn)行標(biāo)準(zhǔn)量化考核。支持C/C++ (works with C++14),Java,C# (C Sharp),JavaScript (With ES6 and JSX)等多種語言。
2.2.4 效能服務(wù)及展示模塊
此模塊根據(jù)業(yè)務(wù)場景及研發(fā)管理訴求,建立研發(fā)系統(tǒng)總部量化指標(biāo),從時間維度支持不同月份、多個月份的數(shù)據(jù)展示,從空間維度支持部門、項目層層下鉆展示;
(1)可以通過本模塊,由至上而下視角,分析哪個部門效能數(shù)據(jù)做得好還是待改進(jìn),然后下鉆到部門下面所有項目進(jìn)行進(jìn)一步分析,最終再到項目下各個研發(fā)人員效能進(jìn)一步確認(rèn)原因;
(2)按照研發(fā)人員角色建模,根據(jù)各個階段的產(chǎn)出及質(zhì)量反饋綜合評分,給出排名;各角色按月度打分,客觀數(shù)據(jù)和主觀數(shù)據(jù)相結(jié)合,根據(jù)長期得分情況綜合確定該人員績效是否合格,可用于供應(yīng)商人員考核、簽約、加薪等場景;
(3)根據(jù)人員角色定義職能;通過最新人力填報查詢,人員與業(yè)務(wù)線關(guān)聯(lián)關(guān)系,分析統(tǒng)計部門人員編程語言使用分布及提交情況,形象展示部門的人力報表,學(xué)歷、歲數(shù)分段、職能、代碼,服務(wù)的業(yè)務(wù)線等數(shù)據(jù)。
代碼行數(shù)需要比較兩次提交的增量代碼,變動場景判定:增加行,刪除行,修改行,新增文件,刪除文件,修改文件名,移動文件目錄,代碼中包含空行,注釋等非有效代碼,計算時會根據(jù)不同代碼語言進(jìn)行過濾統(tǒng)計,考慮每種語言的特性,進(jìn)行代碼行計算后,會通過語言比例因子換算,計算出標(biāo)準(zhǔn)代碼行。
執(zhí)行過程
cloc gcc-5.2.0/gcc/c
圈復(fù)雜度可以用來判斷軟件的復(fù)雜度,它可以用來衡量一個模塊判定結(jié)構(gòu)的復(fù)雜程度,數(shù)量上表現(xiàn)為獨(dú)立現(xiàn)行路徑條數(shù),也可理解為覆蓋所有的可能情況最少使用的測試用例數(shù)。圈復(fù)雜度大說明程序代碼的判斷邏輯復(fù)雜,可能質(zhì)量低且難于測試和維護(hù)。程序的可能錯誤和高的圈復(fù)雜度有著很大關(guān)系。
3.2.1 評估項目圈復(fù)雜度
對于整個項目的代碼圈復(fù)雜度,我們建議使用函數(shù)平均圈復(fù)雜度,用于確定項目的整體復(fù)雜度。
示例:項目A 和項目B 均是Java 開發(fā)業(yè)務(wù)系統(tǒng),項目A 的平均圈復(fù)雜度為2.3,項目B 的平均圈復(fù)雜度為6.1,則從數(shù)值上我們認(rèn)為項目A 的代碼狀況相對較好一些。
3.2.2 評估個人圈復(fù)雜度
對于項目中的成員,我們就不能再將他的代碼質(zhì)量用函數(shù)圈復(fù)雜度來衡量了,因為其可以增加一個函數(shù)、修改一個函數(shù)、刪除一個函數(shù),因此我們更喜歡用每次提交的變動代碼的圈復(fù)雜度來衡量其代碼質(zhì)量。
示例:某項目成員A,通過重構(gòu),將某文件的累計圈復(fù)雜度從100 降低為80,變動代碼為500 行,則本次代碼提交圈復(fù)雜度為-20,我們認(rèn)為表現(xiàn)優(yōu)良。
3.2.3 評估方法
工具lizard。
命令執(zhí)行示例:
$ lizard -C 10000 -L 10000 -X /path/source
3.2.4 執(zhí)行過程
執(zhí)行圈復(fù)雜度掃描工具,結(jié)果保存為文件,文件名為“gerrit提交標(biāo)識.ccn.xml”;
掃描xml 文件,將信息寫入數(shù)據(jù)庫。
重復(fù)度是一種代碼復(fù)雜度的衡量標(biāo)準(zhǔn),用來表示程序的復(fù)雜度,它可以用來衡量一個模塊判定結(jié)構(gòu)的復(fù)雜程度,數(shù)量上表現(xiàn)為獨(dú)立現(xiàn)行路徑條數(shù),也可理解為覆蓋所有的可能情況最少使用的測試用例數(shù)。重復(fù)度大說明程序代碼的判斷邏輯復(fù)雜,可能質(zhì)量低且難于測試和維護(hù)。程序的可能錯誤和高的重復(fù)度有著很大關(guān)系。
3.3.1 評估項目重復(fù)度
對于整個項目的代碼重復(fù)度,我們建議使用函數(shù)平均重復(fù)度,用于確定項目的整體復(fù)雜度。
示例:項目A 和項目B 均是Java 開發(fā)業(yè)務(wù)系統(tǒng),項目A 的平均重復(fù)度為2.3,項目B 的平均重復(fù)度為6.1,則從數(shù)值上我們認(rèn)為項目A 的代碼狀況相對較好一些。
3.3.2 評估個人重復(fù)度
對于項目中的成員,我們就不能再將他的代碼質(zhì)量用函數(shù)重復(fù)度來衡量了,因為其可以增加一個函數(shù)、修改一個函數(shù)、刪除一個函數(shù),因此我們更喜歡用每次提交的變動代碼的重復(fù)度來衡量其代碼質(zhì)量。
示例:某項目成員A,通過重構(gòu),將某文件的累計重復(fù)度從100 降低為80,變動代碼為500 行,則本次代碼提交重復(fù)度為-20,我們認(rèn)為表現(xiàn)優(yōu)良。
3.3.3 評估方法
目前業(yè)界普遍使用的重復(fù)度評估工具是CPD。
命令執(zhí)行示例:
$ ./run.sh cpd --minimum-tokens 100 --files /path/to/c/source
--language cpp --skip-duplicate-files --skip-lexical-errors --format xml
3.3.4 執(zhí)行過程
針對每次提交,根據(jù)代碼掃描結(jié)果,確定新增代碼類型;
根據(jù)新增代碼類型,分別執(zhí)行重復(fù)度掃描工具,結(jié)果保存為文件,文件名為“gerrit 提交標(biāo)識.language.xml”;
掃描xml 文件,根據(jù)以下公式,將信息寫入數(shù)據(jù)庫;
重復(fù)代碼次數(shù) = (duplication.lines>=10) && (COUNT(duplication/file) - 1)
研發(fā)效能作為數(shù)字化企業(yè)的核心競爭力日益凸顯,真正實現(xiàn)數(shù)據(jù)驅(qū)動的研發(fā)效能提升,具有理論和實踐的雙重意義。發(fā)展和完善軟件系統(tǒng)評價技術(shù)具有廣闊前景。
本文所設(shè)計的羅盤效能評估系統(tǒng)在某公司研發(fā)部門上線后,運(yùn)行良好。開發(fā)一部在用例、代碼、需求、缺陷等維度都表現(xiàn)優(yōu)秀且均衡;開發(fā)五部目前用例數(shù)據(jù)沒有體現(xiàn),其余部分都表現(xiàn)良好;開發(fā)六部和開發(fā)七部各項指標(biāo)很均衡,長期視角看,其余部門數(shù)據(jù)應(yīng)向六部和七部靠攏。
本文所設(shè)計的羅盤效能評估系統(tǒng),以科學(xué)的度量模型,再運(yùn)用高效率的呈現(xiàn)手段,從時間維度支持不同月份、多個月份的數(shù)據(jù)展示,從空間維度支持部門、項目展示。數(shù)據(jù)充實,跨項目、跨角色、跨編程語言,實現(xiàn)衡量不同角色的效能。以研發(fā)數(shù)據(jù)為基準(zhǔn),分析各研發(fā)部門的目標(biāo)差距,以準(zhǔn)確的研發(fā)度量數(shù)據(jù),促進(jìn)開發(fā)過程改進(jìn),優(yōu)化產(chǎn)品質(zhì)量管理。實施以來,羅盤系統(tǒng)為軟件組織提供持續(xù)改進(jìn)方案方面取得了亮眼的成績。