曾國蓀, 丁春玲(同濟大學(xué) .電子與信息工程學(xué)院;.化學(xué)科學(xué)與工程學(xué)院,上海,200092)
“軟件工程”是計算機專業(yè)的骨干課程,是應(yīng)用計算機科學(xué)、數(shù)學(xué)及管理科學(xué)等進行軟件開發(fā)的工程科學(xué),強調(diào)思想性、方法論、標(biāo)準(zhǔn)化、實踐觀為一體。軟件工程課程旨在使學(xué)生掌握軟件項目開發(fā)和維護的一般過程,掌握軟件開發(fā)的傳統(tǒng)方法和最新技術(shù),為今后就業(yè)打下良好基礎(chǔ),培養(yǎng)高素質(zhì)人才[1-4]。軟件工程是計算機專業(yè)的一門必修課程,早在1991年,IEEE-CS/ACM聯(lián)合工作組就將“軟件工程”列為計算機學(xué)科的9個知識領(lǐng)域之一。軟件工程是一門實踐性很強的綜合性課程,其他計算機課程,如程序設(shè)計語言、數(shù)據(jù)庫、操作系統(tǒng)等都是軟件工程的先導(dǎo)課程。在軟件開發(fā)的各個階段都會用到有關(guān)的知識,可以說軟件工程課程與先導(dǎo)課程是相互作用和影響的,并對這些課程起到重要的支撐和引領(lǐng)作用[5-7]。
程序設(shè)計方法是軟件工程課程主講的內(nèi)容。軟件工程課程主要內(nèi)容包括軟件工程概述、軟件過程模型、軟件設(shè)計方法、軟件項目管理等[8-10],其中軟件設(shè)計方法又包含問題定義、可行性分析、需求分析、總體和詳細設(shè)計、編碼測試、軟件維護等知識,可見程序設(shè)計方法是課程的重點。計算機發(fā)展至今,先后出現(xiàn)了面向機器的程序設(shè)計、面向過程的程序設(shè)計、面向?qū)ο蟮某绦蛟O(shè)計、面向構(gòu)件的程序設(shè)計、面向方面的程序設(shè)計等方法[11]。上述程序設(shè)計方法各有特色,理念不同、關(guān)注點不一樣、也都存在缺陷。隨著信息新技術(shù)的出現(xiàn),網(wǎng)絡(luò)搜索成為一種習(xí)慣,有必要講解基于搜索的程序設(shè)計方法。
程序編碼效率是軟件項目開發(fā)的生命。軟件項目通常規(guī)模大,程序復(fù)雜性高,如何在預(yù)定時間和預(yù)算內(nèi)完成開發(fā),是項目成敗的關(guān)鍵。但是,軟件開發(fā)效率很低,既跟不上硬件的發(fā)展速度,也落后用戶的期待。為了解決上述問題,可從程序編碼效率上尋求突破。據(jù)統(tǒng)計,程序編碼在整個軟件生命周期中,占據(jù)了高達37%的時間成本和40%的人力成本,因而編碼效率直接影響著軟件的生產(chǎn)率,提高程序編碼效率可以大幅度縮短軟件項目的開發(fā)時間。
開源代碼復(fù)用是提高軟件開發(fā)效率的重要手段。軟件復(fù)用包括知識方法復(fù)用、代碼復(fù)用、標(biāo)準(zhǔn)和文檔資料復(fù)用等。其中開源代碼復(fù)用是最有效的形式,開源代碼可以來自代碼托管平臺和開源社區(qū)等場所。進行代碼復(fù)用的好處很多,在應(yīng)用系統(tǒng)開發(fā)中可以充分利用已有的開發(fā)成果,消除包括分析、設(shè)計、編碼、測試等在內(nèi)的許多重復(fù)勞動。程序員使用一個可復(fù)用庫,其中的源代碼和功能都是他們所需要和熟知的。從長遠角度講,有利于明確人員分工和個人的經(jīng)驗積累。代碼復(fù)用技術(shù)還有利于減少培訓(xùn)開銷,即雇員在熟悉任務(wù)時所需的非正式的開銷。軟件復(fù)用技術(shù)的另一個好處在于對快速原型的支持,即可以快速構(gòu)造軟件系統(tǒng)可操作的模型,大大提高項目的開發(fā)效率[12-13]。
復(fù)用代碼依賴精準(zhǔn)搜索引擎查找。據(jù)統(tǒng)計,SearchCode開源庫擁有超過500萬個開源項目、180億行開源代碼。為了發(fā)現(xiàn)需要的源代碼,程序員平均需花費19%的編程時間搜索代碼。目前搜索途徑大都采用“基于關(guān)鍵詞的搜索”,雖然能夠搜索所需要的源代碼,但是返回結(jié)果太多,很難獲取真正想要的源代碼。因此,本項目進一步探索精準(zhǔn)搜索開源代碼的新方法。事實上,程序代碼之所以能夠被計算機編譯,必須滿足一些規(guī)則和要求。例如,代碼的語法和語義信息就是可以被利用開展搜索的信息,通過這兩方面的信息,可以唯一確定所需的源代碼,從而可以設(shè)計基于語法和語義結(jié)合的精準(zhǔn)搜索引擎。
基于智能搜索的程序設(shè)計方法呼之欲出。據(jù)統(tǒng)計,新軟件項目中,約80%的源代碼都可在以前的軟件項目中找到,并進行復(fù)用。因此,應(yīng)該站在巨人的肩膀上,在程序設(shè)計時盡量利用已有的源代碼。目前傳統(tǒng)的程序設(shè)計方法,能夠利用同一項目中已經(jīng)存在的函數(shù)、類、構(gòu)件、庫文件等,進行內(nèi)部調(diào)用,但是如果超出了項目的范圍,代碼則不能復(fù)用。此時就需要智能搜索,除了提供快速檢索、相關(guān)度排序等功能,還能提供用戶輸入內(nèi)容的語義理解、智能信息過濾和主動推薦源代碼等功能[14]。
在智能搜索的基礎(chǔ)上,呼吁一種新的程序設(shè)計方法,即一種“基于搜索的程序設(shè)計方法”,從程序設(shè)計哲學(xué)思想、邏輯理念、方法技術(shù)、過程實現(xiàn)等方法改善傳統(tǒng)程序設(shè)計方法,其根本目的是提高軟件開發(fā)效率。
縱觀軟件技術(shù)發(fā)展歷史,程序設(shè)計方法從面向機器、面向過程、面向?qū)ο?,發(fā)展到面向組件、面向agent,面向服務(wù)等多種方法。針對程序設(shè)計方法的哲學(xué)思想、關(guān)注點、驅(qū)動力、邏輯、特色、不足等,可用圖1所示進行比較。
隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展和源碼開放運動的興起,網(wǎng)絡(luò)上越來越多的優(yōu)秀的開源代碼可以被人們下載學(xué)習(xí)和使用。以目前最大的開源社區(qū)sourceforge.net為例,該社區(qū)共享了179 518個開源工程擁有200萬的注冊用戶,以及數(shù)量更為龐大的匿名用戶群[5],其中不乏優(yōu)秀代碼片段。假如能夠開發(fā)一套先進的開源代碼搜索系統(tǒng),能夠根據(jù)開發(fā)者的搜索需求,精確返回可信的代碼以供選擇,制作成模板或者庫函文件,通過繼承(extends)和實現(xiàn)(implements)等手段實現(xiàn)重用。那么在大規(guī)模的程序開發(fā)中,將大大降低人員的學(xué)習(xí)成本和勞動成本,編程的效率必將大幅提高。
目前,基于“搜索”的編程方法,最初級的階段是利用通用搜索引擎來實現(xiàn)。程序設(shè)計過程中,當(dāng)需要實現(xiàn)一個模塊的某個功能時,程序員往往希望盡量利用現(xiàn)存的方案,因此需要通過一些搜索渠道查找相關(guān)信息,例如百度等通用搜索引擎。由于返回的結(jié)果通常是一段或多段源代碼,因此這種也被稱為“源代碼級”的搜索。這種傳統(tǒng)的搜索方法明顯存在兩個嚴(yán)重的不足:①存在大量無關(guān)信息的干擾。當(dāng)搜索引擎返回程序設(shè)計方面的結(jié)果的同時,難以避免地也會夾雜著一些無關(guān)信息,要想得到準(zhǔn)確和期望的結(jié)果,必須掌握一定的搜索技巧,這無疑給原本單純的操作增加了障礙。②可信度無法判斷。通用搜索引擎的輸出結(jié)果排序完全取決于通用的排序算法,程序員通常不能在第一時間確定與搜索請求最相符的代碼,且代碼的質(zhì)量無從判斷,利用這種開放代碼編寫的軟件存在缺陷的可能性非常高。為此,軟件開發(fā)者需要建立一套更為合理的“基于搜索的編程方法”,提供更專業(yè)、高效、多樣的搜索功能。根據(jù)不同的代碼重用需求,提供不同粒度的搜索支持。其中最大粒度的是軟件開發(fā)的整個架構(gòu),盡管軟件的功能不盡相同,但是其運行都可以依托于近乎相似的架構(gòu),例如“LAMP”的網(wǎng)站架構(gòu)、TCP/IP 網(wǎng)絡(luò)協(xié)議模型等都可以作為程序開發(fā)的參考。中等粒度的是功能模塊的搜索,此時的搜索對象大多為構(gòu)件,這是一種可單獨生產(chǎn)、獲取、部署的二進制單元,依靠.NET、EJB等框架,它們之間可以互相作用構(gòu)成一個軟件功能系統(tǒng)。最小粒度也是目前最為常用的是源代碼的搜索。
圖1 程序設(shè)計方法演進圖
為了迎合程序員的編程習(xí)慣,接近企業(yè)軟件開發(fā)實際情況,構(gòu)建一種支持“即時編程錄入,即時代碼搜索”的程序設(shè)計支撐系統(tǒng)。當(dāng)程序員編程輸入代碼時,根據(jù)輸入預(yù)測所需代碼,將結(jié)果返回到編程界面,程序員可以即時選擇使用,并且在編程結(jié)束后,對這次匹配進行是否正確的反饋,方便提高今后的匹配準(zhǔn)確率。通過這種方法達到共享開源代碼的目的,整個過程無需主動搜索,是一種友好快速高效的編程環(huán)境,是一種新的編程方法的實踐和體驗。
為了讓軟件工程課程的教學(xué)內(nèi)容追趕最新的軟件技術(shù),讓專業(yè)學(xué)生在實驗室中體驗最新的軟件設(shè)計方法,我們開展了基于搜索編程的實驗教學(xué)建設(shè),同時得到學(xué)校實驗室與設(shè)備管理處的大力支持。主要工作內(nèi)容如下:
(1) 海量開源代碼庫的構(gòu)建。基于搜索編程首先需要源代碼庫,否則是無米之炊。代碼庫的構(gòu)建主要有3個任務(wù):①源代碼爬取操作:確定爬取場所為開源代碼搜索引擎,例如searchcode,爬取對象為C語言源代碼。為了提高效率,采用多臺電腦分布式協(xié)作,多線程并行抓取。②源代碼數(shù)據(jù)存儲操作:采用分布式文件系統(tǒng)HDFS方式,存儲對象是以函數(shù)為粒度的源代碼文件,每個文件只保存一個函數(shù)體。③源代碼庫索引建立操作:利用Lucerne建立倒排索引,源代碼屬性值除了代碼中的關(guān)鍵字外,還包括為了精準(zhǔn)搜索的語法和語義信息,將一個Document與一個物理源代碼文件相對應(yīng)。通過構(gòu)建本地源代碼庫,為基于搜索的程序設(shè)計方法提供了搜索數(shù)據(jù)源的支持。
(2) 精準(zhǔn)代碼搜索引擎設(shè)計和開發(fā)。源代碼的搜索主要有兩個目標(biāo),找全,找準(zhǔn)。傳統(tǒng)的基于關(guān)鍵詞搜索能夠滿足一定的要求,但難達到精準(zhǔn)匹配的效果。因此,本項目設(shè)計“基于語法和語義的新型源代碼搜索引擎”,旨在找全找準(zhǔn)兩個目標(biāo)上有所提高。在語法方面,利用“程序流程圖”進行搜索,流程圖主要通過三種基本結(jié)構(gòu)(順序、分支、循環(huán))反映程序的執(zhí)行順序和過程。用戶在搜索時,可以根據(jù)經(jīng)驗預(yù)設(shè)程序中包括多少循環(huán),多少分支,提高搜索的精度。在語義方面,利用“輸入/輸出”進行搜索,用戶提交對輸入/輸出變量的數(shù)目和類型描述,得到所有符合要求的結(jié)果。因此,充分利用語法和語義結(jié)合進行搜索和匹配,可以提高搜索的精準(zhǔn)度。
(3) 校園網(wǎng)站實驗平臺構(gòu)建。本實驗環(huán)境的特色和用意是實踐和鍛煉一種新的程序設(shè)計方法,新的知識點用傳統(tǒng)的軟件工程實驗教學(xué)環(huán)境無法支持,不能滿足這個目的要求,也無法從現(xiàn)有公司或企業(yè)買來產(chǎn)品來幫助本實驗的開展。因此,只能通過自主開發(fā)和構(gòu)建新的實驗平臺。同時,考慮到軟件工程課程實驗學(xué)時少,不能增加課堂授課時間,計算機專業(yè)學(xué)生學(xué)習(xí)比較自由自助自主,不需要提供固定的時間和固定的場所,激發(fā)學(xué)生對新技術(shù)的興趣以及創(chuàng)新意識等,利用校園Internet網(wǎng),進行開放性實驗室的建設(shè)。組織研究生采用Java技術(shù)設(shè)計網(wǎng)站,根據(jù)實驗任務(wù)構(gòu)建實驗平臺,例如http://10.60.138.179:8080/SearchEngine/,該網(wǎng)站在我校校園內(nèi)均可訪問,學(xué)生可以隨時隨地隨意進行實驗。
(4) 代碼復(fù)用搜索實驗內(nèi)容設(shè)計。實驗內(nèi)容建設(shè)遵循與理論緊密結(jié)合的原則,做到有針對性、層次性、可操作性、趣味性和適當(dāng)難度性。保證學(xué)生都能完成實驗而促進學(xué)生學(xué)習(xí)信心的建立;精心設(shè)計每部分的上網(wǎng)實驗題目,適當(dāng)限定查找設(shè)計范圍,為學(xué)生指明一條捷徑,避免學(xué)生無所適從,調(diào)動學(xué)生的積極性和學(xué)習(xí)熱情;體現(xiàn)寓教于樂,興趣驅(qū)動,使每個學(xué)生都有滿足感,充分調(diào)動學(xué)習(xí)的主動性和創(chuàng)造性,施展學(xué)生的才華,逐漸對課程產(chǎn)生興趣,大大提高學(xué)生的設(shè)計欲望和創(chuàng)新動力。另外,適當(dāng)?shù)馗郊与y度,激發(fā)優(yōu)秀學(xué)生進一步鉆研的斗志。為此,選擇幾個代碼復(fù)用搜索的題目:①快速排序源代碼搜索,②求解線性方程組源代碼搜索,③求圖中兩點間最短路徑源代碼搜索,④根據(jù)興趣學(xué)生自選源代碼搜索。
(5) 實驗操作手冊編寫。由于是一個全新的網(wǎng)絡(luò)教育實驗環(huán)境,操作手冊的編制是為了讓學(xué)生了解和熟悉本次實驗的方法、目的、內(nèi)容、過程等,具體的操作細節(jié)包括:注冊登錄、源代碼搜索、代碼分類瀏覽、代碼抓取、用戶滿意度評價、后臺管理等。為了使系統(tǒng)功能劃分明確,系統(tǒng)運行穩(wěn)健,將用戶分為學(xué)生、老師、管理員等,各自具有相應(yīng)操作分類和權(quán)限。
(6) 實驗教學(xué)效果網(wǎng)絡(luò)自動評價機制?!皩W(xué)習(xí)-實踐-反饋”是學(xué)生掌握知識、提高能力的一般過程,故應(yīng)十分重視實驗效果反饋評價。為了避免傳統(tǒng)考評機制的缺陷,杜絕實驗中的克隆現(xiàn)象,做到公正、公平、合理、科學(xué),本實驗環(huán)境特別設(shè)置兩個手段進行網(wǎng)絡(luò)自動考評,①開辟一個用戶滿意度窗口,學(xué)生用戶隨時可以錄入實驗感受、問題、意見等,老師用戶隨時可以進行相應(yīng)點評交流。②根據(jù)學(xué)生實驗過程中,針對要求的實驗內(nèi)容,即復(fù)用搜索源代碼的精準(zhǔn)度給予學(xué)生掌握知識、實驗效果好壞的評價,精準(zhǔn)越高,成績越高。上述評價過程完全是網(wǎng)絡(luò)自動進行的,不摻雜指導(dǎo)老師的任何主觀意見。
在人工智能時代,利用前人的智慧開發(fā)軟件,復(fù)用源代碼,是一種高效的編程方法。為了將最新的程序設(shè)計方法引入到軟件工程課程教學(xué)中,構(gòu)建了基于搜
索編程的實驗教學(xué)環(huán)境,提供給學(xué)生自由、自助、自主開展教學(xué)實驗,學(xué)生感受新鮮,教學(xué)效果良好,為大學(xué)專業(yè)教學(xué)進行了一次大膽改革和有益嘗試。
參考文獻(References):
[1] 何文廣, 周 珂, 熊剛強. 程序設(shè)計課程實驗教學(xué)改革與實踐[J].實驗室研究與探索, 2016, 35(6): 163-165.
[2] Weiser M.The computer for the 21st century [J]. ScientificAmerican,1991, 265(3): 94-104.
[3] 陳中育,呂振洪,葉榮華.軟件工程專業(yè)課程建設(shè)的思考與實踐[J].計算機教育, 2013(10):48-51.
[4] Dahotre A,Krishnamoorthy V,Corley M,etal. Using intelligenttutors to enhance student learning of application programminginterfaces[J]. Journal of Computing Sciences in Colleges, 2011, 27(1):195-201.
[5] Gao M, Ma Y, Xiong Q,etal. Construction andimplementation of surveillance system for software engineeringoriented training[J]. International Review on Computers and Software, 2012, 7(4):1855-1859.
[6] 吳春雷,剛 旭,崔學(xué)榮. 軟件工程綜合實驗課程的改革與建設(shè)[J]. 實驗室研究與探索, 2017, 36(1):180-184.
[7] 肖祥慧,林冬梅,胡春萍.基于網(wǎng)絡(luò)學(xué)習(xí)的軟件工程實驗教學(xué)研究[J]. 電腦知識與技術(shù), 2013(9): 2194-2196.
[8] 江 頡, 石曉耀. 面向?qū)ο蟮能浖こ套灾鲗嶒灲虒W(xué)改革[J]. 實驗技術(shù)與管理, 2007,24(5): 112-114.
[9] 蔡 勇, 楊海中. 軟件工程實驗教學(xué)體系的探討[J]. 實驗室研究與探索, 2008, 27(2): 49-55.
[10] 陳云芳, 孫力娟. 軟件工程專業(yè)課程體系研究[J]. 高等工程教育研究, 2009(2):140-144.
[11] 張海藩. 軟件工程導(dǎo)論[M]. 北京:清華大學(xué)出版社, 2013.
[12] Paul S, Prakash A. A framework for source code search using program patterns [J]. IEEE Transactions onSoftware Engineering, 1994, 20(6):463-475.
[13] 張 康, 曾國蓀. 開源對軟件工程的作用及關(guān)鍵搜索技術(shù)分析[J]. 微型機與應(yīng)用, 2015,34(24): 8-12.
[14] StoleeK T, Elbaum S, Dobos D. Solving thesearch for source code[J]. ACM Transactions on SoftwareEngineering and Methodology, 2014, 23(3): 1-45.