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

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