孫 晴 ,梁冠宇 ,武延軍 ,武 斌 ,田春岐 ,王 偉
(1.中科南京軟件技術(shù)研究院,南京 210000;2.同濟(jì)大學(xué) 電子與信息工程學(xué)院,上海 201804;3.中國(guó)科學(xué)院軟件研究所,北京 100190;4.華東師范大學(xué) 數(shù)據(jù)科學(xué)與工程學(xué)院,上海 200062)
軟件系統(tǒng)往往由自主研發(fā)、開源獲取、外包開發(fā)、商業(yè)購買等多種來源的部件組合而成,為了滿足快速開發(fā)的需求,軟件供應(yīng)鏈中第三方來源的 (如開源、外包、商業(yè)等) 成分軟件的占比會(huì)增大,從而引入更多“不可控”成分,提高了軟件安全評(píng)估的難度.大型軟件的供應(yīng)鏈環(huán)節(jié)非常復(fù)雜、流程和鏈條很長(zhǎng),暴露給攻擊者的攻擊面越來越大,攻擊者利用供應(yīng)鏈環(huán)節(jié)的薄弱點(diǎn)作為攻擊窗口,供應(yīng)鏈的各個(gè)環(huán)節(jié)都有可能成為攻擊者的攻擊入口.近幾年來,供應(yīng)鏈相關(guān)安全事件更是頻繁發(fā)生,造成了不可估量的影響.綜上所述,對(duì)軟件供應(yīng)鏈進(jìn)行全鏈路的安全監(jiān)控防護(hù),針對(duì)薄弱環(huán)節(jié)進(jìn)行安全預(yù)防是保障軟件質(zhì)量的必要手段[1].軟件維護(hù)作為軟件生命周期中最耗費(fèi)時(shí)間和成本的階段,評(píng)估軟件可維護(hù)性能夠發(fā)現(xiàn)目前系統(tǒng)中存在的問題以進(jìn)行更改或重構(gòu),從而提高軟件系統(tǒng)的可維護(hù)性,降低系統(tǒng)維護(hù)成本.
與傳統(tǒng)軟件相比,開源軟件供應(yīng)鏈具有生產(chǎn)線上化、供應(yīng)全球化、倉儲(chǔ)集中化和用戶多樣化等特點(diǎn).目前針對(duì)開源軟件供應(yīng)鏈的可維護(hù)性研究往往缺少有效的理論驗(yàn)證,其合理性及有效性有必要進(jìn)行更深入的分析和討論.
基于此,本文首先,介紹了開源軟件供應(yīng)鏈維護(hù)性風(fēng)險(xiǎn)的研究現(xiàn)狀,并指出當(dāng)前工作的不足;其次,根據(jù)開源軟件供應(yīng)鏈的特點(diǎn),提出了多維度的分析視角;最后,給出了一個(gè)開源供應(yīng)鏈軟件維護(hù)性風(fēng)險(xiǎn)度量方法和評(píng)估方法,并通過實(shí)驗(yàn)驗(yàn)證了模型的有效性.
傳統(tǒng)供應(yīng)鏈可以理解為將原材料加工成中間組件,然后將中間組件形成最終產(chǎn)品并傳送到消費(fèi)者手中的過程.軟件供應(yīng)鏈的概念由傳統(tǒng)供應(yīng)鏈擴(kuò)展而來,在軟件供應(yīng)鏈中,原始組件是原材料,集成組件是中間組件,軟件產(chǎn)品是傳送消費(fèi)者手中的商品.軟件的開發(fā)過程包括設(shè)計(jì)、編碼、發(fā)布和運(yùn)營(yíng)4 個(gè)階段,是一套持續(xù)交付的流水線.軟件供應(yīng)鏈和傳統(tǒng)供應(yīng)鏈的共性在于攻擊者可以攻擊供應(yīng)鏈中的薄弱環(huán)節(jié),污染上游組件,從而影響下游產(chǎn)品.由于開源軟件源代碼開放、通過互聯(lián)網(wǎng)來傳輸?shù)忍匦?導(dǎo)致供應(yīng)鏈攻擊可能發(fā)生在軟件生命周期中的任何階段,攻擊面也更廣.
開源軟件的可維護(hù)性風(fēng)險(xiǎn)是指軟件及其開源軟件供應(yīng)鏈因無法持久滿足用戶需求而產(chǎn)生的風(fēng)險(xiǎn).開源軟件維護(hù)性風(fēng)險(xiǎn)目前的研究主要依賴于統(tǒng)計(jì)軟件開發(fā)者上次提交活動(dòng)的時(shí)間,并以此將軟件分為未維護(hù)或者類似的狀態(tài).比如,Khondhu 等[2]將一年作為評(píng)判標(biāo)準(zhǔn)對(duì)SourceForge 上的軟件進(jìn)行分類.然而使用特定的閾值并不是一個(gè)較好的方法.首先,在Khondhu 等[2]的研究方法中,這個(gè)決定是主觀設(shè)置的,并沒有經(jīng)過實(shí)驗(yàn)驗(yàn)證.其次,對(duì)未維護(hù)軟件的定義并不是要求在給定時(shí)期內(nèi)完全沒有提交,即使在某個(gè)時(shí)間間隔內(nèi)發(fā)生很少的提交,軟件也被認(rèn)為是未維護(hù)的.換句話說,未維護(hù)的軟件不一定需要被終止、棄用或存檔.最后,開源軟件的可維護(hù)性評(píng)分并不應(yīng)該只是維護(hù)和非維護(hù)這種二元取值,而應(yīng)該給出一個(gè)定量的分析.Coelho 等[3]提出了一個(gè)機(jī)器學(xué)習(xí)模型來識(shí)別無人維護(hù)的 GitHub 項(xiàng)目,使用 GitHub 提供的標(biāo)準(zhǔn)指標(biāo)作為特征,比如,提交、克隆、建立問題和提出請(qǐng)求的數(shù)量.但該方法的準(zhǔn)確率完全依賴于訓(xùn)練集的情況.本文旨在給出一個(gè)簡(jiǎn)單有效的指標(biāo)來提醒用戶依賴特定軟件的風(fēng)險(xiǎn),并較為全面地考慮開源軟件生命周期中的多個(gè)特征.
隨著軟件質(zhì)量研究的發(fā)展,不同學(xué)者已經(jīng)提出了不同的軟件質(zhì)量模型,用不同的質(zhì)量指標(biāo)來量化軟件的可維護(hù)性.以軟件質(zhì)量模型ISO/IEC 25010:2011 為例,傳統(tǒng)軟件可維護(hù)性評(píng)價(jià)指標(biāo)主要從易分析性、易修改性、模塊性和易測(cè)試性等軟件屬性出發(fā).
原有的軟件質(zhì)量評(píng)估模型都比較早出現(xiàn),而當(dāng)前開源軟件的發(fā)展隨著相關(guān)平臺(tái)級(jí)技術(shù)的迅猛發(fā)展,導(dǎo)致這些模型的評(píng)估體系、評(píng)分體系和權(quán)重設(shè)計(jì)都無法高效達(dá)到評(píng)估要求[4].本文所提出的評(píng)估體系主要針對(duì)企業(yè)場(chǎng)景而非研究用途,該評(píng)估體系能夠高效、精準(zhǔn)、低成本對(duì)開源軟件供應(yīng)鏈進(jìn)行評(píng)估.目前對(duì)于易分析性、易修改性、穩(wěn)定性等指標(biāo)的評(píng)估方法,大多停留在學(xué)術(shù)研究層面,無法適應(yīng)工程化和商業(yè)化對(duì)于評(píng)估本身的高效、低成本和實(shí)效性的要求.本框架結(jié)合開源軟件供應(yīng)鏈規(guī)模化、社交化的發(fā)展特點(diǎn),主要從以下幾個(gè)指標(biāo)進(jìn)行探討.
(1) 團(tuán)隊(duì)健康
個(gè)人的精力和能力是有限的,大型軟件的開發(fā)和維護(hù)需要不同角色的人參與,一定數(shù)量的差異化的開發(fā)人員保證了一個(gè)開源軟件可以得到長(zhǎng)足的發(fā)展.較大的團(tuán)隊(duì)規(guī)模也具有更高的抗風(fēng)險(xiǎn)能力,即使部分核心貢獻(xiàn)者離去,也會(huì)有其他貢獻(xiàn)者繼續(xù)維護(hù)軟件和做出貢獻(xiàn),不會(huì)導(dǎo)致軟件完全失去維護(hù).
(2) 軟件活躍度
活躍度是指在某一段時(shí)間內(nèi)該軟件進(jìn)行開發(fā)、維護(hù)、討論等行為的活躍程度.活躍度高不意味著軟件是成熟的,可能只是因?yàn)閯倖?dòng);而一個(gè)看似偃旗息鼓的軟件不一定是一個(gè)爛尾樓,也可能是已經(jīng)趨于穩(wěn)定.在技術(shù)革新層出不窮的今天,一個(gè)再完美的軟件如果止步不前,它的生命力終究就是有限的.其中活躍度又可以從以下3 個(gè)方面著手分析.
社區(qū)活躍度.社區(qū)活躍度反應(yīng)了用戶及開發(fā)者對(duì)軟件的關(guān)注度,用戶的持續(xù)關(guān)注和對(duì)軟件做出貢獻(xiàn)關(guān)系著軟件的生存和發(fā)展.積極活躍的用戶基礎(chǔ)將有效促進(jìn)軟件的持續(xù)健康發(fā)展,提高軟件的競(jìng)爭(zhēng)力;社區(qū)活躍度下降意味著粘性用戶的流失,從而導(dǎo)致軟件失去生命力.社區(qū)活躍度從側(cè)面上也反映了軟件的質(zhì)量水平,有影響力且運(yùn)營(yíng)良好的軟件才能吸引更多用戶和貢獻(xiàn)者.
依賴平均更新時(shí)間.顯然,使用老舊版本的開源軟件會(huì)增大開源軟件運(yùn)維風(fēng)險(xiǎn).依賴平均更新時(shí)間越低,一個(gè)軟件的維護(hù)性就越好.
發(fā)布頻率.在軟件某一個(gè)版本規(guī)劃中,要預(yù)先確定該版本所需包含的特性集合,當(dāng)該集合內(nèi)的所有特性全部開發(fā)完成,并且達(dá)到相應(yīng)的發(fā)布質(zhì)量標(biāo)準(zhǔn)后,才能發(fā)布該版本.這種軟件開發(fā)模式更符合安全生產(chǎn)習(xí)慣,即不能夠把未完成的功能添加到即將發(fā)布的版本中,以免增大缺陷風(fēng)險(xiǎn).每個(gè)新版本的發(fā)布都是一個(gè)里程碑,預(yù)示著開源軟件又向前邁進(jìn)了一大步,因此,軟件版本的發(fā)布頻率也能體現(xiàn)軟件的活躍程度.
(3) 依賴影響力
依賴影響力是指在一個(gè)開源軟件供應(yīng)鏈中,有多少軟件直接或者間接依賴當(dāng)前軟件.依賴影響力對(duì)維護(hù)性風(fēng)險(xiǎn)的影響體現(xiàn)在兩方面.一方面,一個(gè)軟件的依賴影響力越大,其出現(xiàn)各種風(fēng)險(xiǎn)和漏洞時(shí)對(duì)整個(gè)供應(yīng)鏈造成的影響就越大.開源軟件供應(yīng)鏈的上游軟件具有蝴蝶效應(yīng),由于這個(gè)軟件被許多軟件直接或者間接依賴,一旦這個(gè)軟件出現(xiàn)問題,將會(huì)給整個(gè)供應(yīng)鏈造成滾雪球式的危害.相反,如果一個(gè)未被其他軟件依賴的下游軟件出現(xiàn)問題,就只會(huì)影響到使用這個(gè)軟件的少部分用戶.另一方面,一個(gè)軟件被其他軟件依賴至少意味著這個(gè)軟件能夠被這部分用戶良好運(yùn)行和使用,經(jīng)受住了他們的考驗(yàn),滿足了他們的需求,在被依賴和使用的過程中可以獲得更多的反饋從而推動(dòng)軟件持續(xù)改進(jìn).因此,一個(gè)軟件的依賴影響力越大,它出現(xiàn)可維護(hù)性風(fēng)險(xiǎn)的概率越小.
(4) 測(cè)試完整度
測(cè)試不僅能保證代碼的基本功能是正確的,也表明開發(fā)人員認(rèn)真負(fù)責(zé)的開發(fā)態(tài)度.如果測(cè)試很少、沒有測(cè)試或者測(cè)試失敗,可能就會(huì)導(dǎo)致財(cái)產(chǎn)損失、人員傷亡等后果.一個(gè)漏洞越長(zhǎng)時(shí)間不被發(fā)現(xiàn),它所帶來的隱患也許會(huì)越大.
(5) 外部依賴度
與依賴影響力相反,外部依賴度表征的是一個(gè)軟件對(duì)外部模塊依賴的程度.通過復(fù)用代碼,依賴項(xiàng)中的所有漏洞和缺陷通過依賴關(guān)系轉(zhuǎn)嫁給軟件自身,因?yàn)?軟件完全依賴于這些依賴項(xiàng).一個(gè)沒有任何依賴項(xiàng)的軟件外部依賴度為0,這樣的軟件比有外部依賴項(xiàng)的軟件更好維護(hù),因?yàn)?維護(hù)者只需要關(guān)注程序自身邏輯的實(shí)現(xiàn),而不需要考慮依賴項(xiàng)可能帶來的外部風(fēng)險(xiǎn).一般來說,一個(gè)軟件的依賴項(xiàng)越多,該軟件的風(fēng)險(xiǎn)越大,對(duì)依賴項(xiàng)進(jìn)行維護(hù)的成本也越高.
(6) 可理解性
易理解性描述了通過相關(guān)文檔來了解系統(tǒng)功能及其運(yùn)行的難易程度.文檔是軟件開發(fā)使用和維護(hù)過程中的必備資料,它能提高軟件開發(fā)的效率,保證軟件的質(zhì)量,在軟件的使用過程中有指導(dǎo)、幫助、解惑的作用,對(duì)文檔的分析一般從針對(duì)性、精確性、完整性、清晰性等方面出發(fā).由于這些屬性難以量化且沒有一個(gè)統(tǒng)一的打分標(biāo)準(zhǔn),本文僅從兩方面來評(píng)價(jià): ①軟件是否有文檔;②該文檔是否清晰.
(7) 問題處理能力
許多軟件通過漏洞追蹤中心收集用戶的反饋,GitHub 通過問題來實(shí)現(xiàn)同樣的功能.問題被用來追蹤各種想法、增強(qiáng)功能、任務(wù)和軟件漏洞等.如果問題沒有被適當(dāng)處理,軟件項(xiàng)目中就會(huì)同時(shí)包含大量的漏洞問題或模糊不明的產(chǎn)品需求.軟件維護(hù)者會(huì)被大量工作所困擾,新的貢獻(xiàn)者也不清楚軟件當(dāng)前的工作重點(diǎn)是什么.所以對(duì)問題的處理能力也對(duì)軟件的發(fā)展和維護(hù)起著至關(guān)重要的作用.
(8) 軟件生態(tài)
軟件生態(tài)是一個(gè)復(fù)雜的社會(huì)-技術(shù)系統(tǒng),軟件生態(tài)的環(huán)境可以是軟件公司或研究組織,也可以是一個(gè)虛擬的開源或開放開發(fā)社區(qū).開源軟件基金通常會(huì)以多種方式支持開源軟件,比如,推廣宣傳開源軟件,提供開源指導(dǎo),為軟件的發(fā)展和其他活動(dòng)提供補(bǔ)助等.商業(yè)支持同樣保證了軟件有持續(xù)可靠的資金流來進(jìn)行各種活動(dòng),這些支持或贊助都有助于軟件的持續(xù)性發(fā)展.
(9) 發(fā)布形式
大部分的開源許可證都有免責(zé)條款,這意味著這些軟件一旦出現(xiàn)問題,沒有人提供保障.雖然開源社區(qū)可能愿意向用戶提供幫助,但是這種幫助只是出于自愿而非義務(wù).解決這一問題的有效方法是購買軟件支持服務(wù),也稱為“訂閱”.用戶在訂閱之后通常還能得到增強(qiáng)的功能,比如: Linux 操作系統(tǒng)就有Redhat、Novell 等公司提供各自的發(fā)行版并出售訂閱服務(wù);OpenLogic 提供了與開源軟件相關(guān)的全方位的服務(wù),幾乎涵蓋了使用開源軟件的整個(gè)生命周期;Bluck Duck、Palamida 和ProteCode 等公司則專注于幫助用戶防范開源的法律和安全等方面的風(fēng)險(xiǎn).
軟件的可維護(hù)性度量是指軟件在可維護(hù)評(píng)估中某一具體考察對(duì)象的實(shí)際情況.對(duì)屬性的評(píng)估將反映出軟件在這一評(píng)估點(diǎn)上表現(xiàn)的好壞,對(duì)所有屬性的綜合考慮將會(huì)得出該軟件可維護(hù)性的評(píng)價(jià).
實(shí)行可維護(hù)性屬性的分級(jí)定義、分級(jí)計(jì)算,每一級(jí)有自己的權(quán)重體系.軟件維護(hù)性特征的第一級(jí)軟件質(zhì)量要素對(duì)應(yīng)可維護(hù)評(píng)估屬性類,第二級(jí)軟件質(zhì)量要素對(duì)應(yīng)具體的可維護(hù)評(píng)估屬性.屬性和屬性類都有自己的權(quán)重定義,屬性的權(quán)重定義更加細(xì)致,這樣可以充分反應(yīng)屬性的差別.屬性的權(quán)重取值為0 (不考慮),1 (不重要),2 (一般),3 (重要),4 (非常重要).屬性類的權(quán)重取值為1 (不重要),2 (較為重要),4 (重要).屬性和屬性類的權(quán)重定義如表1 所示.
表1 模型屬性和屬性類的權(quán)重定義Tab.1 Weight definitions for model attributes and attribute classes
將每個(gè)屬性類評(píng)分和其相關(guān)的權(quán)重代入公式,計(jì)算結(jié)果取平均值.屬性類評(píng)分值的計(jì)算公式為
上式中:G表示當(dāng)前屬性類評(píng)分值,Mi為屬性類中第i個(gè)屬性的評(píng)分值,wi為該屬性在這一屬性類中的權(quán)重,n表示這一屬性類中屬性的個(gè)數(shù).
由于不同屬性的取值范圍差別很大,比如,測(cè)試覆蓋率的取值范圍為 [0,1],而活躍度的取值范圍為 [0,107] .在根據(jù)屬性及其權(quán)重計(jì)算屬性類的得分結(jié)果時(shí),不使用屬性的真實(shí)計(jì)算結(jié)果,而使用絕對(duì)值限制為[0,5]的屬性評(píng)分值.根據(jù)屬性的真實(shí)計(jì)算結(jié)果得到屬性評(píng)分值的方法見3.2 節(jié).
軟件的可維護(hù)性評(píng)分由前面計(jì)算的屬性類評(píng)分值乘以相應(yīng)權(quán)重相加得出,計(jì)算公式為
上式中:M表示軟件的可維護(hù)性評(píng)分,Gj表示第j個(gè)評(píng)估屬性類的計(jì)算得分,Wj表示第j個(gè)質(zhì)量屬性類在整個(gè)評(píng)估體系中所占權(quán)重.
可維護(hù)性評(píng)分總分為100 分,可以根據(jù)可維護(hù)性評(píng)分將可維護(hù)性風(fēng)險(xiǎn)劃分為3 個(gè)等級(jí): 高風(fēng)險(xiǎn)(得分為 [0,33)),中風(fēng)險(xiǎn) (得分為 [33,66)),低風(fēng)險(xiǎn) (得分為 [66,100]).
(1) 團(tuán)隊(duì)健康
團(tuán)隊(duì)健康這一項(xiàng)指標(biāo)的計(jì)算參考了Gitee 網(wǎng)站中Gitee 指數(shù)的定義方法.成員數(shù)量定義為所有貢獻(xiàn)超過1 次的用戶總數(shù);關(guān)鍵成員定義為所有貢獻(xiàn)超過3 次的用戶總數(shù).
(2) 軟件活躍度
社區(qū)活躍度的計(jì)算方法基于X-lab 開放實(shí)驗(yàn)室所提出的軟件活躍度計(jì)算方法,該方法較為全面地考慮了在開發(fā)過程中所產(chǎn)生的多種行為數(shù)據(jù),并且計(jì)算方法簡(jiǎn)單,保證了在實(shí)際使用中具有較高的計(jì)算效率[5].
依賴平均更新時(shí)間等于開發(fā)者將軟件實(shí)際使用的依賴項(xiàng)版本更新到依賴項(xiàng)當(dāng)前最新版本的平均時(shí)間.
發(fā)布頻率基于 GitHub 或 npm 子生態(tài)發(fā)布事件進(jìn)行統(tǒng)計(jì),在數(shù)值上等于一個(gè)軟件在一年內(nèi)發(fā)布事件的次數(shù).
(3) 依賴影響力
軟件之間的依賴關(guān)系可以看作是一個(gè)有向圖,PageRank 算法是圖的鏈接分析的典型算法,在子生態(tài)的依賴關(guān)系上執(zhí)行PageRank 算法即可求得軟件的依賴影響力.
(4) 測(cè)試完整度
如果軟件有測(cè)試用例,包含測(cè)試屬性實(shí)際計(jì)算結(jié)果就為1;如果軟件沒有測(cè)試用例,包含測(cè)試屬性實(shí)際計(jì)算結(jié)果就為0.測(cè)試覆蓋率評(píng)分為從GitHub 上所采集到的該軟件的測(cè)試覆蓋率數(shù)據(jù).
(5) 外部依賴度
外部依賴度表征了一個(gè)軟件擁有外部依賴項(xiàng)的多少,取決于一個(gè)軟件直接和間接依賴項(xiàng)的數(shù)量.
(6) 可理解性
如果軟件包含說明文檔,包含文檔屬性實(shí)際計(jì)算結(jié)果就為1;如果軟件不包含說明文檔,包含文檔屬性實(shí)際計(jì)算結(jié)果就為0.
(7) 問題處理能力
未關(guān)閉的問題占所有問題的比例等于一段時(shí)間內(nèi),建立但未關(guān)閉的問題數(shù)量占這段時(shí)間內(nèi)建立問題數(shù)量的百分比.
問題平均關(guān)閉時(shí)間屬于軟件的統(tǒng)計(jì)特征,代表一個(gè)軟件中所有問題從建立到關(guān)閉所花費(fèi)的平均時(shí)間.
問題首次響應(yīng)平均時(shí)間等于一個(gè)軟件中所有問題從被創(chuàng)建到第一次被回應(yīng)的時(shí)間的平均值.
(8) 軟件生態(tài)
如果該軟件有商業(yè)支持,存在商業(yè)支持屬性實(shí)際計(jì)算結(jié)果就為1;如果該軟件沒有商業(yè)支持,存在商業(yè)支持屬性實(shí)際計(jì)算結(jié)果就為0.如果該軟件有基金會(huì)支持,存在基金會(huì)支持屬性實(shí)際計(jì)算結(jié)果就為1;如果該軟件沒有基金會(huì)支持,存在基金會(huì)支持屬性實(shí)際計(jì)算結(jié)果就為0.
(9) 發(fā)布形式
如果該軟件存在商業(yè)版,存在商業(yè)版屬性實(shí)際計(jì)算結(jié)果就為1;如果該軟件不存在商業(yè)版,存在商業(yè)版屬性實(shí)際計(jì)算結(jié)果就為0.
在模型中計(jì)算各個(gè)指標(biāo)所需要的數(shù)據(jù),包括軟件間的依賴關(guān)系、開發(fā)者的人員組成等.總體而言分成兩類數(shù)據(jù): 第一類數(shù)據(jù)是來自軟件間的依賴關(guān)系;第二類數(shù)據(jù)是軟件在開發(fā)過程所產(chǎn)生的行為數(shù)據(jù).第一類數(shù)據(jù)可以從包管理器中獲取,第二類數(shù)據(jù)一般從代碼托管平臺(tái)采集.本文基于2021 年GitHub 全域公開數(shù)據(jù)集npm (Node.js 標(biāo)準(zhǔn)的軟件包管理器),composer (PHP 軟件包管理器) 和pip(Python 軟件包管理器) 3 個(gè)包管理器的數(shù)據(jù),所得數(shù)據(jù)集統(tǒng)計(jì)情況如表2 所示.
表2 數(shù)據(jù)集統(tǒng)計(jì)情況Tab.2 Data-set statistics
模型中的指標(biāo)可以分為兩類: 第一類是取值范圍有限的指標(biāo),比如,測(cè)試覆蓋率 (取值范圍為 [0,1]),是否有文檔 (取值為0 或1,0 表示有,1 表示沒有) 和是否有商業(yè)支持 (取值為0 或1,0 表示有,1 表示沒有) 等;第二類是取值范圍很大的指標(biāo),比如活躍度、成員個(gè)數(shù)、發(fā)布頻率等.對(duì)第一類指標(biāo)進(jìn)行評(píng)分只需要乘一個(gè)系數(shù)即可保證取值范圍是 [0,5],對(duì)于第二類指標(biāo)需要給出具體的評(píng)分方法,對(duì)屬性進(jìn)行評(píng)分的思路是: 將屬性計(jì)算結(jié)果根據(jù)其分布規(guī)律映射成線性,然后劃分等級(jí).
以軟件活躍度為例,通過對(duì)GitHub 全域軟件進(jìn)行活躍度分析,得到軟件的活躍度 (記為A) 與活躍軟件數(shù)量 (記為N) 雙對(duì)數(shù)分布情況如圖1 所示.可以看到軟件的活躍度與活躍軟件數(shù)量的雙對(duì)數(shù)圖符合冪律分布.
圖1 軟件活躍度與活躍軟件數(shù)量雙對(duì)數(shù)分布圖Fig.1 Software activities and the number of active software double logarithmic distribution
使用同樣的繪圖方法,得出全域軟件上的成員數(shù)量 (記為Cc) 和活躍軟件數(shù)量 (記為N) 雙對(duì)數(shù)分布情況如圖2 所示,軟件的成員數(shù)量與活躍軟件數(shù)量的雙對(duì)數(shù)圖也滿足典型冪律分布.
圖3 展示了關(guān)鍵成員數(shù)量 (記為Ccc) 和活躍軟件數(shù)量 (記為N) 的雙對(duì)數(shù)分布規(guī)律.圖3 縱坐標(biāo)取值范圍和圖2 相近,說明部分軟件項(xiàng)目中大多數(shù)用戶的貢獻(xiàn)次數(shù)都大于等于3.同時(shí),與圖2 相比,圖3 的橫坐標(biāo)取值范圍更小,說明有一部分軟件項(xiàng)目中不存在貢獻(xiàn)次數(shù)超過2 的用戶.這一現(xiàn)象也符合客觀規(guī)律.
圖2 成員數(shù)量與活躍軟件數(shù)量雙對(duì)數(shù)分布圖Fig.2 The number of members and active software double logarithmic distribution
圖3 關(guān)鍵成員數(shù)量與活躍軟件數(shù)量雙對(duì)數(shù)分布圖Fig.3 The number of core members and active software double logarithmic distribution
以軟件活躍度為例,為了能夠根據(jù)軟件活躍度的實(shí)際計(jì)算結(jié)果得到最終取值范圍是 [0,5] 的活躍度評(píng)分,可以將圖1 中的分布擬合成一條直線,擬合結(jié)果如圖4 所示,先將 lnN的范圍均勻地分成5 等份,得到每等份取值為2.由于軟件活躍度越高,評(píng)分越好.所以,當(dāng)評(píng)分為5 時(shí),lnA=15,對(duì)應(yīng)圖4 中直線橫坐標(biāo)為0 的情況;當(dāng)評(píng)分為4 時(shí),lnA的取值對(duì)應(yīng)圖4 中直線橫坐標(biāo)為2 時(shí)曲線所對(duì)應(yīng)的縱坐標(biāo),即12;當(dāng)評(píng)分為3 時(shí),lnA的取值對(duì)應(yīng)圖4 中直線橫坐標(biāo)為4 時(shí)曲線所對(duì)應(yīng)的縱坐標(biāo),即9;以此類推,當(dāng)評(píng)分為2 時(shí),lnA=6;當(dāng)評(píng)分為1 時(shí),lnA=3;當(dāng)評(píng)分為0 時(shí),l nA=0 .
圖4 軟件活躍度與活躍軟件數(shù)量雙對(duì)數(shù)分布擬合直線圖Fig.4 Dual logarithmic distribution of software activities and the number of active software fits a straight line chart
根據(jù)同樣的方法,可以得出成員數(shù)量、關(guān)鍵成員數(shù)量計(jì)算結(jié)果和評(píng)分對(duì)照結(jié)果,如表3 所示.
表3 軟件活躍度、成員數(shù)量、關(guān)鍵成員數(shù)量計(jì)算結(jié)果和評(píng)分對(duì)照表Tab.3 Comparison of software activity,contributor,and core contributor calculation results and score
為了提高計(jì)算結(jié)果的區(qū)分性,每個(gè)屬性的評(píng)分保留小數(shù)點(diǎn)后兩位.根據(jù)上述分析,軟件活躍度評(píng)分的計(jì)算公式為
上式中:Macc為根據(jù)軟件活躍度計(jì)算出來的軟件活躍度評(píng)分,A為軟件活躍度.
軟件的成員數(shù)量評(píng)分計(jì)算公式為
上式中:Mc為根據(jù)軟件成員數(shù)量計(jì)算出來的軟件成員數(shù)量評(píng)分,Cc為軟件成員數(shù)量.
軟件的關(guān)鍵成員數(shù)量評(píng)分計(jì)算公式為
上式中:Mcc為根據(jù)軟件關(guān)鍵成員數(shù)量計(jì)算出來的軟件關(guān)鍵成員數(shù)量評(píng)分,Ccc為這個(gè)軟件關(guān)鍵成員數(shù)量.
使用同樣的方法,可以得到其他指標(biāo)實(shí)際計(jì)算結(jié)果和最終評(píng)分之間的關(guān)系.
以npm 子生態(tài)軟件webpack (https://github.com/webpack/webpack) 和babel (https://github.com/babel/babel) 為例,webpack 直接或間接依賴了92 個(gè)外部軟件,babel 直接或間接依賴了80 個(gè)外部軟件.webpack 和babel 的依賴樹深度都為4,這種“寬深”的依賴樹結(jié)構(gòu)往往可能招致比較廣泛的供應(yīng)鏈攻擊[6].兩者各項(xiàng)評(píng)分如表4 所示.
表4 webpack 和babel 評(píng)分明細(xì)Tab.4 Webpack and babel scoring details
續(xù)表4
babel 軟件的可維護(hù)性評(píng)分遠(yuǎn)高于webpack 軟件,且babel 軟件屬于低風(fēng)險(xiǎn)軟件,webpack 為中風(fēng)險(xiǎn)軟件.但webpack 軟件的依賴影響力高于babel 軟件的依賴影響力,因此,一旦webpack 軟件出現(xiàn)維護(hù)性風(fēng)險(xiǎn)時(shí),對(duì)整個(gè)生態(tài)造成的影響大于babel 軟件.綜上所述,webpack 軟件更有可能為npm 子生態(tài)帶來可維護(hù)性風(fēng)險(xiǎn).
開源已經(jīng)成了軟件的主流開發(fā)模式,軟件供應(yīng)鏈的開源化影響了整個(gè)軟件生態(tài)的安全性.本文建立了一個(gè)開源軟件供應(yīng)鏈可維護(hù)性質(zhì)量模型,從多個(gè)維度對(duì)開源軟件的可維護(hù)性進(jìn)行了評(píng)估,并采集了2021 年的GitHub 行為數(shù)據(jù)和npm 生態(tài)數(shù)據(jù)進(jìn)行驗(yàn)證計(jì)算.當(dāng)前工作仍有需要進(jìn)一步研究的地方,包括: 雖然目前的可維護(hù)性度量指標(biāo)對(duì)開源軟件屬性進(jìn)行了較為全面的衡量,但是還存在一些需要被補(bǔ)充的屬性.比如,源碼層面的分析 (包括程序的易分析性、易修改性及穩(wěn)定性等),以達(dá)到對(duì)可維護(hù)性更加精準(zhǔn)評(píng)估.本文僅提出了一個(gè)探究開源軟件可維護(hù)性風(fēng)險(xiǎn)的框架,后續(xù)在收集到更多的數(shù)據(jù)后,會(huì)進(jìn)行更加全面的定量分析,進(jìn)一步證明模型的有效性.本文著眼于開源軟件系統(tǒng)的各個(gè)部分,即對(duì)單個(gè)開源軟件進(jìn)行研究.將開源軟件供應(yīng)鏈作為一個(gè)整體進(jìn)行可維護(hù)性度量,從而評(píng)價(jià)整個(gè)供應(yīng)鏈的可維護(hù)性風(fēng)險(xiǎn),同樣是必要且有意義的,后續(xù)會(huì)進(jìn)一步收集相應(yīng)數(shù)據(jù)展開研究.