一、以项目驱动为核心
早在20世纪80年代,人们就注意到了项目在大学教学中的重要性。根据构建主义理论,软件开发既是对新的软件理论、技术的理解与掌握,同时,更是对原有开发经验和软件理论的改造和重组,因此,必须以大量的项目训练来不断提升学生的软件理论和技能。项目驱动是指教学工作围绕项目而展开,根据项目的进程讲解相应的理论、培训相关的技术。已经有大量的文献探讨了项目驱动式教学方法在软件工程教学中的作用。[6]在这样的教学模式下,教学活动围绕学生而展开,教师转变为一个组织者的角色。项目驱动比较理想的模式是对学生进行大规模的设计开发训练,让学生在实际的软件开发过程中掌握软件设计、实现、测试的各种相关技术、知识、规范。[7]但是它需要具备项目开发所需的相关场地、设备以及面向市场的实际软件项目。显然,上述条件对于一个普通的二本院校而言,很难满足,通常都会采用一种模拟开发的方式来进行软件开发训练。因此,选取难易适度、内容多样的项目,是项目驱动教学方法实施的关键。在实践中,我们把以下几点作为判定一个项目是否适合用以模拟开发的标准。1)大小合适。保证一个项目小组可以在一个学期的实践(实验课+课堂讨论)中完成一个完整的项目分析设计,在1周的集中实践中能完成项目的编码、测试。2)兼顾各种类型。比如普通的桌面系统,基于移动平台的同时各类项目要分别适合用程序语言进行开发,以方便不同编程习惯的学生。3)技术难度要适当。由于是给学生“练手”用,如果项目技术难度过大,则容易挫伤学生开发的积极性;同时如果难度过低,则又降低了“练手”的价值。因此,在项目中,应该主要体现一些当前主流、常见的技术,适当体现一些新技术。4)联系市场实际。在项目的选择过程中,需要充分吸取软件企业内从事相关工作人员的意见和建议。由此所选择的项目训练,学生在毕业后能更快、更好地适应企业的工作环境,可以有效提高学生就业的竞争力。开课之后,任课教师向学生公布实践课时的内容安排,学生自愿组队(一个项目小组控制在3~5人),每个小组推荐产生一名项目经理,负责项目相关工作的人员安排和实施。各小组根据自身的设计、开发能力和兴趣,选取一个合适的项目。为防止抄袭,可以规定同一题目的重选次数。在选定项目后,由项目经理根据组员的个人能力和兴趣,确定每个成员在项目实施过程中的具体分工,教师此时应该适当进行指导,合理分配各成员的工作量。随着课程的进度,各小组围绕自己的项目,通过课堂讨论和课后实践,达到掌握理论知识和培养动手能力的目标。
二、以敏捷开发为基础
传统的基于瀑布模型的软件开发方式,由于其稳定驱动和推迟实现的特点,使得前期的文档工作和后期的开发工作相对脱离,根据经验,学生普遍对撰写文档不感兴趣,而更希望能够动手编写软件。因此,用瀑布模型进行软件开发管理,很容易抑制学生的学习积极性,从而影响学习效率。[8]敏捷开发是一种以人为核心,迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。敏捷开发强调灵活性、不断地测试和整合,以及快速地交付优质软件。[9]由于敏捷开发能在短时间内做出可运行的系统,很容易引起学生的学习兴趣。根据经验,把敏捷开发应用于软件工程课程的教学,可以明显提高学生的学习积极性和主动性,在提高动手能力的同时也加深了他们对理论知识的理解。下面以开发一个“洗车收费系统”为例,对比瀑布模型说明敏捷开发在“软件工程”教学中的优势。在以瀑布模型为基础的传统软件工程课程教学中,假如一个团队选择了“洗车收费系统”,那么教师会按照瀑布模型的推进方法,针对可行性分析、需求分析、整体设计、详细设计、编码实现和软件测试这一系列过程,让学生完成相应的文档。由于在此期间学生都没有软件开发的经验,因此,在撰写文档的时候很难和软件开发的实际联系起来,文档虽然完成了,但是所得非常有限,同时由于文档撰写无法联系开发实际,从而影响学习的积极性和主动性。在以敏捷开发为基础的软件工程教学中,情况则完全不同,教师在介绍了敏捷开发的基本理论(6~8课时)之后,学生就开始对收费系统进行简化的需求分析和设计,并进行简单的模块划分,紧跟着就开始着手进行编码,很快就有一个可以运行的系统被开发出来。随着课程的进展,关于敏捷开发的技术理论被逐步介绍,也被逐步运用到软件的设计、开发过程中。在这一过程中,各种书本上介绍的技术,大多可以在实践中被验证和模仿,可以被学生更好地理解和接受,同时有利于调动学生的学习积极性。
三、以合理的考核体系作保证
在课程改革前,软件工程的考核采用平时成绩占30%,期末考试成绩占70%的方式进行。这样的考核方式过于强调理论,很难检验学生的动手能力,而动手能力恰恰是软件设计与开发的关键能力,因此,通过这样的考核方式培养出来的学生,显然难以满足当前很多公司“入场就干活”的要求。在课程改革后,考核体系更加强调对学生实践能力的培养,从各个方面对学生的动手能力进行考核。1)考核分三部分:期末考试成绩占40%,平时的实验和课堂讨论占40%,平时作业和考勤占20%。2)期末考试的试题内容,更倾向于综合型、设计型,降低记忆性试题的比例,突出对基础理论、基础知识的运用。如给定一个题目,要学生从数据流图、E-R图、层次图、PAD图和流图等软件的各个阶段、各个方面对软件进行描述。3)对实验成绩和课堂讨论成绩的评定中,参考项目小组的整体表现和各项目组成员所承担的工作,进一步细分为团队成绩和个人成绩。同一项目组的学生获得相同的团队成绩,打分的依据是设计、开发的软件质量,以及该软件项目本身的难度。每个小组成员根据自己所承担的工作(写文档、编码、项目管理等)的完成质量获得相应的个人成绩。4)在所有的作业、实验成绩的评定中,坚持对水平较高的软件设计给予适当奖励;对明显错误的软件设计加大扣分力度。这样做的目的主要是为了培养学生在软件设计、实现的起步阶段对错误设计的敏感性。这一点,在学生的毕业设计中有明显体现。5)教师在学生实验时,随机抽取一些学生,对其所作的工作进行当场提问,这样可以有效防止某些能力强的项目组成员“一人包干所有工作”的情况,也可以在一定程度上防止学生之间相互抄袭。
四、结语
本文提出了一种适合普通二本院校软件工程教学的改革方式。它以项目驱动为核心,通过仔细挑选模拟项目,围绕项目展开教学。在整个教学过程中,学生在老师指导下,以团队讨论、团队设计、团队开发的方式,实现基础理论和项目实际的结合;它以敏捷开发为载体,通过提前实现、弱化文档等手段,有效提高了学生学习的积极性和主动性,提高了学生的动手能力;以突出实践、兼顾理论的考核体系敦促学生更加注重平时的讨论和实验,提高了学生动手实践的质量。嘉兴学院计算机科学系的软件工程课程改革仍然还在探索阶段,通过上面所述的一些措施,现已取得了较明显的成效,学生在毕业设计和实习的时候,完成的软件开发相关的工作质量比以前有明显提高,近3年计算机科学与技术专业的毕业生,一次就业率均达到98%以上。根据反馈的信息,大多数学生在进入软件企业后,都能较快地适应企业的工作模式并顺利地投入到软件开发中,用人单位对嘉兴学院计科专业毕业生的动手能力比较认同。
作者:殷海明 魏远旺 单位:嘉兴学院 数理与信息工程学院