![]() |
![]() |
|
首页 作文 翻译 随笔 本站 English |
软件教学新思维Parnas:把软件工程作为一门真正的工程学科胡健2006年4月关于David ParnasDavid Parnas是现代计算机科学和软件工程的奠基者之一。Parnas在过去三十年的工作对软件设计有 着很大的影响。他的工作能引起同行们的注意,其中一个重要的原因,据他自己说,是因为他的研究 几乎都是针对他在工业界的软件开发中观察到的问题,而不是回应其他人的论文,称“我能做得更好”。 例如,他最有影响力的模块化设计和信息隐藏思想就源于他在1969年在一个公司的一段工作经历。 Parnas著有200多篇论文和报告,在2000年出版的“Software Fundamentals: collected papers by David L Parnas”一书收录了他最具影响力的33篇论文,包括模块化设计、信息隐藏、抽象接口、 以及软件工程职业与教育等等。 他曾于己于1979年获得ACM的“最佳论文”奖,和两项国际软件工程大会(ICSE)“最有影响论文”奖, 在1998年获得ACM SIGSOFT的“杰出研究成果奖”。他是加拿大皇家学会的fellow和ACM fellow。同时 也是加拿大安大略省注册的专业工程师(licensed Professional Engineer)。 Parnas三十多年一直在大学任教,在Parnas的研究与教学中,他总是寻求理论联系实践,强调抓住 那些能应用在实践中以改进产品质量的理论成果与概念,他对软件工程教学也有着自己独到的观点。 在“Software Engineering Programmes are not Computer Science Programmes,” 一文全面地论述了他关于软件工程,软件工程师以及软件工程教学的思想与教学大纲。 理科与工科、科学家与工程师软件产品与软件工程师在这篇文章中,Parnas对软件工程采取了一个非常不同的角度。他不是把软件工程看成是计算机科学的 一个亚领域,而是把它看成是工程集合 {土木工程、机械工程、化学工程、电力工程等} 中的一个成员。 因为过去三十多年以来,软件已经越来越成为众多产品,包括传统的工程产品中的一个组成部分。软件 也被工程师们用来设计其他非计算机化的产品,他们设计的正确性部分地依赖于他们所用的软件的 正确性。 在许多地方,“软件工程师”被用来作为“程序员”的一个优雅的代名词,许多人 似乎都假设软件工程师的唯一责任是编写结构良好的代码。Parnas认为,这种定位反映出对 “工程师”的在历史上和法律上的意义的无知。一个工程师是一个专业人员,他能够对他生产 出来的、供他人使用的产品负责。而要确信一个产品能够使用,这需要了解产品使用的环境。 软件的使用从不会是孤立于其他工程产品;软件只是一个在包含了物理系统部件的系统中的 一个部件,它用来对物理部件的信息进行计算处理。因此,那些被称为“软件工程师”的人 需要知道许多不属于计算机科学的东西。 软件工程师要专(精)于软件设计,同时也要具备其他工程领域的足够的知识,这样他们知道 什么时候从其他领域的工程师那里寻求帮助并且能与这些工程师很好地一起工作。 理科教育与工科教育Parnas在文中正本清源,重申工程师的教育是让学生学习如何使用数学、科学和技术去建造产品, 这些产品关乎公众安全与福祉。因为今天的产品太广泛,没有一个人能够通晓对所有产品的设计 建造,因此工程领域分成了若干专业。土木工程师专于对道路、桥梁、楼房的建造。化学工程师 专于化学工业方面如工厂与制造流程的设计。电力工程师专于电力传输、电子、通讯设备等等。 Parnas又从历史上看,当一门科学发展成熟时,教育机构便会发展出基于这门科学的工程专业。例如, 当人们对物理学中的磁场和电场的理解加深时,在工程领域中就出现了一门新的专业--电力工程 (Electrical Engineering, EE),而相应的教育大纲也在大学里发展出来(Parnas举物理学和 电力工程为例子,大概是与他的电力工程背景有关)。尽管有些物理学家坚持说这其实都是物理学 的东西,可以在应用物理学中讲授,但许多大学都开有EE科目。两种大纲(物理学和电力工程)都 需要,这并不是因为有两个不同的科学领域,而是因为有两种不同的职业路径。一条路径的对象 是那些设计产品来为他人所用的毕业生,另一条路径的对象则是那些扩展这个领域的知识的毕业生。 每一条职业路径都会吸引不同类型的学生,因此需要不同的教学计划。大部分选择电力工程的学生 喜欢建造东西,而选择物理学的学生更喜好学习知识。 再回头来看计算机科学(Computer Science, CS),Parnas认为今天人们对计算机科学与程序设计 的知识大大超过了三十多年前,软件的日益重要性和我们日益丰富的建造软件的知识,使得我们 可以开设软件工程(Software Enginerring, SE)专业让学生象其他工程师一样受到专于设计、 建造、测试和维护软件产品的教育。而计算机科学专业和软件工程专业的关系应该是是互相补充 和合作的,就象其他理科和工科学系一样。也就是说,这门软件工程应该是一门真正的工程学科。 Parnas在不同的大学教过工程学生也教过计算机科学的学生,他发现他们之间有重要差别。许多计算机 科学的学生相对来说比较有耐心并愿意去探讨他们感兴趣的科目。而对多数工程学生来说,你如果没给 他们展示如何应用正在学的理论,他们就会变得不耐烦。对工程学生来说,“那门课主要是理论性的” 这个评语是个很强烈的批评,而对CS学生来说却是一种赞扬。Parnas更进一步举例说,如果EE系的 系主任对来访者介绍他的工作“是非常智能和抽象的”,那么这是一种“没什么用场”的礼貌性的说法。 而要是CS的系主任这样介绍的话,那肯定是没有那种负面的含义的。 科学家与工程师Parnas更一般地比较了科学家(scientist)和工程师(engineer)的不同之处。
软件工程师和软件工程教育一个软件工程师需要准备着参加下面各项任务:
总之,象其他工程师一样,软件工程师要对他们产品的可用性、安全性与可靠性负责。他们应该能够 运用基本的数学和科学知识(包括计算机科学)来保证他们建造的系统能工作良好。 Parnas还提到了象团队合作,计划编制,期限设置,估算成本以及其他的项目管理功能。但他认为 这些东西倒是区分了学术研究者和开发实践者的工作,但并没有把软件工程师和其他工程师区分开。 项目管理某些方面的课程应该属于所有工程类的核心课程,而另一些方面的课程可以专为那些有志 于项目管理的学生而开。 软件工程大纲的原则首先,Parnas认为,在过去三十几年计算机科学的研究取得了许多的成果,计算科学的成熟使得 我们能够建立软件工程专业。同时,计算机科学必须继续发展,所以我们应该同时具备工科大纲 和理科大纲,一份为科学家,一份为工程师,这样就可以把两者都做好,而不需要作出不愉快的 妥协来做本是另一方应做的事情。 其次,Parnas强调软件工程教育能够并且必须注重基本概念。不言而喻,实践经验对任何一门 工程教育都是很基本的,它能帮助学生学习如何应用学到的知识。实验室和其他项目应该给学生 提供机会使用最常用的工具并尝试发展新的工具。可是,要注意某些“实际型”的计算机科学家 却把“技术”与“工程” 混为一谈。许多课程都没有强调基础概念,而是围绕着流行的技术而开设。 这些技术也许在学生毕业之前就过时了。我们必须要记住今天的这些时髦工具只是替换了早先的 时髦工具,它们也会在将来被替换。Parnas并提醒说,教育者的责任是要记住今天的学生的职业生涯 可能会持续四十年,因此教育者必须要确定那些会在这期间一直有效和有用的基础原理,并在讲课 中强调这些原理。要记住学习一个特定的系统的目的并非这个系统本身,而是学习其他(概念和 原理)的一种方法。Parnas还谈到自己的经历,早年从实验室、作业、业余爱好(无线电) 以及暑期工作中学到了很多那个时代的技术,但是课堂上所学的基本概念却是具有长期的价值, 甚至在今天,这些概念还在帮助他学习新的技术。 Parnas认为还有一点很重要,那就是教学风格和课程结构必须改变。软件课程的讲授方法应该不同 于传统CS课程的方法。在理科课程中,讲授"事物"(本身)是合情合理的,而工科学生是要学习 “怎样去做”。对工科学生,你不能只是简单地在黑板上列出推论和证明了事。每一门课程必须 把理论和实践联系起来,并强调在解决问题时怎样应用理论。Parnas还针对目前有些CS大纲的理论 和实践课程的脱节的问题,举例说一些课程(如符号语义学)被认为是纯理论的,而另一些 (如编译器构造)被认为是实践类的,在一类课程中没有地方提到另一类的材料,这与工程教学 风格形成巨大的反差。 最后,也是Parnas软件教育思想中很具特色的一点是:软件工程大纲应该被认证(accreditation)。 科学家的工作通常是由其他科学家来评判的,但是工程师通常是直接对付既非科学家也非工程师的 客户。包含有软件的产品和用来设计产品的软件对于公众的福祉与安全是极端重要的,我们必须要 有一定的保证使那些软件工程的从业者受得专业教育要包含一些最重要的基本材料。在工程学科的 教学大纲中,获取“认证”总是一个重要的途径。对软件工程师的注照(licensing)应该与对 土木工程师的注照同等重要。Parnas认为,在工科大纲中的"认证"机制对于提高教育质量和保证 毕业生能掌握最重要的思想以及如何应用之是非常有效的。软件工程只有在类似的认证系统出现后, 才能成为一个真正的专业。建立这样一个系统最容易也是最好的方法便是把软件工程作为工程领域 的一个分支。 软件工程与计算机科学由于软件工程脱胎于计算机科学,Parnas更进一步列出了SE与CS大纲的一些对照,以求更清楚的 了解它们的异同。总的来说,在SE大纲中,优先权是知识的广度、有用性和可应用性(usefulness and applicability);在CS大纲中,优先权应该是知识兴趣、将来发展以及教授用以研究计算机 和软件开发的科学方法。
Parnas的软件工程大纲
在40来门技术课程中,几乎一半是"核心"的工程内容,余下的则是软件工程所要求的。这包括了 一些CS内容和许多的数学,以及软件设计课程(含项目)。 Parnas认为,许多计算机科学中的课程是很有趣且很有挑战性的,但并不在实践中有所使用。 如程序语言的符号语义学(denotational semantics)就是这样一门课程,他认为我们可以 建造一个坚实的软件系统而不用这门学科的任何知识。相反地,如果某人不熟悉这门领域他 几乎不能声称自己是计算机科学家。类似的科目包括神经计算(neural computation),许多 人工智能的部分,以及可计算性和自动机理论中的一些方面。而CS大纲中却必须要包括对这些 科目的内容。另一个例子是操作系统。教授根据操作系统的特性来分类,就象生物学家对昆虫 的分类一样。这可以让学生了解系统的演进过程,看到一些思想理念是怎样从一个操作系统转移 到另一个系统。这种课程对于想设计新的操作系统或发展新的模型和理论的人来说是非常重要的。 但是对SE学生来说这样的课程并不是最好的教授操作系统的方法。他们不会对操作系统的历史和 系统比较有太大的兴趣。他们想要知道如何选择系统、如何使用系统。 许多科目应该共同为SE和CS计划所包含,但需要开出不同的课程。例如,数理逻辑显然对 SE和CS两边都很重要。在给SE学生讲授数理逻辑时,Parnas发现最根本的一点是要强调用逻辑来 描述系统的属性和状态的属性,也要强调逻辑在检查规范和程序的完全性和 一致性上所起的作用。推理和证明也会提及,学生也会有机会使用定理证明软件,但逻辑类型 之间的差别就不会花太多的时间来讲了。相反,在CS的逻辑课程中,学生需要学习不同逻辑种类 之间的区别。 有近半数的课程是CS中没有的,但对日益增长的软件应用却是很重要的。如扫描算法、数据结构 的机器表示、并发活动的同步这些内容。总之,Parnas认为这份大纲着重于根本的设计原理, 同时面向培养于市场亟需的、要去开发新应用的、受过良好教育的开发人员。 显而易见,Parnas把软件工程作为一门新的工程分支的思想是根本性的,不管在工程领域还是 在计算机科学领域都遭到了真诚而坚决的反对,两边不讨好,这似乎也是可以理解的。 工程那边不认可计算机科学这三十多年积累起来的关于如何编写软件的知识体系。许多工程师 似乎都认为编程只是简单的学习编程语言以及一些惯例规则。有些工程师认为,任何能写程序 的工程师都是软件工程师,而不需要任何特定的专业知识和经验去建立和运行一份软件工程纲。 提出的大纲被视为太"狭窄",程序设计过重。大部分审阅过这份计划的工程师认为多数第4类的 课程应该被2类的一些附加课程所代替。 而在计算机科学这边则坚持应该是计算机系,而不是工程学系来设计和控制软件工程的大纲。 同时,Parnas还发现计算机科学家缺乏理解软件工程教育方式将不同于他们过去所受教育的方式, 还有,很少有计算机科学家认识到要成为一个好的软件工程师,你必须要具备的知识和能力远较 一个好的程序员为多。所以,大部分审阅过大纲的CS的毕业生认为第2类的大部分内容都是无关 的,应该被更多的第4类的课程所替代。 这份大纲带来的另一个问题是需要找到合适的教师,即是那些知道怎样做这些工作的和有兴趣来 建造产品的,这是很关键而困难的。Parnas注意到,许多今日的计算机科学家,甚至于那些认为 兴趣在软件工程的人士,实际是对抽象的东西感兴趣,而不愿意参加到产品设计,甚至不愿意 近距离地看看目前的实践中做了些什么。另外,从理科领域成功转到工程领域的教师需要在 讲课内容和方式上做很大的改变,而很少有计算机科学家做了这种转变,或意识到有必要去做。 从工程那边看,今天很少有工程师有足够的计算机科学知识来正确地教授这门课程。 由于生产软件产品的经验是个基本要求,生产出一个产品要比写一篇论文花更长的时间。 Parnas认为在招聘教师时就得使用不同的标准,不能让具有实际经验的人与从事纯研究的人 比论文数量。在工程领域,实际经验与洞察力也许比高学位和论文更有价值。 尽管Parnas的大纲倍受争议,他所在的加拿大McMaster大学还是(大约)在1998-99年按照这份 大纲开设了号称是世界上第一个真正的软件工程专业。它和其他工程类专业一样属于工程学系 (Faculty of Engineering),其定位和其他工程专业相同。时至今日(2005-06)软件工程 教学还是完全保持了Parnas大纲的风貌。以下有关当前软件专业介绍和课程设置的信息源于 McMaster大学计算机与软件系(Department of Computing and Software)的网页 http://www.cas.mcmaster.ca/。 首先,在软件工程专业的介绍中指出:“软件工程师是专业于设计、建造、测试和维护计算机 系统中的软件的工程师。这些系统包括了电机控制系统、通讯系统、用于设计其他工程产品的 计算机系统、金融系统和信息管理系统”。作为软件工程师的责任是“需要对他们建造的产品的 可用性、安全性和可靠性负责”。要很好地履行这个责任,“他们必须要了解许多计算机以外的 知识,不仅只是软件设计” 。在教学上,“着重于讲授根本的设计原则和那些三十年后仍然有用 和有效的知识,以使学生能够在迅速变化的领域中立于不败之地”。可以看出这些总纲性的介绍 不论从含义还是行文风格都与Parnas的文章有相当的一致之处。 其次,也许更重要的是目前的课程设置。从学校的网页可以看出目前的绝大多数课程和Parnas 当初提出的课程是一样的。第一年,软件工程专业的学生和其它工程专业的学生一样要学习诸如 数学、物理、化学、材料、工程设计等基础课,第二年开始学习软件专业的数学基础及设计原则等。 还有一点值得一提,就是1999年左右和后来几年招聘的教师有好几位是计算机科学出身,后又在 工业界有过多年的软件研发经历的人士,有几位还有注册专业工程师(licensed professional engineer)资格(详见该系网页中教师个人主页)。 结语本文概要介绍了Parnas的软件工程教育思想和教学大纲。这份大纲最特别之处便是把软件工程专业 置于和其他传统工程专业同等地位,由此引起的工程课程和软件课程的比例也是最具有争议性的。 但是,Parnas重申旨在培养科学家的理科教育和旨在培养工程师的工科教育的区别,辨析理科专业 (如物理学)与相应工科专业(如EE)的关系与知识结构的异同,以及强调工程教育中的理论 联系实际的教学内容与风格却对软件工程教学大纲的设计有着重要的参考价值。 附录:Parnas的软件工程课程以下课程在[Parnas1998]中列出。为方便阅读,特摘录在此。
参考文献
相关文章修改记录
|
|
[首页] [作文] [翻译] [随笔] [本站] [English] | ||
![]() Except where otherwise noted, this site is licensed under a Creative Commons Attribution-NonCommercial 2.5 License. |