冶红 蒋波
摘要:针对当前计算机专业本科毕业设计中普遍存在的问题,提出用软件工程思想指导毕业设计的方案。探讨如何通过建立软件生存周期和毕业设计各阶段的映射关系,规范毕业设计过程,提高教学质量,为社会培养合格软件人才。
关键词:毕业设计;软件工程;软件生存周期;软件过程;教学质量
1、软件工程概念
软件工程是指导计算机软件开发和维护的工程学科,它将工程学的概念、原理、技术和方法应用于软件的开发和维护,结合了软件开发技术和工程管理的成功经验。
软件工程包括方法、工具和过程3个要素。软件有一个从孕育、诞生、成长、成熟到衰亡的过程,即软件的生存周期。通过生存周期模型直观地表达软件开发的全过程,明确要完成的主要活动、任务和开发策略,是软件工程思想的具体化。根据这一思想,将软件生存周期划分为软件定义、开发和运行维护3个阶段,软件定义阶段包括问题定义、可行性研究和需求分析,软件开发阶段的任务包括总体设计、详细设计、实现和测试。
2、毕业设计制作
毕业设计是以学生为主体,在专业教师或工程技术人员的指导下,围绕特定的选题进行的有计划、有步骤的学习和开发过程,是培养人才的重要途径。
2.1 毕业设计的目的
毕业设计不同于一般的课程设计,系统性和综合性较强,需要多方面的知识作支撑,注重实际操作。通过毕业设计,使学生在以下方面得以锻炼和提高:①综合运用所学知识,分析、解决实际问题的能力;②自主获取新知识、独立发现问题的能力;③计算机系统设计和开发的能力;④创新精神和团队协作能力;⑤文献检索、资料查询以及论文写作能力。
2.2 毕设现状及存在问题
近年来,计算机专业毕业设计质量出现滑坡。一方面是由于学生对待毕业设计态度不够认真,投入的精力有限;另一方面,也是更主要的原因,相当一部分学生没有按照软件工程思想进行相应的软件开发,违反了软件工程的基本原则,导致毕业设计质量较低。
目前,毕业设计中存在的问题主要表现在以下方面:
1)选题不当,不重视可行性研究。
选题脱离实际,不能与社会应用接轨或缺乏创新。很多学生无法参与到实际科研项目中,只能选择一些虚拟题目,为了作设计而设计,完成的系统业务逻辑简单,其结果没有实用价值。存在不同指导教师的学生做同一题目的现象,内容雷同,很多是对现有的成果稍加修改和变换,缺乏创新。
2)不重视软件的需求分析。
需求分析阶段调研不充分,没有全面、准确地获取用户的需求,忽视了软件需求的不稳定性,没有做到需求跟踪;或者只关注软件的功能性需求,忽视了性能需求,导致最终软件的可用性差;有一些学生直接略过需求分析而进入软件设计阶段。整个软件过程处于“设计-分析-修改-设计”这样一个混乱的状态。
3)不重视设计过程和软件测试。
没有事先对软件进行总体规划,目标不明确,想起来哪部分就做哪部分,甚至有些部分做了一半就又开始另外一个阶段的工作,忽视软件设计的基本原则。整个设计过程呈无序状态,导致软件结构混乱、功能代码重复、可集成性差,待到发现问题已为时过晚,稍作改动系统就会崩溃。忽视软件测试的现象也非常普遍。有的只针对模块做单元测试,认为模块内部的可靠性达到了一定程度,集成后也必然稳定可靠。有的随机地选取少数测试用例,发现程序运行结果与预期结果吻合后,便觉得大功告成了。
4)不重视软件文档的编制和毕业论文的撰写。
很多开发人员认为编写软件文档是在浪费时间,他们更愿意将精力花费在如何调通一个程序上。在毕业设计的特定环境下,一些虚拟性的项目无需进行后期维护,轻视文档的现象尤为严重。毕业设计的同时还应在导师的指导下撰写毕业论文,可很多学生直至毕设最后阶段才开始撰写论文,投入的时间和精力不足,文章质量低下且抄袭现象严重。
3、用软件工程思想指导计算机专业本科毕业设计
为了提高毕业设计的质量,培养出适应社会需求的软件人才,将软件工程思想引入毕业设计,用软件工程方法指导和规范毕业设计过程,是十分必要和迫切的[5]。
将毕业设计视为一个大型项目,整个毕业设计过程就是一个完整的软件生存周期。以软件工程思想为线索驱动毕业设计进展,遵守软件过程的基本原则,引导学生分阶段地完成毕业设计任务,并按要求提交可运行的软件产品和完整规范的文档。软件生存周期和毕业设计各阶段的对应关系如图1所示。
3.1 以可行性研究为指导,严把选题关
可行性研究不是解决问题,而是确定问题是否值得去解,是否有可行的解决办法。毕业设计的选题应有益于学生综合运用多学科的知识与技能,有一定的理论和现实意义,难易适度,大小适中。
为了更好地进行可行性分析,我们对选题方式进行了改革。选题时,指导教师不给出具体的题目,只给出研究方向和计划指导的学生人数,让学生自行确定题目,给学生更多的自主权,激发学生的创新思维。由指导教师引导学生从经济、技术、法律等方面对选题进行综合评价,分析选题有无违反国家相关法律和社会道德规范,现有的技术手段和工具能否提供必要的支持,最终得到的收益是否大于投入的成本,能否带来一定的经济效益。为了提高选题的可行性,题目的形式和内容也要力争创新。在校外作毕业设计的学生,建议选择与实习内容相关的课题,立足于工程实际。在校内做毕业设计的学生,鼓励其参加科研团队、科技竞赛和各类创新实验项目等,开放校内实验室,为学生提供创新平台。经过可行性分析,明确选题的意义和范围,以便更好地制定毕业设计阶段的工作计划。
3.2 以需求分析为基础,明确系统目标和任务
毕业设计选题完成以后,应以需求分析的思想为指导,对选题需承担的工作及实现目标进一步阐述和分析,收集和整理资料,明确用户要求。确定待开发软件的功能需求、性能需求和运行环境约束,运用科学的研究方法对软件需求建模,在建模过程中了解系统。有时还要对复杂系统的接口、人机界面等进行模拟或构造原型。目前在毕业设计中广泛使用的有传统方法学和面向对象方法学,通过抽象和概括,导出用图形方法表示的、经用户确认的目标系统逻辑模型,用这些模型来描述和设计系统。模型既是软件设计的基础,也是编写软件规格说明的基础。软件需求规格说明是用户与开发人员对软件需求取得共同理解的基础上达成的协议,是软件项目成败的关键。endprint
3.3 以软件设计为指导进行实践,规范毕业设计过程
软件设计决定软件系统“怎么做”,在软件工程过程中处于技术核心地位,是后续开发和维护的基础。软件设计主要集中于软件体系结构、数据结构、用户界面和实现算法等方面,同样需要文档化,撰写相应的设计说明书并组织评审。传统方法学把软件设计划分成总体设计和详细设计2个阶段。总体设计概括提出解决问题的办法,建立软件系统的总体结构和模块间的关系,设计全局数据结构,规定设计约束,制定集成测试计划。详细设计阶段将解法具体化,设计模块内部细节,拟定单元测试计划。类似地,面向对象方法学将软件设计分为系统设计和对象设计,系统设计确定实现策略和系统的高层结构,对象设计确定解空间中的类、关联、接口形式和实现服务的算法。
在毕业设计过程中,应严格遵守软件工程学原则,规范设计过程。对于大型软件系统,首先对软件需求进行分解,将其划分为若干个子系统,为每个子系统定义功能模块,给出各子系统接口的定义,再以增量方式集成到软件系统中,增量开发法如图2所示。软件系统应具有良好且稳定的总体结构,模块内部保持高内聚,模块之间保持松散的耦合。模块划分时,一个模块的直接下属模块不宜太多。设计当前模块时,把该模块的所有下层模块看作“黑盒”,一个模块的全部直接下属模块设计完成后,再转向另一个模块的下层模块设计。
3.4 重视测试,保证毕业设计质量
软件测试的目的是以最少的时间和人力,系统地找出软件中潜在的各种错误和缺陷。当把详细设计结果翻译为源代码后,应及早开始测试。建议先考虑静态测试,采用人工检测和计算机辅助静态分析方法,仔细地审查软件设计、体系结构和源代码,接下来再通过运行程序进行动态测试。
从过程的观点考虑,毕业设计期间一般经过单元测试、集成测试和确认测试。单元测试发现模块控制结构、算法处理和编码中的错误,以白盒测试为主。集成测试主要检查与设计相关的软件体系结构的问题,以黑盒测试为主。确认测试主要检查软件是否满足需求规格说明中确定的功能、性能等需求,使用黑盒测试技术。测试时,需要为被测程序精心设计测试用例,选取系统需求所需的测试数据、设计文档所需的测试数据、程序代码所需的测试数据、边界数据和一些随机数据,同时考虑合理输入和不合理输入。测试时注意错误的群集现象,重点测试发现错误多的模块,并尽可能使用一些自动测试的软件工具。如果测试没能发现错误,应考虑重新制定测试方案并设计测试用例。测试后,分析比较实测结果和预期结果,出现的错误要调试,同时修改相应的文档。修改后的程序要再次测试,直至满意为止。
3.5 重视文档写作,提升毕业设计论文的质量
很多学生认为毕业设计就是编写代码,这种理解是错误的。软件文档是软件开发规范的体现和指南,按要求生成一整套文档的过程,就是按照开发规范完成软件开发的过程。软件文档是软件生存周期各阶段的设计思想和研究成果的体现,是软件产品的一部分,是后续维护的基础。毕业论文是毕业设计工作的总结和提高,让读者对课题的设计原理、解决方法及关键技术等有一个全面的了解。论文写作首先是确定选题,查阅相关资料后撰写开题报告,进行项目设计,完成论文初稿,最后修改定稿。在毕业设计过程中,指导学生分阶段地撰写规范的软件文档,一方面可以科学地计划、组织软件开发过程,另一方面可以从中提取精华部分放在毕业设计论文相关章节中。软件文档与毕业设计论文各章节的对应关系如图3所示。
4、结语
以软件工程思想为指导规范学生进行软件开发活动,在以往的毕业设计中取得了良好的效果,不仅保障了毕业设计的质量,更提高了学生解决实际问题的能力、沟通协作能力,以及书写和表达能力,积累了一定的项目开发经验。软件工程教学与毕业设计实践相互促进、相辅相成。一方面,以软件工程推进毕业设计进程,加强毕业设计各环节的指导;另一方面,可以毕业设计为任务驱动软件工程教学,‘将毕业设计作为项目引入到今后的软件工程课堂教学中,让学生尽早参与实际软件项目中,培养实践能力和创新精神。endprint