提升学生软件能力的成功实践
--北航面向对象课程培训简记

2018暑假开始时看到一个通知,吴际老师团队要在北航举办“面向对象设计与构造师资培训班”。早就听说过吴老师的这门课,很难,但对学生帮助很大,很受欢迎。我很好奇具体是怎么做的?难度多大?学生做不出来怎么办?开发软件需要很多知识和技能,如何在一门课里解决?250个人的大班,如何指导学生?带着这些疑问,我报名参加了培训。
培训一共五天,全国各地的老师来了四十多人,大家组成四五人的小组,一起讨论、练习。
培训详细讲了面向对象设计这门课的主要思想和教学过程。学生在上这门课时,需要完成两个软件案例的开发,一个是电梯控制程序,另一个是出租车调度系统,通过课堂练习、课后作业、实验课来完成。这次培训以电梯控制程序为例进行了介绍,让大家走完了主要过程,并介绍了线程安全等高级话题。根据培训中各位老师和助教的讲解,总结出课程的几个特点。
特点1:要讲课,更要编程
课程的一大特点是所有教学都要在“做”上落实。要求学生通过课上练习和课下作业完成案例的编程。考虑到有些学生没用过Java,如果只是把软件任务布置下去让学生做,可能做不出来,效果不能保证。为了上好这一门课,吴老师实际安排了三门课:先导课程、昆仑课程、知识补给站课程。
- 先导课程安排在大一暑期,快速教给学生入门知识,包括Java语言,OO基本特征。
- 昆仑课程是大二上学期正常上课。好比是把运动员拉到高原上训练,空气稀薄,提高能力。
- 知识补给站针对正常上课中跟不上的学生,这部分学生的知识不足以完成昆仑课程的任务,暑假为他们补课。就好像运动员无法承受高原训练的强度,要提供一些专门补给,否则就倒下了。
其中,昆仑课程的任务体现了课程的难度,通过几阶段的编程迭代训练,最终学生一周内能开发1000~2000行OO程序,能开展严格测试与验证。
在编程案例的选择上,满足如下特点:
- 复杂度:有真实系统背景和一定的规模,以及明确的质量和进度要求。需要有分析、编程、调试和算法知识;
- 高质量:要符合编程规范,能通过测试。使用技术性手段来表明/论证所开发的软件质量是否满足要求;
- 使用工程化的方法:有方法指导,可综合分析软件功能和性能相关约束,设计方案和实现代码,并能使用测试和推理分析等手段进行综合验证和优化。
特点2:要结果,更要过程
课程中间布置了十几次编程作业,如果只是让学生交报告,老师不了解学生作业是如何完成的,就无法追踪完成的过程,难以起到培养能力的效果。课程中有系统化的方法来量化过程进展和出现的各种问题。主要是通过测试来实现。测试分为公测和互测两类。
公测由老师和助教准备一定数量的测试用例,目前是33个,测学生提交的程序,公测能测出大部分常见bug,以保证进入互测阶段的程序可运行,达到基本的质量要求。互测时由学生自己写测试用例,测其他学生的程序,因为程序通过了公测,找出新bug有一定难度。从测试结果能清楚地看到每个学生程序的测试通过率,程序质量好或不好有据可查。下面是一个公测的测试用例:
- 用例输入 (楼层及电梯内请求指令)
(FR,1,UP,0)
(FR,8,UP,0)
(FR,4,UP,2)
(FR,7,UP,3)
(ER,8,4)
RUN
- 期望输出 (每执行完一个输入后,期望的电梯状态)
[FR,1,UP,0]/(1,STILL,1.0)
[FR,4,UP,2]/(4,UP,2.5)
[FR,7,UP,3]/(7,UP,5.0)
[FR,8,UP,0]/(8,UP,6.5)
[ER,8,4]/(8,UP,6.5)
- 实际输出 (程序实际输出的电梯状态)
[FR,1,UP,0]/(1,STILL,1.0)
[FR,4,UP,2]/(4,UP,2.5)
[FR,7,UP,3]/(7,UP,5.0)
[FR,8,UP,0]/(8,UP,6.5)
#SAME[ER,8,4]
- 运行状态 (比较期望输出和实际输出,判断状态是否正确,测试是否通过)
错误
这个测试系统是北航学生开发的,作业程序提交到课程的Gitlab上,测试系统自动拉取程序,启动JVM,执行程序,调用测试用例完成测试,并给出在线测试报告。
特点3:一遍不够,要迭代
吴老师团队在讲课、实验、作业等各教学环节,都体现了迭代和递进的思想。比如电梯的案例设计,第二次作业只要求写一部电梯的傻瓜式控制程序,顺序执行,不考虑中间同方向的楼层请求;第三次作业增加捎带功能,在原来基础上,多了一些判断;后面的作业增加到三部电梯,需要考虑并发和多线程。复杂度和难度每次增加一点。按吴老师的说法,要垫上一两块砖才能够得到。
不仅大的教学案例迭代,小的具体概念也考虑了迭代。比如“锁”,第一次只是在PPT中出现一次,不展开介绍;后面再出现时,介绍锁的概念、特点;最后在讲解编程时教给学生,如何分析、实现和测试锁。
通过精心设计的迭代,学习过程没有跳跃,学生在一个平缓的过程中自然地完成了高强度的学习和训练。
特点4:教师引领,助教助攻
面向对象课程设计了十几次作业和八次实验,要给所有的作业和实验评分,中间持续答疑,需要掌握学生情况,以便动态调整课程。和普通课程相比,任务增加了很多,只靠教师难以完成,需要助教辅助。
北航这门课的助教全部由本科生而不是研究生担任,也是一大特色。助教的安排也体现了迭代和递进。助教按年级不同,分为三种类型:
- 预备助教:正在学习这门课的学生,在学习过程中提建议,参与对课程改进。下一年可转为正式助教;
- 正式助教:预备助教转正而来,助教工作的主要承担者;
- 高阶助教:正式助教下一年成为高阶助教,指导预备助教。
助教团队约10人左右,自愿参加,能做助教都是优秀学生,是一种荣誉。学院发给助教一定的补助,保研时可加分。
培训小结
几天的培训下来,感到吴老师团队的这门课,像一场音乐会,老师、助教和学生共同配合,和谐地完成了整个演出。每一个环节都用心做了设计,有讲解,有作业,有实验,可量化评估。结果分析显示,课程开始时学生的代码错误率较高,后期越来越少,包括其它的一些指标,都说明学生通过课程的学习,软件能力确实有了明显提升。
那么,如何在自己的课上做?
我上的是软件工程课,和面向对象相比,更侧重向学生强调生命周期各阶段的概念、项目管理的方法。课程中要求学生开发一个联想笔记本商城系统,使用的语言不限,最后交文档和代码,并演示系统,一直感觉对过程控制的不够。这次培训给了我很多启发,特别是项目复杂度、难度设定,过程控制,以及迭代三个方面。今后打算尝试把出租车调度系统作为开发案例,提高软件开发的复杂度和难度,同时提高分析文档和编程的要求,增加对过程的把控。引入需求的验证、设计中耦合、内聚、程序复杂度等的计算和评估。在编程方面,学习北航的先进经验,对课堂设计、作业、实验、助教等环节进行改进,用心设计细节。
另一个问题,北航课的体系完善严密,老师和助教阵容整齐,外校能否学得来?
罗马不是一天建成的。最初吴老师开始这样上这门课时,只有他一个人,200多人的课,每到交作业时,要加班到半夜2、3点,也没有辅助教学系统,完全靠个人的超强能力,把课程讲了下来,取得良好效果。因此,外部条件不是成功的必要条件,关键还是教师自己。
另外,为帮助大家更好的掌握教学中的细节,吴老师团队正在编写教材,方便老师们在自己学校复制。也提出了建立软件能力工作委员会的倡议,把有兴趣的老师们聚集到一起,互相交流,有利于大家得到更多的资源。培训中吴老师说,一门课布置的任务,如果只有10%的学生做的好,可能是学生自己能力强,跟老师教的关系不大;有80%的学生做得好,才能证明是教得好。现在,这门课在北航取得了成功,如何能在更多的高校落地,达到同样的效果,是一个更大的挑战,也是很有意义的事情。相信经过吴老师团队以及所有志同道合老师们的努力,会不断取得进展。
这次培训,把一学期前后的课浓缩在五天的培训中介绍,这篇博文,又把几天的培训压到一篇文字里,难免挂一漏万,有些理解和表述也不一定准确到位,请吴老师和大家指正。

浙公网安备 33010602011771号