在QCon旧金山2007大会期间,InfoQ的编辑Stefan Tikov采访了CORBA宗师Steve Vinoski,就他对REST的关注,使用CORBA的场景,以及分布式系统中描述语言的角色等问题做了深入的探讨。其他主题还包括了解多门语言的好 处,Erlang在构建分布式系统时的好处等。
个人简介
Steve Vinoski是一家美国创业公司Verivue的技术员工。他被公认为是CORBA领域里世界领先的专家之一,在加入Verivue之前他在IONA呆 了10多年之久,是IONA的首席架构师和创始人之一。此前他还在惠普、Apollo计算机和德州仪器等公司从事过软件和硬件相关的工作。
今天我采访的是我儿时的偶像之一Steve Vinoski。这些天您在忙什么?
现在我还不能说我的公司是做什么的。二月份我离开了IONA公司,出于保密的原因,新公司的创始人不想对外界透漏太多相关的情况。但是我可以告诉你,现在我很快乐。就像呼吸了一口新鲜的空气。相比于我在IONA的那十几年,这种感觉是非常不同的,充满了快乐。
这个新公司跟中间件或者新型分布式对象相关吗?
不相关,完全不同的领域。你也知道,我是硬件工程师出身,所以公司里有一些搞硬件的朋友,这倒有点追根溯源的意思。我现在并没有从事硬件相关的工作,而主要是做中间件。我已经从一个供应商过渡到用户的角色了。
也许有人会说这些已经体现在你的博客中了,那些内容现在还可以看到。您过去曾批判过供应商、中间件、WS-*和ESB等,能展开谈一谈吗?
我想如果你回头看一下我四年前发表在《互联网世界》(Internet Computing)上的文章(其实我的第一个REST专栏是5年前写的),就会发现我的有些观点是“将WSDL用作抽象是做事情的好方法”,还有些是 “这些(技术)还没有被真正地标准化,有那么多的规范,那么多的供应商战争和摩擦。”。说实话一直以来我真的看不惯这些事情,但由于身在IONA,碍于多 种原因我不能讲出实话,因为那是公司的事情。但一旦这个负担被拿走了,我就可以说说我的真实感受了。其实和从前我所说的差别不远,只是现在所言全是实话, 没人给我压力。
如果您现在是一个大型公司的架构师,要为一整套系统或者一个大型分布式系统设计架构的话,您会选择什么技术?
我想我会先看看REST。如果你研究一下SOA,你会发现它主要关注业务和文化,里面都是谈我们如何整合业务,如何使事物能彼此合作,如何制作共享组 件,以及如何避免重复劳动和雇员多余等等问题。SOA关注的重点是文化,而不是技术架构。有些人在谈论技术SOA,但是技术SOA还是依靠现在我们所用的 产品,因为每一个产品都是不同的。从技术角度来看,SOA还没有具体到让这些产品看上去都一样的地步。转而来看REST,它就是一个全新的架构类型,全是 关于规约以及如何从这些规约中找到价值的方面。有些人已经将大量的规约用于分布式系统,并取得了可喜的成绩。那么为什么我认为我可以做的更好呢?因为我从 前做过类似的工作,如果必须使用那些规约的话,我也能设计得非常松耦合。在我看来,如果单纯考虑工程造价的话,REST是有意义的。
谈谈您会使用CORBA的一些场景吧。
在确实需要和正在(或已经)用CORBA编写的应用交互时,我会用CORBA。我从1991年就开始用CORBA,现在还在用,在最近我和Michi Henning写的一本书里面对其做了反思。虽然CORBA现在不如过去应用的那么广泛,但是我还没有完全放弃它的想法。有许多领域仍然在用CORBA, 那些接口也不会明天马上消失,在未来的5到10年里它们还会存在。如果需要和那些用CORBA构建的系统交互,我肯定用CORBA。另外如果我正在开发某 个小规模系统,而且开发人员对CORBA比较熟悉,我也会选择用CORBA。但是如果要构建一个企业级系统,我会选择REST。
假设我们要讨论一个不同之处,一个在讨论REST时经常被提及的问题,比如在REST论述(指Fielding博士关于REST的论文)中没有定义任何描 述和契约定义,只有一个通用的定义。而在这一点上,CORBA对IDL的依赖非常强烈,您觉得这是CORBA的一个问题吗?这是CORBA所缺失的特性 吗?
关于你的这个问题,我过去也有很多的想法。在CORBA里,一个人可以从事的层面和领域很多,也很明显。我几乎干过所有事 情,但是在我从事CORBA工作时,我大部分时间专注于IDL和将它映射到其他语言之上。至于为什么这样,我想是可以理解的。我知道有很多人对于理解C+ +映射方面存在问题,但那它(即C++映射)是为C++高手所写的。我个人对此没有什么困难。如果你只知道IDL的使用方式就去用它定义一个接口,这就会 有问题。那种方式并不能正常工作。没有人在使用IDL时会说“就是这个方法,我要调用它,传递它。我只需要看一下IDL就知道要做什么。”
没有人会这样做。IDL只是用来代码生成。如果我想知道如何使用一个服务,不论它是否有IDL,只要开发人员在旁边我就会去问他们;如果他们不在旁边, 我就去看文档。比如打算使用Amazon、Google或者其他站点的REST服务,我就去找它们在网上的文档,然后阅读和查找。我不晓得拥有一个IDL 是否真的有用。现在这个接口被修正了,成为一个HTTP动词(Verbs)。你需要处理数据定义,而数据定义和媒体类型通常被注册的IANA类型所定义。 如果你想知道这些数据如何展现,那么就去看看那些媒体类型或者MIME类型。我不认为你的问题和分布式对象的CORBA风格是同样的问题。
我听说现在的争论焦点之一是:如果你使用的是一门诸如Java或者C++这样的典型静态类型语言,那么当你构建那些在调用过程中需要交换的对象时,从代 码生成那一步所得到的对象就得是类型安全的。如果你没有一个可以生成代码的描述语言的话,在你的IDE里面就不会有代码实现,你也不会有我们过去习以为常 的东西。
我猜是有这样的情况,但是我不使用IDE。从前在我的博客评论有人说“你应该使用IDE,你应该尝试所有新的事物”, 就这个问题我从前还和一个同事讨论过。但我一直使用Emacs。我曾经试用过Eclipse,有些工作它做的真的很棒,但是我想我现在只是一条“老狗”。 回到你说的这个类型安全的问题,你最好称它为“伪类型安全”,因为我可以将一个在客户端应用上假定类型安全的消息传递到你的服务器上,而你的服务器能通过 完全不同的定义进行编译,还能够离线读那些字节,换句话说它们看上去符合你的消息定义,而其实两个定义可能是完全不同的。对于你的对象、服务或者其他任何 我能通过使用IDL得到的类型安全也是如此,现实中它们可能都有完全不同的类型,但却不是在我的客户端上,原因是它是完全分布式的。你的版本变更可能和我 的变更有所不同。所以你最好称它为“伪类型安全”。但是我认为名称的变化改变了整个等式(译注:之前的“类型安全”隐含对象必须在分布式系统中各个部分都 是相等的,但是改为‘伪类型安全’之后,这一等式不再成立,只需要系统中传递的消息契约一致即可。),因为你是在构建一个分布式系统,而不是构建一个本地 程序然后分发之。而且在构建分布式系统的时候,你恰好使用你选择的语言写了一些这个系统的部分程序。我想我们应该关注分布式系统,而不是考虑哪个语言在编 写这个系统时更容易使用。我知道很多人不同意我的观点。
我知道您花了很多时间来讨论动态语言,能多讲一些这方面的事情吗?我很难想象一个C++老程序员会忽然转到Ruby上来。
你这儿说的“老”是指我从1988年就使用C++对吗?而不是说我年龄已经很老了……:)我使用C++确实有些年头了,但是很久以来我也是动态语言的粉 丝。我的专业是电子工程,从来没有上过什么计算机科学课程。所以我一直感觉应该自己学习一些关于计算机科学方面的知识,回想我当年自学编程语言(主要是C 和C++)的时候,因为身处硬件组所以周围没有人和我交流编程方面的想法。在1987年我加入Apollo计算机公司时,我开始接触软件人员,但是他们主 要是嵌入式开发者,大多数人使用汇编语言,也有部分人使用C。当时我使用C++对其他人而言是很反常的行为,要知道在那个环境中即使用C也算得上是激进分 子了,而C++则完全不在考虑之列。
没有人交流可能会让我错失了一些东西,现在想想我当时应该多看几门语言,而不仅仅是C++和 C等。我一直坚持自学语言,几乎什么都看。虽然我没有用它们开发过真实的应用,但是至少我阅读了很多相关的书籍。我还学习了使用Unix,那是一台硬件测 试机器,上面跑的是Berkeley Unix操作系统。当时我是什么都学,Unix的很多工具,如greps、seds和awks等。后来Larry Wall推出了Perl,我看过之后惊呼,“哇,这些都是我曾经学习过的,但一个语言全包括了”。1988年我将Perl移植到Domain OS上,也就是Apollo的操作系统,我想现在你可能还能拿在Perl源代码里找到我的名字。所以说,我在学习使用C++时就接触到了动态语言。对我来 说,它不是一个新事物,我用了很久了。
您说现在更倾向于使用REST,而不是CORBA,对于语言的选择也是如此吗?现在您更倾向于使用Ruby或者其他动态语言,而不是C++或者Java吗?
我确实倾向于首先看看那些语言,虽然有时候它们并不是正确的选择。我喜欢做的是将多个语言放在一起,对着某个问题问自己“有没有解决这个问题最简单的方 法?哪个语言能够做到?”。不仅仅是能够解决这个问题,还要最易于后期的维护,最易于扩展等。一般而言,我先看问题域,然后看看工具箱里的语言,然后选择 正确的那个。我之所以有点偏爱动态语言,是因为它们确实很强悍,也很简洁。你用它们写出的程序要比用Java、c++或者C小的多,而且能做同样的事情。 它们也很快。有人常说动态语言很慢,但是这不是事实。有些比较慢,有些不是。Python就非常快。我并不是要抛弃Java或者C++。说实话,我不是 Java的忠实粉丝,因为如果我要编程解决什么问题时,我会选择C++。如果要选择和C++完全不一样的语言,我会选择动态语言。于我而言,Java和C ++没有太多的区别。
我发现最近一段时间您在玩Erlang。我不知道这儿使用“玩”这个词是不是确切,因为我了解到您在实现Tim Bray的Wide Finder。能给我们大体地讲一下Wide Finder问题的背景,以及使用Erlang的经验吗?
实际上我结缘Erlang已经有十几年的时间了。过去我一直没有使用过Erlang,但是近两年我开始看一些相关的参考文档。一般情况下,如果有人告诉 我说“有个语言你应该注意一下”,那么我的第一反应是“好,我会看一下”。如果我在这个语言上没有发现很实在的东西,我会回到我手头的工作。这次也不例 外,Erlang吸引我的地方是它的可靠性和并发性方面。作为一个长期从事中间件编程的开发者,我会花很多时间来确定这些语言是否具有很好的生产力。传递 消息,分析数据等这些其实都是很简单的地方。
当某个东西需要长时间运转的时候,你需要预防节点股障问题,或者需要容错性、安全保 障以及需要花时间处理的并发性问题等。比如我锁定了一个数据,需要跨线程共享,这时如果丢失一个的话,事情就很糟糕了。这两点是始终伴随中间件开发人员的 两大难题。在我研究Erlang的时候发现它是内置的。因此这也许需要多一些的调查,所以对Erlang我一直保持关注。我在IONA工作的时候,我正在 实现高级消息队列协议,现在Apache的Qpid项目也在做。在那时,有些人请我给这个高级消息阵列协议增加容错性,我回答他们说“如果你需要容错性, 那么你应该用Erlang,那会省掉很多麻烦。”
两周后,有家叫RabbitMQ的公司发布了一个AMQP的Erlang版本, 很明显他们在这方面已经做了很久。现在这个项目还在,很多人都在使用。我当时想我不能离这个东西太远,这时Tim的Wide Finder出现了。Tim Bray是Sun的一个员工,他想分析他的网络日志,可能最小的日志都要1/4G那么大,有很多数据需要分析。他认为“Sun有新的机器出来了,我应该如 何用像Erlang这样的语言去并行分析这些数据呢?”于是他写了一个Erlang程序,但是他对它并不满意。如果现在你去看他的博客,你能看到他很不 爽,他认为Erlang并不是人们所吹嘘的那么厉害。
看到这件事情,我想我也许能做得更好一些。于是就开始做,Erlang社区 里的其他人也是如此。然后就看到处理时间不断地下降。我想Tim在分析这个数据集时所用的时间应该是30~40秒。我将它降低到2~3秒。而有个家伙最后 竟然将这个时间降低到0.8秒。我想现在Tim系统的最快实现是另一个函数语言Ocaml实现的,第二名是Python,Erlang次之。许多人说 Erlang不能处理文件的输入输出并引以为诟病,但是很明显这不是事实,因为它能处理这些巨大的数据文件,而且速度名列前茅。
您认为像这样的事情会继续下去吗?也就是说语言会变得更加强大,而不是说一门拥有大量类库、工具或者中间件什么的通用语言。语言要包含我们在类库中期望的功能是一个趋势吗?
类似的事情在多核系统的并发领域有很多。当你有两个核的时候,将你原来的程序扔到那个机器上,不会有什么问题。但是当你有八个核的时候,事情就变得很有 意思了,因为你会发现有的核在你运行程序的时候是空闲的。如果你没有选择合适的语言去利用它们,那么你的应用就只能使用其中的某一个核。操作系统不会帮你 处理这些,因为它不会拿着你的应用然后为你拆分到其他核上。你必须明确地将它进行多线程处理。在Java和C++语言中,现程是相当重量级的。即使它们比 进程要轻量一些,也是很重量的。而像Erlang或者类似Erlang的语言都有轻量级的线程,在我的Mac笔记本上可以轻松地跑 50,000~60,000个线程,很酷。它是一门非常特别的语言。
下面我们看看面向对象和函数语言,现在函数语言好像要复苏 了。我不清楚这背后的原因,也许是因为它们很小巧,但是却可以用很少的代码处理很多的事情。甚至像Ruby和Python这样的语言都有函数的一面,也许 这是一个驱动因素吧。我还认为现在语言设计和人们对语言的理解也有“复古”的趋势。过去一直将C作为高级语言的汇编语言,不仅C++而且Python、 Perl等都是在C上构建的。Java目前也有这个趋势。Java就像JVM的汇编语言,它已经成为很多语言的虚拟机,比如Scala、Groovy和 Jython等。人们看上去在朝两个方向前进,其实殊途同归:构建更小的语言,然后基于这些通用语言更好地解决特定的问题!
对于您提到的这些语言,最为推崇哪一个?
我想过去十年或者二十年,关于语言有一些相关的调查。许多人认为C++也许是人们应该使用的语言;然后Java出现了,许多人转向Java。我遇到许多 好像只懂得Java的程序员。如果你向他们推荐说也许他们应该学习一下其他的语言,他们会和你争论,反驳说“Java都能做到!”。我想如果你问那些发明 这些语言的人,他们肯定不会说这些语言什么都能做。除了这些,还有许多其他讨论小语言的多语言社区。Erlang已经有21年的历史了, Smalltalk一直就有,现在人们还在使用它。我想正因为没有哪个语言什么都能做,开发人员才真的需要去学习多门语言,并能够整合他们。
当你真的遇到这种情况,当你学会了许多种语言,突然遇到一个问题,用两行Ruby程序就解决了,而如果用Java语言的话可能需要两百行,想想那是一种 多么美妙的感觉。这会让你成为一个更好的开发人员,因为你开始明白在不同的语言中如何使用不同的程序,你会从不同的语言中获取知识。在Python中有很 酷的列表表达式,一行程序就可以处理一个列表中的各种迭代。Erlang也有类似很酷的功能,你会发现“原来在Erlang中也有和Python中语句基 本类似的列表表达式,它们有着同样的功能。”其实并不是说每个语言都是一个完全不同的世界,都需要你一切从头开始。你学会了一个,认识了这个语言中一些独 特的地方,然后学习了另一个,会发现有很多相似的地方。
从OO语言过渡到函数语言有那么一些不同之处。而像Ruby和 Python这样的语言是跨OO和函数语言的,使用这些语言可以帮你处理很多事情,同时还能够扩展你的视野。对于并发,如果你在写中间件程序,我想你最好 先看一下Erlang。这个语言本身就具有这样的原语(primitive),它有一个称为Open Telecom平台的库,能够方便地构建安全的软件。这绝对不是说它简单,只是和你不用Erlang去做的事情相比起来,它确实容易了很多。所以,不要只 看一门语言,都要涉猎!
受访人 Steve Vinoski 采访人 Stefan Tilkov 翻译:霍泰稳
来自:InfOQ中文站