徐立鑫 吳化堯
(計算機軟件新技術國家重點實驗室(南京大學) 南京 210023)(141270043@smail.nju.edu.cn)
隨著信息技術的飛速發(fā)展,現(xiàn)代軟件的規(guī)模和復雜度正不斷提高,開發(fā)高質(zhì)量的軟件已成為一項困難的工作;而軟件需求的不斷變化、開發(fā)周期的持續(xù)縮短以及軟件產(chǎn)品的快速迭代更是對軟件的可重用性、可擴展性和可靠性提出了更高的要求和挑戰(zhàn).為了應對當前軟件開發(fā)面臨的困境,軟件工程領域的學者近幾十年來一直在不斷探索新的軟件開發(fā)方法,形成了面向?qū)ο筌浖こ蹋?]、面向服務軟件工程[2]、網(wǎng)構軟件工程[3]、可信軟件工程[4]和大數(shù)據(jù)軟件工程[5]等一批各具特色的軟件工程方法.基于群體智能的軟件工程旨在利用群體智能方法來高效且富有創(chuàng)造力地解決軟件開發(fā)各個階段中遇到的各類復雜問題,是近年來軟件工程領域研究的前沿和熱點.
群體智能方法來源于智能行為在群體中的匯聚現(xiàn)象,其強調(diào)了在一群個體間的相互合作或競爭模式下,整個群體能表現(xiàn)出遠超其中任何一個個體智能水平的智能能力[6].這樣一群個體既可以是沒有智能、或僅具有相對簡單智能的動物群體,也可以是人類群體本身.對應地,對群體智能的利用也就可分為3種不同的層次:機器群體智能、人類群體智能以及人機結合群體智能.
1) 機器群體智能
機器群體智能方法利用模擬生物群體行為的進化優(yōu)化算法[7]來進行復雜問題求解.基于搜索的軟件工程(search based software engineering, SBSE)是機器群體智能在軟件工程領域應用的一種代表性方法[8],其中軟件工程問題首先被形式化地轉(zhuǎn)化為優(yōu)化問題,隨后機器群體智能方法就能在適應值函數(shù)的指導下自動搜索平衡眾多因素關系的最優(yōu)解.
2) 人類群體智能
人類群體智能利用大規(guī)模人類群體的協(xié)同來進行復雜問題求解.眾包軟件工程(crowdsourced software engineering, CSE)是人類群體智能在軟件工程領域應用的一種代表性方法[9],其通常需要3種角色的協(xié)同參與,包括問題的提出者、潛在解決問題的大規(guī)模分布式用戶群體以及一個促進各方交互的公共平臺.
3) 人機結合群體智能
人機結合群體智能是機器群體智能和人類群體智能的結合.對于某些軟件工程問題來說,問題的某些方面可以使用計算機來自動優(yōu)化,而在另一些方面上則需要手工進行求解,通過人機結合的方式有助于提高人們處理上述軟件工程問題的有效性和自動化程度.
目前,在利用機器群體智能和人類群體智能來解決軟件工程問題上已有很多研究工作.例如Harman等人[10]和Mao等人[11]曾分別對SBSE和CSE的基本概念和研究現(xiàn)狀進行了全面細致的總結.然而,已有研究大多僅關注了單一層次的群體智能方法,忽視了不同層次間群體智能方法的內(nèi)在聯(lián)系,從而可能在一定程度上限制了基于群體智能的軟件工程方法的有效應用和發(fā)展?jié)摿?
基于此,本文首先提出了應用不同層次的群體智能方法進行問題求解的統(tǒng)一框架;在此基礎上,系統(tǒng)梳理和總結了各類群體智能方法在軟件工程生命周期各項活動(包含需求分析、設計、構造、測試和維護)中的應用.我們希望本文工作能為不同層次間群體智能方法的相互借鑒和轉(zhuǎn)化提供參考,從而進一步增強人們利用和優(yōu)化群體智能方法來解決復雜軟件工程問題的能力.
群體智能是在許多個體的合作和競爭中涌現(xiàn)的共享智慧,其在復雜問題求解上的優(yōu)勢主要在于群體對于個體智能的放大作用[12-15].人們對于群體智能的認識很大程度受到生物物種的啟示.Winston等人[16]和Schutter等人[17]曾分別研究了蜂群和蟻群的協(xié)作行為,他們發(fā)現(xiàn)一群只有基本本能的個體在組成群體之后,整體上可以表現(xiàn)出遠超其中任何一個個體的智能水平.這樣一種生物群體現(xiàn)象隨后啟發(fā)人們提出了不同的進化優(yōu)化算法(例如蟻群算法[18]、粒子群算法[19]和蜂群算法[20]),并將這些算法應用于解決難以通過傳統(tǒng)方法構造和求解的現(xiàn)實復雜問題.
低智能生物體的群體行為讓人們深刻認識到群體對智能的放大作用,大量學者因而開始考慮如何利用人群的智能解決某些難題.例如Engelbart在20世紀60年代就預言通過將人類的智力能力組織到更高層次的協(xié)同結構中可以放大人類的智力[21];而1714年英國政府公開征集能夠準確測量海上船只經(jīng)度的方法則是眾包方法的最早實踐[22].
然而,對大規(guī)模人類群體智能的挖掘和利用出現(xiàn)的很晚,這主要是由于物理時空對人類群體協(xié)同規(guī)模的限制,以使得人類個體之間的信息難于快速共享和傳播[23].互聯(lián)網(wǎng)的快速發(fā)展極大地克服了這個問題,為人類群體智能的大規(guī)模應用奠定了基礎,大量基于人類群體智能的應用也因此逐步出現(xiàn).例如免費協(xié)作、多語言的互聯(lián)網(wǎng)百科全書Wikipedia(1)https://en.wikipedia.org/wiki/Main_Page;利用互聯(lián)網(wǎng)大規(guī)模人類群體來輔助開發(fā)藥物的InnoCentive(2)https://www.innocentive.com;;利用機器計算和人類計算[24]來高效解決任務的Mechanical Turk(3)https://www.mturk.com;;利用游戲設計蛋白質(zhì)模型,為抗逆轉(zhuǎn)錄病毒藥物的設計提供新見解的游戲平臺[25];以及加強研究團體和社會中研究者的聯(lián)系,豐富藥物發(fā)現(xiàn)工作價值的眾包平臺[26]等都是人類群體智能應用的成功實踐.
雖然人類群體智能在表現(xiàn)形式上與多人協(xié)作等通用的問題求解方式相似,它們在組織方式上具有本質(zhì)不同:多人協(xié)作通常采用集中式層級結構,而群體智能則依賴分布式的獨立個體.在軟件開發(fā)活動中,人們已經(jīng)發(fā)現(xiàn)當軟件的規(guī)模和復雜度達到一定程度時,單純增加多人協(xié)作團隊的成員規(guī)模并不能提高軟件開發(fā)的效率[23].與之相比,人類群體智能代表了一群相對獨立、自組織的智能個體在相互交互時產(chǎn)生的一系列復雜行為,這些行為尤其能在群體的層次上表現(xiàn)出某種連貫、協(xié)調(diào)的活動,涌現(xiàn)的群體智能也會隨著群體規(guī)模的增大而增大.計算機算力的提升使得機器群體智能可以在更大的解空間中搜索最優(yōu)解;互聯(lián)網(wǎng)的快速發(fā)展使得大規(guī)模人類群體智能得以涌現(xiàn),利用人類群體智能進行軟件開發(fā)成為可能.
群體智能作為一類通用的問題求解方法,其同樣被廣泛應用于解決軟件開發(fā)過程中面臨的各類復雜問題,這一應用趨勢經(jīng)過逐步發(fā)展即形成了基于群體智能的軟件工程研究領域.目前基于群體智能的軟件工程中已經(jīng)有很多研究方向,例如基于搜索的軟件工程、眾包軟件工程以及開源軟件等,基于群體智能的軟件工程也和智能化軟件工程等領域有交叉.其中基于搜索的軟件工程(SBSE)和眾包軟件工程(CSE)是該領域的2個重要且發(fā)展相對成熟的研究方向,分別代表了對機器群體智能和人類群體智能的有效探索和利用,將作為本文討論的重點.
1.2.1 基于搜索軟件工程
SBSE最早可以追溯到1976年,Miller等人[27]最早使用遺傳算法來解決浮點數(shù)測試用例的生成問題.2001年Harman和Jones[8]系統(tǒng)性將軟件工程問題轉(zhuǎn)化為基于搜索的優(yōu)化問題,并利用遺傳算法等群智優(yōu)化算法進行問題求解,標志著SBSE開始成為軟件工程中的一個新研究方向.
不同于傳統(tǒng)軟件工程在問題空間中通過算法構造出一個解,SBSE將傳統(tǒng)軟件工程問題轉(zhuǎn)化為優(yōu)化問題,并以適應度函數(shù)作導向,利用群智優(yōu)化算法在解空間中尋找問題的近似最優(yōu)解.Harman等人[10]總結了應用SBSE的2個前提條件:
1) 能將問題表述成形式化的優(yōu)化問題;
2) 能夠定義出適應度函數(shù)(fitness function).
軟件工程的研究對象和解決方案都不是物理實體,這種虛擬性使得幾乎軟件開發(fā)生命周期各階段的問題都可以通過數(shù)學抽象形式化表示為優(yōu)化問題.此外,軟件工程中許多問題都有一組與之相關且豐富多樣的軟件度量標準,這些度量標準形成了良好的初始適應度函數(shù)候選集[28].軟件工程問題的這2個特點使SBSE的應用成為可能:只要軟件工程問題能夠形式化表達為優(yōu)化問題,就可以使用SBSE方法來求解.
經(jīng)過長時間的發(fā)展,SBSE領域已形成了一定規(guī)模的研究者群體,基于搜索的軟件工程國際研討會(International Symposium on Search-Based Soft-ware Engineering, SSBSE)和基于搜索的軟件測試國際研討會(International Workshop on Search-Based Software Testing, SBST)每年都召開,在很多子研究領域上也都有綜述論文發(fā)表[10,29-30].Harman等人尤其建立了一個SBSE領域論文數(shù)據(jù)庫(4)https://crestweb.cs.ucl.ac.uk/resources/sbse_repository/repository.html,收集了該領域近2 000篇研究論文,是開展SBSE研究的重要資源.
1.2.2 眾包軟件工程
眾包是一種新興的開放式協(xié)作模式.2006年Howe[9,31]將眾包定義為“公司或機構將需要員工完成的任務,以公開招募勞動力的形式外包給一個尚未界定(通常規(guī)模較大)的網(wǎng)絡群體的行為”,以用來描述企業(yè)是如何利用互聯(lián)網(wǎng)將工作外包給大眾.
眾包軟件工程使用眾包解決軟件工程問題.通過互聯(lián)網(wǎng)在線平臺,軟件工程問題被分解成一個個任務,分配給有能力的個體解決,利用人類群體智能的作用高效高質(zhì)量給出解決方案.如圖1所示,眾包軟件工程的工作流程涉及3個主要角色:基于互聯(lián)網(wǎng)的眾包平臺、需求提出方和開發(fā)者.需求提出方可以是一個公司,公司利用眾包平臺完成公司業(yè)務可以加快軟件開發(fā)周期、節(jié)省成本,個人也可以通過眾包平臺發(fā)布任務,幫助自己實現(xiàn)軟件開發(fā).開發(fā)者可以是個人也可以是一個團隊,可以根據(jù)個人或者團隊的能力選擇相應的開發(fā)任務.基于互聯(lián)網(wǎng)的眾包平臺是軟件眾包的核心,管理整個軟件眾包項目的業(yè)務邏輯,一個理想的軟件眾包平臺應該有在線軟件開發(fā)環(huán)境和工具、知識分享和協(xié)同工具、解決方案質(zhì)量保證和改善工具以及項目管理工具[32].
眾包軟件工程屬于人類群體智能在軟件工程中的一種實踐形式,可以極大提高軟件開發(fā)速度和交付軟件產(chǎn)品的質(zhì)量.從近年來出現(xiàn)的眾包軟件工程研討會(International Workshop on CrowdSourcing in Software Engineering, CSI-SE@ICSE)和與會文章可以看出,眾包軟件工程發(fā)展十分迅速,并且越來越完善,與眾包軟件工程相關的研究非常多,一些研究人員從不同角度對眾包相關研究工作進行了總結[33-36],其中Mao等人[11]在2016年對眾包技術在軟件工程中的應用進行了系統(tǒng)的總結.

Fig.1 The three participants in crowdsourced software engineering[11]圖1 眾包軟件工程的3類參與者[11]
1.2.3 基于群體智能的軟件工程方法統(tǒng)一框架
以基于搜索的軟件工程為代表的研究旨在利用源自生物群體的進化優(yōu)化算法來搜索軟件工程問題的最佳解決方案,而以眾包軟件工程為代表的研究則更加關注人類群體智能的高效匯聚和應用.這些方法雖然具有不同的群體智能表現(xiàn)形式,但從問題求解的統(tǒng)一的視角來看,對于特定的問題解空間,每個個體能感知和搜索的范圍通常是有限的,而群體智能能通過個體間的交互作用來更有效地探索整個問題解空間,并最終找到問題的最優(yōu)解或局部最優(yōu)解.
圖2給出了利用群體智能方法進行軟件工程問題求解的統(tǒng)一框架.對于一個給定的軟件工程問題,首先群體中的每個個體分別產(chǎn)生問題的解決方案,隨后在群體智能的幫助下對已有解決方案進行評估,并在此基礎上對解決方案進行優(yōu)化以產(chǎn)生更好的解決方案.這一過程將不斷循環(huán)迭代,直到滿足某種終止條件,最后在整個流程中找到的最優(yōu)解即作為群體智能的最終求解結果.

Fig.2 A unified framework of collective intelligence based software engineering圖2 基于群體智能的軟件工程方法統(tǒng)一框架
產(chǎn)生解決方案、評估解決方案以及優(yōu)化解決方案是上述基于群體智能的軟件工程框架中的3個關鍵任務,這些任務既可以借助機器群體智能來實現(xiàn),也可以借助人類群體智能來實現(xiàn).當3個任務都使用機器群體智能來實現(xiàn)時,即代表了機器群體智能層次的基于群體智能的軟件工程(例如使用蟻群算法自動化地構造、評估和優(yōu)化測試數(shù)據(jù)[37]);當3個任務都使用人類群體智能來實現(xiàn)時,即代表了人類群體智能層次的基于群體智能的軟件工程(例如使用眾包機制公開召集一群人類個體來構造、評估和優(yōu)化軟件設計[38]);而當一部分任務由機器群體智能來實現(xiàn),另一部分任務由人類群體智能來實現(xiàn),即代表了人機結合群體智能層次的基于群體智能的軟件工程.

Fig.3 Solving software engineering problem by machine collective intelligence圖3 利用機器群體智能進行軟件工程問題求解
具體地,圖3給出了利用機器群體智能進行軟件工程問題求解的示意圖.為了自動化地使用機器群體智能構造、評估和優(yōu)化候選解,軟件工程問題首先需要被結構化地編碼為可以被計算和搜索的形式,同時需要給出候選解的形式化評估指標,即定義結構化的適應值函數(shù).在此基礎上,以進化優(yōu)化算法為代表的機器群體智能方法就能在適應值函數(shù)的指導下自動化地演化候選解.
圖4給出了利用人類群體智能進行軟件工程問題求解的示意圖.其中,一個管理平臺是群體智能有效涌現(xiàn)的基礎,項目請求者在平臺上發(fā)布軟件工程項目和獲得解決方案.軟件工程項目在平臺中將經(jīng)歷產(chǎn)生解決方案、評估方案和選擇一個比較好的解決方案的迭代過程,直到請求者獲得一個滿意的解決方案.在上述迭代過程中會產(chǎn)生許多的微任務,例如提交解決方案任務、評估其他人解決方案任務等.工人群體通過平臺可以選擇自己感興趣的任務,提交任務結果.理想的平臺還有工具支持,為大規(guī)模群體個體協(xié)作和通信奠定基礎.

Fig.4 Solving software engineering problem by human collective intelligence圖4 利用人類群體智能進行軟件工程問題求解
對于某些軟件工程問題,其解決方案可能難于形式化描述、或者難于形式化度量,這限制了機器群體智能的應用;而人類群體智能則要求所有任務都由人類個體來完成,這又缺乏對機器運算效率的有效利用.人機結合群體智能是對上述兩者的結合,圖5給出了其對應的軟件工程問題求解示意圖.其中,機器群體智能既可以和人類群體智能結合,人機合力半自動化解決軟件工程問題,也可以利用人群形成的知識庫成為全自動化的間接人機結合群體智能來解決問題.
基于機器群體智能、人類群體智能和人機結合群體智能的軟件工程分別代表了利用群體智能進行軟件工程問題求解的3種不同層次,它們統(tǒng)一于基于群體智能的軟件工程框架中,同時也在很多領域都有著廣泛且成熟的應用.
1.3.1 人類群體智能在軟件工程中的實踐
軟件開發(fā)本身就是一項高度依賴人類智能的創(chuàng)造性活動.在基于人類群體智能的軟件工程上,目前人們已開發(fā)了很多商業(yè)化的眾包平臺,這些平臺通過不同的問題求解模型來解決軟件工程問題.目前世界上最大規(guī)模的軟件眾包開發(fā)平臺是2001年建立的TopCoder(5)https://www.topcoder.com;,用戶可以通過TopCoder發(fā)布軟件設計、軟件開發(fā)、軟件測試等任務.此外,UDesignIt(6)https://www.marketingideasforprinters.com;,StakeNet[39]和StakeSource[40]專注于需求獲取與分析;DesignCrowd(7)https://www.designcrowd.com;可以利用人類群體智能進行軟件設計;Bountify(8)https://bountify.co;,HelpMeout[41]等可以幫助用戶進行代碼編寫和軟件實現(xiàn);而軟件測試領域有最多的工具與平臺,例如uTest(9)https://www.utest.com/;,Testin(10)https://www.testin.cn/;,Testbirds(11)https://www.testbirds.com/.
TopCoder是利用人類群體智能解決軟件工程相關問題的先行者.在TopCoder中,人類群體智能以在線競爭的形式產(chǎn)生、評估、優(yōu)化解決方案.從頂層設計來看,系統(tǒng)過程類似于瀑布模型,每個開發(fā)階段都是由一系列在線競爭來實現(xiàn)的.每個參與者都產(chǎn)出特定任務的解決方案,由人群中選出的審查委員會對每個解決方案進行評估,解決方案的優(yōu)化來自于參與者之間的競爭機制.由于人群無法處理復雜的軟件問題,TopCoder將復雜任務分解為多個簡單子任務發(fā)布,降低了對人類群體智能的限制,有利于充分利用人群的優(yōu)勢.
AppStori(12)https://www.appstori.com;是一個新穎的移動應用開發(fā)眾包平臺.和TopCoder直接利用人群智能解決問題不同,AppStori利用人群智能輔助軟件開發(fā)過程,AppStori創(chuàng)新性地將消費者群體和軟件開發(fā)過程緊密聯(lián)系,消費者群體可以以眾籌形式為項目提供資金;消費者群體中有能力的開發(fā)者可以加入項目的開發(fā)過程中;消費者群體可以在應用開發(fā)過程中提出建議和需求;消費者群體還可以充當原型軟件測試人員的角色,為現(xiàn)有項目提供反饋.整個開發(fā)過程,從概念到發(fā)布,都是通過開發(fā)人員和消費者群體之間的協(xié)作來實現(xiàn)的,涉眾群體幫助評估、優(yōu)化現(xiàn)有的解決方案絕對是高效、高質(zhì)量的人類群體智能利用方式.
StackOverflow(13)https://www.stackoverflow.com;是一個編程知識問答網(wǎng)站.在這個平臺中,人類群體以經(jīng)驗知識庫的形式出現(xiàn),提問者需要通過提問的方式主動從經(jīng)驗知識庫中“拉出”問題解決方案.一方面,經(jīng)驗知識庫為問題提供多種多樣的解決方案,這個過程反映出人類群體智能對解決方案的優(yōu)化;另一方面,提問者需要評估不同的回答找到最合適的解決方案.
1.3.2 機器群體智能在軟件工程中的實踐
與人類群體智能的相關實踐相比,機器群體智能在軟件工程中的代表性應用包括自動化測試數(shù)據(jù)生成和程序代碼修復等工具,這些工具已被成功應用到很多真實的軟件開發(fā)環(huán)境中.
Austin(14)https://github.com/kiranlak/austin-sbst;是一個用于單元測試C程序的結構測試數(shù)據(jù)生成工具.Austin認為一個單元是一個被測試的函數(shù),并且該函數(shù)中的所有函數(shù)都是可訪問的.在函數(shù)代碼覆蓋率相關適應度函數(shù)的評估下,Austin不斷生成給定函數(shù)的輸入?yún)?shù),形成新的測試用例,從而優(yōu)化測試用例集.
EvoSuite(15)http://www.evosuite.org;和Austin類似,不過EvoSuite針對Java語言,并且對測試過程中的Oracle問題提供了解決方案.EvoSuite通過添加小而有效的斷言集來提供可能的指示,這些斷言集簡潔地總結了當前的行為,允許開發(fā)人員檢測預期行為的偏差,并捕獲當前行為,以防止未來的缺陷破壞這種行為.
GenProg(16)https://squareslab.github.io/genprog-code/;使用基因編程來修復代碼缺陷.具體地來說,修復代碼的解決方案以對源代碼進行修改的操作序列表示.每一個候選解決方案被用于源代碼,生成新的代碼程序;測試套件充當評估解決方案的角色,通過的測試越多,說明該解決方案越接近完美;優(yōu)化體現(xiàn)在不同解決方案的競爭當中.
為了搜集目前與基于群體智能的軟件工程相關的主流研究論文,我們在這里主要考慮SBSE和CSE這2個較為成熟的基于群體智能的軟件工程領域.
具體地,我們首先從SBSE和CSE對應的文獻庫(17)https://github.com/Rhapsod/software-crowdsourcing-papers中獲取所有相關研究論文,共計1 450篇,表1給出了這些論文的研究主題在軟件工程生命周期各個階段上的分布情況.隨后,為了使本文調(diào)研工作聚焦到較高水平的研究論文上,我們進一步根據(jù)CCF期刊和會議推薦列表對上述論文進行篩選,最終共收集706篇研究論文作為本文調(diào)研的對象.
我們對上述每個軟件工程階段相關的論文進行深入分析,表1給出了基于群體智能的軟件工程在軟件開發(fā)各個活動上的應用和分布情況.從表1中可以看出,目前在軟件工程的整個生命周期中都有基于群體智能的軟件工程相關的研究和應用.

Table 1 Statistics of Literatures of Collective Intelligence Based Software Engineering表1 基于群體智能的軟件工程主流文獻統(tǒng)計結果
需求工程是通過分析客戶需求,幫助技術人員理解問題域并定義目標系統(tǒng)功能特征的方法論,是軟件開發(fā)生命周期中至關重要的一環(huán)[42].需求工程強調(diào)開發(fā)者對用戶需求的理解,從而減少系統(tǒng)建設過程中可能出現(xiàn)的偏差與錯誤;同時,需要追蹤與處理需求變更,減少需求變更帶來的耗費,提高生產(chǎn)效率.
目前群體智能在需求工程中主要用于需求獲取和分析,表2給出了不同層次的群體智能在解決具體需求工程問題上的應用.其中,機器群體智能在需求分析中主要用于解決需求沖突協(xié)商[43]、需求交互[44-48]、需求選擇[49-53]和需求規(guī)范[54]等問題;人類群體智能主要在需求獲取中發(fā)揮作用,如尋找需求涉眾[39-40,55-57]、需求提取[58-61]和需求分析[40,55-56,62-63]等.目前,基于人機結合群體智能的需求工程研究較少,僅在需求規(guī)范[64]和需求優(yōu)先級排序[65]中有相關研究.

Table 2 Research on Collective Intelligence Based Requirement Engineering表2 基于群體智能的需求工程相關研究
需求獲取指理解涉眾的要求以及他們是如何使用新軟件系統(tǒng)來支持他們的工作.如果項目需求分析的涉眾群體不夠多或者沒有代表性,需求分析結果就會出現(xiàn)偏差,從而導致軟件產(chǎn)品無法被用戶接受.因此在需求獲取之前應盡量全面地分析并尋找軟件涉眾.傳統(tǒng)需求工程方法通常選取部分用戶作為全體用戶的代表,這會導致僅對有限的需求進行提取,從而難于適應互聯(lián)網(wǎng)環(huán)境下大規(guī)模、多樣和動態(tài)演化的用戶群體和軟件使用環(huán)境.
基于大規(guī)模人群涌現(xiàn)人類群體智能在尋找涉眾任務中具有特殊優(yōu)勢.人類群體規(guī)模越大,涉眾的多樣性越豐富;同時人類群體規(guī)模越大,涌現(xiàn)的群體智能越強大,應用在涉眾確定任務中的效果越好.
首先,可以通過涉眾的背景來尋找初始的涉眾群體.例如為了尋找到足夠多的特定領域涉眾,Wang等人[57]根據(jù)具有特定領域知識的人群會在特定的時空間聚集的現(xiàn)象,提出了一種新型的參與者招募框架來以更有效的方式招募所需領域的參與者.其次,涉眾群體可以通過涉眾之間的關系進行優(yōu)化,例如Lim 等人[39-40,55]提出了StakeNet方法并開發(fā)了相關工具.在StakeNet方法中,為了尋找和項目有關的所有涉眾群體,讓涉眾推薦可能的涉眾群體,在真實項目中取得了良好的效果.最后,通過將涉眾關系抽象定義為網(wǎng)絡圖,定義相關度量函數(shù)來評估涉眾群體是否已經(jīng)滿足要求.StakeNet方法中采用了PageRank等算法指標來計算涉眾群體的優(yōu)先級,并且在后續(xù)的工作[56]中提出了StakeRare方法,使用社交網(wǎng)絡分析和協(xié)同過濾技術來識別大型軟件工程中的需求并對需求優(yōu)先級進行排序.
需求提取是將各種形式的需求意見提取為可用于后續(xù)需求分析的規(guī)范需求文檔的過程.需求提取面臨的困難主要來自于從大量自然語言形式文檔中提取需求的時間成本,限制了需求提取的規(guī)模.基于群體智能的軟件工程方法通過增加處理問題的并行程度,縮減時間成本,從而增加了需求提取的規(guī)模.但是非專業(yè)的人群手動從大型自然語言文本源中提取需求是一項艱巨的任務,限制了人類群體智能需求提取的一般化.Breaux等人[61]進行了3個實驗,雇傭未經(jīng)培訓的人群工作人員手動從隱私政策文檔中提取需求.實驗結果表明,合理的任務分解可以降低人群提取難度,提高了人類群體智能提取需求的能力.此外,Hosseini等人[58]還發(fā)現(xiàn)眾包應用于需求提取可以適應軟件需求提取的高要求,該研究深入研究了如何使用眾包可以提高提取需求的質(zhì)量,優(yōu)化基于群體智能的軟件工程方法的評估、優(yōu)化解決方案過程.
人類群體智能方法充分利用了用戶群體的主體作用,通過將需求提取任務以一定方式眾包出去,從而盡可能全面地感知和收集需求[60].Adepetu等人[59]提出了一個概念化的眾包平臺CrowdREquire,人群中的個體需要向客戶端定義的任務提交規(guī)范的需求文檔解決方案.在競賽機制作用下,個體會相互競爭,不斷優(yōu)化自身的解決方案,最后由任務提出方從人群提交的眾多解決方案中選出最優(yōu)的解決方案.
需求分析包括提煉、分析和審查已經(jīng)收集到的需求,以確保所有風險承擔者都知道其中含義,并找到需求中沖突、錯誤和其他不足的地方.需求分析相關研究集中在需求優(yōu)先級排序、需求分類、需求沖突協(xié)商以及需求交互研究等活動.
在需求分析問題上,對不同層次群體智能來說,非專業(yè)人類群體很難利用人類群體智能對需求分析問題進行直接集體決策,因此人類群體智能應用有限;需求優(yōu)先級、客戶滿意度、項目成本等因素的需求分析能夠表述為多目標優(yōu)化問題,因此機器群體智能在需求分析問題中具有廣泛的應用;通過機器群體智能對問題進行優(yōu)化,轉(zhuǎn)換為比較容易的子任務分配給人類群體智能解決,可以充分利用人機群體智能的優(yōu)勢.
目前,人類群體智能在需求分析中的應用主要是利用眾包技術來進行需求優(yōu)先級排序[40,55-56].此外,Nascimento等人[62]還利用眾包對需求進行分類以分析用戶對產(chǎn)品的真正期望;而Liang等人[63]提出了基于Web 2.0的需求分析框架來輔助需求決策,以降低用戶參與需求分析的難度.
當需求分析問題可以較容易地轉(zhuǎn)化為結構化的優(yōu)化問題時,機器群體智能方法就能得到廣泛的應用,其中最有代表性的例子就是下一版本問題(next release plan, NRP),即如何根據(jù)現(xiàn)有資源選擇新的功能加入到軟件系統(tǒng)中來滿足客戶需求[64].機器群體智能在NRP問題中應用的關鍵是解決方案的評估,由于功能選擇時需要考慮多方面因素,例如客戶之間的優(yōu)先級關系、成本和需求之間的關系等,人們尤其關注基于多目標優(yōu)化的NRP問題.例如Brasil等人[46]提出了一種多目標優(yōu)化公式,在考慮客戶滿意度、需求之間相關性、業(yè)務價值和可用資源等多種因素的條件下確定系統(tǒng)理想的版本數(shù)量,實驗中使用帶精英策略的非支配排序的遺傳算法(nondo-minated sorting genetic algorithms Ⅱ,NSGAⅡ)和MOCell[65]算法驗證了公式的有效性.
評估NRP問題還需要考慮項目資源和成本,在項目資源限制內(nèi)找出一組需求滿足不同涉眾的訴求.Zhang等人[49]采用Kiviat圖直觀顯示出預算壓力對于多方涉眾滿意度的影響,并且比較了Two-Archive算法、NSGAⅡ算法和隨機算法在此問題的性能.實驗表明,隨著問題規(guī)模擴大,Two-Archive算法的收斂性更好.此外,項目預算不準確也會對NRP問題的最終結果有很大影響.Harman等人[51]在單目標或多目標需求優(yōu)化問題基礎上進行了成本的可接受敏感范圍分析,決策者可以根據(jù)分析結果的可視化圖表識別數(shù)據(jù)中的敏感范圍.
在某些情況下,機器群體智能評估需求分析解決方案還需要考慮需求交互問題[66],即某些特定目標只有多個需求同時滿足時才能達到.Zhang等人[44]修改了傳統(tǒng)NSGAⅡ算法[67],使之可以用于解決考慮需求交互約束的多目標需求優(yōu)化評估問題.Zhang等人[47]隨后對算法進行了進一步改進,提高了算法的收斂性和最終解決方案的多樣性.此外,Sureka等人[48]將NPR中的需求交互看作需求之間的協(xié)同作用,分為積極協(xié)同作用和消極協(xié)同作用,研究了機器群體智能對此類問題的性能,驗證了機器群體智能對NRP問題的適用性.
此外,針對多客戶需求之間的相互沖突和競爭問題, Finkelstein等人[43]提出了3種公平性衡量公式來評估和客戶優(yōu)先級相關的需求分析解決方案,并且利用遺傳算法尋求需求公平性權衡的需求協(xié)商方案.針對用戶輸入需求的不準確或不完全問題,Devries等人[54]結合符號分析和演化計算將需求進行分解,枚舉所有必要的分解需求和確定分解需求的影響范圍.
在上述研究中可以發(fā)現(xiàn),利用機器群體智能產(chǎn)生解決方案的方法也十分重要,機器群體智能算法的選擇對解決問題過程的收斂性和最終解決方案的多樣性有很大影響.Souza等人[45]認為NRP問題可以看作是背包問題,蟻群算法在這類問題上的收斂性和產(chǎn)生解決方案的質(zhì)量上表現(xiàn)非常好,因此作者對蟻群算法進行改進,使之可以解決存在互相依賴的需求的NRP問題.Kumari等人[50]結合量子計算和演化計算的特性,提出了一種量子啟發(fā)的多目標演化算法來解決NRP問題中的需求選擇問題.Chaves等人[52]提出一個蜂群算法解決多目標下一版本問題(multi-objective next release problem, MONRP),該方法可以生成高質(zhì)量的需求集供工程師進行決策.José等人[53]改進了早期的蟻群系統(tǒng)用于項目迭代中需求集的選擇問題,算法效果得到了很大提升.
人機結合群體智能能夠使用人類智能來彌補機器智能的不足.Tonella等人[68]提出了一種基于人機交互的遺傳算法來解決需求優(yōu)先級排序問題,該方法將評估解決方案的任務交給具有相關專業(yè)知識的人群,實驗表明該方法的有效性和魯棒性均優(yōu)于機器群體智能方法,并且可以容忍一定的人為錯誤率.Wever等人[69]采用協(xié)同演化算法通過確定性有限狀態(tài)機半自動化尋找合適的形式化軟件規(guī)范,該方法需要用戶對有限的訓練數(shù)據(jù)進行標記,幫助機器群體智能產(chǎn)生高質(zhì)量的解決方案.
此外Sultanov等人[70]的研究表明機器群體智能也適用于需求跟蹤問題.Yue等人[71]為需求審查提出了評估需求審查分配結果的適應度函數(shù),機器群體智能也可以用于自動需求審查分配問題.
和傳統(tǒng)需求工程方法相比,應用群體智能方法的優(yōu)勢包括大規(guī)模群體的問題并行處理能力、涉眾群體的多樣性以及對需求分析結果的優(yōu)化等.但是具體到不同層次的群體智能時,可以發(fā)現(xiàn)機器群體智能很難進行涉眾確定活動;而人類群體中個體無法處理復雜任務,因而在進行需求分析時存在任務分解難題.針對上述問題,我們可以通過不同層次群體智能的相互轉(zhuǎn)化來增強群體智能方法的普適性.例如,在涉眾確定活動中,機器群體智能的局限性正是人類群體智能的優(yōu)勢所在,將涉眾群體看作群體智能涌現(xiàn)的源泉即可解決問題;同樣,利用機器群體智能優(yōu)化分解問題,人類群體智能解決子問題的人機結合群體智能模式在需求分析中能夠發(fā)揮巨大作用.
軟件設計是從需求說明到軟件具體實現(xiàn)的過渡階段.人類群體智能在這方面的研究比較少,如表3所示,主要有軟件概念建模[72]、UI界面設計[38]和Web網(wǎng)站頁面設計[73].人類群體智能方法在上述問題上的應用主要來源于2方面因素:1)在激勵的作用下,大量工人會給出自己的軟件設計方案,眾多軟件設計方案的競爭會帶來一個當下最優(yōu)的設計方案;2)通過不斷學習人類群體智能形成的知識庫,可以不斷優(yōu)化已有設計,從而獲得近似最優(yōu)解決方案.

Table 3 Research on Collective Intelligence Based Software Design表3 基于群體智能的軟件設計相關研究
與之相比,利用機器群體智能解決軟件設計問題目前已有大量的應用,相關研究領域包括軟件體系結構設計[75-77]、軟件產(chǎn)品線設計[78-83]和面向服務的軟件設計[84-85]等.R?ih?[87]從更廣泛的角度總結了機器群智優(yōu)化算法在軟件設計中的應用,不僅包括軟件開發(fā)前期的軟件設計,還包括軟件維護和重構工程中的軟件設計.機器群體智能能夠在上述軟件設計方法中發(fā)揮作用,主要是因為復用和模塊化已成為現(xiàn)代軟件系統(tǒng)設計的基本準則,因此軟件設計問題通常能轉(zhuǎn)化為在成本、資源和性能約束下選擇并組合已有軟件組件的問題.由于軟件組件的多樣性和龐大的數(shù)量,機器群體智能應用于軟件設計的關鍵在于如何選擇并組合已有軟件組件,優(yōu)化設計方案.例如Lagerstrom等人[74]根據(jù)非功能性需求、效用理論和涉眾需求設計適應度函數(shù),從組件庫中選取新的組件對UML進行修改,搜索最佳解決方案.
在軟件體系結構設計上,人們通常關注的是軟件系統(tǒng)組織方式和整體結構,其目的是確定一個系統(tǒng)的主要構件以及構件之間的相互關系.機器群體智能在這一問題上已有很多應用,例如Andrade等人[76]提出了DuSE方法并開發(fā)了對應的DuSE-MT[75]工具,該工具能夠給出設計空間系統(tǒng)化表示元模型,在運行過程中不斷利用元模型對已有架構進行自動修改,生成新的體系架構,并利用帕累托最優(yōu)理論評估系統(tǒng)體系結構,為決策提供價值權衡.Li等人[77]則提出了PETUT-MOO工具,在給定軟件體系結構設計模型時通過模型轉(zhuǎn)換自動優(yōu)化和改進該設計方案的非功能性需求.該工具利用集成環(huán)境來實時分析架構模型性能,從而利用處理器利用率、成本和系統(tǒng)延遲等軟件質(zhì)量因素評估新的軟件架構方案.
軟件產(chǎn)品線架構(product line architecture, PLA)指的是一個共性的體系結構以及共享構件的一組應用,其中每個應用都可以通過特征化來滿足特定用戶需求.Harman等人[88]系統(tǒng)總結了應用機器群智優(yōu)化算法解決軟件產(chǎn)品線工程中問題的研究,為軟件產(chǎn)品線的自動演化提供了方向.在軟件產(chǎn)品線設計問題上,如何利用機器群體智能優(yōu)化軟件設計是問題的關鍵.現(xiàn)有優(yōu)化搜索算子改變PLA的結構,可能違反分層體系結構,使得PLA靈活性和可維護性降低.為此,Mariani等人[79]引入考慮分層體系結構樣式的搜索算子,可以保證PLA風格不變并且與之前的方法相比有更好或等價的適應度函數(shù)用于軟件設計方案的評估過程.同時,PLA是根據(jù)軟件特征進行設計的,將特征模塊化可以保證PLA的擴展,Colanzi等人[81]提出基于特征的算子用于PLA設計方案的優(yōu)化,可以解決此類問題.Le等人[82]通過引入變異算子將設計模式引入PLA的設計優(yōu)化過程中,提高了產(chǎn)生和優(yōu)化的解決方案的質(zhì)量.
為了能夠直觀評價機器群智方法優(yōu)化PLA設計方案的實際效果,Wu等人[89]提出了一個尋找所有解決方案的3階段算法,可以促進決策者選擇的決策.之后Wu等人[80]還分享了使用該算法和機器群智優(yōu)化算法解決實際PLA設計問題的計算經(jīng)驗,實驗證明該算法能夠幫助決策者確定算法的最優(yōu)參數(shù).Colanzi等人[83]提出了新的基于搜索PLA直接表示方法,比現(xiàn)有研究中的表示方法更有效率.Féderle等人[78]提出一個工具OPLA-Tool,實現(xiàn)機器智能在多目標優(yōu)化PLA任務上的輔助.
近年來,面向服務的軟件體系結構也正受到人們的日益關注,其中每個服務實現(xiàn)一個特定的功能,并具有松耦合、可復用和技術異構等特征.在面向服務的軟件設計上,人們通常面臨服務組合和服務選擇的問題,其中服務質(zhì)量[90](quality of service, QoS)是機器群體智能評估解決方案的主要指標.例如,云服務提供商提供的云服務及其相關定價模型各不相同,導致部署云服務十分復雜.Ardagna等人[84]提出了一種MILP方法,可以利用機器群體智能生成一個可行的初始解決方案用于自動搜索優(yōu)化過程,該方案利用成本和QoS作為評估函數(shù),實驗證明該方法可以降低云應用程序的成本,并提高最終系統(tǒng)的質(zhì)量.為了實現(xiàn)服務組合成所需系統(tǒng)的所有階段自動化,F(xiàn)anjiang等人[85]提出了一種服務組合自動化的方法,該方法利用遺傳算法生成和優(yōu)化服務組合方案,利用功能性和非功能性需求相關度量對服務組合方案進行評估.
此外,Simons等人[91]提出了一種新型的交互式蟻群算法,可用于軟件開發(fā)生命周期早期的軟件設計中.
在人類群體智能的應用上,由于單個建模者無法建立高質(zhì)量概念模型,Jiang等人[72]設計了一個工具,可以使在線建模者突破時間空間限制進行協(xié)作,完成概念模型建模,Huang等人[38]利用人群已有的設計方案建立了在線的程序應用線框圖和UI設計示例之間的映射,為開發(fā)者提供參考.同樣的,Lasecki等人[92]提出了一個實時眾包系統(tǒng)Apparition,通過理解需求方對軟件功能的描述和畫出的草圖,在線群體幫助給出軟件的原型設計.Latoza等人[93]研究了眾包軟件設計中解決方案之間的關系,其他人的解決方案可以幫助自己的解決方案演化,獲得更好的解決方案,這為軟件設計競賽提供了好的改善方向.Nebeling等人[73]提出了輕量級Web信息系統(tǒng)開發(fā)方法,網(wǎng)站設計的演化基于人群提供的數(shù)據(jù)和功能,網(wǎng)站所需組件的開發(fā)也由眾包實現(xiàn).
人機結合群體智能在軟件設計問題上同樣有一定程度的應用.例如,在面向?qū)ο缶幊讨校琒imons等人[86]發(fā)現(xiàn)使用演化計算和軟件代理的基于交互式搜索的人機結合群體智能方法進行類設計非常有前景.
與傳統(tǒng)軟件設計方法相比,人類群體智能方法的使用能夠提供高質(zhì)量、多樣性的設計方案[93];機器群體智能能夠有效量化軟件設計中的各種約束,科學地進行體系結構、產(chǎn)品線和服務組合等設計問題.從表3中相關論文數(shù)量來看,關于如何使用人類群體智能進行軟件設計和應用的研究相對較少,其原因在于軟件設計任務很難分解為簡單的子任務,因此無法有效降低處理問題的復雜性.
軟件構造是將設計模型實現(xiàn)為目標軟件系統(tǒng)的過程,其中面臨的主要問題是如何高效編寫高質(zhì)量的代碼.表4給出了不同群體智能方法在解決軟件構造問題上的代表性工作.其中人類群體智能方法在輔助調(diào)試[41,94-96]、程序優(yōu)化[97-98]和程序自動修復[99-100]中都有應用,這主要是因為軟件開發(fā)者通常數(shù)量眾多,能夠大規(guī)模涌現(xiàn)群體智能.開源軟件代碼倉庫和社區(qū)的快速發(fā)展帶來大量的代碼、文檔和測試等編程資源和經(jīng)驗,機器群體智能方法復用這些知識,可以自動高效地解決很多編碼問題,例如程序優(yōu)化[101-106]和程序自動修復[107-112];人機結合群體智能則在程序優(yōu)化[113]和程序自動修復[114-115]中具有很好效果.

Table 4 Research on Collective Intelligence Based Software Coding表4 基于群體智能的軟件構造相關研究
在編碼和調(diào)試問題上,人類群體智能主要體現(xiàn)在知識與經(jīng)驗的復用.將人群的編碼調(diào)試經(jīng)驗、相似功能代碼整合和代碼依賴庫的說明文檔等知識融合,形成編碼知識庫.開發(fā)者在開發(fā)新的軟件系統(tǒng)時可以利用知識庫對自己的代碼進行優(yōu)化,修改錯誤的函數(shù)使用方法、優(yōu)化代碼結構、代碼算法優(yōu)化以及提高調(diào)試效率等.
例如經(jīng)驗不足的新手開發(fā)者在編碼和錯誤調(diào)試上通常會浪費太多的時間,針對這一問題,Hartmann等人[41]設計了面向靜態(tài)語言的Help-MeOut推薦系統(tǒng),通過展示其他程序員是如何糾正類似錯誤的示例來幫助用戶調(diào)試錯誤和異常消息.Mujumdar等人[95]開發(fā)了一種輔助工具Crowd Debug,能夠為動態(tài)解釋的Web開發(fā)語言提供調(diào)試幫助.此外,F(xiàn)ast等人[94]提供的Codex工具能夠記錄程序員是如何使用編程語言的,新手程序員可以通過Codex掌握經(jīng)典函數(shù)調(diào)用方式,避免出現(xiàn)不必要的程序語句.
這種利用人類群體智能的輔助工具需要預先收集大量代碼方面的知識,如何建立對應的知識庫因而也是相關研究中的一個重要問題.一般來說,人們通常從編程相關的問答社區(qū)中獲取信息來建立知識庫,但其中出現(xiàn)的代碼片段往往不可直接運行.基于此,Terragni等人[116]致力于將問答社區(qū)中代碼片段自動合成可以直接編譯的程序;Chen等人[96]從Stack Overflow數(shù)據(jù)中建立代碼匹配數(shù)據(jù)庫,可以幫助開發(fā)者發(fā)現(xiàn)有缺陷的代碼,并且提出修復缺陷的解決方案.
利用群體智能對程序進行優(yōu)化的研究主要關注編譯優(yōu)化.在人類群體智能層次上,F(xiàn)ast等人[98]設計了一個Python語言擴展Meta,可以為開發(fā)者尋找代碼優(yōu)化和錯誤修復方案.Auler等人[97]通過收集Web客戶端的性能數(shù)據(jù),為JavaScript建立了在線編譯標記參數(shù)推薦系統(tǒng),可以對給定的平臺達到5倍的性能優(yōu)化.
在人機結合群體智能層次上,Cochran等人[113]提出了Program boosting方法來解決專業(yè)人士都難以解決的編程問題.例如在書寫正則表達式時,通過熟練的開發(fā)人群提供問題的初始方案,通過演化來生成改進的解決方案,在這期間,未經(jīng)訓練的人群評估程序輸出來幫助產(chǎn)生改進的方案,實驗證明這樣使得正則表達式精度得到了提升.
除了人類群體智能利用編碼經(jīng)驗知識輔助程序優(yōu)化的方式以外,利用搜索算法創(chuàng)建程序變體,生成自動修復方案,在多個版本中選取最優(yōu)解決方案的機器群體智能同樣也被成功應用于程序優(yōu)化.遺傳優(yōu)化(genetic improvement, GI)是其中的代表性自動修復方案生成和優(yōu)化方法,其能通過自動搜索生成新的程序代碼來改進軟件的現(xiàn)有版本.在程序優(yōu)化任務中,有非常多的優(yōu)化評估函數(shù),例如軟件執(zhí)行效率[101-106]、能耗[117-119]和內(nèi)存消耗[120]等非功能性指標都可以用于評估機器群體智能方法生成的優(yōu)化結果.
程序修復包括故障定位、補丁生成和補丁驗證3個階段.程序自動修復的評估準則是通過測試用例的數(shù)量,修復過的代碼通過的測試用例越多,說明修復效果越好.為了利用人類群體智慧進行故障定位,Adriano等人[99]討論了將復雜系統(tǒng)故障定位分解成可以眾包的微小任務的可能性,而Fryer等人[100]則對使用獎勵機制鼓勵有能力的人發(fā)現(xiàn)軟件漏洞的現(xiàn)象進行了系統(tǒng)的研究.
與上述研究相比,機器群體智能在程序自動修復中的應用更為廣泛,相關方法主要利用搜索算法對故障代碼進行修改,希望能夠在不改變代碼功能的情況下自動修復故障.例如Nguyen等人[109]提出了一種利用遺傳編程(genetic programming, GP)自動進行軟件修復的方法.通過將修改集中在與bug發(fā)生位置相關的區(qū)域,該方法有效地將搜索空間復雜性最小化,能在短時間內(nèi)生成大量的高質(zhì)量修復方案.Weimer等人[107]提出了一種用于故障定位和修復缺陷的全自動方法GenProg.一旦發(fā)現(xiàn)程序錯誤,GenProg就通過使用一種擴展形式的遺傳編程演化程序變體來生成修復方案,直到既保留了所需的功能又修復程序中的缺陷為止.Le等人[108]進一步通過實驗驗證了該方法的有效性.
除了高級程序語言外,程序修復還可以在匯編語言層次進行.面向匯編語言的修復不需要訪問源代碼,具有很強的普適性,而且所有修復都可以在更細粒度的級別上進行.例如Schulte等人[110]描述了一種利用進化計算在匯編代碼級自動修復遺留軟件的方法,在Java字節(jié)碼和x86匯編程序上的實驗展示了如何獲得在保留所需程序特征的同時糾正缺陷的程序變體.
此外,為了提高機器群體智能方法在程序修復應用中的有效性,需要提高機器群體智能評估修復結果的能力,F(xiàn)ast等人[111]研究了適應度函數(shù)的設計問題,其提出的適應度距離相關度量方法有助于提高算法的效率和準確性.Qi等人[112]則從測試用例優(yōu)化角度進行了研究,將回歸測試優(yōu)先級分析技術引入自動化程序修復領域,并提出了一種新的優(yōu)先級分析技術FRTP,能夠減少修復過程中所需執(zhí)行測試用例的數(shù)量,大大提高自動修復的效率.
在程序自動修復領域中,人機結合群體智能中人類群體智能的作用往往體現(xiàn)在為機器群體智能提供知識庫,增強機器群體智能的效果.機器群智方法應用于故障修復時,解決方案的搜索空間非常巨大,處理問題時復雜性非常高.例如雖然GenProg方法在應用時能顯示出非常好的效果,但是由于突變操作的隨機性,GenProg會生成無意義的補丁.Kim等人[115]利用人機結合群體智能,提出了基于模式的自動程序修復技術,將現(xiàn)有的人工編寫的補丁作為知識庫,通過學習總結出常見的修復模式為自動生成補丁服務.該方法生成的補丁比GenProg生成的補丁更容易被接受,且實驗中的生成的補丁成功修復錯誤的概率更高.Nguyen等人[114]在使用GI對程序進行修復時也參考了人工開發(fā)的補丁來提高程序自動修復的效果.
目前自動化軟件構造方法以形式化方法和模型驅(qū)動軟件開發(fā)方法為主,機器群體智能方法尚無法實現(xiàn)完全自動化的軟件構造,因此軟件構造階段的相關文獻數(shù)量最少,研究集中在程序優(yōu)化和修復上[94-96].與之相比,人類群體智能基本上是以經(jīng)驗知識庫的形式出現(xiàn),在軟件構造中發(fā)揮了輔助作用.機器群體智能反映了對自動化軟件構造目標的不懈追求,將人力從繁雜的編碼任務解放出來,但是機器群體智能在程序優(yōu)化和自動修復上的效果仍有待提高,搜索復雜性和解決方案本身距離滿足實用的要求也存在一定差距.
基于群體智能的軟件測試是基于群體智能的軟件工程研究的一個重要分支.軟件測試是搜索軟件中存在潛在錯誤的過程,這非常契合機器群體智能的使用方式,其中基于搜索的軟件測試便是這一方向的代表,也是SBSE中最為熱門的研究領域[121].同時,讓終端用戶參與到軟件測試過程中也是人類群體智能研究的關注點,目前已提出了很多基于眾包的軟件測試方法[122].
群體智能在軟件測試中的應用包括軟件測試和軟件驗證,如表5所示.在軟件測試中,人類群體智能研究包括測試用例生成[123-125]、Oracle問題[126]、GUI測試[127-128]、性能測試[129]和可用性測試[130]等;機器群體智能方法應用于測試用例生成[27,37,131-135]、測試用例排序[136]、Oracle問題[137]、GUI測試[138-141]、性能測試[142]、功能測試[143-144]和回歸測試[145]等和軟件模型檢測[146-149];人機結合群體智能在測試用例生成[150]和Oracle問題[150-151]中效果顯著.在軟件驗證中,人類群體智能在錯誤定位等方面有一些應用[152-153].

Table 5 Research on Collective Intelligence Based Software Testing表5 基于群體智能的軟件測試相關研究
機器群體智能在軟件工程領域應用的最早嘗試就是解決軟件測試數(shù)據(jù)生成問題.Miller等人[27]使用遺傳算法來自動生成浮點數(shù)測試數(shù)據(jù),首次將測試數(shù)據(jù)生成問題轉(zhuǎn)變?yōu)榛谒阉鞯膬?yōu)化問題.隨后,相關研究的發(fā)展十分迅速,基于搜索的軟件工程領域中超過一半的研究都關注在軟件測試[27],其中包括遺傳算法、蟻群算法等機器群體智能方法已被廣泛應用于測試用例的生成[37,131-135]、優(yōu)先級排序[136]等各種問題.
在回歸測試中,時間往往不足以執(zhí)行所有的測試用例,需要對測試用例的優(yōu)先級進行排序.Singh等人[136]實現(xiàn)了回歸測試排序技術的算法形式,使用ACO優(yōu)化了排序結果.在路徑測試中,Li等人[133]使用ACO自動化測試用例生成,使用代碼覆蓋率作為評估準則.類似地,Srivastava等人[134]也使用ACO自動生成測試用例來達到更好的代碼覆蓋率.在特殊情況下,對于某些容易出錯的程序路徑需要重點測試,Rao等人[135]提出了一種適用于測試比較容易出錯的路徑的方法,該方法提高了測試性能.Mahajan等人[131]曾提出一個模型,可以用來檢驗遺傳算法被用于使用數(shù)據(jù)流測試技術自動創(chuàng)建測試套件的性能,幫助評估測試用例生成的效果.
利用機器群體智能生成測試數(shù)據(jù)就是不斷搜索被測函數(shù)的輸入空間,生成新的測試數(shù)據(jù),不斷迭代直到測試數(shù)據(jù)集滿足給定覆蓋率等測試要求的過程.上述使用基于機器群體智能的測試用例生成方法能節(jié)省大量的人力資源,代碼覆蓋率也很高,但是在實現(xiàn)更高層次的代碼覆蓋上仍存在一些困難[154].
除了機器群體智能外,人類群體智能同樣也被應用于測試數(shù)據(jù)生成.其目的通常是利用人類智力的主觀性有意識地生成測試數(shù)據(jù),有助于減少重復或無用的測試用例數(shù)量,同時可以提高代碼覆蓋率.例如Chen等人[125]提出基于謎題的半自動測試環(huán)境,它將對象變異和復雜約束解決問題分解為小難題,采用游戲性的測試流程吸引人群,從而利用人群涌現(xiàn)的群體智能生成較優(yōu)的測試用例,該方法較當前一些自動測試用例生成技術提高了代碼覆蓋率.Pham等人[123]對Github開展了一項研究,GitHub社區(qū)中有能力的人可以很輕松地解決別人代碼庫中出現(xiàn)的問題,從這個現(xiàn)象中發(fā)現(xiàn)了從社會性代碼社區(qū)中生成測試用例的可能性[124],但是這個想法還有待完善.
研究者也嘗試使用人機結合群體智能來產(chǎn)生測試數(shù)據(jù),尤其是以人類知識庫的方式為機器群體智能的應用提供支持,希望可以提高自動化測試用例生成的效率和生成的測試用例質(zhì)量.例如McMinn等人[150]曾提出一種從開發(fā)者、源代碼和文檔抽取知識的自動測試數(shù)據(jù)生成方法,從而通過利用這些知識來生成更加貼近真實應用場景、和更加容易判斷測試結果的測試數(shù)據(jù).
除了測試用例生成和排序外,群體智能方法在其他測試問題上也得到了廣泛的應用.在測試用例的預期輸出問題中,預期輸出Oracle的判定通常需要人工來完成.Pastore等人[126]曾開展一項實驗來讓人群判斷程序斷言和代碼文檔描述的行為是否一致,他們發(fā)現(xiàn)人類群體智能對解決預期輸出問題有一定的幫助,但如何有效組織人類群體仍舊面臨巨大的挑戰(zhàn).
目前,盡管人工判定Oracle的成本很高,但很少有研究來提高這項工作的效率.人工判定Oracle成本的一個來源是機器生成的測試輸入通常具有不可讀性,例如自動生成的字符串輸入往往是難以讀取的任意字符序列.Afshan等人[151]提出了一種將自然語言模型引入基于搜索的輸入數(shù)據(jù)生成過程中,以提高生成字符串的可讀性的方法.實驗結果表明參與者在判定使用語言模型生成輸入的Oracle時,速度顯著加快,部分實驗在準確性上也有顯著提高.
Just等人[137]發(fā)現(xiàn)Oracle問題很難利用機器群體智能自動化解決,而利用底層函數(shù)或算法的約束來識別測試系統(tǒng)中的故障是比較有前景的判定Oracle的方法.
群體智能在針對不同開發(fā)方式和應用場景的軟件測試方法中也有著廣泛的應用,其中一個代表性例子是基于群體智能的圖形用戶界面(GUI)測試.GUI是如今軟件的重要組成部分,它的正確執(zhí)行是保證整個軟件正確性的必要條件.但是在機器群體智能的應用中,創(chuàng)建一個可用于自動化測試用例生成的模型是困難的[155],很少有工具能夠幫助自動化測試過程.大部分研究只針對GUI測試的一個小階段進行優(yōu)化.
在GUI測試上,目前工業(yè)界最常用的技術仍然是捕獲和重放工具,它簡化了輸入序列的記錄和執(zhí)行,但是不支持測試人員尋找故障敏感的測試用例.Bauersfeld等人[138-139]針對GUI測試序列生成問題,使用蟻群優(yōu)化算法來生成對故障敏感的測試用例.此外,在進行GUI測試時常常會因為只研究用戶界面而遺漏許多底層程序行為.Gross等人[140]開發(fā)出EXSYST原型工具,使用遺傳算法來生成測試用例,優(yōu)化GUI測試套件,以實現(xiàn)在探索用戶界面的同時保證最大可能的代碼覆蓋率.
上述研究表明群智優(yōu)化算法可以為GUI生成復雜的測試序列,但是測試序列有很強的隨機性.對于希望用戶在GUI中輸入特定輸入值的應用程序,測試效率會非常低.Salvesen等人[141]利用動態(tài)符號執(zhí)行生成特定輸入值,實驗中使用DSE對基于搜索的測試生成工具EXSYST進行拓展,成功增加了2個案例程序的測試代碼覆蓋率.
GUI測試難以自動化,而人工測試GUI非常費時、昂貴且難以集成到連續(xù)的測試過程中.Dolstra等人[127]展示了使用人類群體智能解決GUI測試的可能.實驗證明,通過實例化測試系統(tǒng)的虛擬機,讓測試人員通過互聯(lián)網(wǎng)訪問測試系統(tǒng)可以讓大量參與者參與到測試過程中,從而在軟件系統(tǒng)的連續(xù)測試中實現(xiàn)GUI的半自動連續(xù)測試,并且成本很低.Vliegendhart等人[128]在Amazon的眾包平臺Mechanical Turk上對一個多媒體應用程序進行A/B測試的例子同樣證明了人類群體智能在GUI測試上的巨大優(yōu)勢.
除了針對不同的待測軟件外,群體智能方法還被應用于軟件不同質(zhì)量屬性的測試.其中,性能測試是群體智能廣泛應用的一個領域,其目標通常是發(fā)現(xiàn)影響系統(tǒng)服務質(zhì)量QoS的因素,如響應時間、執(zhí)行效率和可靠性等.
在機器群體智能應用中,Gu等人[142]針對組合服務軟件系統(tǒng)提出一種基于遺傳算法的測試用例自動生成方法,該方法根據(jù)系統(tǒng)的工作流程,將系統(tǒng)使用模式建模為基于性能需求的QoS敏感因子,采用群智優(yōu)化算法自動尋找具有最大或最小QoS的測試用例.實驗證明該自動測試數(shù)據(jù)生成方法生成的測試數(shù)據(jù)優(yōu)于隨機測試.
然而,對系統(tǒng)建模仿真測試或者在受控環(huán)境中進行性能測試很難準確評估在極端異構環(huán)境中軟件運行的性能.利用人類群體智能,將用戶的真實使用性能數(shù)據(jù)收集起來用于性能測試評估能夠幫助開發(fā)者團隊識別和確定性能問題的優(yōu)先級.Musson等人[129]在Lync(18)https://products.office.com/en-us/previous-versions/microsoft-lync-2013平臺上的實驗證明了該方法的有效性.
并不是所有軟件測試問題都可以用機器群體智能解決.例如可用性測試是檢查軟件程序的人為因素和易用性等問題,人類群體智能基于人群的特點在這個領域有一些研究[130],但是機器群體智能很難在這個領域發(fā)揮作用.總的來說,群體智能被廣泛應用于解決各種軟件測試問題,除上面提到的研究以外,功能測試[143-144]、回歸測試[145]等不同測試方法中遇到的問題都可以借助群體智能解決.
軟件測試的目的是發(fā)現(xiàn)程序中的錯誤,而軟件驗證則更加關注軟件是否滿足其所聲明的功能性和非功能性需求.目前,機器群體智能在軟件驗證中的應用主要集中于模型檢測.例如Alba等人[146]將蟻群算法應用于模型檢測,在狀態(tài)空間中尋找反例.Banerjee等人[147]利用蟻群算法和粒子群算法來優(yōu)化模型檢測.Katz等人[148-149]使用基于模型檢查的GP在程序規(guī)格說明中驗證和合成代碼,其中模型檢查用于提供評估每個階段突變結果的適應度函數(shù)值.
軟件驗證一般由經(jīng)過專業(yè)訓練的工程師進行,如何讓未經(jīng)訓練的普通人也能夠進行軟件驗證工作是人類群體智能相關研究的重點.例如Dietl等人[152]將驗證任務轉(zhuǎn)化成為小游戲,普通人熟悉游戲玩法便可以通過游戲證明軟件的正確性.Li等人[153]建立了一個系統(tǒng)CrowdMine,通過模擬實驗證明未經(jīng)訓練的人群確實在一些軟件驗證工作如錯誤定位等有幫助作用.
從表5相關文獻數(shù)量可以看出,人類群體智能和機器群體智能在軟件測試與驗證階段都能發(fā)揮巨大作用,利用群體智能可以提高測試效率,降低成本.但是不同層次群體智能方法存在各自的優(yōu)缺點,需要根據(jù)測試的實際要求進行選擇.例如機器群體智能是一種廣泛適用的、有效的生成測試數(shù)據(jù)和優(yōu)化測試過程的方法,能夠解決許多人類群體智能不能解決的軟件測試問題[156];而人類群體智能利用大量在線工人參與完成測試任務,對真實應用場景和真實用戶表現(xiàn)的良好模擬是機器群體智能無法提供的[122].整體上來說,相比于傳統(tǒng)測試方法,群智方法更加高效、成本低廉,易于集成到持續(xù)集成過程中.
軟件維護階段的主要任務包括軟件演化以及軟件文檔和相關制品的更新.如表6所示,人類群體智能主要應用于軟件演化[157-159],機器群體智能在軟件演化[160]和軟件重構[161-163]及軟件模塊化[164-166]中都有研究,人機結合群體智能出現(xiàn)在軟件重構[167]中.其中,Mariani等人[168]曾總結了應用于確定軟件構件的最佳重構序列的基于搜索方法的共同特點,并討論了未來的研究機會.

Table 6 Research on Collective Intelligence Based Software Maintenance表6 基于群體智能的軟件維護相關研究
軟件的運行環(huán)境往往會隨著系統(tǒng)使用時間的增長而發(fā)生變化,對應地,軟件也需要不斷進行演化和更新.在軟件開發(fā)中,軟件的上下文環(huán)境是很難監(jiān)視的,Ali等人[157]提出Social sensing以利用終端用戶監(jiān)視軟件上下文環(huán)境的變化,不斷發(fā)掘用戶需求,從而進行軟件演化.He等人[158]提出一個模型,鼓勵用戶參與到軟件運行適應的流程中,用戶可以提出和修改他們的意見,應用程序借鑒這些建議可以使自身運行時更好地適應環(huán)境.例如Nebeling等人[159]采用眾包的方式,讓用戶參與網(wǎng)頁接口自適應過程中,從而讓網(wǎng)頁可以適應廣泛的使用環(huán)境.
人類群體智能通過引入人群作為軟件系統(tǒng)的評估對象對軟件進行演化和優(yōu)化,相比于上述人類群體智能的應用,機器群體智能在軟件演化上的研究較少.Schulte等人[160]利用程序的“中性網(wǎng)絡”和演化算法可以對軟件進行自動演化,這項研究將對現(xiàn)實軟件系統(tǒng)的開發(fā)人員和維護人員有巨大幫助.
軟件重構是提升程序性能以減緩其由于更改而性能退化的過程.重構意味著通過修改程序來改進程序結構,讓程序更容易理解.SBSE在軟件維護階段的研究重點就就是軟件重構問題,相關研究主要關注2個方面[10]:1)利用群體智能方法將軟件優(yōu)化,形成重構后的版本[161,167];2)優(yōu)化軟件的重構步驟,使重構獲得最好的效果[162-163].無論是軟件優(yōu)化過程還是重構步驟的選擇,在機器群體智能應用中都可以轉(zhuǎn)化為搜索問題,進而探索最優(yōu)的解決方案.在軟件重構中,機器群體智能應用的問題在于如何評估方案的好壞.
例如軟件系統(tǒng)反復修改會導致代碼壞味[172]的出現(xiàn).重構可以消除這些壞味,可以將代碼壞味作為評估重構方案的指標,但是手工確定和執(zhí)行有用的重構是一項艱巨的挑戰(zhàn).Kebir等人[162]提出一種基于遺傳算法的基于構件軟件自動重構方法.該方法包括利用遺傳算法生成優(yōu)化重構的最佳序列,檢測并消除與構件相關的代碼壞味.Mkaouer等人[163]進一步引入了一個基于NSGAⅡ的多目標健壯模型,該模型將軟件質(zhì)量改進、代碼壞味嚴重性和代碼的重要性作為評估的適應度函數(shù),通過對3個因素的權衡以獲取重構效果最大化.
人機結合群體智能同樣被應用于解決軟件重構問題.例如Ghannem等人[167]提出了一種交互式遺傳算法,該算法利用人的智力對產(chǎn)生的重構建議進行評估,從而提高重構活動的自動化程度.
軟件模塊化是降低軟件復雜性的重要方法,有助于軟件實現(xiàn)可控、可維護和可擴展.Mancoridis等人[164]最早將機器群體智能算法用于軟件的自動模塊化.該方法利用了傳統(tǒng)的爬山算法和遺傳算法,取得了不錯的效果.隨后Mancoridis等人[165]還開發(fā)了一個聚類工具Bunch,實現(xiàn)了軟件模塊聚類.在Mancoridis等人研究影響下,其他一些研究者也將軟件模塊聚類看作可以利用SBSE方法解決的研究問題.例如Harman等人[166]研究了將模塊粒度、內(nèi)聚性和耦合性度量作為評估的適應度函數(shù)的影響.
除上述軟件維護問題以外,群體智能還被應用在其他維護活動中.例如在把遺留系統(tǒng)遷移到面向?qū)ο蠹夹g體系中的過程中,在代碼中識別對象是整個過程的關鍵任務,Sahraoui等人[171]利用遺傳算法在過程代碼中識別對象解決了這一問題.
而在人類群體智能的應用上,眾包還被用來解決軟件文檔維護問題[169]和軟件本地化問題[170].例如Jiau等人[169]提出了一種眾包軟件文檔重用的方法,能夠有效解決軟件相關文檔不足的問題.研究團隊在Stackoverflow平臺上的研究證明了文檔重用的可行性,同時實驗還表明文檔重用能夠有效提高文檔的覆蓋率和質(zhì)量.
軟件本地化是指將軟件產(chǎn)品的用戶界面和輔助文檔從其原產(chǎn)國語言向另一種語言轉(zhuǎn)化,使之適應某一外國語言和文化的過程.Exton等人[170]發(fā)現(xiàn)眾包是解決本地化的可行方法,其使得軟件本地化的決策從大型企業(yè)轉(zhuǎn)移到服務用戶,從而使軟件可以有更多的語言可用,因此提出并描述了一種新的眾包模式,它可以為實現(xiàn)突破語言障礙的“信息與知識的平等獲取”提供一個平臺.在這個平臺上,軟件本地化的決策由用戶執(zhí)行,用戶個體出于自身利益不斷優(yōu)化本地化方案,并接受其他人評估和優(yōu)化,最終得到的語言解決方案應該是大家都認可,最優(yōu)的結果.
在軟件維護階段中,以用戶群體作為人類群體智能涌現(xiàn)主體可以在軟件文檔編寫、軟件本地化等任務發(fā)揮優(yōu)勢,給出更符合用戶群體需求的解決方案;而軟件重構問題,如重構序列確定問題對于非專業(yè)人群是十分困難的任務,但是非常符合搜索算法的優(yōu)化思想,因而更加適合使用機器群體智能解決[161].從表6相關論文數(shù)量可以看出,軟件維護是軟件生命周期的最后一個階段,常常被開發(fā)者忽視,但是其實是一個非常重要且成本很大的開發(fā)階段,群體智能有利于軟件維護工作自動化和簡單化發(fā)展.
群體智能在軟件工程中的應用十分廣泛,除了在軟件開發(fā)生命周期5個階段中有豐富的研究,在軟件工程的其他方面也有很多的應用.如表7所示,人類群體智能還被應用于軟件安全[17,173]、軟件用戶支持[174-176]和軟件創(chuàng)意競賽服務[177]等研究,機器群體智能則在軟件項目管理上擁有巨大優(yōu)勢[178-179].
為了利用人類群體智能保證軟件安全,Arellano等人[180]開發(fā)了一個基于眾包的Web擴展,不僅將用戶看作程序的使用者,更是程序想法設計的貢獻者,以保證Web應用程序的安全性和完整性.類似地,Sharifi等人[173]實現(xiàn)了一個名為SmartNotes的系統(tǒng),利用人群眾包檢測潛在的Web瀏覽安全威脅.
而在軟件用戶支持方面,Chilana等人[174-175]發(fā)現(xiàn)即使在以用戶為中心的設計和可用性方面做出了最大的努力,也不是所有的用例中的細微差別都能在設計時預料到,用戶在尋找軟件相關幫助也十分困難.基于此,他們設計了LemonAid方法,允許用戶從其他用戶那里找到問題的答案,讓軟件支持能夠被重用.Chilana等人[176]之后還對LemonAid進行實例研究,驗證了LenmonAid的價值和有效性.
開展創(chuàng)意競賽有益于眾包的推廣和軟件開放創(chuàng)新過程.Leimeister等人[177]發(fā)現(xiàn)許多基于信息技術的創(chuàng)意競賽不能吸引用戶積極參與,相關發(fā)現(xiàn)強調(diào)了主辦方的榮譽、獎勵和專業(yè)知識作為激勵的重要性.

Table 7 Research on Other Collective Intelligence Based Software Activities表7 其他基于群體智能的軟件工程活動相關研究
軟件工程項目管理關注的是軟件生命周期不同階段執(zhí)行的復雜活動管理,目標是優(yōu)化軟件生產(chǎn)過程以及這個過程產(chǎn)生的產(chǎn)品.機器群體智能對于這類多目標約束優(yōu)化問題有很強的處理能力,不同的解決方案生成算法和不同的評估適應度函數(shù)是研究的重點,其中Chang等人[178]最先將群智優(yōu)化算法應用在軟件項目管理中,而Kapur等人[179]使用遺傳算法在有限的時間限制下為客戶提供最優(yōu)的產(chǎn)品發(fā)布人員和最優(yōu)的服務質(zhì)量.
以基于搜索軟件工程為代表的機器群體智能在軟件工程中的應用已經(jīng)是一個相對成熟的研究領域了.但是,在已有的研究領域中還有許多問題無法使用機器群體智能來解決,包括在需求工程中如何尋找盡可能多且具有代表性的用戶群體、軟件測試中涉及人因工程的可用性測試和Oracle問題等.此外,各種新的軟件工程形式,如面向服務軟件工程[2]、云平臺軟件工程[181]、大數(shù)據(jù)軟件工程[182]的出現(xiàn)也向SBSE的廣泛應用帶來了新的挑戰(zhàn).
在研究新的軟件工程問題外,機器群體智能的發(fā)展還需要新方法和新技術的支持.機器學習能夠在一定程度上彌補機器群體智能的不足,增強機器群體智能算法的性能,主要表現(xiàn)在其能夠代替人工,加深機器群體智能方法的自動化程度,同時還能優(yōu)化群體智能算法性能.然而,這個交叉領域尚未成熟,許多問題還沒有現(xiàn)成可用的機器學習解決方案,使用機器學習解決問題的質(zhì)量也不能得到保證.
對于特定問題,機器群體智能使用者一直在尋找性能良好的群體優(yōu)化算法[183],然而這是一個非常困難的過程.同時,機器群體智能通常依賴定制化的搜索算法來確保在具體問題上取得理想的效果[184].未來機器群體智能應用的一種新方式應該是在廣泛的問題實例中學習搜索策略,提供一種類似超啟發(fā)式搜索的單一的泛型方法[168].另一方面,通過機器學習的數(shù)據(jù)分析預測能力能夠為機器群體智能的應用提供新思路,提高機器群體智能算法的效率.例如,在軟件測試中,根據(jù)已有測試結果預測哪些剩余的測試用例會失敗,哪些測試應該有更高的優(yōu)先級,通過預測能力加快軟件測試的速度.
如今軟件工程以及機器學習都和大數(shù)據(jù)技術緊密相連,大數(shù)據(jù)軟件工程因而也為機器群體智能的應用提供了借鑒.在此基礎上,基于機器群體智能的軟件工程范式應該轉(zhuǎn)變?yōu)閿?shù)據(jù)驅(qū)動的軟件工程方法,即首先通過大數(shù)據(jù)技術從已有軟件系統(tǒng)、開源軟件和社區(qū)中采集海量的數(shù)據(jù)并組織形成信息,隨后通過對相關信息的整合和提煉,以機器群體智能為基礎形成自動化的軟件工程問題解決模型.
人類群體智能通常從大規(guī)模人群的競爭與合作中涌現(xiàn),其有效性高度依賴于人類群體的組織管理模式、人類群體智能的激勵機制以及質(zhì)量保證3個方面的因素.
當前人類群體智能方法還停留在組織管理單個人類群體解決實際問題的階段,未來人類群體智能應用的新方式應該是將項目分解為小任務,交給多個人群完成,利用不同人群的特點解決不同的任務,從而提高群體智能的利用效率.例如在基于多人類群智的軟件開發(fā)前期,需求捕獲和原型開發(fā)可以同時進行,一個人群用于收集需求,另一個人群為這些需求開發(fā)原型,人群中個體的特征取決于這個人群需要處理的問題.
人類智能方法應用的困難在于如何有效促進人群中個體之間的協(xié)同作用[32],未來人類群體智能領域需要加強對人類群體智能的形成機理和人群協(xié)作規(guī)律的探索,為高效組織管理人類群體和促進協(xié)同作用提供堅實的理論基礎.另外,當前互聯(lián)網(wǎng)是人類群體智能涌現(xiàn)的主要平臺,需要解決人類群體智能方法在互聯(lián)網(wǎng)平臺上應用的相關問題,例如人群組織管理相關的核心服務如何整合到互聯(lián)網(wǎng)平臺中.人類群體智能本身十分抽象,在使用時如何對群體協(xié)作程度進行度量與調(diào)控,保證群體智能的工作效率需要更多的研究.
人類群體智能的激勵機制是群體智能涌現(xiàn)的動力,對于激發(fā)參與者積極性和確保可靠的交付平臺至關重要[185].Groen等人[186]在基于人群的需求工程中將參與者的自身動力分為7種,但是大部分已有人類群體智能應用激勵單一,因而僅能吸引小部分人群;或者激勵機制不合理,打擊大部分參與者的積極性.最好的方式就是針對不同類型的個體給予相應的激勵機制,但是這種方式在實現(xiàn)中十分的不切實際,還有很多問題需要解決.
使用人類群體智能解決問題的質(zhì)量保證是最重要的問題.參與者短期參與項目,參與者的個人背景和工作能力各不相同,依賴上述人群完成的任務往往容易產(chǎn)生質(zhì)量問題[187].眾包軟件開發(fā)中存在23個和質(zhì)量有關的因素[188],質(zhì)量保證問題非常復雜.許多質(zhì)量相關工作有待評估,軟件質(zhì)量保證將會是人類群體智能方法未來的關注重點.
人機結合群體智能結合了機器的高度并行性和人類智力的優(yōu)點,是一種發(fā)揮基于群體智能的軟件工程優(yōu)點的有效方法.其中,人機之間的相互關系和組織形式是人機結合群體智能應用所面臨的關鍵問題,即如何針對人類和機器的特點設計并分配最為合適的任務.
現(xiàn)有的人機結合群體智能應用的出發(fā)點在于機器群體智能在某些問題上存在局限性,需要人類智力的幫助才能解決問題.例如在Cochran等人[113]提出的Program boosting方法中,通過專業(yè)人群生成群智優(yōu)化算法的初始解,讓未經(jīng)訓練的人群評估解的質(zhì)量是人機結合群體智能的良好嘗試.但是,這種形式的人機結合群體智能僅將人類智能作為機器群體智能的補充,如何利用機器學習方法來進一步增強人機結合的能力,以及如何將半自動化人機結合群體智能轉(zhuǎn)化為全自動化人機結合群體智能仍需要進一步研究.
此外,人機群體智能需要的人的知識可以通過建立知識庫來實現(xiàn)基于群體智能的軟件工程方法的自動化.人群知識庫對絕大部分軟件工程問題都應該有借鑒意義,因此在建立普遍適用的人群知識庫時,知識的表示和共享要能滿足復用知識庫的要求,并遵循一定的規(guī)范.在此基礎上,復用人群知識庫能縮減軟件工程問題求解所需時間,提高軟件生產(chǎn)力.不同知識庫的相互補充還能使得全自動群體智能的性能不斷提升,提高解決問題的性能.
基于群體智能的軟件工程為解決復雜軟件工程問題提供了新的思路,已成為現(xiàn)代軟件工程方法的重要組成部分.為了進一步推廣該方法,還有必要開展更多的經(jīng)驗研究,并與傳統(tǒng)軟件工程方法進行系統(tǒng)對比.同時,還需要針對云平臺系統(tǒng)、移動應用、智能軟件系統(tǒng)等新興軟件系統(tǒng)的特點開展基于群體智能的軟件工程的實證研究和示范性應用.此外,需要開發(fā)全面的基于群體智能的軟件工程工具集,為該領域的推廣奠定基礎.
基于群體智能的軟件工程是當前軟件工程領域研究的前沿和熱點,具有良好的發(fā)展和應用前景.本文首先提出了涵蓋機器群體智能、人類群體智能以及人機結合群體智能的基于群體智能的軟件工程方法統(tǒng)一框架,隨后從軟件生命周期中的需求分析、設計、構造、測試和維護5個方面總結了上述3個層次群體智能方法在軟件工程領域的應用,最后討論了不同層次群體智能未來的發(fā)展方向和可能的挑戰(zhàn).