软件工程是一门很难教的课程,究其原因,无非几点:
1. 软件工程是在工作中打磨几年,才可能有切身体会的。在学校学并没有强大驱动力,因为好像用不着,又不像一门语言课,它是“硬”本事。另外,软件工程的理论知识并不像高数或者算法那么深奥,学起来感觉没学到什么高深的知识。简而言之,就是学生很难get到一种驱动力。
2. 软件工程要实操,就得有比较好的基础,比如熟悉一门语言,编过一些程序,在里面折腾过。可是,前面的基础学得好不好呢?有时候只能哭笑不得,面向对象都不知道是什么。这就大大影响了本门课的教学,搞得上软件工程课的老师什么都得教什么都得会,即便老师会,学生在短短一个学期里面也不可能补上前面几年的基础。
3. 说是说软件工程专业,可大部分学生是对这个方向上的就业兴趣不大的,一个班能有四分之一有这个想法就很不错了。于是,当老师告诉学生软件工程有多么重要时,得到的反馈就是:好,重要,但与我何关,我只想过个关。
教了几年软件工程,有点心灰意冷,特别是学生的学习欲望简直让人失望。老师都愿意教,可得有人愿意学啊。于是,愿不愿意学习自然也成为了老师要解决的问题。让大家做实践项目吧,大部分人就是拷贝粘贴,反正就是一个平时成绩,最终还是试卷成绩作为主导。不做项目吧,这门课确实索然无味,很多时候就是另一种形式的心灵鸡汤,听一听可以,但没用。
如何在短短一个学期内,在学生基础都很差的情况下,在大家还愿意配合不闹到教务处的状况下,教出有点效果的软件工程课呢?
首先,得要跟院领导争取平时成绩占比至少达到60%,这是前提。考试也考,不违背学校教学基本范式。
再次,必须要降低要求和工作量。
软件工程必须得依靠个人项目,结对项目,团队项目三个项目的轰炸才会有效果,这就是『构建之法』邹老师的核心理念:做中学。做了东西,对于激发学习兴趣很重要,对于体会软件工程核心思想更重要。传统教学可能看重的是DFD中的对象是圆形还是方形,但做中学的思路根本不是注重这个。一个圆形一个方形与软件工程到底有什么关系?没关系。如何画一个有价值的DFD才是软件工程思想的体现。可这些东西不在实践中,不在项目中,怎么才能教的好?
对于大三的学生,三个项目必须到位,对于大二的学生(学习软件工程概论)必须做一个团队项目。
如何规划教学就很重要了,下面是我的一些想法:
1. 平时学业,每次总分十分,打分为三挡,10分,有自己经过实践的,有价值的观点;5分,有自己的阐述,未经过实践,应付居多;0分,未交或迟交或引用不说明来源或全盘拷贝。平时作业占比平时分的50%。平时作业每周至少一次,也可以自行多做,但以后给一个平均分作为作业成绩,计算公式:score=50%*10*(s1+s2+s3+...+sn)/n,n>=8。当自己平时有一次没有交作业,就多做点有价值的作业,拉高平均分。不再考量附加分,全部归纳到作业分中。
2. 平时作业从实际项目中提取题目,结合实践做,比如黑盒测试有几种方法,你在你的项目中是怎么采用边界值法来测试的,举例说明,并有测试结果。这样,就将项目中的某些工作移至作业中了,工作量降低了,也很好的全面学习了理论。
3. 个人项目在立项时要能融入结对项目,结对项目在立项时要能融入团队项目。这样,做的代码和文档就不会浪费,大大降低了工作量,但还能保证学习效果,毕竟软件工程是一种理念,通过实践才能更好的去理解,它不是编程课,不能把这门课上成了JAVA实训课。比如团队项目是一个游戏,那结对项目就可以做游戏中场景与角色程序设计,那个人项目就可以做角色自身动画程序实现。结对双方最好在团队中选取。
4. 个人项目主要是带入,让学生走入这这门课,结对项目主要是偏重知识点实践,比如UML怎么做,代码复查怎么做,白盒测试怎么做等等,团队项目是主打传递或更深入理解软件工程的核心理念,比如迭代升级,团队沟通等。
5. 因为平时作业做了项目中很多事情了,所以个人项目占比平时成绩10%,结对项目占比20%,团队项目占比20%,结对项目中分数分配由两人协商,不可相同,团队项目中分数分配由团队协商,不可相同。三个项目都是百分制。团队项目必须有一个队长,队长全盘负责。
6. 不太建议个人项目和结对项目采用命题作文,一般一个老师会同时教三个班,大概100多人,这么多人采用命题作文,基本上会出现拷贝的情况,老师也没有办法一一排查谁抄的谁,即便你要求多具体和详细,拷贝是忽略这个的。目前,都是采用开放式的。个人项目评分为三等,100分,完全自己做的,可以运行,有项目说明;50分,自己修改了一部分,也看懂了,可以运行,有项目说明;0分,没交,迟交,拷贝的,丁点修改。结对项目对文档要求低点,团队项目必须要有所需的全部文档。
7. 这样的教学方法,考试出题是个大难题。这里提供一种方法,不出纯记忆力题目,出几个大题即可,大题就是平时作业,比如出一道白盒测试题,写一小段程序,请写出路径覆盖的测试用例。如果平时认真做了作业的,考试完全没有问题,意思也就是实际上没有考试环节了,只是形式上有。
终上所述,软件工程的核心还是在于“做”,但通过手段将复杂的教学流程简化,简化的目的是让教学取得更好的效果。这门课的核心目的我认为是通过“做”来理解软件工程的核心思想,这门课无法覆盖语言课、算法课、创新创业课、数据库原理课、JAVA课程实践等。