基于搜索的软件设计方法实验教学探索

2018-07-03 00:46曾国荪丁春玲同济大学电子与信息工程学院化学科学与工程学院上海200092
实验室研究与探索 2018年5期
关键词:源代码程序设计代码

曾国荪, 丁春玲(同济大学 .电子与信息工程学院;.化学科学与工程学院,上海,200092)

0 引 言

“软件工程”是计算机专业的骨干课程,是应用计算机科学、数学及管理科学等进行软件开发的工程科学,强调思想性、方法论、标准化、实践观为一体。软件工程课程旨在使学生掌握软件项目开发和维护的一般过程,掌握软件开发的传统方法和最新技术,为今后就业打下良好基础,培养高素质人才[1-4]。软件工程是计算机专业的一门必修课程,早在1991年,IEEE-CS/ACM联合工作组就将“软件工程”列为计算机学科的9个知识领域之一。软件工程是一门实践性很强的综合性课程,其他计算机课程,如程序设计语言、数据库、操作系统等都是软件工程的先导课程。在软件开发的各个阶段都会用到有关的知识,可以说软件工程课程与先导课程是相互作用和影响的,并对这些课程起到重要的支撑和引领作用[5-7]。

程序设计方法是软件工程课程主讲的内容。软件工程课程主要内容包括软件工程概述、软件过程模型、软件设计方法、软件项目管理等[8-10],其中软件设计方法又包含问题定义、可行性分析、需求分析、总体和详细设计、编码测试、软件维护等知识,可见程序设计方法是课程的重点。计算机发展至今,先后出现了面向机器的程序设计、面向过程的程序设计、面向对象的程序设计、面向构件的程序设计、面向方面的程序设计等方法[11]。上述程序设计方法各有特色,理念不同、关注点不一样、也都存在缺陷。随着信息新技术的出现,网络搜索成为一种习惯,有必要讲解基于搜索的程序设计方法。

程序编码效率是软件项目开发的生命。软件项目通常规模大,程序复杂性高,如何在预定时间和预算内完成开发,是项目成败的关键。但是,软件开发效率很低,既跟不上硬件的发展速度,也落后用户的期待。为了解决上述问题,可从程序编码效率上寻求突破。据统计,程序编码在整个软件生命周期中,占据了高达37%的时间成本和40%的人力成本,因而编码效率直接影响着软件的生产率,提高程序编码效率可以大幅度缩短软件项目的开发时间。

开源代码复用是提高软件开发效率的重要手段。软件复用包括知识方法复用、代码复用、标准和文档资料复用等。其中开源代码复用是最有效的形式,开源代码可以来自代码托管平台和开源社区等场所。进行代码复用的好处很多,在应用系统开发中可以充分利用已有的开发成果,消除包括分析、设计、编码、测试等在内的许多重复劳动。程序员使用一个可复用库,其中的源代码和功能都是他们所需要和熟知的。从长远角度讲,有利于明确人员分工和个人的经验积累。代码复用技术还有利于减少培训开销,即雇员在熟悉任务时所需的非正式的开销。软件复用技术的另一个好处在于对快速原型的支持,即可以快速构造软件系统可操作的模型,大大提高项目的开发效率[12-13]。

复用代码依赖精准搜索引擎查找。据统计,SearchCode开源库拥有超过500万个开源项目、180亿行开源代码。为了发现需要的源代码,程序员平均需花费19%的编程时间搜索代码。目前搜索途径大都采用“基于关键词的搜索”,虽然能够搜索所需要的源代码,但是返回结果太多,很难获取真正想要的源代码。因此,本项目进一步探索精准搜索开源代码的新方法。事实上,程序代码之所以能够被计算机编译,必须满足一些规则和要求。例如,代码的语法和语义信息就是可以被利用开展搜索的信息,通过这两方面的信息,可以唯一确定所需的源代码,从而可以设计基于语法和语义结合的精准搜索引擎。

基于智能搜索的程序设计方法呼之欲出。据统计,新软件项目中,约80%的源代码都可在以前的软件项目中找到,并进行复用。因此,应该站在巨人的肩膀上,在程序设计时尽量利用已有的源代码。目前传统的程序设计方法,能够利用同一项目中已经存在的函数、类、构件、库文件等,进行内部调用,但是如果超出了项目的范围,代码则不能复用。此时就需要智能搜索,除了提供快速检索、相关度排序等功能,还能提供用户输入内容的语义理解、智能信息过滤和主动推荐源代码等功能[14]。

在智能搜索的基础上,呼吁一种新的程序设计方法,即一种“基于搜索的程序设计方法”,从程序设计哲学思想、逻辑理念、方法技术、过程实现等方法改善传统程序设计方法,其根本目的是提高软件开发效率。

1 各种程序设计方法演进和比较

纵观软件技术发展历史,程序设计方法从面向机器、面向过程、面向对象,发展到面向组件、面向agent,面向服务等多种方法。针对程序设计方法的哲学思想、关注点、驱动力、逻辑、特色、不足等,可用图1所示进行比较。

2 基于开源搜索编程的新方法

随着互联网技术的飞速发展和源码开放运动的兴起,网络上越来越多的优秀的开源代码可以被人们下载学习和使用。以目前最大的开源社区sourceforge.net为例,该社区共享了179 518个开源工程拥有200万的注册用户,以及数量更为庞大的匿名用户群[5],其中不乏优秀代码片段。假如能够开发一套先进的开源代码搜索系统,能够根据开发者的搜索需求,精确返回可信的代码以供选择,制作成模板或者库函文件,通过继承(extends)和实现(implements)等手段实现重用。那么在大规模的程序开发中,将大大降低人员的学习成本和劳动成本,编程的效率必将大幅提高。

目前,基于“搜索”的编程方法,最初级的阶段是利用通用搜索引擎来实现。程序设计过程中,当需要实现一个模块的某个功能时,程序员往往希望尽量利用现存的方案,因此需要通过一些搜索渠道查找相关信息,例如百度等通用搜索引擎。由于返回的结果通常是一段或多段源代码,因此这种也被称为“源代码级”的搜索。这种传统的搜索方法明显存在两个严重的不足:①存在大量无关信息的干扰。当搜索引擎返回程序设计方面的结果的同时,难以避免地也会夹杂着一些无关信息,要想得到准确和期望的结果,必须掌握一定的搜索技巧,这无疑给原本单纯的操作增加了障碍。②可信度无法判断。通用搜索引擎的输出结果排序完全取决于通用的排序算法,程序员通常不能在第一时间确定与搜索请求最相符的代码,且代码的质量无从判断,利用这种开放代码编写的软件存在缺陷的可能性非常高。为此,软件开发者需要建立一套更为合理的“基于搜索的编程方法”,提供更专业、高效、多样的搜索功能。根据不同的代码重用需求,提供不同粒度的搜索支持。其中最大粒度的是软件开发的整个架构,尽管软件的功能不尽相同,但是其运行都可以依托于近乎相似的架构,例如“LAMP”的网站架构、TCP/IP 网络协议模型等都可以作为程序开发的参考。中等粒度的是功能模块的搜索,此时的搜索对象大多为构件,这是一种可单独生产、获取、部署的二进制单元,依靠.NET、EJB等框架,它们之间可以互相作用构成一个软件功能系统。最小粒度也是目前最为常用的是源代码的搜索。

图1 程序设计方法演进图

为了迎合程序员的编程习惯,接近企业软件开发实际情况,构建一种支持“即时编程录入,即时代码搜索”的程序设计支撑系统。当程序员编程输入代码时,根据输入预测所需代码,将结果返回到编程界面,程序员可以即时选择使用,并且在编程结束后,对这次匹配进行是否正确的反馈,方便提高今后的匹配准确率。通过这种方法达到共享开源代码的目的,整个过程无需主动搜索,是一种友好快速高效的编程环境,是一种新的编程方法的实践和体验。

3 实验教学建设过程

为了让软件工程课程的教学内容追赶最新的软件技术,让专业学生在实验室中体验最新的软件设计方法,我们开展了基于搜索编程的实验教学建设,同时得到学校实验室与设备管理处的大力支持。主要工作内容如下:

(1) 海量开源代码库的构建。基于搜索编程首先需要源代码库,否则是无米之炊。代码库的构建主要有3个任务:①源代码爬取操作:确定爬取场所为开源代码搜索引擎,例如searchcode,爬取对象为C语言源代码。为了提高效率,采用多台电脑分布式协作,多线程并行抓取。②源代码数据存储操作:采用分布式文件系统HDFS方式,存储对象是以函数为粒度的源代码文件,每个文件只保存一个函数体。③源代码库索引建立操作:利用Lucerne建立倒排索引,源代码属性值除了代码中的关键字外,还包括为了精准搜索的语法和语义信息,将一个Document与一个物理源代码文件相对应。通过构建本地源代码库,为基于搜索的程序设计方法提供了搜索数据源的支持。

(2) 精准代码搜索引擎设计和开发。源代码的搜索主要有两个目标,找全,找准。传统的基于关键词搜索能够满足一定的要求,但难达到精准匹配的效果。因此,本项目设计“基于语法和语义的新型源代码搜索引擎”,旨在找全找准两个目标上有所提高。在语法方面,利用“程序流程图”进行搜索,流程图主要通过三种基本结构(顺序、分支、循环)反映程序的执行顺序和过程。用户在搜索时,可以根据经验预设程序中包括多少循环,多少分支,提高搜索的精度。在语义方面,利用“输入/输出”进行搜索,用户提交对输入/输出变量的数目和类型描述,得到所有符合要求的结果。因此,充分利用语法和语义结合进行搜索和匹配,可以提高搜索的精准度。

(3) 校园网站实验平台构建。本实验环境的特色和用意是实践和锻炼一种新的程序设计方法,新的知识点用传统的软件工程实验教学环境无法支持,不能满足这个目的要求,也无法从现有公司或企业买来产品来帮助本实验的开展。因此,只能通过自主开发和构建新的实验平台。同时,考虑到软件工程课程实验学时少,不能增加课堂授课时间,计算机专业学生学习比较自由自助自主,不需要提供固定的时间和固定的场所,激发学生对新技术的兴趣以及创新意识等,利用校园Internet网,进行开放性实验室的建设。组织研究生采用Java技术设计网站,根据实验任务构建实验平台,例如http://10.60.138.179:8080/SearchEngine/,该网站在我校校园内均可访问,学生可以随时随地随意进行实验。

(4) 代码复用搜索实验内容设计。实验内容建设遵循与理论紧密结合的原则,做到有针对性、层次性、可操作性、趣味性和适当难度性。保证学生都能完成实验而促进学生学习信心的建立;精心设计每部分的上网实验题目,适当限定查找设计范围,为学生指明一条捷径,避免学生无所适从,调动学生的积极性和学习热情;体现寓教于乐,兴趣驱动,使每个学生都有满足感,充分调动学习的主动性和创造性,施展学生的才华,逐渐对课程产生兴趣,大大提高学生的设计欲望和创新动力。另外,适当地附加难度,激发优秀学生进一步钻研的斗志。为此,选择几个代码复用搜索的题目:①快速排序源代码搜索,②求解线性方程组源代码搜索,③求图中两点间最短路径源代码搜索,④根据兴趣学生自选源代码搜索。

(5) 实验操作手册编写。由于是一个全新的网络教育实验环境,操作手册的编制是为了让学生了解和熟悉本次实验的方法、目的、内容、过程等,具体的操作细节包括:注册登录、源代码搜索、代码分类浏览、代码抓取、用户满意度评价、后台管理等。为了使系统功能划分明确,系统运行稳健,将用户分为学生、老师、管理员等,各自具有相应操作分类和权限。

(6) 实验教学效果网络自动评价机制。“学习-实践-反馈”是学生掌握知识、提高能力的一般过程,故应十分重视实验效果反馈评价。为了避免传统考评机制的缺陷,杜绝实验中的克隆现象,做到公正、公平、合理、科学,本实验环境特别设置两个手段进行网络自动考评,①开辟一个用户满意度窗口,学生用户随时可以录入实验感受、问题、意见等,老师用户随时可以进行相应点评交流。②根据学生实验过程中,针对要求的实验内容,即复用搜索源代码的精准度给予学生掌握知识、实验效果好坏的评价,精准越高,成绩越高。上述评价过程完全是网络自动进行的,不掺杂指导老师的任何主观意见。

4 结 语

在人工智能时代,利用前人的智慧开发软件,复用源代码,是一种高效的编程方法。为了将最新的程序设计方法引入到软件工程课程教学中,构建了基于搜

索编程的实验教学环境,提供给学生自由、自助、自主开展教学实验,学生感受新鲜,教学效果良好,为大学专业教学进行了一次大胆改革和有益尝试。

参考文献(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.

猜你喜欢
源代码程序设计代码
基于TXL的源代码插桩技术研究
基于Visual Studio Code的C语言程序设计实践教学探索
从细节入手,谈PLC程序设计技巧
创世代码
创世代码
创世代码
创世代码
软件源代码非公知性司法鉴定方法探析
基于语法和语义结合的源代码精确搜索方法
高职高专院校C语言程序设计教学改革探索