曾國(guó)蓀, 丁春玲(同濟(jì)大學(xué) .電子與信息工程學(xué)院;.化學(xué)科學(xué)與工程學(xué)院,上海,200092)
“軟件工程”是計(jì)算機(jī)專業(yè)的骨干課程,是應(yīng)用計(jì)算機(jī)科學(xué)、數(shù)學(xué)及管理科學(xué)等進(jìn)行軟件開發(fā)的工程科學(xué),強(qiáng)調(diào)思想性、方法論、標(biāo)準(zhǔn)化、實(shí)踐觀為一體。軟件工程課程旨在使學(xué)生掌握軟件項(xiàng)目開發(fā)和維護(hù)的一般過(guò)程,掌握軟件開發(fā)的傳統(tǒng)方法和最新技術(shù),為今后就業(yè)打下良好基礎(chǔ),培養(yǎng)高素質(zhì)人才[1-4]。軟件工程是計(jì)算機(jī)專業(yè)的一門必修課程,早在1991年,IEEE-CS/ACM聯(lián)合工作組就將“軟件工程”列為計(jì)算機(jī)學(xué)科的9個(gè)知識(shí)領(lǐng)域之一。軟件工程是一門實(shí)踐性很強(qiáng)的綜合性課程,其他計(jì)算機(jī)課程,如程序設(shè)計(jì)語(yǔ)言、數(shù)據(jù)庫(kù)、操作系統(tǒng)等都是軟件工程的先導(dǎo)課程。在軟件開發(fā)的各個(gè)階段都會(huì)用到有關(guān)的知識(shí),可以說(shuō)軟件工程課程與先導(dǎo)課程是相互作用和影響的,并對(duì)這些課程起到重要的支撐和引領(lǐng)作用[5-7]。
程序設(shè)計(jì)方法是軟件工程課程主講的內(nèi)容。軟件工程課程主要內(nèi)容包括軟件工程概述、軟件過(guò)程模型、軟件設(shè)計(jì)方法、軟件項(xiàng)目管理等[8-10],其中軟件設(shè)計(jì)方法又包含問(wèn)題定義、可行性分析、需求分析、總體和詳細(xì)設(shè)計(jì)、編碼測(cè)試、軟件維護(hù)等知識(shí),可見程序設(shè)計(jì)方法是課程的重點(diǎn)。計(jì)算機(jī)發(fā)展至今,先后出現(xiàn)了面向機(jī)器的程序設(shè)計(jì)、面向過(guò)程的程序設(shè)計(jì)、面向?qū)ο蟮某绦蛟O(shè)計(jì)、面向構(gòu)件的程序設(shè)計(jì)、面向方面的程序設(shè)計(jì)等方法[11]。上述程序設(shè)計(jì)方法各有特色,理念不同、關(guān)注點(diǎn)不一樣、也都存在缺陷。隨著信息新技術(shù)的出現(xiàn),網(wǎng)絡(luò)搜索成為一種習(xí)慣,有必要講解基于搜索的程序設(shè)計(jì)方法。
程序編碼效率是軟件項(xiàng)目開發(fā)的生命。軟件項(xiàng)目通常規(guī)模大,程序復(fù)雜性高,如何在預(yù)定時(shí)間和預(yù)算內(nèi)完成開發(fā),是項(xiàng)目成敗的關(guān)鍵。但是,軟件開發(fā)效率很低,既跟不上硬件的發(fā)展速度,也落后用戶的期待。為了解決上述問(wèn)題,可從程序編碼效率上尋求突破。據(jù)統(tǒng)計(jì),程序編碼在整個(gè)軟件生命周期中,占據(jù)了高達(dá)37%的時(shí)間成本和40%的人力成本,因而編碼效率直接影響著軟件的生產(chǎn)率,提高程序編碼效率可以大幅度縮短軟件項(xiàng)目的開發(fā)時(shí)間。
開源代碼復(fù)用是提高軟件開發(fā)效率的重要手段。軟件復(fù)用包括知識(shí)方法復(fù)用、代碼復(fù)用、標(biāo)準(zhǔn)和文檔資料復(fù)用等。其中開源代碼復(fù)用是最有效的形式,開源代碼可以來(lái)自代碼托管平臺(tái)和開源社區(qū)等場(chǎng)所。進(jìn)行代碼復(fù)用的好處很多,在應(yīng)用系統(tǒng)開發(fā)中可以充分利用已有的開發(fā)成果,消除包括分析、設(shè)計(jì)、編碼、測(cè)試等在內(nèi)的許多重復(fù)勞動(dòng)。程序員使用一個(gè)可復(fù)用庫(kù),其中的源代碼和功能都是他們所需要和熟知的。從長(zhǎng)遠(yuǎn)角度講,有利于明確人員分工和個(gè)人的經(jīng)驗(yàn)積累。代碼復(fù)用技術(shù)還有利于減少培訓(xùn)開銷,即雇員在熟悉任務(wù)時(shí)所需的非正式的開銷。軟件復(fù)用技術(shù)的另一個(gè)好處在于對(duì)快速原型的支持,即可以快速構(gòu)造軟件系統(tǒng)可操作的模型,大大提高項(xiàng)目的開發(fā)效率[12-13]。
復(fù)用代碼依賴精準(zhǔn)搜索引擎查找。據(jù)統(tǒng)計(jì),SearchCode開源庫(kù)擁有超過(guò)500萬(wàn)個(gè)開源項(xiàng)目、180億行開源代碼。為了發(fā)現(xiàn)需要的源代碼,程序員平均需花費(fèi)19%的編程時(shí)間搜索代碼。目前搜索途徑大都采用“基于關(guān)鍵詞的搜索”,雖然能夠搜索所需要的源代碼,但是返回結(jié)果太多,很難獲取真正想要的源代碼。因此,本項(xiàng)目進(jìn)一步探索精準(zhǔn)搜索開源代碼的新方法。事實(shí)上,程序代碼之所以能夠被計(jì)算機(jī)編譯,必須滿足一些規(guī)則和要求。例如,代碼的語(yǔ)法和語(yǔ)義信息就是可以被利用開展搜索的信息,通過(guò)這兩方面的信息,可以唯一確定所需的源代碼,從而可以設(shè)計(jì)基于語(yǔ)法和語(yǔ)義結(jié)合的精準(zhǔn)搜索引擎。
基于智能搜索的程序設(shè)計(jì)方法呼之欲出。據(jù)統(tǒng)計(jì),新軟件項(xiàng)目中,約80%的源代碼都可在以前的軟件項(xiàng)目中找到,并進(jìn)行復(fù)用。因此,應(yīng)該站在巨人的肩膀上,在程序設(shè)計(jì)時(shí)盡量利用已有的源代碼。目前傳統(tǒng)的程序設(shè)計(jì)方法,能夠利用同一項(xiàng)目中已經(jīng)存在的函數(shù)、類、構(gòu)件、庫(kù)文件等,進(jìn)行內(nèi)部調(diào)用,但是如果超出了項(xiàng)目的范圍,代碼則不能復(fù)用。此時(shí)就需要智能搜索,除了提供快速檢索、相關(guān)度排序等功能,還能提供用戶輸入內(nèi)容的語(yǔ)義理解、智能信息過(guò)濾和主動(dòng)推薦源代碼等功能[14]。
在智能搜索的基礎(chǔ)上,呼吁一種新的程序設(shè)計(jì)方法,即一種“基于搜索的程序設(shè)計(jì)方法”,從程序設(shè)計(jì)哲學(xué)思想、邏輯理念、方法技術(shù)、過(guò)程實(shí)現(xiàn)等方法改善傳統(tǒng)程序設(shè)計(jì)方法,其根本目的是提高軟件開發(fā)效率。
縱觀軟件技術(shù)發(fā)展歷史,程序設(shè)計(jì)方法從面向機(jī)器、面向過(guò)程、面向?qū)ο?,發(fā)展到面向組件、面向agent,面向服務(wù)等多種方法。針對(duì)程序設(shè)計(jì)方法的哲學(xué)思想、關(guān)注點(diǎn)、驅(qū)動(dòng)力、邏輯、特色、不足等,可用圖1所示進(jìn)行比較。
隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展和源碼開放運(yùn)動(dòng)的興起,網(wǎng)絡(luò)上越來(lái)越多的優(yōu)秀的開源代碼可以被人們下載學(xué)習(xí)和使用。以目前最大的開源社區(qū)sourceforge.net為例,該社區(qū)共享了179 518個(gè)開源工程擁有200萬(wàn)的注冊(cè)用戶,以及數(shù)量更為龐大的匿名用戶群[5],其中不乏優(yōu)秀代碼片段。假如能夠開發(fā)一套先進(jìn)的開源代碼搜索系統(tǒng),能夠根據(jù)開發(fā)者的搜索需求,精確返回可信的代碼以供選擇,制作成模板或者庫(kù)函文件,通過(guò)繼承(extends)和實(shí)現(xiàn)(implements)等手段實(shí)現(xiàn)重用。那么在大規(guī)模的程序開發(fā)中,將大大降低人員的學(xué)習(xí)成本和勞動(dòng)成本,編程的效率必將大幅提高。
目前,基于“搜索”的編程方法,最初級(jí)的階段是利用通用搜索引擎來(lái)實(shí)現(xiàn)。程序設(shè)計(jì)過(guò)程中,當(dāng)需要實(shí)現(xiàn)一個(gè)模塊的某個(gè)功能時(shí),程序員往往希望盡量利用現(xiàn)存的方案,因此需要通過(guò)一些搜索渠道查找相關(guān)信息,例如百度等通用搜索引擎。由于返回的結(jié)果通常是一段或多段源代碼,因此這種也被稱為“源代碼級(jí)”的搜索。這種傳統(tǒng)的搜索方法明顯存在兩個(gè)嚴(yán)重的不足:①存在大量無(wú)關(guān)信息的干擾。當(dāng)搜索引擎返回程序設(shè)計(jì)方面的結(jié)果的同時(shí),難以避免地也會(huì)夾雜著一些無(wú)關(guān)信息,要想得到準(zhǔn)確和期望的結(jié)果,必須掌握一定的搜索技巧,這無(wú)疑給原本單純的操作增加了障礙。②可信度無(wú)法判斷。通用搜索引擎的輸出結(jié)果排序完全取決于通用的排序算法,程序員通常不能在第一時(shí)間確定與搜索請(qǐng)求最相符的代碼,且代碼的質(zhì)量無(wú)從判斷,利用這種開放代碼編寫的軟件存在缺陷的可能性非常高。為此,軟件開發(fā)者需要建立一套更為合理的“基于搜索的編程方法”,提供更專業(yè)、高效、多樣的搜索功能。根據(jù)不同的代碼重用需求,提供不同粒度的搜索支持。其中最大粒度的是軟件開發(fā)的整個(gè)架構(gòu),盡管軟件的功能不盡相同,但是其運(yùn)行都可以依托于近乎相似的架構(gòu),例如“LAMP”的網(wǎng)站架構(gòu)、TCP/IP 網(wǎng)絡(luò)協(xié)議模型等都可以作為程序開發(fā)的參考。中等粒度的是功能模塊的搜索,此時(shí)的搜索對(duì)象大多為構(gòu)件,這是一種可單獨(dú)生產(chǎn)、獲取、部署的二進(jìn)制單元,依靠.NET、EJB等框架,它們之間可以互相作用構(gòu)成一個(gè)軟件功能系統(tǒng)。最小粒度也是目前最為常用的是源代碼的搜索。

圖1 程序設(shè)計(jì)方法演進(jìn)圖
為了迎合程序員的編程習(xí)慣,接近企業(yè)軟件開發(fā)實(shí)際情況,構(gòu)建一種支持“即時(shí)編程錄入,即時(shí)代碼搜索”的程序設(shè)計(jì)支撐系統(tǒng)。當(dāng)程序員編程輸入代碼時(shí),根據(jù)輸入預(yù)測(cè)所需代碼,將結(jié)果返回到編程界面,程序員可以即時(shí)選擇使用,并且在編程結(jié)束后,對(duì)這次匹配進(jìn)行是否正確的反饋,方便提高今后的匹配準(zhǔn)確率。通過(guò)這種方法達(dá)到共享開源代碼的目的,整個(gè)過(guò)程無(wú)需主動(dòng)搜索,是一種友好快速高效的編程環(huán)境,是一種新的編程方法的實(shí)踐和體驗(yàn)。
為了讓軟件工程課程的教學(xué)內(nèi)容追趕最新的軟件技術(shù),讓專業(yè)學(xué)生在實(shí)驗(yàn)室中體驗(yàn)最新的軟件設(shè)計(jì)方法,我們開展了基于搜索編程的實(shí)驗(yàn)教學(xué)建設(shè),同時(shí)得到學(xué)校實(shí)驗(yàn)室與設(shè)備管理處的大力支持。主要工作內(nèi)容如下:
(1) 海量開源代碼庫(kù)的構(gòu)建?;谒阉骶幊淌紫刃枰创a庫(kù),否則是無(wú)米之炊。代碼庫(kù)的構(gòu)建主要有3個(gè)任務(wù):①源代碼爬取操作:確定爬取場(chǎng)所為開源代碼搜索引擎,例如searchcode,爬取對(duì)象為C語(yǔ)言源代碼。為了提高效率,采用多臺(tái)電腦分布式協(xié)作,多線程并行抓取。②源代碼數(shù)據(jù)存儲(chǔ)操作:采用分布式文件系統(tǒng)HDFS方式,存儲(chǔ)對(duì)象是以函數(shù)為粒度的源代碼文件,每個(gè)文件只保存一個(gè)函數(shù)體。③源代碼庫(kù)索引建立操作:利用Lucerne建立倒排索引,源代碼屬性值除了代碼中的關(guān)鍵字外,還包括為了精準(zhǔn)搜索的語(yǔ)法和語(yǔ)義信息,將一個(gè)Document與一個(gè)物理源代碼文件相對(duì)應(yīng)。通過(guò)構(gòu)建本地源代碼庫(kù),為基于搜索的程序設(shè)計(jì)方法提供了搜索數(shù)據(jù)源的支持。
(2) 精準(zhǔn)代碼搜索引擎設(shè)計(jì)和開發(fā)。源代碼的搜索主要有兩個(gè)目標(biāo),找全,找準(zhǔn)。傳統(tǒng)的基于關(guān)鍵詞搜索能夠滿足一定的要求,但難達(dá)到精準(zhǔn)匹配的效果。因此,本項(xiàng)目設(shè)計(jì)“基于語(yǔ)法和語(yǔ)義的新型源代碼搜索引擎”,旨在找全找準(zhǔn)兩個(gè)目標(biāo)上有所提高。在語(yǔ)法方面,利用“程序流程圖”進(jìn)行搜索,流程圖主要通過(guò)三種基本結(jié)構(gòu)(順序、分支、循環(huán))反映程序的執(zhí)行順序和過(guò)程。用戶在搜索時(shí),可以根據(jù)經(jīng)驗(yàn)預(yù)設(shè)程序中包括多少循環(huán),多少分支,提高搜索的精度。在語(yǔ)義方面,利用“輸入/輸出”進(jìn)行搜索,用戶提交對(duì)輸入/輸出變量的數(shù)目和類型描述,得到所有符合要求的結(jié)果。因此,充分利用語(yǔ)法和語(yǔ)義結(jié)合進(jìn)行搜索和匹配,可以提高搜索的精準(zhǔn)度。
(3) 校園網(wǎng)站實(shí)驗(yàn)平臺(tái)構(gòu)建。本實(shí)驗(yàn)環(huán)境的特色和用意是實(shí)踐和鍛煉一種新的程序設(shè)計(jì)方法,新的知識(shí)點(diǎn)用傳統(tǒng)的軟件工程實(shí)驗(yàn)教學(xué)環(huán)境無(wú)法支持,不能滿足這個(gè)目的要求,也無(wú)法從現(xiàn)有公司或企業(yè)買來(lái)產(chǎn)品來(lái)幫助本實(shí)驗(yàn)的開展。因此,只能通過(guò)自主開發(fā)和構(gòu)建新的實(shí)驗(yàn)平臺(tái)。同時(shí),考慮到軟件工程課程實(shí)驗(yàn)學(xué)時(shí)少,不能增加課堂授課時(shí)間,計(jì)算機(jī)專業(yè)學(xué)生學(xué)習(xí)比較自由自助自主,不需要提供固定的時(shí)間和固定的場(chǎng)所,激發(fā)學(xué)生對(duì)新技術(shù)的興趣以及創(chuàng)新意識(shí)等,利用校園Internet網(wǎng),進(jìn)行開放性實(shí)驗(yàn)室的建設(shè)。組織研究生采用Java技術(shù)設(shè)計(jì)網(wǎng)站,根據(jù)實(shí)驗(yàn)任務(wù)構(gòu)建實(shí)驗(yàn)平臺(tái),例如http://10.60.138.179:8080/SearchEngine/,該網(wǎng)站在我校校園內(nèi)均可訪問(wèn),學(xué)生可以隨時(shí)隨地隨意進(jìn)行實(shí)驗(yàn)。
(4) 代碼復(fù)用搜索實(shí)驗(yàn)內(nèi)容設(shè)計(jì)。實(shí)驗(yàn)內(nèi)容建設(shè)遵循與理論緊密結(jié)合的原則,做到有針對(duì)性、層次性、可操作性、趣味性和適當(dāng)難度性。保證學(xué)生都能完成實(shí)驗(yàn)而促進(jìn)學(xué)生學(xué)習(xí)信心的建立;精心設(shè)計(jì)每部分的上網(wǎng)實(shí)驗(yàn)題目,適當(dāng)限定查找設(shè)計(jì)范圍,為學(xué)生指明一條捷徑,避免學(xué)生無(wú)所適從,調(diào)動(dòng)學(xué)生的積極性和學(xué)習(xí)熱情;體現(xiàn)寓教于樂(lè),興趣驅(qū)動(dòng),使每個(gè)學(xué)生都有滿足感,充分調(diào)動(dòng)學(xué)習(xí)的主動(dòng)性和創(chuàng)造性,施展學(xué)生的才華,逐漸對(duì)課程產(chǎn)生興趣,大大提高學(xué)生的設(shè)計(jì)欲望和創(chuàng)新動(dòng)力。另外,適當(dāng)?shù)馗郊与y度,激發(fā)優(yōu)秀學(xué)生進(jìn)一步鉆研的斗志。為此,選擇幾個(gè)代碼復(fù)用搜索的題目:①快速排序源代碼搜索,②求解線性方程組源代碼搜索,③求圖中兩點(diǎn)間最短路徑源代碼搜索,④根據(jù)興趣學(xué)生自選源代碼搜索。
(5) 實(shí)驗(yàn)操作手冊(cè)編寫。由于是一個(gè)全新的網(wǎng)絡(luò)教育實(shí)驗(yàn)環(huán)境,操作手冊(cè)的編制是為了讓學(xué)生了解和熟悉本次實(shí)驗(yàn)的方法、目的、內(nèi)容、過(guò)程等,具體的操作細(xì)節(jié)包括:注冊(cè)登錄、源代碼搜索、代碼分類瀏覽、代碼抓取、用戶滿意度評(píng)價(jià)、后臺(tái)管理等。為了使系統(tǒng)功能劃分明確,系統(tǒng)運(yùn)行穩(wěn)健,將用戶分為學(xué)生、老師、管理員等,各自具有相應(yīng)操作分類和權(quán)限。
(6) 實(shí)驗(yàn)教學(xué)效果網(wǎng)絡(luò)自動(dòng)評(píng)價(jià)機(jī)制。“學(xué)習(xí)-實(shí)踐-反饋”是學(xué)生掌握知識(shí)、提高能力的一般過(guò)程,故應(yīng)十分重視實(shí)驗(yàn)效果反饋評(píng)價(jià)。為了避免傳統(tǒng)考評(píng)機(jī)制的缺陷,杜絕實(shí)驗(yàn)中的克隆現(xiàn)象,做到公正、公平、合理、科學(xué),本實(shí)驗(yàn)環(huán)境特別設(shè)置兩個(gè)手段進(jìn)行網(wǎng)絡(luò)自動(dòng)考評(píng),①開辟一個(gè)用戶滿意度窗口,學(xué)生用戶隨時(shí)可以錄入實(shí)驗(yàn)感受、問(wèn)題、意見等,老師用戶隨時(shí)可以進(jìn)行相應(yīng)點(diǎn)評(píng)交流。②根據(jù)學(xué)生實(shí)驗(yàn)過(guò)程中,針對(duì)要求的實(shí)驗(yàn)內(nèi)容,即復(fù)用搜索源代碼的精準(zhǔn)度給予學(xué)生掌握知識(shí)、實(shí)驗(yàn)效果好壞的評(píng)價(jià),精準(zhǔn)越高,成績(jī)?cè)礁?。上述評(píng)價(jià)過(guò)程完全是網(wǎng)絡(luò)自動(dòng)進(jìn)行的,不摻雜指導(dǎo)老師的任何主觀意見。
在人工智能時(shí)代,利用前人的智慧開發(fā)軟件,復(fù)用源代碼,是一種高效的編程方法。為了將最新的程序設(shè)計(jì)方法引入到軟件工程課程教學(xué)中,構(gòu)建了基于搜
索編程的實(shí)驗(yàn)教學(xué)環(huán)境,提供給學(xué)生自由、自助、自主開展教學(xué)實(shí)驗(yàn),學(xué)生感受新鮮,教學(xué)效果良好,為大學(xué)專業(yè)教學(xué)進(jìn)行了一次大膽改革和有益嘗試。
參考文獻(xiàn)(References):
[1] 何文廣, 周 珂, 熊剛強(qiáng). 程序設(shè)計(jì)課程實(shí)驗(yàn)教學(xué)改革與實(shí)踐[J].實(shí)驗(yàn)室研究與探索, 2016, 35(6): 163-165.
[2] Weiser M.The computer for the 21st century [J]. ScientificAmerican,1991, 265(3): 94-104.
[3] 陳中育,呂振洪,葉榮華.軟件工程專業(yè)課程建設(shè)的思考與實(shí)踐[J].計(jì)算機(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í)驗(yàn)課程的改革與建設(shè)[J]. 實(shí)驗(yàn)室研究與探索, 2017, 36(1):180-184.
[7] 肖祥慧,林冬梅,胡春萍.基于網(wǎng)絡(luò)學(xué)習(xí)的軟件工程實(shí)驗(yàn)教學(xué)研究[J]. 電腦知識(shí)與技術(shù), 2013(9): 2194-2196.
[8] 江 頡, 石曉耀. 面向?qū)ο蟮能浖こ套灾鲗?shí)驗(yàn)教學(xué)改革[J]. 實(shí)驗(yàn)技術(shù)與管理, 2007,24(5): 112-114.
[9] 蔡 勇, 楊海中. 軟件工程實(shí)驗(yàn)教學(xué)體系的探討[J]. 實(shí)驗(yàn)室研究與探索, 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ó)蓀. 開源對(duì)軟件工程的作用及關(guān)鍵搜索技術(shù)分析[J]. 微型機(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.