《Java程序员修炼之道》做者Ben Evans:保守的设计思想是Java的最大优点

非商业转载请注明做译者、出处,并保留本文的原始连接:http://www.ituring.com.cn/article/127453程序员

Ben EvansjClarity的联合创始人。其公司致力于开发能够为开发和运维团队提供帮助的性能工具和服务。他是LJC(伦敦Java用户组)的组织者之一,也是JCP(Java社区过程)执行委员会的成员之一,帮助定义Java生态系统中的一些标准。他仍是“Java Champion”荣誉得主。他曾与人合著了《Java程序员修炼之道》The Well-Grounded Java Developer)和《Java权威技术手册(第6版)》(Java in a Nutshell)。他曾就Java平台、性能、并发和相关主题发表过屡次演讲。docker

图片描述

问:《Java权威技术手册》(Java in a Nutshell)是一部经典,它的上一版(第5版)长达1200页,而在十年后即将在中国出版的第6版却只有400页,这两版之间到底有什么样的变化?对于Java来讲,这十年意味着什么?shell

第1版《Java权威技术手册》是在Java刚刚变得流行以后很快出版的,那个时候人们对于Java充满了想象。在接下来的五个版本里,这本书越变越大,内容不断延续。因此每一本的重点都有些着眼于历史,由于几个版本之间有着演进的关系。这是由几个因素形成的结果,有一部分缘由纯粹是由于这样比较好写,你只要知道这个版本和上一个版本相比增减了什么就能够了。可是更重要的是,在早些时候,在大部分企业中,Java的生命周期很长,因此你常常能够看到很老版本的Java。因此理解不一样版本之间的区别变得很重要。因此当你在某家公司某个Java版本上工做时,若是你知道版本是哪一个,你也就知道了能作什么不能作什么,以及这个版本与其余版本相比有什么样的改变。编程

这就是当我开始写新一版时,第一个想改变的事情。由于如今最新版的Java 8(说到这里,容易让人有些混淆,《Java权威技术手册》的第6版讲的是Java的第8版)的生命周期比之前短了不少。固然,这要取决于具体领域,可是了解了广泛的使用状况后,你会发现使用老版本的(好比Java 6)只是极少数的人。固然仍然有一些疯狂的人仍然在使用6之前的版本,大部分的用户使用的是版本7。如今,版本8正在以很快的速度占领市场,仅仅在半年时间,有15%到20%的用户已经在使用Java 8了。因此新版《Java权威技术手册》的关注点比以往更加开放,咱们开始关注Java之外的世界,也会讨论如今和将来。微信

第二件重要的改变是长度,正如你所说,第5版长达1200页,而第六版只有它的三分之一,当我开始着手整理上一版的时候,我作的第一件事就是去掉了三分之二的内容。若是你看过第五版,你就知道除了讨论Java的主要内容以外,这本书的第二部分是关于索引的。固然这也是历史缘由形成的,当Java刚出来的时候,网络的使用还不是很广泛,因此书自带一份索引是很合理的事。可是还有另外两个缘由,Java平台变得愈来愈大,在《Java权威技术手册》的第一章我讨论了Java版本进化,指出了Java平台的增加速度之快。要描述Java 5平台的基本知识就用了800页,那仍是Java 5的时候,若是用一样的方法讨论Java 8的话,这本书就要顶到天花板上了。可见这个方法不可行了,没有人会愿意拿着这样一本书。另一个缘由(也许这两件事是相关的)就是人们利用技术信息的方式发生了改变,因特网现在无处不在,人们不肯意携带厚重的书籍,全部的索引均可以在网上的PDF、网站等资源中找到。因此这个时候还要在纸质书的后面加上厚重的索引就很不合理了。这就是《Java权威技术手册》两个版本之间的重大改变。网络

我尝试的第三件事是捕捉Java的变化趋势和规律。因此不少关于过去如何使用Java的内容都被去掉了,我加入了更多现代的使用方法,读者们须要了解垃圾回收,内存分配,并发编程,我在这些方面讲了不少。这里面涉及了大量的工做,由于原来的版本都着力于保存原有的内容。在第五版留下的三分之一内容中,大概只有25%-30%留到了第六版中,这些内容也都从新编辑整理过,而剩下的70%左右的内容则是全新的。架构

由于,咱们想在Java 8投入使用的时候就把这本书弄出来,因此Java 8尚未出来的时候咱们就动笔了,到了后来还出现了一些一开始没有想到的工做(好比Java 8上隐藏的特性)。可是此次咱们的经验更丰富了,因此咱们但愿能在2016年4月,Java 9出来的时候完成下一个版本。事实上我已经作好具体计划了。并发

问:对于《Java程序员修炼之道》The Well-Grounded Java Developer)你有下一步的计划吗?运维

《Java程序员修炼之道》这个项目很好,写做的过程也很愉快。可是在写做《Java权威技术手册》的过程当中我消耗了大量精力,我认为我可能不会再写这本书的第2版了。我和这本书的原出版商Manning谈过了,可是最新的进展我并不了解,因此颇有可能这本书不会再有第2版了。编程语言

问:一位Java大牛和一位普通Java程序员之间的区别是什么?

我认为能够把程序员的层次看做一个金字塔,其中能够大体分红3个层次。在最底层的是很勤劳的程序员,可是他们可能对编程自己兴趣不大,他们也能作好工做,可是他们下班以后就不会再想关于编程的事。这是很正常的现象,软件业须要不少程序员,而且这个需求仍然在不断增加。中间层次上的程序员,想再多作一些,他们阅读科技新闻和网站上的消息,他们会跟进下一个版本的进展,他们关心本身的技能,这个层次的程序员颇有趣。而最上层的程序员则是时刻对技艺以及技术的本质着迷。当你到达了这个金字塔的最顶层时,你就会开始有反馈环,你能够从自身学习,对技艺的了解也更深入。可是我认为最难的部分就是如何从第二层突破到最顶层。若是你对你所作工做以外的知识有一丁点兴趣,你就要寻找属于本身的那个点,这个点对于每一个人都不同,一旦发现那个让你着迷的领域,你就能够随着好奇心的驱使深刻学习下去。

关于开源软件有一个说法,一个好的开源开发者必须找到本身的痛点,他们不得不去解决这个困扰他们的问题。这是大多数人对开源软件感兴趣的缘由,也是不少人称为Java开发者的缘由。你找到了一个让你感兴趣的点,因为不明因此,你一直学习下去,这就是成长的秘密。

问:虽然Lambda加入了Java 8,可是在开发者之间始终有关于Java语法过于冗长的抱怨。你认为这是不少开发者和团队不肯意使用Java的主要缘由吗?

我不这么认为。James Gosling有三句话能够解释Java的语言设计,以及为何Java是如今这个样子。第一句就是英语中所说的“蓝领”语言,蓝领工人是从事第一线工做的人,而白领则表明了办公室以及经理们的工做。Java就是一种蓝领语言,它的设计是为了让工做中的程序员解决真正的问题。Java是实用的语言,它解决的是真实世界中的业务。

James Gosling在2014年JavaOne大会上谈到了Lambda以及Java的早期版本中没有出现的一些设计,他说:若是我没有找到完成一件事的正确方法,那我就什么都不作。这句话表达了一种缓慢而保守的演进设计思想,要想理解Java是什么,就必需要明白这点。不少人以为Java老了,编程语言须要改变,可是他们没有搞清楚的是,真正变化的是他们本身。他们在能力上有了发展,他们想看得更远更深,而语言反映出了这一点。并非语言须要改变,而是提出这个观点的程序员自身发生了变化。Java从过去到将来都是一种设计保守的语言。这也是Java的一大优点。

当James解释他设计Java的初衷时说:当我在设计的时候,我知道人们想要自动内存管理,人们想要強型式,可是这些功能会吓跑蓝领工人。好比说Smalltalk,这是一门很优秀的语言,可是它太先进了,它和现实中开发者们在构建应用时的思惟脱离开来。因此Java继承了其中的一些理念,并将其简化,把这些理念放入一种语言和格式中。这些事解释了这门语言设计的基本动机。

因此你固然能够说Java是一种冗长的语言,但我认为额外的内容是为了方便阅读。特别是当你仍是一位初级或中级程序员的时候,那些看似多余的文字可以帮助到你。人们永远都铭记咱们对于生产力的需求愈来愈高,可是代码仍然是写出来的。因此我不认为Java冗长,虽然咱们能够加入一些高级功能,可是有些事永远都没法在一个语言中改变,这很遗憾。固然咱们也会进步,可是就像我总说的一句话,人们老是过于关心语法,而不是能用语言来实现什么。

问:如今很多的大企业(Paypal等)从Java切换到Node.js,Java在企业中的地位受到威胁,Java和Node.js各自擅长的领域是什么?

这个问题中有一个误解,事实上并无出现大波公司弃用Java转向Node.js的状况。Paypal中启用Node.js的部分规模很小,Paypal的大部分运行代码仍然是Java。Node.js参与的只是一个试点项目,这是能够理解的,Node.js是一个有趣的环境,其中也有一些有趣的想法。Node.js十分年轻,同时,它也有不少严重的问题,因此如今预测Node的将来发展还为时尚早。因此虽然各类开发者网站上有不少支持Node的声音,GitHub上有不少有趣的项目(好比用它写Ardruino,玩硬件),可是在全部生产环境下的产品中,毫无疑问,Java拥有最多的代码行。企业在没有充分理由的状况下不会舍弃工做软件,虽然有不少使用Node.js的创业者,可是创业者们来得快,走得也快。

做为近些年来有趣的产品之一Twitter,若是你观察一下他们的发展你会发现他们最开始用的是Ruby on Rails。三四年前,他们的网站开始出现一个很是可爱的卡通形象,失败鲸。这是一件很尴尬的事,为了弄明白到底发生了什么,他们作了不少调查,在查看了Ruby的垃圾收集以后,他们发现本身无能为力。同时,他们的Java试点项目得到了成功,他们意识到Java能解决他们的扩展性问题。而后在接下来的18个月,他们使用了一些JRuby做为中转站,而后将整个系统改写成Java。最终的效果也很好,他们围绕Java引入了新的服务,新的架构。曾几什么时候,Ruby被视为企业级软件的将来,但现现在,Ruby只是众多编程语言中的一种。如今应用最广的三种语言是Java,JavaScript,以及C/C++,可是大部分的JavaScript代码都是在客户端,若是把这三种语言去掉,其余语言的市场份额都很是小。

问:直到如今,Java应用的虚拟托管模型须要分配给整个x86虚拟机用来托管一个单独的JVM实例,相对来讲实例上也托管了单独的Java应用。这样的方法效率很低,可是Java本地并不支持多租户虚拟以及云计算配置。幸运的是,在社区里能够找到一些为了解决云计算问题而产生的多租户Java解决方案,你认为哪一个方案足够成熟能够应用到生产环境?

这里面包含了两件事,把虚拟和云以及多租户混在一块儿并不彻底正确。好比说在QCon上海上有不少分享是关于docker的(docker是一个并不依赖于虚拟化的平台),其中一个精彩的分享来自Chris Swan。他展现了将CPU内存从虚拟环境转移到以Docker为基础的环境所带来的好处,虽然仍不够完善,可是它已经为Java带来了额外的优点,只要在Docker上运行Java你就能感觉到。咱们应该把云和虚拟的关系梳理清楚。另外,有不少其余你能够作的事,好比你能够创建多个JVM主机。

可是这个问题真正在问的是多租户。关于这个问题,有一个产品在我心中是当之无愧的冠军,那就是Waratek。Waratek能够把一个单独的非热点JVM分开,并在其中运行主机JVM,在JVM里运行的是Java虚拟多租户JVC,而JVC能够作到很轻量级。我认为Waratek是一个很成熟、能够投入使用的产品,德意志银行刚刚宣布把本身的第一个工做JVM挪到Waratek上,既然德意志银行已经承认了这个产品,那么这个产品应该也值得你花时间研究一下。

问:Java常常被拿来和Scala作比较,这两种语言的设计目的有什么不一样?在将来,这两种语言是否可能发展方向彻底一致?

Java和Scala是有着很大不一样的语言。以前咱们谈到过Java的设计哲学,如今咱们能够来讲一说Scala的设计思想,以及它们之间有什么不一样。Scala最初是一门来自学术界的语言,最开始Martin Odersky创造的语言叫作Pizza,那时候Java仍是版本4,这个时候Pizza开始逐渐加入了一些相似于Java范型的功能,Java 5中也加入了一些Pizza的功能做为范型。

Martin是一个很聪明的人,Scala也有不少很棒的设计。可是同时,这个语言也有本身的问题。有时候它被称为“厨房水槽”语言,可见人们对这门语言又爱又恨。这个比喻的意思是:水槽里面装了各类各样数量过多的东西。这确实是Scala的一个问题,它的功能太多了。有一条语言设计的准则,同时也是Java设计过程当中的一个重要原则——保守。具体说来,就是每当你添加一个新特性的时候(《Java程序员修炼之道》14页谈到了了一个具体的例子),可能你也形成了新的问题。若是你的语言有200种特性,而这个时候你想再加入一个,我须要检验它和全部其余特性的交互状况。对于Scala来讲,它老是频繁地加入新的特性。要想知道这些特性之间的交互状况是很困难的。就算Scala有一个很灵活,可以拥抱改变的社区,语言特性的变更也是件不容易的事。因此你会发现虽然Scala拥有不少优秀的工做性能,可是你须要决定哪些特性是你想要的,而哪些特性是你不能碰的。当你在团队中编程的时候,这不是个问题。真正的问题在于,现代社会的软件栈历来都不是仅仅依赖于代码,问题来自于函数库。有一些Scala特性的动做不只影响目标对象,还会影响其余一些东西。Scala的特性越多,这些问题就更容易互相重叠。

另外,他们一直都纠结于二进制兼容的问题。Java、Sun以及Oracle一直都认为这是对Java来讲最重要的设计理念,因此我能够用Java 1.0写程序,编译一下,放到Java 8的虚拟机中,仍然能够运行,并且运行速度会比之前快不少倍。而Scala从未作出这方面的承诺,哪怕就是上一个版本也会出现问题。在函数库空间中,这个问题就更严重了,我知道不少项目都放弃了Scala,就是由于每次只要升级函数库,整个系统就会崩溃。

因此说,这两种语言的设计思想很不相同。人们老是喜欢新鲜事物,第一个尝鲜的人也会第一个享受到不少好处,可是在更多的状况下,人们更愿意作第二个尝试的人。你能够观察第一我的犯下的错误,而后从中学习。而Java就是这样一个从别人的错误中学习的语言。我刚才提到过程序员的金字塔,我认为Scala并不适用于底层,它的做用更多在于为最顶层的程序员们激发思考。而Java是一种适用于整个金字塔的语言,并且它对底层和中层的程序员尤为适用。我相信在将来的不少年内都会有一个强大且健康的Scala社区,我也但愿能和他们一块儿交换思想。可是我并不认为Scala会从一种小众语言成长成一种大众语言。如今地球上可能有上百个Scala程序员,可是这个数量顶多也就是Java程序员的百分之一,而这个比例极可能不会继续增加了。


更多精彩,加入图灵访谈微信!

图片描述

相关文章
相关标签/搜索