首页 -> 2007年第4期

浅谈软件开发项目式教学

作者:周 颖




  摘要:文章探讨了指导学生进行模拟软件项目开发的方法。作为教学改革的一个环节,最终的目的是让学生能有一定的软件开发体验,能够在以后的实际工作中较快进入角色。
  关键词:软件开发教学;项目教学;教学改革
  
  目前针对计算机软件专业学生进行的项目开发式实践性教学主要是课程设计环节和毕业设计环节。但当前一般的课程设计环节主要突出的重点是某门课程的知识运用。本文旨在探讨在学生完成部分专业课学习,具备开发一个简单而有代表性的完整软件的基础之后,如何引导学生进行第一次完整软件开发。在软件专业教学领域,最终应以综合运用多门课程知识的项目导向式综合课程设计取代原来教学环节中单独针对某门课程的课程设计。
  教学过程
  (一)选题
  指导教师应引导学生选择一个力所能及的开发题目。所以指导教师应向学生提出几个选题的原则:(1)选择一般的管理或商业运用领域。不要选择系统软件和实时软件等复杂程度很高且质量要求很高的软件领域,也不要选择工业控制、嵌入式或科学计算等专门程度太高的软件领域。(2)选择一个易于理解的业务逻辑流程。毕竟我们的目标是去体会怎样开发软件而不是做企业管理。(3)选择学生已经学过的课程或开发工具适合做的项目。(4)选择规模很小的项目。作为第一次软件开发,过大的规模很可能会导致学生不能完成而产生挫折感;同时,对于第一次软件开发,指导教师不必强调分工合作而更注重每个学生都应该独立完成整个过程,获得完整的体验。(5)为便于教学和学生平时交流、对比,所有学生做同一个项目。
  在向学生阐述这些原则后,指导教师与学生一起讨论做什么样的项目。根据上述第二条原则,学生一般会选择比较容易理解的成绩管理、宿舍管理、学籍管理、人事管理、考勤管理、便利店进销存、家政管理、工资管理、物业服务等没有什么特殊业务性质的系统中的一个或一部分作为初次软件开发的题目。根据学生所学的课程,往往会用到一种图形化的开发工具和数据库结合来完成项目的具体编码(一般使用VB+SQL Server)。
  在确定好题目后,指导教师应给学生讲一讲软件开发模型的知识(已学过软件工程课程的则可以提纲挈领地复习一下相关知识)。作为第一次软件开发,应该采用技术成熟、步骤清晰的自顶向下的结构化生命周期方法。这也是我们要求业务逻辑简单的原因,简单清楚的业务逻辑非常适合自顶向下的方法。结构化方法一般把软件生命周期分为系统分析(SA-System Analysis)、系统设计(SD-System Design)、编码(Coding)、测试(Testing)等若干阶段。
  虽然项目规模小、业务逻辑简单清楚,系统分析的工作量不大,但考虑到学生不知如何入手,指导教师可以在确定题目后剩下的1~2个小时内给学生示范本项目编写系统说明书的系统分析部分,与学生一边讨论一边一起编写系统分析文档的初稿,简单地描述项目目标,功能分类和范围等。最好画出一个本项目完整的功能模块图。
   选题完成后,指导教师给学生一周左右的时间(这个软件开发过程教学均为利用学生正常上课的课外时间进行,以下的时间间隔概念均与此相同)根据系统分析框架初稿思考和完善系统分析文档。可建议学生参考一些案例书籍来完成这项工作。一周以后,指导教师应评阅所有学生的系统分析文档对各个层次的典型作品进行点评,还要请被点评学生就这个阶段的工作谈体会(工作方法;参考资料、方式;困难与收获等)。要求学生根据点评结果最终定稿系统分析文档,一般还需要2~3天,形成3~5页的文件。
  这个阶段的任务对大多数学生而言都能顺利完成。这是建立在项目规模小、业务逻辑简单清楚的基础上。学生设计初期的畏惧感大大地减弱了。
   (二)系统设计
  虽然整个项目相对不太复杂,不再细分为概要设计和详细设计两个阶段,但设计的工作量还是比较大,也是整个软件开发过程教学的一个难点和重点。
  通过实际观察,我发现对初次进行软件开发的学生而言,如果仅仅给几个参考文档或者案例就让他做系统设计的效果是不理想的,绝大多数情况下学生会生搬硬套,不能根据系统分析阶段确定的规划要求作出符合当前标准的设计。最大的原因是学生还不能很好消化课堂上和参考资料里的知识点,仍孤立地看待完整的问题并作出分析。当然,在现有的教学计划中,也没有这方面的训练,最多是在开设的软件工程课程中有概念性的讲解。因此我采用的办法是在教学课堂上由指导教师进行一部分设计并详细剖析设计的原理和规范,学生跟着模仿设计,再在这个基础上布置类似模块让学生独立完成。这种方式需要指导教师做好准备工作。采用这种方式的主要目的是让学生对设计工作有直观的认识和模仿的基础。
  一般说来,整个设计过程的教学可以分为数据库设计和界面及功能设计两个部分,具体如下:
  数据库设计根据系统分析中的功能要求和范围,确定实体-关系模型(E-R模型),在E-R模型基础上确定数据库的逻辑和物理设计。数据库设计是整个软件开发教学过程中学生最弱的环节,因为这是一个实践性很强的问题,需要很多数据规划的经验,而学生没有也不可能一下子获得这些经验。从实践效果看,几乎所有学生都不可能独自完成合适的数据库设计。因此我采用的办法是(针对学生的第一次软件开发)数据库设计以指导教师设计为主,学生仅仅是在指导教师形成的数据库设计文档基础上根据要求稍微完善和补充一些比较容易理解的细节。设计采用ERWin或者Visio等图形化工具画出ER图,并结合数据库理论中的第一、第二、第三范式详细给学生讲解怎样确定一个表的主键和取舍其他字段;什么情况下需要拆成主、从表,怎样拆,怎样确定合适的外键;怎样存放和处理实际数据。然后根据ER图生成具体的数据库结构并整理成表格文档。指导教师在设计课的第一次课上完成大部分数据库设计和讲解。剩余部分布置学生课外完成,一周以后的第二次课检查学生完成情况。实际情况表明,能基本准确完成的学生仍不多,指导教师在第二次课上将整个数据库设计完成并针对学生在独立设计数据库结构中的问题做具体分析。整个数据库设计共计一周左右,学生没有很好地完成。但通过指导教师的演示,可以获得一些经验,在下一次的软件开发中能更有效地分析参考案例或资料中的数据库设计。
  模块界面及功能设计因为这个环节的内容比较直观,完成设计的情况比数据库设计要好一些。在完成数据库设计后,指导教师可以给学生在课堂上示范按系统分析功能要求进行模块设计。根据功能划分画出相应的界面并布置好对应的控件,然后对每个控件作功能说明,还要作相应数据处理说明以及页面跳转的说明。需要注意的是,这个阶段一般要求使用后续编码阶段要采用的可视化编程工具来进行界面设计,以利于编码阶段的重用,但一定要强调界面规范——界面大小、控件摆放、控件大小、什么字体、不同界面间的统一风格等等。不同的项目,模块界面及功能设计的完成时间不一样,一般需要3周左右。平时表现和成绩较好的学生基本都能完成并初步达到设计的要求,未能完成的学生的主要问题是没有投入相应于较大工作量的工作时间。指导教师在期间召开一次会议组织学生讨论并点评有代表性的学生的阶段成果。
  特别需要指出的是,整个设计过程会经历一些反复,很多没考虑周全的细节会在后续的编码或测试阶段暴露出问题,因此设计文档也需要根据实际开发情况作出一些调整。适当的调整也有助于培养学生严密的思维。
  编码和测试
  比较而言,编码是学生较为熟悉的工作,能够较快进入角色。但实际情况中编码阶段的问题并不少。虽然学生不必像前面系统分析和设计阶段那样由指导教师来亲自示范进行前期引导。编码阶段的问题主要体现在以下几个方面:(1)编码规范。虽然在相应的课程学习时都多少有所提及,但绝大多数学生仍然编写的是非常零乱的程序。这需要指导教师经常提醒或示范并要求学生及时改正已有的程序。在编码阶段后期,部分学生开始自觉按规范编写程序。这时指导教师应以这些学生的作品为示范,并要求他们帮助指导其他学生。(2)程序错误调试。这是最突出的问题。学生往往在程序出错时不知所措,难以自己解决问题。指导教师可以以学生作品中出现的典型问题为例,结合调试程序的一般原理,多次在机房示范讲解怎样调试程序。但这个问题不能光通过指导教师的讲解来解决,还需要学生自身不断实践,投入大量时间、精力去调试、完善自己的程序。在编码阶段后期,应要求学生相互交流调试程序的经验。对于学生讨论后还不能解决的问题,指导教师应给予支持。(3)学生的情绪不稳定。碰到问题长时间不能解决后,多数学生有畏难情绪,甚至想放弃。指导教师这个时候应该及时组织学生一起交流,特别是鼓励取得阶段性成果并带有喜悦、兴奋情绪的学生谈体会,让别的学生分享其喜悦,大家相互促进。指导教师如果直接给学生加油鼓劲往往不能起到好效果,学生间的相互感染要直接有效得多。
  测试阶段在实际工作中也很重要。但在第一次的软件开发教学过程中不必太强调。因为要求苛刻的测试会让多数学生感到作品一无是处,从而没有成就感。一般说来,要求学生在编码过程中同步做初步的功能测试,在完成编码后做初步的运行测试即可。可能的话,可以鼓励学生相互间做功能和运行测试。
  编码和测试阶段共需要4~6周。设计阶段完成较好的学生在这个阶段会顺利一些。很多学生在这个阶段经历挫折后取得了成功,从而激发了学习兴趣。
  待学生作品基本完成后,可组织全体学生介绍展示自己的作品并谈谈体会。还请一些教师来为学生的作品评分。从结果看,整个软件开发教学过程达到了预期目的。学生普遍感到经历这样的过程后,提高了软件开发能力。□