2018年7月12日到16日,期末工作刚结束不久,我和同事一行三人在北京航空航天大学计算机学院,培训了面向对象程序设计与构造课程的教学和实践,聆听了这所一流名校核心课程团队的若干报告和经验分享,体验了整个实践教学体系,和来自全国的一线同行教师进行了频繁的面对面交流。接近一周的时间,感觉收获良多,绝对不虚此行。有哪些收获呢?
一、重新认识了能力培养
作为教师,职业本能是站在讲台上,滔滔不绝地将自己认为学生应该掌握的知识(注意是知识,不是能力)讲给学生听,至于对学生来讲至关重要的能力培养,则严重关注不足,一直以来都以为自动完成似的。
那么什么是能力?能力如何培养?
吴际老师分享的报告中,提到了能力形成于过程细节,能力是do
具体来说,对于面向对象程序设计这门课程,更为关注的是软件能力的培养,按北航的理解,软件能力是“使用工程化方法,开发具有一定复杂度的高质量软件系统的能力”。关注复杂度、高质量代码和工程化方法的软件能力不等同于学生编程解决ACM问题的能力,后者是前者的良好保障。学生软件能力的提升是分阶段的,对应于教学计划来讲,则是应该由一个课程群(数据结构、面向对象、算法设计、软件工程)分别完成不同能力阶段的培养任务。有点像我们培养方案中的CDIO三级项目课,分别对应不同层次能力的培养。只不过学生培养的定位不同,另外后面的细粒度过程控制和反馈,我们做得远远不足。这都是我们以后可以改进的地方。
二、梳理了面向对象课程的知识体系
面向对象课程讲什么,怎么讲更有效,这是所有任课老师关心的问题。北航介绍了他们的实践和经验:设置了先导课程(选修)、昆仑课程(必修)、暑期补给站课程(不及格学生的暑期课程)的知识体系,分别完成OO基础概念、OO核心知识和后进学生的补充学习。相比较传统的知识体系确定方法而言,这种做法考虑了不同层次学生的需求,内容上是逐次迭代,难度上是逐渐爬坡的,整个设计很完整。
看得出,这样一套课程体系不只是面向对象程序设计本身,涉及到了规格化设计、测试和验证,具有广泛的覆盖度,直接拿来主义恐怕不符合我们这所普通二本院校的需求,但是设计思路给人以启发:面向对象程序设计不能仅仅讲授语言层面、工具层面上的这些学生在课下翻翻书就能学会的知识,更重要的是,要能够深刻理解面向对象思想,并以此为基础进行高质量代码设计,我们接下来的任务是借鉴北航提供的案例,结合我们的人才培养方案,制定适合本校学生的能力培养知识体系。 比如,由于在本校的教学计划中,有软件工程和软件测试两门必修课,所以规格化设计、测试和验证部分培养的能力,在这门课中就可以不体现或者弱体现了。
三、了解了实验课程体系
北航的这门课程实验课提供了8个实验指导书,共计16学时,完成了面向对象程序设计与调试、多线程程序观察与调试、规格设计和代码交叉补全、自动化测试和模型设计等内容。非常充实,而且和理论课4个模块的授课内容相匹配。我所任教的这门课程,实验学时是8个,内容方面必修进行调整。初步想法是,结合实际情况,不涉及规格设计和测试部分的学习(这些内容可由后续的软件工程、软件测试课程覆盖)。当然这还需要跟理论课相匹配。
实验指导书在实验过程中起到了非常重要的指导作用,它能够配合理论课,让学生在规定时间完成相应知识体系的学习。每个实验都布置有需要当堂完成的任务,在线提交,其主要作用,还是定位于帮助学生构建相应的知识体系。
四、体验了课程作业体系
能力的提升,在于完成作业的过程,这是软件能力提升的关键。
北航这门课程的作业体系有鲜明的特色:站在用户的角度、工程化方法、完成高质量代码、项目具备一定复杂度。作业由易到难,增量迭代设置。设计的思想是二维的大周期(进阶周期、深化周期、精炼周期、贯彻周期)、小周期(每次周期内的作业发布、提交、公测、互测、申诉)。内容方面强调核心知识的覆盖和训练,特别是电梯调度作业还有模拟滴滴系统作业具备明显的迭代性和综合性,相信完成了这两个作业训练的学生,能力必然大幅提升。
作业的量非常充足,很好的承担了能力训练的任务,下图是听课时做得笔记,不一定齐全,但是可以明显看出量和内容吧。
可借鉴的地方:
1、增量迭代的作业设计。必须迭代,迭代能够带来不一样的训练效果;
2、博客作业。博客作业可以在线记录自己的学习成长,而且是一种很好的档案资料;
3、工程化方法、一定复杂度。作业简单了不行,简单意味着无法训练能力;太难了也不行,太难意味着全面打击;吴老师形容得很好,垫两块砖可以够得着,挺好!
4、过程化考核。可借助github, gitlab等工具记录作业提交过程;
5、作业情况的反馈。作业完成情况回头看,积极做出反馈;
6、团队人员的通力协作。北航配备了助教团队,完成了大量的作业考核方面的工作,保证了作业的考核质量。
五、基于过程数据的能力形成效果观察(吴际老师报告)
能力形成于过程,过程质量由细节控制。北航通过采集学生的学习行为数据(代码提交次数、互测通过率、系统访问次数、bug报告、申诉情况等),对学生学习进度、代码质量、能力差异、构造能力与测试能力、层次间流动、代码提交情况与作业完成情况进行了观察与分析,一切以数据说话,感觉还是很震撼的。人们一直以来将教学改革和科学研究对立起来看待,从而才有了重科研轻教学这样的说法。吴老师展示的数据让我们看到了教学过程如果控制得好,数据会说话,这在科研方面很有价值。教学和科研,是可以非常好的结合的!
六、我们怎么办?
整个培训安排的十分紧凑,收获满满。毋庸置疑,北航团队已经探索出了一条符合自己学校实际情况的特色道路。关键的问题是,我们怎么办?我觉得可以从以下几个方面入手:
1、结合人才培养方案学时的要求,修订教学内容,使之更加适合学生面向对象程序设计能力的培养;
2、配合理论课任务,重新设计实验课;
3、重新设计作业体系,加入增量迭代的思想;
4、使用gitlab,github等平台,完成对学生代码提交数据的采集和记录;
5、探索建设助教团队,保障教学质量;
6、对于本校学期末配备的课程设计进行重新设置,使之能够在理论课、实验课的基础上,增量完成一个覆盖面向对象概念、多线程和线程安全和工程化方法的项目。
完成这些工作并非说说这么简单,幸运的是北航团队在这方面做了有效的尝试,有强烈的示范作用。感谢他们提供的学习和交流机会!看得出这是一个非常有执行力的课程团队。接下来,我们希望能够站在巨人的肩上,改进本校的教学,提高学生的软件能力。