转:技术对谈-看Google怎么用Java

技术对谈-看Google怎么用Java
文/李延华 (记者) 2006-08-29

Google首席Java架构师Joshua Bloch与Google专任工程师兼Java讲师Neal Gafter,与七位台湾Java社群专家对谈。


席卷全球Java界的《Java Puzzlers》作者-Google首席Java架构师
Joshua Bloch与Google专任工程师兼Java讲师Neal Gafter,应邀来台担任Java 2006的讲师。iThome邀请多位Java专家与两位Google大师对谈。在轻松的气氛中,Joshua与Neal针对Java的发展与 Google的技术应用等议题,以幽默诙谐的方式提出他们的看法。

PC组成高度容错的分散式架构
王建兴:当我们知道可与两位来自Google的Java大师座谈时,心中浮现的自然是Google举世闻名的分散式架构,Java向来有性能上的争议,但Google为何会采用Java?又如何应用Java?

Neal:Google打造的许多应用程式都是大型的分散式系统,我们不会将应用程式放到一台大型的单一主机上。我们喜欢使用现成的PC,来建构我们的系统,而不是大型而且可靠度佳的昂贵主机。单一PC随时可能发生错误,我们试着用软件的方式建立容错的机制。

基 本上,我们没使用J2EE,这其中有许多原因,包括Google在J2EE之前就已经有了自己的分散式架构,甚至还是使用 Java 语言建构出来的。所以Google有自己的RPC(Remote Procedure Call)系统,而且广泛地使用,它可以在不同语言之间达到良好的沟通,不论服务器、用户端、Java、Python 或C++,而且运作地很平顺。

我 们应用Interface Definition Language编译程式,成为可以跨Java、Python及C++三种语言的系统。所以当我们设计一个分散式系统时,其中一件事就是看哪种通讯协定可 以适合这些语言来开发,另外就是我们怎么处理容错、备份、如何确保我们不会遗失任何使用者的资料、如何恢复某台当掉的机器。Google有特别的解决方式 处理这方面的问题,我们有个通用的解决方法。

Joshua:没错,如Neal所言,失败不是少见的情况,而是很常见的。当你要建立一个像Google这样规模的搜索服务,你可以想像会有多少问题,但是我们就是要持续的让服务运作下去,尽量让系统可以自动修复,不要造成延迟。

王文彬:Google的应用好像都是自制的,是否曾使用其他公司的产品?

Joshua:会的,我们会拿现成的来用,多数工具是我们自制的,不过如果有别人已开发好的软件,刚好是我们需要的,而且价格不错,我们会买下它,Google Web Toolkit(GWT)就是很好的例子。

Neal:我们就常用一些开放源码的产品,用哪些可能不方便讲,不过我们用很多Linux工具,有时候我们会用些其他人开发好的工具,其实Google没有规定一定什么都要自己开发,当你要把程式交给开放源码社群时,你会倾向社群支持你的东西,但你不会要他们付钱给你。

彬:这就是JBoss要做的。

Java与C++人才的比重逐渐改变
王建兴:我们听早上的主题演讲,你们说Google应用Java在中介层(Middle-Tier),例如GMail、Calendar。我们很有兴趣知道什么样的应用适合使用Java?

Neal:没错,在中介层的开发,Java是很好的选择。Google 有很多基础的设施,Web Servlet 引擎,让你很简单就能以Java撰写与部署中介层的程式。

Joshua:而且有许多现成的函式库,不需要用到bit-level,就可以整合原有底层的C++程式,这可以广泛地移植到用户端的程式,像是一些AJAX程式。

Neal:这还是要看各个开发团队决定用什么,如果是要开发一些以Web为主的程式,可能就不考虑Java而选择C++,有可能因为他们对C++很熟,所以,即使他们开发的东西和我做的很像,但他们还是决定选择C++。

王建兴:你们认为Java能提供更好的可携性吗?

Joshua:绝对是的。而且Java可以提供较好的效能表现。

Neal:一般来说,以Google使用Java的方式下,可携性没那么重要。因为我们将Java应用程式部署在特定版本的Linux。

不过,可携性的优点,是当我们移至下一个版本的Java,或下一个版本的Linux时,我们不想锁在某个特定版本的Java、架构或作业系统,所以可携性很重要。

Joshua:但我们不会要求写程式时,要同时兼顾在任何平台上都可以执行,这有点与写程式的态度有关,你是要写给自己用的,或是写给全世界用的。

王建兴:我想你们会采用 Java 有一个很重要的理由是想要降低开发的心力和时间。

Joshua:绝对如此。还有另一个理由,学生在学校里学的都是Java,而且喜欢Java,他们甚至不懂C++,所以比找C++人才容易。

Neal:而且Java除错容易多了。

王文彬:现在Google的C++与Java工程师的比例为何?各占一半吗?

Joshua:我不太确定。可以肯定的是Google正在徵求更多的Java工程师。

Neal:应该不到这个比例,使用C++的应该多一点,可能是 6:4 左右。不过,使用Java的人正在成长中,5年前Google大概没什么人使用Java,所以我们可以预见,Java在Google里越来越重要。

王建兴:即使Java对开发企业应用程式是够快的,可是你们怎么兼顾延展性(Scalability)?

Joshua: Google解决Java的延展性,就像解决其他这类延展性问题。像是复制、大型分散式系统,或者用更多机器来解决这些问题。

王建兴:所以你们会用分散式架构来解决?

Joshua:对。

叶秉哲:请问Google分散式基础架构早在Google搜寻引擎刚草创的时代就已经存在了吗?

Neal:许多Google的丛集和分散式基础架构,的确可追溯到Google两位创始者在史丹福大学研究所,以三五台机器研究时代。不过早期的基础架构都已被重新设计过,所以现在已经很难看到杂乱的程式码了。单以搜寻引擎核心本身而言,大概就被改写过三次。

Joshua:不过,当然,某些核心的演算法,例如PageRank仍然存在。

没有修改JVM,调校是从程式着手
王建兴:在你们早上的演讲中,提到有许多在Java社群有所贡献的人,现在都在Google,我们看到有很多人都熟悉JVM,我们猜你们有基于效率的考量修改JVM。我们有猜对吗?

Joshua、Neal:猜错了。

Joshua: 你们可能会这么想,但就我所知没有。我们使用现成的JVM,不是我们为自己人说话,但昇阳的JVM效能一直在精进,我们把原来跑在 JRE 1.4的程式放在Tiger上,发现,哇!效能这么好。再放在Mustang,哇!效能更快,我们就不用花什么功夫特别去调整我们的程式了。

Neal:我们的确是和昇阳保持联系,所以当我们遇到了特定的问题时,我们就会让他们知道,这样的VM对我们不够用。

Joshua:而且我们提供解决方案。

王建兴:所以最佳化是在应用程式的层级进行?

Joshua:是的,开发精简而有效率的程式,Java是很好的工具。Java程式既短且清楚,而且提供够多的函式库,可以根据需求置换。要写出一样的C++程式,就得花上更多的力气。

Neal:你可以找到许多用在Java的效能衡量与调校的工具,那可以很容易找出问题在哪。

王建兴:程式效能的瓶颈。

Neal:是呀,我总是很惊讶瓶颈怎么会在这儿,所以总是真的找到了才相信。

王建兴:效能瓶颈所在,总是令人惊讶不已。

Joshua:没有真的证明前,总是猜错瓶颈究竟在哪里。

开放原始码,对Java的帮助有限
朱仲杰:我们知道这几年Java将会开放原始码,你们们觉得这会对提升Java的效能,或找出Java的效能瓶颈有帮助吗?

Joshua: Neal和我并不同意这个观点,基本上我们有研究许可(Research License)已经可以阅读原始码,调校或找出问题都很简单,我不是要说这么做没用,而是我们不需要因为原始码不够开放而这么做,从1995年到现在, 已有很多进步,可以写很高效能的Java程式。

Neal:Java SE今年年底就要释出原始码,你可能会觉得届时开放源码社群协助Java SE,找出Java SE的问题。不过,其实他们现在就已经可以这么做了,Java SE已有公开的原始码,你可以在上面加些警告,也可以告诉昇阳哪里有问题。但是实际上,很少人这么做,所以我不觉得完全开放源码之后,会吸引大家贡献些什 么,因为现在就可以了。

Joshua:不过学术单位在Java开放以后,就可以更自由的使用与修改Java了。

Neal:有些事是开放Java源码以后可以做的。像是Java语法的实验,现在我虽然可以改Java的东西,做些实验性质的应用,加些新的功能,但因为我不是昇阳的员工,不被允许提供给别人试用。

Joshua:我要提出相反的看法,7年前Philip Wadler、Martin Odersky这两个人,在Java上加了很多功能,然后取名叫「Pizza」,现在的Generic功能很多都是根源于Pizza的。

Neal:但如果他们在Java开放原始码之后再做,就不需要自己重写一个Java SE了!

Joshua:我要说的是,这类在Java之上的再开发,7、8年前就有。

Google力求提供在地化的服务
冯彦文:我很好奇Google的软体,有没有还未自动化的?需要人工处理的?

Neal:有,像在地化,因地区不同的翻译之类。

Joshua:也是有些工具可以帮忙。

Neal:其实也有系统帮助不在Google工作的人,协助我们做在地化。

Joshua:基本上Google会尽量能自动化就自动化,Yahoo就不那么自动化,Yahoo是有历史原因的,因为从一开始的设计就是由人工登录网址;而Google从一开始的索引就是让网路自己搜寻,但也没办法做到样样自动化。

Neal:还是有些服务像登广告,得由人工检查填写资料的是否正确,及是否侵犯他人的商标。

Joshua:不过我再强调,我们都尽量自动化,不能做到的,才用人工补强。例如Google News,就不是用人工挑选资料,是电脑筛选的。

Neal:Google设计服务时,还是以自动化为原则,这样的服务才不会被限制住。如果有服务是我们无法靠自动化来解决的,可能我们就做错了方向。

冯彦文:所以像 Google广告,如果我想申请的是中文、日文,这些不同语言的广告,你们需要不同地区的人协助吗?

Neal:我想我们在全球不同国家,都有分公司照顾各种语言的用户,我们的服务在全球都有,还是需要有人知道当地的语言、文化、法律的特色,才能服务当地的人。

叶秉哲:所以我们才能看到Google Map在日本是日文,在希腊是希腊文。

Neal:没错。

Joshua:Google了解这个世界只有一小部分人的母语是英文,我们也了解,在这个一直成长的网路世界人口中,大部分的人说着其他语言,Google想要为这部分的人服务。

冲击可以激盪出更多兴奋的点子
钱世丰:Google在全球有那么多员工,分散在不同的地方,如何合作完成工作?

Joshua:我们公司使用电子邮件和即时传讯系统沟通。有人说到Google Talk吗?

昨 晚我抵达台北的时候,写电子邮件给老婆,一打开即时通讯,就有Google的人传讯过来问我「Hey,你现在在哪里?我有个技术问题想问你,有个API里 有个名字,我不认为那是个好名字,你觉得呢?」基本上,Google是个全球性的公司,合作的方法就是要有全球化的想法。

Neal:Google尽可能的维持小型团队,而且让小型团队在同地点工作,理想的团队规模可能是5个人,4个或5个,也许多到8个。大过这个数字,沟通就复杂多了。

Joshua:举例像匹兹堡分公司,匹兹堡的团队可能有些人会在某个计画上分担工作,和位于山景城(Mountain View)总部的员工合作。Google是从史丹福的研究生开始的,逐渐聚集许多工程师加入,这些工程师聚在一起就会有些东西蹦出来。

王文彬:你们现在有多少员工?一万人?

Neal:还没,大约7000~8000人。

王文彬:那现在一定也多了许多人是从事业务工作,从一个管理者的角度来看,如何和业务这类不同性质的人合作?

Joshua:这对公司而言的确是有点挑战。可能有时候需要顺从别人的意见,但Google还是尽量保有某些原则。当然还是有混乱冲击(Chaos)的时候,优秀的科技公司,总是会有些「冲击」,因为冲击可以激盪出更多令人兴奋的点子。

王文彬:我总很好奇,你们有很多东西都是自制的,那新进同仁要如何学习这些东西呢?学习方式为何?

Joshua:这是非常棒的问题,来到Google就像刚移民时,都要上一些课,像刚上大学会有新生训练一样,Google有两个礼拜的新生训练,教导Google现有的产品。例如我们是开发Java程式的,就会教导一些写Java的方式。

Neal:新进员工会有指定的mentor(学长)带他,如果有什么问题,可以问学长,实作上的问?

Google的80/20工作法则
钱世丰:Google的员工可以利用20%的工作时间做任何想做的事,是真的吗?

Neal:真的!我当初的20%时间是做一个行事历的应用,后来发展成为今日的Google Calendar。它现在变成我的80%,而目前来台湾就是用我的20%时间。

Joshua:很多年来,我的20%是更新《Effective Java》。

Google专任工程师Neal Gafter(左)与Google首席Java架构师Joshua Bloch(右),两人利用Google的20%自由工作时间写出《Java Puzzlers》畅销书。摄影/赖基能

AJAX仍在演进,是未来的趋势
朱 仲杰:我们知道AJAX是从Google Map点燃的,而AJAX现在正火红,Java Script有个大问题是相容性,有些语法只能在IE或Firefox上使用。Gmail可以在很多浏览器上使用,但Google Calendar就只能在IE和Firefox上用。

Neal:不,它现在可以在Mac OS上使用了。

使用AJAX撰写应 用程式,会比用Java用户端技术撰写应用程式花上更多力气。真的,因为可携性不会是免费奉送的。另一方面,并不是很多人的机器都装有 Java,但每个人都有浏览器,Firefox到处都有,而IE更占有90%,只要有Windows就有IE。实务上来说,当你能够在这两个浏览器上执 行,对大多数人来说,就具备了可携性。

Joshua:我看AJAX是比以前的HTML更丰富,但还是没有比传统的Windows、Mac OS或Unix上的应用程式丰富。不过另方面,AJAX一直在改进,比以往更容易移植、更容易维护,这些背后技术的演进,让使用者能自然地使用,不会感觉 到技术端有什么不同,这些都是好事。我有时候对AJAX做不到一些功能而感到挫折,但另一方面以一些商业的角度来看,选AJAX还是正确的决定。

Neal: AJAX的应用还是无法像一般例如Java开发的程式来得丰富,其中部分原因是技术太新,所以不那么普及,没有那么多函式库可以让开发变得简单,而且 AJAX还是有效能上的问题,Java Script还是一个直译式的语言,如果未来有更丰富复杂的以AJAX 开发的应用程式,我们还是需要有更好的Java Script解译方法。我还是会很高兴看到越来越多用户端在使用Java。

Joshua:会的,大约60%的电脑出厂时就装好Java 5的JRE(Java Runtime Environment)。

丁彬:Google以併购的方式取得GWT,Google还有其他的AJAX 工具集的计画吗?

Neal:Google很多专案采用AJAX技术,不过如果你的问题,是Google有没有其他的AJAX Toolkit产品,就我所知是没有。

Joshua:就我所知,也是没有。就算有,我也不被允许谈论这些计画。

叶秉哲:所以你们会用吗?(指GWT)

Neal:我们现在没有,因Google Calendar在AJAX诞生之前就开始开发了,但如果开发时就有这些工具,我想我会采用。至于我现在是否会将Google Calendar转由AJAX工具开发,这听起来就有点费功夫了,可能不太值得。

叶秉哲:如果有新的应用,你们可能就会采用?

Neal:如果有新的计画是以AJAX为目标,我想会采用的,因为有现成的可以利用。

Joshua:如果有时间我也会想用,不过有点困难。

叶秉哲:当Google在使用脚本语言时,为什么会选择Python,而不是Perl 之类的语言?

Joshua: 当我们任职于Google时,Google已经采用Python,所以我并不知道最初的原因。在Google内部也有人使用 Perl,不过只是用于个人的20%时间,属于实验性质,用来展示及说服个人的想法;当此计画成长到有其他人加入时,还是得转移到Google最常用的语 言平台上。

Google OS?只是揶揄微软
朱仲杰:现在你们用的Java是哪一个版本?

Joshua:我很骄傲的说,现在我们已经用到Tiger,我是2004年7月4日加入Google,大约从2005年3月起,全公司就转换到Tiger,这是在Tiger发表后没多久的事。

Neal:我们已经完成JDK 1.6的测试,只要等JDK 1.6公布后,我们也可以很快地转换过去。

钱世丰:请问你们有自己的作业系统吗?

Joshua:没有,我们用Linux,我们在一些大规模的系统用Linux,但我们没有自己的作业系统。

Neal:但我在自己的笔记型电脑上做了一个「Google OS」的萤幕保护程式,当我去演讲开会的时候,大家都会看到我用「Google OS」。

王文彬:这是行销?

Neal:是我们在揶揄微软。

C#与Java各擅胜场
王建兴:.NET是Java的主要竞争对手,现在也有开放源码的.NET Framework可执行于Linux,它叫做Mono,你对Mono的看法?

Neal:嗯,它还不完整,是吧。有很多开放源码的Java实作,也都不完整。很多Java的实作,都只有60%~70%的API支援,就算是90%都不够好。那意谓着我可能会呼叫到一个不能起作用的方法。要支援全部才算有用。

Joshua:像我在Java的委员会,我还是觉得即使是.NET公开的API也不会很实际,Java有完整公开的计划,主要就是要把所有函式库都公开。

丁彬:那C#呢?C#的目的之一,就是要从Java社群挖走一些人,你们觉得呢?

Neal: 我认为C#的确有一些好的想法。他们有自由选择不需要保留向下相容性,举例来说,当他们在语言中决定增加Generics语法时,他们建立了另一套全新的 Collections API,身为程式设计员或是软体厂商,必须在原本的和新的介面中,选择一套来使用。以语言设计的角度来说,这样做可能比Java设计者的选择来得好,C# 有这样的自由可以让设计者更大幅地改良语言的设计。

Joshua:我这样说好了,「模仿」绝对是高度的赞美,何况是像C#如此公开的模仿。我不全然认为C#挖走了Java 的开发者。当你的目标是在Windows 上开发时,为了某些明显的因素,使用C#或C++会面临较少的整合性问题。

Neal: 在Java的Generics中,有Wildcard的语法,我认为这是一个极为重要的部分,它让程式设计人员更有威力、可以更灵活的表达设计理念。C# 中就没有这项功能,这也可能和当时的程式语言社群中对于 Wildcard 的需求讨论还没这么热烈有关,但我认为对C#来说,要增加这项功能已经太晚了。

Joshua:每一种程式语言都有它的优点和缺点,我或许有点偏颇,不过我的确很喜欢Java中这些新的功能。C# 中有太多过去Pascal及C++的影子。

王建兴:以一个架构师的角度,可以区别一下Java和.NET的核心的不同吗?

Joshua:我对.NET的核心没有那么熟,他们出现得比Java晚,所以可以针对Java的缺点改进,但如果你有看《Java Puzzlers》,你会发现还是有很多Puzzlers也同样在C#出现。

朱仲杰:《Java Puzzlers》、《Effective Java》的第二版何时会问市呢?

Joshua: 我在今年旧金山的JavaOne大会,于数千人面前保证,在下一届JavaOne之前,会推出《Effective Java 2nd edition》,我会继续努力朝着明年出版的目标努力。至于《Java Puzzlers》的第二版,希望不会再有那么多难题了。因为越多难题与陷阱其实代表这个语言的缺点越多,只要我们不要再加入更多不好的语言特性在 Java中,就不会有太多新的难题。

Java太肥了吗?
王文彬:我对Java的未来方向有点好奇,Java已经很成熟,若我们再持续加入新功能,会不会让语言太过庞大而失焦?

Joshua: 会的,每个语言都有生命周期,有些语言持续增加新功能,导致该语言后来很难写、很丑、难以使用,很多语言后来变成这样,而我会尽力让Java不变成这样。 我相信现在的Java已经是一个相当完整的语言,虽然还是有很多好的功能可以加入,但将这些东西一股脑全部加进来绝对是错的。

Neal:我觉得在JDK 5就加入了太多功能。

王文彬:是的,像annotation 就是。

Joshua:但是使用者喜欢耶!我是annotation技术团队的负责人,虽然这不是我心目中最想要的功能,但是我相信它对一般的Java工程师帮助很大。

Neal:有两个我觉得后悔的功能:Static Import 和 Varargs。
Joshua:其实Static Import我觉得并没有太伤害Java语言本身,因为根本就很少用。Varargs在特定的时候,确实会造成无法预期的结果。

钱世丰:你们最喜欢哪些Java新功能?

Joshua: 我觉得enum这个小功能很重要,但当初没有规划好enum的比较,现在的规格允许我们可以比较两个enum是否相等,但是却不能使用像是大于、小于来比 较两个enum。另外像switch不能使用在String 上,很多人需要这个功能,没理由Java无法做到。我觉得像这样的小功能,是我很希望未来的Java再加入。

Neal:我自己认为有个功能是现在Java缺乏的:closures。

Web 2.0的定义始终是分歧的
朱仲杰:你们怎么看Web 2.0呢?会觉得是泡沫吗?

Joshua: 我觉得这只是大家为现在的网路现象取个名字,就像从写HTML开始,后来有Java Script,现在有公开的API,就可以做一些Mashups(混搭程式),我觉得一些Mashups很棒,像房屋网站Zillow.com就整合 Google Map,这些东西都很棒,不过这比较像是行销人员把这种现象取了个Web 2.0的名词。

Neal:我不知道大家怎么看待Web 2.0的意义,我认为这是把网路应用服务集合的意思,其中有些想法也是行之有年,像Amazon上可以写书评。不过我想Web 2.0会是现在和未来一些网路服务的趋势。

Joshua:那如果说Web 2.0是平台呢?当我们说 Web 2.0是一些以网路服务为基础的平台,像Amazon、Google、eBay有提供 API,这样一些网路服务就可以利用其他网站现有的平台提供更多应用。
钱世丰:我觉得直到有租屋网站和Google Map整合后,大家才开始注意Web 2.0的现象。

Neal:我觉得大家对Web 2.0的定义都不大相同,几年后如果Web 2.0成功了,这个词就还会存在;如果没有成功,就不会再叫Web 2.0了。

钱世丰:有些人说GMail与Google Map是 Web 2.0 的开始。

Joshua:Google Map无疑的是属于Web 2.0服务,你看Zillow.com就是整合Google Map的应用。整理⊙李延华

        Joshua Bloch

Google首席架构师,着有《Effective Java》、《Java Puzzlers》(java解惑)

「当你要建立一个像Google这样规模的搜寻服务,你可以想像会有多少问题,但是我们就是要持续的让服务运作下去,尽量让系统可以自动修复,不要造成延迟。」


        Neal Gafter

Google专任工程师兼Java讲师,着有《Java Puzzlers》(java解惑)

「使用AJAX撰写应用程式,会比用Java用户端技术撰写应用程式花上更多力气,因为可携性不会是免费奉送的。」

你可能感兴趣的:(java,Ajax,应用服务器,linux,Google)