软件教学新思维 - Bertrand Meyer的逆向大纲教学法 -- 软件行者 [an error occurred while processing this directive]
SoftwarePractitioner.org


首页

作文

翻译

随笔

本站

English
  


软件教学新思维

Meyer之逆向大纲教学法

胡健

2006年4月

关于Bertrand Meyer

Bertrand Meyer是位面向对象技术的大师,也是现代软件工程的先驱之一。 他具有深厚的计算机科学理论素养与长期的工业界的软件工程实践经验。 他的出色工作奠定了他在OO技术和软件工程方面的地位,在2001年10月被聘为瑞士 联邦技术学院的教授、软件工程主任(Chair of Software Engineering)。 Meyer最为著名的是专著“Object Oriented Software Construction”,契约式设计 (Design by Contract)思想和这些思想的结晶-Eiffel语言。 Eiffel语言是Meyer创建的一门完完全全的OO程序语言。其设计精巧,结构严谨,风格优美。 最主要的特点是Eiffel直接实现了Design byContract(契约式设计)。在Eiffel源码文本中, 每一个功能例程都要说明前提、后验条件,而每一个类都要说明类不变条件。

学术界与工业界

Meyer曾长期在工业界工作。对于学术界和工业界的状况也有着自己独特的见解。Meyer认为,软件领域里 学术界和工业界的关系和其他领域不同。一般来说,人们会认为学术界更富于创新。而在软件领域却是 反过来的。在OO技术领域,过去20多年来几乎所有的创新都是来自工业界。事实上,除了最初的思想是 从Oslo大学Simula 67提出的,其他源于大学的贡献几乎没有。

但是,工业界里有种很不健康的情况,就是对学术研究有着本能的不信任,特别对任何有些数学味道 的东西都持怀疑态度。Meyer认为,程序设计虽然是门实际的手工艺术,但它也是应用数学的一个分支。 其实在软件实践中要用到的数学也不是很艰深,大部分都是高中或大学本科的水平,但具备这种能力却 可以极大地改善软件产品的质量。

再回过头来看学术界。Meyer指出,大学在过去二十年对软件技术的发展没能做出足够的贡献,而目前 在种种压力下,又转向另一个极端。某些大学以满足工业界的要求为由而推动讲授特定的技术。他们 其实是误解了工业界真正的需要:用人企业知道寻找的是解决问题的能力而非狭窄的知识。 要培养优秀的软件人员,重要的是要教给他们根本性的思维方式,这些将伴随他们整个职业生涯并帮助他们 在这个多变的领域里成长。

目前,软件已影响到社会的各个领域,因此而来的是对软件开发人员的需求。许多人在学习编程,目前市场 上有很多功能齐全的开发工具使得这种学习变得很方便。但这样一来,许多开发人员,都没有受到 过正规的计算机科学教育。Meyer反复强调,基本水平上的编程和专业的软件开发并不是一回事。正如能 写字的人并非一定就是作家,会算术也并不意味着你就是一个数学家。

程序设计是软件工程的基础与核心,但并不等于软件工程。Meyer认为可以从软件工程的工业性质上区分开 软件工程和程序设计:“软件工程是开发用于生产环境中的、可能很大的系统,这种开发可能费时长久、 人员众多、多次修改”,这里“开发”包括了管理、维护、验证(validation)、文档,等等。在ETH的 软件主任的就职演讲中,更简明的提出了软件工程要解决的是软件系统的正确性和可变性,而软件教学的 中心应该是教授正确的系统建造技能。

软件教学思想

Meyer一直对于软件工程教学有着浓厚兴趣。早在1990年代初,他就提出了基于OO原则的软件教学思想 [Meyer1993]。他认为OO技术不仅是大势所趋,更是一种建造软件系统的清晰而有效的方法。整个 软件教学,包括引论性的程序设计课程其他软件课程,如数据结构与算法,都应该融入OO的思路。其 教学方法的核心是 “逆向大纲”(inverted curriculum),即学生先作为用户来使用一些软件部件 来建造他们自己的应用系统,然后看看这些部件是怎么做的,再改一改、扩展扩展。

2001年5月,Meyer在IEEE Computer上发表了一篇题为“Software Engineering in the Academy(院校 软件工程教学)”[Meyer2001],从一个更为广阔的角度全面地论述了他的软件教学思想,并从他自己的 长期在工业界的经验出发,更一般地讨论如何把软件工程关心的基本问题反映到整个软件教学大纲中去。 其立足点是试图在概念和操作(原理和技术)之间保持一种平衡。他认为一份软件教学大纲应该包含 五个相互补充的要素,我觉得大致可分为两类:

  • 原理与数学
  • 实践、应用与工具;

原理是构成整个学科基石的恒常不变的基本概念,主要有:

  • 抽象。这是从事任何科学研究的一个基本素养。而在软件中主要表现在区分规范说明与具体实现。 这个问题是软件工程特有的,因为它对付的是虚拟而有些飘渺的东西。Meyer并举例说,没人会把 一座桥与这座桥的图纸,或一辆车和这辆车的制造计划相混淆。你不会从图纸上掉下水去,也 不会被一纸计划轧过。但在软件里面,这种区分远远不够清楚。与抽象相关的还有信息隐藏的思想。
  • 契约(contract)。一个软件系统被视为一组相互交流的部件,它们之间互动的基础是一组准确定义了 的规范,它规定了这些部件相互之间的义务 -- 即契约。契约式设计理论建议每一个软件单元都应该 有一个规范说明。这些规范(或契约)管理着一个软件单元与其外部世界的交互活动。
  • 递归。递归概念是由数学而来,而在软件领域中被发扬光大。这不仅仅是递归例程这个技术问题, 而是一种通用的思维模式,包括递归定义、递归数据结构、递归推理以及递归证明。

数学是能够很好理解问题的形式化基础。Meyer不止在一个地方强调,基于在工业界作为一个 软件设计师和项目经理的经历,他反复发现那些能够把数学推理应用软件开发的程序员和那些没有这个 能力的程序员相比具有明显的优势。软件教学大纲中的数学教学除了通常的课程,如微积分,还应提供 逻辑学的坚实基础,也应该用实用的语言来介绍一点形式语义学。Meyer根据他的观点和经验认为,作为 一个完全合格的专业开发人员需要掌握象霍尔语义学这样的理论和以及使用象Z或B这样的现代形式化语 言。他并且进一步提出,霍尔语义学及其类似的原理之于软件工程就象麦克斯韦方程或力学定律之于 物理学。

实践是优秀的专业人员自觉而经常运用的解决问题的技术。软件工程教学也应该让学生熟悉业 界常用的实用技术,这些技术作为行业的一个关键组成部分,实践证明对软件生产很有效。这些技术包括: 项目管理,文档建立,用户交互,系统分析,故障排除。

应用是原理与实践能得以发挥作用的专门领域。目前软件的应用领域几乎无所不包,但是, 从教学上考虑,Meyer认为可以把这些科目看作应用领域:基本算法和数据结构、编译器编写、操作系统、 数据库、人工智能技术、数值计算,并用软件工程的观点来决定如何教授这些课程。

工具是具有最新技术水平的、为运用原理与实践提供便利的产品。一个基本原则是软件教学 不应由一时的时髦工具来决定,工具的教学必须处于从属地位。最好是选择一些编程语言和几个流行产品, 让学生能深入理解它们。这样使学生对业界实际所用的主流方法有了解,有助于他们毕业时的求职。

逆向大纲的教学策略

为实现上述的教学思想,Meyer重述了自外而内(Outside-In)的“逆向大纲”(inverted curriculum) 教学法。这种教学法与传统的程序设计课程的教授次序完全相反。传统的次序是自下而上的:从程序 的建造单元开始,例如变量与赋值,接着是控制语句和数据结构,再进入模块设计与构造大程序的 技术。Meyer认为,这种途径能让学生对程序的基本元素有一个很好的实际理解。但是它并非总是能教授 系统建造的概念,而这点是一个软件工程师要想在专业上成功所必须掌握的。

逆向大纲的原则是:学生先作为用户来使用一些工具或部件来建造他们自己的应用系统,然后逐步揭开这 些工具或部件的面纱看看它们是怎么做的,并改一改,作一些扩展。Meyer指出,这样这并非就忽略了 讲授标准的低层的概念和技能,因为最后学生需要能掌握一个程序所需要的所有东西,从大画面到小细节。 不同的是概念的顺序,特别是对架构技能的强调,是在自底而上的大纲中常被忽略的。

Meyer认为这种途径的目的是让学生能掌握软件建造的关键概念,特别是抽象。有效传授这个概念的 唯一法门便是通过实例,特别是通过给学生展示出他们如何复用已存在的千万行代码来编制出让人印象 深刻的应用。这些被复用的代码是数以成百人年的工作,因此,要从内部读源码来理解,会花上好几个 月的时间。而使用这些软件包的抽象接口,学生可以在第一周就能作出令人印象深刻的结果。由于学生 一开始就通过接口使用库例程来建造强大功能的应用软件,他不需要花太多的功夫专门去了解抽象、 信息隐藏和复用的益处。这些概念将自然而然地成为他的第二本能。

逆向大纲要求选择一个功能和规模都足够大的软件项目。一般大纲包括软件项目都不足以应付真正的软 件开发的挑战,这里所要求的项目应是一个长期(跨年度)项目,是一个群体项目,包括了分析、设计与实 现这些方面。并且,它应该包括复用、理解/学习、修改和运行已存在的软件。这样一个新班可以接手老班 的结果并加以发展、改进。

引论性程序设计课程

Meyer的这套教学思想的提出与完善,经历了十年,直到他被聘为瑞士联邦技术学院的软件主任(2001年) 之后,这套教学大纲才得以开始计划实施。其中很重要的一门课程便是引论性程序设计。具Meyer介绍, 瑞士联邦技术学院的计算机学科最好的传统之一是引论性课程的任课教师必须是资深教授。这与有些学校 中引论性课程由初级教师任课的观点截然相反。学院认为那些在本学科积累了最多经验的教师应该去教 最基础水平的新生。能讲授这样一门课程对教师来说是一份很大的荣耀。

教学思想与教材

  • 课程从一开始就讲授OO技术。OO技术已是工业界使用的主流技术,它可以用来建造大型复杂的系统。 OO技术的一个特点就是是把软件开发视为系统建模,这是一种很自然的思想,在引论课程中, 可以用一个类来直接反映学生所熟悉的事物或概念。
  • 课程从一开始就强调通过使用程序库来学习复用。使用可复用的软件部件有许多的好处。这可以 让学生利用程序库的功能来做出漂亮的应用,尽管只是10来行的代码。这可以保持学生的兴趣,更重要的 是在学生的头脑中牢固地建立起复用与抽象的思想。
  • 一个好的软件部件要求对它的性质有明确的规范说明。这个角色是由Eiffel的契约技术来担当的。正是 这个技术使得从外至内的方法得以可行。学生开始作为“消费者”,只是使用部件的抽象接口与契约, 它们是从软件文本(源码)中自动产生的。
    对契约中前提条件,后验条件和类不变条件的使用也是让学生接触一些适量的软件开发 的形式化方法,让他们了解数学在软件开发中的重要性。
  • 当然,学生必须要掌握传统的程序设计,如变量、赋值、控制结构等等。逆向大纲的讲授顺序 是从程序的外层,即类、对象与功能开始,然后逐步进入内层结构。

Meyer在教课的同时,也在为这门课编写教材,名为“Touch of Class”,分成五个部分:

  • 第一部分就用OO概念介绍系统建造,从对象和类到接口、控制结构与赋值。并特别强调契约的概念,教导 学生依赖于所用模块的抽象而精确的描述,作为结果,也要对他们生产的模块同样地准确定义接 口。在“Just Enough Logic”(刚好够用的逻辑)一章将介绍命题演算和谓词演算的基本元素。再回到 程序设计,后续各章介绍对象的创建与结构,赋值与其他语言单元只是在程序结构概念之后才给予介绍。
  • 第二部分,“如何工作的”,从内部的角度来介绍关于计算机组织、程序设计语言和程序设计工具的 基本知识。对于一个着重于抽象的途径来说,让学生同时也掌握硬件和软件的具体方面也是很基本的, 因为它们定义了系统开发的相关环境。学生必须要理解计算机技术对我们想象的限制,特别是在数量级 方面:我们能多快地传送数据、我们能在内存和外存中存放多少对象,对内外存的存取比例。
  • 第三部分介绍计算机科学基础的“算法与数据结构”,从阵列、树到分类。其采取的途径仍然是 面向对象和基于例程库的。
  • 第四部分考虑一些特定的面向对象技术,如继承、事件驱动设计、和一点并发概念。
  • 第五部分,也是最后一部分,将超越程序设计,而介绍在大规模大而长耗时的项目中需要的软件工程 的概念,章节将包括项目管理、需求工程和质量保证等。

教学支持软件

教学用的软件系统是Eiffel语言及程序库、EiffelStudio环境和Traffic软件。

作为Eiffel的作者,Meyer认为,Eiffel也是一门完全适用于教学的语言。首先,Eiffel语言是完完 全全的OO。同时Eiffel是非常易于学习的,如它的保留字都是直白的英语,等于符号‘=’也与数学中 的意义相同,没有违反数百年的数学传统等。Eiffel还含有精确的风格规则,这有助于让学生养成良好 的程序文本风格。

与Eiffel语言紧密相关的还有一组精心选择的程序库,最基本的是EiffelBase,它实现了计算机 科学中的最基本的数据结构,而EiffelVision则是个可移植的图形库,提供对图形接口的设计与开发。 EiffelStudio开发环境使用了现代化的、直观的GUI,具备很多先进、复杂的功能,如浏览、编辑、查错、 自动生成文档(HTML或其他格式)、甚至测度数据。

Traffic软件的应用领域是关于一个城市的交通:建模、规划、模拟和显示。这是基于如下的选择标准:

  • 立即为学生所熟悉,这样我们可以直接讲授软件问题和解决方法,而不必花费时间去了解该领域。
  • 提供大量有趣的算法和数据结构的范例、应用,它们展示会了计算机科学的基本概念。
  • 需要使用图形、多媒体和先进的GUI——该需求对于吸引玩电子游戏长大的这代学生很重要。

Traffic软件不仅是个完成某项任务的“应用”,而且也是一个程序库,它提供给学生和教师可复用 的部件以建造新的应用。尽管很基本,它已拥有了一个地理信息系统(Geographical InformationSystem) 的基本元素,并且支持图形显示机制。TRAFFIC的示例城市是巴黎,包括它的街道与交通网络(因为城市 的描述是用的XML文件,因此可以用另一个城市来作为示例)。 学生要做的第一个应用只是几行代码的一个程序。它显示一个地图、在地图上标示出巴黎的Metro交通 网络、检索定义好了的路径、给用户用图形动画展示一条路径。

教学实践。

引论性程序设计课程第一次开设是在2003-4的冬季,约250个学生,第二年有180个学生。这门课是针对 计算机科学的本科生,这是第一学期唯一的一门计算机课程(ETH的传统是要给学生打下坚实的理工科 基础,第一学期的其他课程主要是逻辑、线性代数、数学分析,概率与统计)。最近发表的一篇 论文[Pedroni2006]详细介绍了这门课在这两届学术中的教学情况。

课程每周教授讲四节课(2X2),研究生助教带三节练习课,每节课45分钟。从1-9周学生每周 交一次作业,这包括两次课堂作业(类似测验)。从第10周到14周,学生每三人一组做课程项目。 课程的教材是Touch of Class。虽然该教材仍在编写中,但大部分讲课的内容已经在教材中了。所有 讲课用的幻灯片(slides)和练习题等都能在网上得到。讲课的录像也在网上,这特别受学生欢迎, 因为他们可以在家中复习。

学生在开始上这门课时曾被问卷调查他们编程和使用计算机的经验。结果显示具有编程经验与多年 使用计算机经验的学生所占的百分比很高:绝大部分学生(>90%)有五年以上使用计算机的经验, 大部分学生(>70%)的学生有编程经验。

这门课结束时学生对这门课的评分显示出它在学生中是非常成功的。2003/2004冬季的评分是4 (满分为5分)。第二年稍高一点(4.1分)。这基本上是计算机科学系第一和第二年课程 能得到的最高分了,且大大高于以前讲这门课的得分。

对课程中使用的软件Traffic的评分却大大低于对课程的总体评分,分别是2.7和2.9分。Meyer认为 主要原因是因为Traffic不是那种在大学里常见的软件。第一版仅是一种概念证明(proof of concept), 还不是很完备,因此没能满足学生的期望也是预料之中的了。

结语

本文介绍了Bertrand Meyer的软件教育思想和教学实践。Meyer教学思想的立足点是试图在概念 和操作(原理和技术)之间保持一种平衡,其核心是(基于OO技术的)逆向大纲教学法。Meyer 认为这种途径能够让学生很好地掌握软件建造的关键概念,如抽象、信息隐藏、复用、契约等。 此教学法在“引论性程序设计”课程中已实践了两年,学生对该课程的评分表明这门课的逆向 大纲教学法是成功的。

参考文献

  • [Meyer1993] B. Meyer. Towards an object-oriented curriculum. Journal of Object-Oriented Programming, 6(2):76-81, May 1993.
  • [Meyer1997] B. Meyer. Object-Oriented Software Construction. Prentice-Hall, 2nd edition, 1997.
  • [Meyer2001] B. Meyer, "Software Engineering in the Academy", IEEE Computer May 2001
  • [Meyer2006] B. Meyer. Touch of class: Learning to program well with object technology and design by contract. To be published, draft versions currently available from http://se.inf.ethz.ch/touch.
  • [Pedroni2006], "The Inverted Curriculum in Practice", Proceedings of SIGCSE 2006, ACM, Houston, Texas, 1-5 March 2006.

相关文章

修改记录

  • 2006年4月23日:发表于SoftwarePractitioner.org。
 
[首页]   [作文]   [翻译]   [随笔]   [本站]   [English]
 
Creative Commons License
Except where otherwise noted, this site is licensed
under a Creative Commons Attribution-NonCommercial 2.5 License
.