跳转到主要内容

developerWorks 中国  >  Rational  >

大师和杰作

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


对此页的评价

帮助我们改进这些内容


级别: 初级

Gary Pollice , Professor of Practice, 沃斯特工学院

2005 年 11 月 15 日

本文来自 Rational Edge:该栏目探讨了Gary Pollice个人提名的几位软件专家 -- 包括 Donald Knuth 和 Niklaus Wirth -- 以及杰出的技术,包括UNIX、Smalltalk和 Eclipse。他为自己的选择定义了标准,并简短解释了他给予高度评价的原因。

illustration在上月的栏目中,我们看过了艺术和软件开发之间的关系。本月,我将探讨更特别的一个主题:我想讨论一些令人赞叹的软件大师和杰作。

让我们首先定义一下什么是 大师杰作。Merriam-Webster 在线字典1 对于 大师 有一些定义;在我们的讨论中,参考以下三种定义:

  • 有资格为实习生传授知识的讲师。

  • 艺术家、表演者,或者具有完美技能的选手。

  • 过去(在科学或艺术)被视为楷模的大人物。

Merriam-Webster也为 杰作 作出了以下两种定义:

  • 使用杰出技能所完成的工作;特别是极度的智力或艺术成就。

  • 对行业作出的工作结果,它是能够用来认定大师资格的证据。

杰作的第一个定义当然可以应用在软件业,这一行业需要很强的技术。软件开发是一项智力工程,带有一定的艺术成分。形容词 杰出极度 告诉我们,杰作是一项远不同于一般,或者高于普通水平的产品。

当我们谈到软件的时候,第二个定义也是适用的。我们会将开发过的软件放在文件夹中,当参加会议、工场和工作面试时,拿给同行看。我们的文件夹有助于定义我们在软件开发领域的位置。如果其中包括杰作,那么我们会被看成是大师。

请注意,当我提到软件大师和杰作时,我仅仅指创造者和智力产品,而不是生产过程、管理项目的方式,或者成为商业可用产品的其它因素。我想集中关注展现给计算机科学家和软件开发人员组织的最终产品 -- 换而言之,对计算机科学和软件工程学科的贡献。

计算机科学和软件大师们

业界有很多的大师,从中作出选择是相当困难的,但是我将基于以下标准,提出我个人的意见。

  • 在一个或多个领域中从深度和广度方面都推进了当时发展水平的人。

  • 我们今天所熟知的,对软件有着深刻影响的人。

  • 对我和我的职业直接或间接地有着深刻影响的人。

我选择了两位著名的人士,但是很多不是特别出名的良师、朋友和同事都对我帮助很大 -- 并且现在还是如此。事实上,我的一些学生可以说是未来的大师,希望他们某一天能站在这个等级上来。

Donald Knuth

我怀疑今天是否有哪个计算机科学专业的学生不知道Donald Knuth的大名。Knuth的经典之作,《计算机编程艺术,1-3卷》2对于我们很多需要探索高效算法的人来说是一个起点。随后出现了许多算法方面的书籍,并且许多新的算法已经得到发展,而Knuth所作的努力为许多学术和商业的成功奠定了基础。

1968年,当我随美国军队驻扎在德国时,我找到了Knuth第一卷关于基础算法的拷贝。我的专业是数学,对计算机编程很感兴趣,但是还想应用更多的数学知识。那本书对我的帮助相当大。

Knuth并不仅仅是一位享有盛誉的理论家,他也开发软件,包括TeX系统,得到了全世界许多人的广泛使用。尽管他在文化编程方面的工作没有赶上他最初的贡献,但这无疑影响到了我们对编写和注释程序的考虑。3 第三卷中的一个算法 -- 关于排序和查找的算法 -- 影响到第一个商业结合的索引文件系统的实施。我的一位在 Datapoint 公司工作的同事于1983年左右实现了这个系统。

Knuth在质量方面的严格要求也很让人钦佩,他努力使自己的工作没有错误。在书的前言中,他提出给指出书中每一处错误的第一人$2.56以表示感谢。我的一个同学很自豪地在他的办公室展示了来自Knuth的支票,我想,收到支票的其他人也会这样做的。帮助Knuth的荣誉要比支票的价值大得多。

我还很敬佩Knuth的另一点 -- 以及其他我认为是大师的人们 -- 具有克服复杂并清晰且简洁地表达自己想法的能力。他并不过多地包装自己的材料;他也坦承要做到这一点非常困难。然而,如果你想要花精力向大师学习,就必须具有在计算机科学职业生涯中取得一定成功的基础。

Niklaus Wirth

如果你在70年代或80年代早期接触编程,你可能曾学过Pascal语言,这门编程语言就是Niklaus Wirth最著名的杰作。尽管我首先学习的是ALGOL、COBOL以及各种汇编语言,但Pascal语言让我可以推出并有效、完美地实施解决方案。Pascal是经过精心设计考虑的语言;它具有很强的类型和对数据结构的良好支持。与当时的其它语言相比较,Pascal确实是一个杰作。

Wirth对我学业和职业影响最大的是他的书籍,《算法+数据结构=程序》。.4 这本书教会我如何将很多用汇编语言所作的事情用高级的Pascal语言完美地实施。

不幸的是,当UNIX成为学生和许多商业所选择的操作系统的时候,Pascal的地位逐渐被C所取代,C语言是一个通用的汇编语言,让你可以作大多你想作的事情。Wirth还协助开发Apple Computer对C++的回应 -- Object Pascal。尽管Pascal语言在市场中失去了地位,Wirth和他杰出的语言对于我们在编程方面的思考仍有着深远的影响。



回页首


杰作

从众多产品中仅选择几个杰作是一件富有挑战的事情。我采用了以下选择标准:

  • 所谓杰作,必须能够达到这样的认同,它已经改变了软件开发人员的工作,或者将会改变软件开发人员的工作。

  • 所谓杰作,是值得学习以便了解结构、技术创新、样式或者其它一些独一无二的属性。

  • 所谓杰作,是编写良好的软件典范。

第三项标准是我们评价软件时经常忽略的。如果某个软件是“酷”的,并能够发挥作用,那么我们就认为这是好的软件,即使编码并不合乎标准。然而,这类软件通常可以反映出开发人员对自己工作缺乏责任心。确实,软件开发人员面对的压力很大,有时在因业务需要,在产品未成熟时就需要交付给顾客。然而,这样的软件不能够归到杰作的类别中。我所了解的好的软件开发人员可能偶尔较早地交付产品,以满足客户的需要,但是他们绝不会将自己编写的隐藏着错误的代码当成范例拿给他人。创作一个好的油画或雕刻品需要时间,软件杰作也是如此,需要花费大量的时间来正确编码并对最终外观给予修饰。

现在,让我们来看一看满足条件的一些技术。

UNIX

把自己看作工具专家的每个人都会喜欢UNIX操作系统。这是当我们还在读书学习大多编程技巧时出现的操作系统,并且直到现在仍然使我们的工作更容易。自从1971年引入开始,UNIX就成为一个杰作,这主要是因为其架构的简单性和弹性。5

这里有一点疑问,Ken Thompson、Dennis Ritchie 和他们在贝尔实验室的同事们开发了UNIX系统,那么他们也应当是业界的大师。他们的系统为编程人员提供了极大的计算能力,而仅需要少量的资源消耗。

关于UNIX,我认为给人印象最深刻的是,它对"纯人类"是易于理解的。尽管每个命令当然都有一些隐蔽的字符序列,那些次序之间存在着一致性。当具备一定基础的时候,你就能够去驾驭系统。学生可以修改内核并构建新的驱动程序,增加新的网络能力,以及其它。感谢UNIX简单、强大的机制。

UNIX的构建中心是一个小的内核,周围是连续的功能层。这个层的概念是一个创新,并且已经证明是结构化复杂系统的模型。每个层仅与另一层之上或之下直接通信,这样,通过隔离问题简化了维护。

UNIX也推广了架构模式,比如导管和过滤器。请注意,UNIX用户很快就能够熟练操作要实现特定目标的不同命令。例如,键入:

egrep "//|/\*" *.java | wc -l

是获取当前目录中所有.java文件的注释数目的一个简单方法。每个UNIX编程人员很快学习命令,正确使用,并且能够与其它命令结合,完成更复杂的任务。这是许多使用各种UNIX版本(包括现在流行的Linux开源版本)的编程人员所必须的。

Smalltalk

讨论这个软件杰作之前,我首先作一些说明。我从来没有“得到” Smalltalk,意思是我没有使用它完成很多有意义的工作。我指的是自己的缺点,而不是Smalltalk本身的缺陷。这种情况类似于我听到一首音乐曲目却并不理解其含义。当人们为我指点时,我懂得了它的含义,但是这首歌曲并不适合我。

然而,在这种情况下,通过观察别人使用的情况,我也可以明白Smalltalk的优势。我为人们使用Smalltalk 作出的成绩而赞叹;在我看来,这是一种真正的、面向对象的语言系统。

Smalltalk并不是第一个面向对象语言6但是Smalltalk是第一个“真正”的面向对象语言。一切都是对象。1 + 2表示:“将消息‘+’传递给出对象‘1’和对象‘2’作为一个变量,然后返回结果对象(对象‘3’)”。如果你能够考虑到这个方法并一贯将其应用到OO范例中,Smalltalk -- 与其相关的环境 -- 将成为一个有魔力的调色板,使用它能够快速编写良好的应用程序。

与UNIX类似,Smalltalk也有一个基于对象和消息交换的简单的内核。这是可扩展的。你可以创建自己所需要的新的对象或命令类型。Smalltalk环境吸收了位-映像显示的优势,并且它使用Model-View-Controller模式来提供一个强大的计算环境。

Smalltalk是我所知道的第一个与语言紧密联系的环境。今天的编程已不仅仅是学习编程语言的语法和语义,比如Java,我们并不是学习其API及类库的能力。为Eclipse之类的环境编写插件需要更多的Eclipse架构和扩展点方面的知识,而不是写Java。我相信我们拥有大量的软件开发方法 -- 在其他人工作的基础之上构建 -- 可以应用到 Smalltalk 环境中。

为什么Smalltalk在市场上没有取得更大的成功呢?首先,因为针对它在通用公共计算方面的支持技术还不够完善。我第一次使用Smalltalk是1984年在一个相当昂贵的Tektronix工作站,那是一般程序设计人员开发时都可以使用的非典型系统。

导致Smalltalk取得的商业成功有限的原因还有另外一方面,那就是它需要自己的环境。你必须在Smalltalk环境中才能运行Smalltalk程序。这点限制了它的广泛使用。

然而,Smalltalk没有得到大型软件开发组织广泛使用的最主要原因是,人们还没有作好充分的准备。当它引入的时候,大多开发人员正在使用诸如COBOL、Pascal和C语言。他们习惯了程序化、结构化的编程技术,通常采用自上而下形式解决问题,进行功能分解,直到能够很容易就实现的小块。分析工具和注解适应了这种形式的开发。

Smalltalk,与其面向对象的方法,需要我们以不同的方式处理问题和解决方案。它提倡开发人员建立类和对象,并将它们结合起来以产生最终的应用程序。今天,大师级的Smalltalk编程人员和大师级的OO编程人员都是这样做的;他们认为,分解功能是70年代我们所干的工作。然而,当Smalltalk第一次出现的时候,人们还没有培养成这种习惯。这可能就是我一直都不能够灵活使用Smalltalk的原因吧。我致力于构建面向对象程序的时候已经有点晚了,是在放弃Smalltalk很长一段时间之后才开始的。这是我的一个损失。

那么,为何我还认为Smalltalk是一个杰作?它具有简单且优雅的架构!它是我们今天理解面向对象编程的范例。与其后来的产物,比如Squeak,7 它继承了“纯对象”传统。从创新的角度来看,Smalltalk是一个极大的软件杰作。

Eclipse

经常阅读本栏目的读者在我的列表中看到Eclipse时并不会感到惊讶。Eclipse目前可能还没有足够广泛地应用,但是我称它为一个现代杰作。六月时,我解释了 在课堂上使用Eclipse.8 的原因。事实上,我也通常在我的大多软件开发工作中运用Eclipse。然而,这并不是我将它定位为杰作的原因。它具有许多优势,足以与这个头衔相称。

类似于UNIX和Smalltalk,Eclipse因其设计和架构的简单性而引人注意,这点使得它易于为所有软件开发人员所理解和使用(图1)。

Figure 1: The Eclipse architecture

图1: Eclipse架构9

如图1所示,Eclipse使用与UNIX相似的分层方法。另外,与UNIX相似,它是一个开放的工具平台。任何人都可以在Eclipse词汇表中增加 -- 或者“贡献” -- 为既有工具创建插件的新的工具和性能。

查看Eclipse的源代码,你将发现代码在命名和结构方面都具有良好的编写风格。例如,Eclipse 工作台包括许多部分。一个被称为IworkbenchPart的接口,告诉你必须做哪些事情。图2展示了IworkbenchPart文档页的内容。Java编程人员知道这一页是由javadoc工具生成的,但是在源文件中必须进行编写,并且保持更新。正如你所看到的,这些信息精确地说明了你需要对工作台的完整生命周期了解的内容。

Figure 2. Eclipse interface documentation for IWorkbenchPart

图2. Eclipse用于IworkbenchPart的接口文档

尽管存在一定复杂性,Eclipse的简单特性仍是一种美。与 Smalltalk类似,Eclipse的真正强势在于环境提供的构建块,而不是由某特定语言来编写(如Java)。

其它环境交付的能力与Eclipse相似,而且还可能会有人争论Eclipse是从其它环境中借鉴而来。其实并不是这样的。我们可以看到,重构引擎、插件,以及用于特定工具和语言的工具集成等技术在许多IDE都经常存在。然而,Eclipse向用户完全开放,而且现在为用户提供了1,000个插件。这允许你将Eclipse用于各种类型的项目,而不仅是编程项目。当Eclipse团队向外界开放了产品的基础结构,用户将创造出大量有用的软件。

我确信,十年之内,人们依然会把Eclipse看成是软件开发的一个杰作。而且我认为基于Eclipse架构,也会出现许多其它的软件环境。

如此之多

看起来,在众多软件中,只定义三个杰作有些不公平。我在列表中还包括了以下:

  • Emacs,开源程序,影响到了今天许多软件开发人员的工作方式。学习在UNIX系统中编写程序的人们很快对Emacs着迷,并定制适用于自己工作方式的程序。我的很多同事,还没有采用Emacs。但是,Emacs的代码并不完美,不能够分配给我的学生用作阅读代码的练习。

  • LISP,与Smalltalk相似,是一个相当简单、一致且强大的语言。

  • MacApp,有人尝试为早期的Macintosh计算机而编写一个应用开发框架。不幸的是,它很复杂,应用起来很难。而且它也没有对大型开发组织产生巨大的影响。

  • Tablet PC数字墨水和手写软件将是成功背后的秘密。Tablet PC手写识别算法和人机交互的发展是非常卓越的智力成就。可以让不熟悉计算机和/或不具备良好打字技能的人们有效地利用计算机。不幸的是,这些算法是专属的(我并不是批评Microsoft;他们在开发方面的投入很大),我也不是很清楚软件是如何工作的 -- 但是它的确很酷!10

列表中还有一些大师。基于个人看法,我选择了两位。例如,我的论文指导老师,他在编程方法上给予我很多指教。还有我之前所说的Datapoint同事,他是一位优秀的商业软件开发专家。尽管他们不像我提到的那些大师那么出名,但他们对我的影响很大。感谢你们,Bill McKeeman和Gene Hughes。



回页首


该你了

我提到的软件大师和杰作仅仅是个人看法。我希望能收到 Rational Edge 读者的来信,希望你能列出选择的大师和软件杰作 -- 以及选择的原因。如果反馈比较多,我会为这些结果作一专栏。请将你的提名(使用我之前提到的 标准)发送到gpollice@cs.wpi.edu.

下月,我们将通过研究杰出的软件“艺术”如何适合于软件开发项目团队,继续考虑艺术和软件开发之间的相似之处。一个团队是否应当由很强的个体来组合?你怎样达到合理调配?你怎样让团队成员保持愉快且高效的状态?以及你怎样发展将来的大师?



回页首


1 参见 http://www.merriam-webster.com

2 Knuth的书最初计划七卷。在60年代末和70年代初仅编写并发表了前三卷。这说明了计算机科学的快速发展,即使是Knuth,也无法控制其步伐。

3 参见Knuth关于文化编程的内容: http://www-cs-faculty.stanford.edu/~knuth/lp.html

4 1976,Prentice-Hall发表。ISBN 0130224189。

5 想了解UNIX的历史,请参见 http://www.levenez.com/unix/

6 想了解Smalltalk 的历史,请参见 http://www.smalltalk.org/smalltalk/TheEarlyHistoryOfSmalltalk_Abstract.html

7 请参见 http://www.squeak.org/

8 请参见 http://www-128.ibm.com/developerworks/rational/library/jun05/pollice/index.html

9 来自 http://www.eclipse.org/whitepapers/eclipse-overview.pdf

10 2002年,Bill Gates在Seattle OOPSLA作了一个给人深刻印象的手写识别算法演示。



回页首


参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文


回页首


关于作者

Author photo

Gary Pollice 是马萨诸塞州伍斯特市的沃斯特工学院的一名实践教授。他教授软件工程、软件设计、软件测试以及其他一些计算机科学的课程,同时他也指导学生的项目。在进入学术领域之前,他花费了35年以上的时间开发各种类型的软件,从商业应用软件到编译器再到工具软件。他最后一份工作是在IBM Rational软件公司,在那里他是出了名的“RUP倔老头”,他也是的Rational Suite团队最初的成员之一。他还是由 Addison-Wesley 出版社于2004年出版的《小型团队软件开发:以RUP为中心的方法》一书的主要作者。他拥有数学学士学位和计算机科学硕士学位。




回页首


对本文的评价

太差! (1)需提高 (2)一般;尚可 (3)不错!(4)真棒!(5)

建议?



回页首



    关于 IBM隐私条约联系 IBM