首页 > 代码库 > 体系化的面向对象课程
体系化的面向对象课程
按:面向对象是绝大多数计算机专业学生的重要课程,北航也不例外。事实上,北航开设OO课程已经有十几年的历史,梳理一下历史发展脉络,基本可以分成三个阶段:第一阶段,面向对象概念与UML表示,那时Java的使用还不是很普遍。这个阶段课程的特点是侧重于介绍UML语言,以及如何使用UML分析和描述一个软件的概要性设计。第二阶段:面向对象概念的程序化表达,由于UML是一个比较抽象的描述性语言,大二学生不易理解和掌握,特别是在应用方面。此阶段课程开始引入Java语言,并在UML与Java之间建立了面向对象概念之间的映射,并结合典型的设计模式介绍UML的表示和相应的Java程序表示。第三阶段,通过大作业量和高强度的训练来掌握面向对象思考方法和设计方法。这个阶段的改革始于2014年,基本是从0开始,完全重构了该课程。后续博客会再来细谈。
这张图是关于OO课程的全部故事,此图产生于午后咖啡馆与高老师的精彩BB。我们的一个基本共识是:北航培养出来的本科生必须能够搞定企业的复杂软件问题,而且我们要成建制的达成这个目标。所谓复杂软件问题,就是设定在贴近企业真实需求的背景下,抓住其复杂的核心特征(功能多、技术要求高、质量要求高),在给定时间内(工程节点要求)开发出满足质量要求(鲁棒性、性能、安全等)的软件(注意不只是程序)。所以这是“昆仑课程”,即面向对象设计与构造主课的目标。经过4年的运行,我们的达成度基本保证在85%水平上。简单来说,主课的目标是1周之内,根据给定的需求和设计要求,使用规格化方法开发出2000行代码规模的有效Java程序,能够撰写相应的自动化测试程序,且能够手工证明程序满足设计要求。这个带有冒险性目标的设定,以及能够成功run下来的基本前提背景是,北航近年来的大力度本科教学改革,强调能力训练和达成度,使得同学们在二下时已经具备了抗下大作业量和高强度训练的心理素质和必要的技术能力。可以说,这是体系设计的结果,而不是哪一门课的作用。
基于2014~2016三年的运行,我们发现,挂科的同学往往在课程前半段就跟不上了,而这些同学因为两地办学和三年级课程紧张等一系列原因,难以真正在重修中达到所要求的目标。上面的图主要是从解决这个问题角度出发得到的解决方案:上昆仑前作必要的训练,昆仑山上才能具备训练的基本条件,实在无法完成训练,带着未完成任务进入补给站。如果补给站还不能通过,则需要第二年再次进入高原进行训练。
对于那些数据结构和C语言尚可,但是不了解Java的同学而言,在昆仑课程的前三次作业基本就丧失了继续战斗的信心。针对这个现实情况,训练营课程的目标是采用现场训练方式,而不是传统的讲授方式,在暑期两周内从Java语言小白变成2天内写出150行左右有效代码的能力,且具备有效的面向对象设计特征。这个课程的特点可以概括为三个:(1)只强调最核心的OO特征,对象化、数据封装、层次抽象;(2)课堂线程训练和现场分析的方式,而不是课堂讲授的方式;(3)强调自主查找类库的使用技巧和方法,并使用类库来解决问题。
补给站课程面对的是未能完成昆仑课程的同学,即无效作业次数达到5次及以上(总共12次编程作业+4次总结作业)。这部分同学基本可以分成两类,一类是前半段被“打趴下了,但后半段逐渐又起来,无奈达到了5次无效作业”,这类同学其实有着还不错的基本编程能力,但是在Java学习使用和面向对象概念掌握方面进度较慢,导致后面无法追赶进度;还有一类则是基本采取了放弃的态度,通常是那些在数据结构和C语言课程本身就困难较大的同学。这类同学基本要进入训练营课程才能解决问题。补给站课程采用“缺什么,补什么”的策略,针对每个同学的无效作业情况,制定计划完成相应作业,并采用答辩的方式来对作业完成效果进行评价。答辩要求必须提供证据表明程序功能满足要求,然后老师会现场提供新的测试用例进行测试,并从设计和代码质量角度来提问。
随着同学们逐渐大四毕业,进入企业实习或继续生造,越来越多的同学反馈说,他们在OO课程上学到和训练的东西真的给了他们很多机会,特别是在企业实习和工作方面的机会。我们希望这样的案例越来越多。
体系化的面向对象课程