![]() |
![]() |
|
首页 作文 翻译 随笔 本站 English |
软件教学新思维Meyer之逆向大纲教学法胡健2006年4月关于Bertrand MeyerBertrand 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不止在一个地方强调,基于在工业界作为一个 软件设计师和项目经理的经历,他反复发现那些能够把数学推理应用软件开发的程序员和那些没有这个 能力的程序员相比具有明显的优势。软件教学大纲中的数学教学除了通常的课程,如微积分,还应提供 逻辑学的坚实基础,也应该用实用的语言来介绍一点形式语义学。Meyer根据他的观点和经验认为,作为 一个完全合格的专业开发人员需要掌握象霍尔语义学这样的理论和以及使用象Z或B这样的现代形式化语 言。他并且进一步提出,霍尔语义学及其类似的原理之于软件工程就象麦克斯韦方程或力学定律之于 物理学。 实践是优秀的专业人员自觉而经常运用的解决问题的技术。软件工程教学也应该让学生熟悉业 界常用的实用技术,这些技术作为行业的一个关键组成部分,实践证明对软件生产很有效。这些技术包括: 项目管理,文档建立,用户交互,系统分析,故障排除。 应用是原理与实践能得以发挥作用的专门领域。目前软件的应用领域几乎无所不包,但是, 从教学上考虑,Meyer认为可以把这些科目看作应用领域:基本算法和数据结构、编译器编写、操作系统、 数据库、人工智能技术、数值计算,并用软件工程的观点来决定如何教授这些课程。 工具是具有最新技术水平的、为运用原理与实践提供便利的产品。一个基本原则是软件教学 不应由一时的时髦工具来决定,工具的教学必须处于从属地位。最好是选择一些编程语言和几个流行产品, 让学生能深入理解它们。这样使学生对业界实际所用的主流方法有了解,有助于他们毕业时的求职。 逆向大纲的教学策略为实现上述的教学思想,Meyer重述了自外而内(Outside-In)的“逆向大纲”(inverted curriculum) 教学法。这种教学法与传统的程序设计课程的教授次序完全相反。传统的次序是自下而上的:从程序 的建造单元开始,例如变量与赋值,接着是控制语句和数据结构,再进入模块设计与构造大程序的 技术。Meyer认为,这种途径能让学生对程序的基本元素有一个很好的实际理解。但是它并非总是能教授 系统建造的概念,而这点是一个软件工程师要想在专业上成功所必须掌握的。 逆向大纲的原则是:学生先作为用户来使用一些工具或部件来建造他们自己的应用系统,然后逐步揭开这 些工具或部件的面纱看看它们是怎么做的,并改一改,作一些扩展。Meyer指出,这样这并非就忽略了 讲授标准的低层的概念和技能,因为最后学生需要能掌握一个程序所需要的所有东西,从大画面到小细节。 不同的是概念的顺序,特别是对架构技能的强调,是在自底而上的大纲中常被忽略的。 Meyer认为这种途径的目的是让学生能掌握软件建造的关键概念,特别是抽象。有效传授这个概念的 唯一法门便是通过实例,特别是通过给学生展示出他们如何复用已存在的千万行代码来编制出让人印象 深刻的应用。这些被复用的代码是数以成百人年的工作,因此,要从内部读源码来理解,会花上好几个 月的时间。而使用这些软件包的抽象接口,学生可以在第一周就能作出令人印象深刻的结果。由于学生 一开始就通过接口使用库例程来建造强大功能的应用软件,他不需要花太多的功夫专门去了解抽象、 信息隐藏和复用的益处。这些概念将自然而然地成为他的第二本能。 逆向大纲要求选择一个功能和规模都足够大的软件项目。一般大纲包括软件项目都不足以应付真正的软 件开发的挑战,这里所要求的项目应是一个长期(跨年度)项目,是一个群体项目,包括了分析、设计与实 现这些方面。并且,它应该包括复用、理解/学习、修改和运行已存在的软件。这样一个新班可以接手老班 的结果并加以发展、改进。 引论性程序设计课程Meyer的这套教学思想的提出与完善,经历了十年,直到他被聘为瑞士联邦技术学院的软件主任(2001年) 之后,这套教学大纲才得以开始计划实施。其中很重要的一门课程便是引论性程序设计。具Meyer介绍, 瑞士联邦技术学院的计算机学科最好的传统之一是引论性课程的任课教师必须是资深教授。这与有些学校 中引论性课程由初级教师任课的观点截然相反。学院认为那些在本学科积累了最多经验的教师应该去教 最基础水平的新生。能讲授这样一门课程对教师来说是一份很大的荣耀。 教学思想与教材
Meyer在教课的同时,也在为这门课编写教材,名为“Touch of Class”,分成五个部分:
教学支持软件教学用的软件系统是Eiffel语言及程序库、EiffelStudio环境和Traffic软件。 作为Eiffel的作者,Meyer认为,Eiffel也是一门完全适用于教学的语言。首先,Eiffel语言是完完 全全的OO。同时Eiffel是非常易于学习的,如它的保留字都是直白的英语,等于符号‘=’也与数学中 的意义相同,没有违反数百年的数学传统等。Eiffel还含有精确的风格规则,这有助于让学生养成良好 的程序文本风格。 与Eiffel语言紧密相关的还有一组精心选择的程序库,最基本的是EiffelBase,它实现了计算机 科学中的最基本的数据结构,而EiffelVision则是个可移植的图形库,提供对图形接口的设计与开发。 EiffelStudio开发环境使用了现代化的、直观的GUI,具备很多先进、复杂的功能,如浏览、编辑、查错、 自动生成文档(HTML或其他格式)、甚至测度数据。 Traffic软件的应用领域是关于一个城市的交通:建模、规划、模拟和显示。这是基于如下的选择标准:
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 认为这种途径能够让学生很好地掌握软件建造的关键概念,如抽象、信息隐藏、复用、契约等。 此教学法在“引论性程序设计”课程中已实践了两年,学生对该课程的评分表明这门课的逆向 大纲教学法是成功的。 参考文献
相关文章修改记录
|
|
[首页] [作文] [翻译] [随笔] [本站] [English] | ||
![]() Except where otherwise noted, this site is licensed under a Creative Commons Attribution-NonCommercial 2.5 License. |