体系化的面向对象课程

按:面向对象是绝大多数计算机专业学生的重要课程,北航也不例外。事实上,北航开设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课程上学到和训练的东西真的给了他们很多机会,特别是在企业实习和工作方面的机会。我们希望这样的案例越来越多。

时间: 2024-10-08 05:30:15

体系化的面向对象课程的相关文章

C#面向对象课程 类与对象,方法重载,类的静态成员,命名空间和类库12月22日

一.类是面向对象课程的基本单元. 在类的里面可以直接定义字段(成员变量),也可以定义方法(函数). 例如: 这里的public是修饰符,修饰符的作用是用来限定它的可访问范围. 两个同范围(同一个类中,或者父子类中)两个同名但参数类型不同或者参数个数不同的方法互相间构成重载关系. 两个构成重载关系的方法(函数)必须满足以下条件: (1)方法(函数)名相同: (2)参数类型不同,或参数个数不同.这里需要注意的是,函数返回值类型的不同不是函数重载的判断条件. 二.静态成员 属性.方法和字段等成员是对象

C#面向对象课程两大特性——封装、继承 12月23日

一.封装 封装:就是将成员变量设为private私有的,然后将其封装出一个属性 属性是具有get和set两个函数的读取写入器,能够成为赋值取值做数据传递. 封装的方法:在字段名上点击右键,重构—封装字段,即可将字段封装. 二.继承      继承是面向对象编程中一个非常重要的特性,它也是另一个重要特性—多态的基础. 类与类之间可以具有继承关系,一个类只能继承一个父类(单根性),但可以被好多类继承. 父类与子类之间拥有以下两个基本特性: (1)是一种(IS-A)关系:子类是父类的一种特例. (2)

大一下学期的自我目标(要求包含对大一上学期的总结、对面向对象课程完成后学习到的能力的预期,对面向对象课程的期望、对编程和专业能力的愿景规划)

在大学度过了第一个学期,也是我成年离开家的第一次经历.在大学里结识了许许多多的朋友,也对自己选择的计算机专业有了初步的了解,但总的生活却让人不满意.大学的生活可能是因为好不容易拜托了12年教育的痛苦,想好好放松一下.也有可能是在大学里充斥着生活的除了学习,还包括了各种各样的社团生活,部门工作,对社会的新奇,对人际的向往,让自己不能静下心来好好的学习,学习上没有做的全部的掌握,也让上个学期的大学生活有了一个小小的遗憾.不过结识了许许多多的小伙伴,通过大学的班级,学生会工作也让自己的能力得到了锻炼,

面向对象课程第三次随笔

一.规格化设计的发展历史 20世纪60年代,软件出现严重危机,Dijkstra提出了goto语句的危害,由此引发了软件界长达数年的论战,并产生了结构化程序设计方法.Pascal语言在20世纪70年代占有统治地位. 随着计算机技术的发展,结构化设计语言和结构化分析无法满足用户的需求,OOP由此应运而生,即面向对象的程序设计.OOP的诞生是程序设计方法学的一场革命,大大提高了开发效率,减少了软件开发的复杂性,提高了软件的可维护性,可拓展性.1990年以来,面向对象分析.测试.度量和管理研究都得到长足

C#面向对象课程12月21日

一.练习题:使用结构体输入学员信息,学号  姓名  分数 排序之后按分数从高到低输出 class Program { //用户自定义,我们自己定义这种数据类型 public struct student { public int Code;//成员变量 public string Name;//成员 public double Degree;//成员 } //主函数,一个程序有且只有一个 static void Main(string[] args) { #region==结构体变量定义== /

Java面向对象课程小结

1.什么是对象?什么是类? 类和对象的关系 定义类的方法 方法五要素 new关键字 引用类型变量的赋值 null和nullException null大小写的区别 2.方法 重载和重写 构造 方法,带参构造 this关键字,可以重载 引用类型数组 3.内存管理 成员变量的生命周期 垃圾回收机制 栈.堆.方法区 方法只有一份 成员变量和静态变量 向上造型 4.继承(继承和多态) 继承中的重写 父类中的重写 父类关键字super 访问控制(包import) 四种权限 static  final 成员

面向对象课程第二次随笔

多线程的协同与同步控制 第五次作业 作为第一次多线程作业,对于多线程的同步和协同机制还不是非常了解.在这次作业中,我将三个电梯作为了三个线程,输入线程和调度器线程进行辅助.输入线程和调度器线程之间采取了很简单的生产者消费者模式来进行指令的传递.比较重要的是调度器与三个电梯之间的协同,共享资源为指令与电梯的状态.由于要考虑电梯的状态进行分配指令,电梯状态的同步是十分重要的,我在电梯类中设计了一个专门的方法返回电梯状态并将这个方法synchronized来保证调度器获得的电梯状态与实际电梯状态的同步

面向对象课程第二单元总结

本单元的整体多线程冒险体验对于我来说是要比第一单元好的……原因无他,我第一单元栽倒在输入处理和正则上的比例有点高,感觉除了设计上的丑陋之处,其他的全是输入处理上的问题= =…… 当然这并不代表本单元的冒险不紧张刺激,但至少省下输入处理的精力,我在代码结构的构造上面还是下了功夫的,整体构造感觉上要比第一单元更加合理一些(也许代码度量插件不这么想orz).这其中也有老师教的合理的多线程设计模式的功劳,在已有的框架内,会把生产者消费者.仓库工人等等线程类所要完成的工作规定清楚,避免上帝类.废物类.奇怪

java入门经验分享——记面向对象先导课程学习感想

选择在暑期学习面向对象先导课程的初衷是为大二下学期面向对象课程做一些铺垫,接触入门java语言.在接触java的过程中,就编程语言的学习方法而言,我从刚入学时的手慌脚乱四处寻求帮助到现在慢慢养成了自己不断寻找困难解决方法的习惯,感觉自己的另一种自学能力--一种计算机工科的实践能力得到了培养,这种自学能力跟学习基础课程理论知识的感觉完全不同,这种需要在实践和动手中得到经验和知识的自学方法与以前理解现成抽象理论概念的自学方法可以说是完全不同了.作为一个偏好理论研究的理科女生,动手实践能力在此之前几乎