主题:Java的最大优势是保守的设计思想
一位Java大牛和一位普通Java程序员之间的区别是什么?
我认为可以把程序员的层次看作一个金字塔,其中可以大致分成3个层次。在最底层的是很勤劳的程序员,但是他们可能对编程本身兴趣不大,他们也能做好工作,但是他们下班之后就不会再想关于编程的事。这是很正常的现象,软件业需要很多程序员,并且这个需求仍然在不断增长。中间层次上的程序员,想再多做一些,他们阅读科技新闻和网站上的消息,他们会跟进下一个版本的进展,他们关心自己的技能,这个层次的程序员很有趣。而最上层的程序员则是时刻对技艺以及技术的本质着迷。当你到达了这个金字塔的最顶层时,你就会开始有反馈环,你可以从自身学习,对技艺的了解也更深刻。但是我认为最难的部分就是如何从第二层突破到最顶层。如果你对你所做工作之外的知识有一丁点兴趣,你就要寻找属于自己的那个点,这个点对于每个人都不一样,一旦发现那个让你着迷的领域,你就可以随着好奇心的驱使深入学习下去。
关于开源软件有一个说法,一个好的开源开发者必须找到自己的痛点,他们不得不去解决这个困扰他们的问题。这是大多数人对开源软件感兴趣的原因,也是很多人称为Java开发者的原因。你找到了一个让你感兴趣的点,由于不明所以,你一直学习下去,这就是成长的秘密。
开发者之间始终有关于Java语法过于冗长的抱怨。你认为这是很多开发者和团队不愿意使用Java的主要原因吗?
我不这么认为。James Gosling有三句话可以解释Java的语言设计,以及为什么Java是现在这个样子。第一句就是英语中所说的“蓝领”语言,蓝领工人是从事第一线工作的人,而白领则代表了办公室以及经理们的工作。Java就是一种蓝领语言,它的设计是为了让工作中的程序员解决真正的问题。Java是实用的语言,它解决的是真实世界中的业务。
James Gosling在2014年JavaOne大会上谈到了Lambda以及Java的早期版本中没有出现的一些设计,他说:如果我没有找到完成一件事的正确方法,那我就什么都不做。这句话表达了一种缓慢而保守的演进设计思想,要想理解Java是什么,就必须要明白这点。很多人觉得Java老了,编程语言需要改变,但是他们没有搞清楚的是,真正变化的是他们自己。他们在能力上有了发展,他们想看得更远更深,而语言反映出了这一点。并不是语言需要改变,而是提出这个观点的程序员自身发生了变化。Java从过去到未来都是一种设计保守的语言。这也是Java的一大优势。
当James解释他设计Java的初衷时说:当我在设计的时候,我知道人们想要自动内存管理,人们想要強型式,但是这些功能会吓跑蓝领工人。比如说Smalltalk,这是一门很优秀的语言,但是它太先进了,它和现实中开发者们在构建应用时的思维脱离开来。所以Java继承了其中的一些理念,并将其简化,把这些理念放入一种语言和格式中。这些事解释了这门语言设计的基本动机。
所以你当然可以说Java是一种冗长的语言,但我认为额外的内容是为了方便阅读。特别是当你还是一位初级或中级程序员的时候,那些看似多余的文字能够帮助到你。人们永远都铭记我们对于生产力的需求越来越高,但是代码仍然是写出来的。所以我不认为Java冗长,虽然我们可以加入一些高级功能,但是有些事永远都无法在一个语言中改变,这很遗憾。当然我们也会进步,但是就像我总说的一句话,人们总是过于关心语法,而不是能用语言来实现什么。
作为近些年来有趣的产品之一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程序员的百分之一,而这个比例很可能不会继续增长了。
免费领取兄弟连php原创视频教程光盘,详情咨询官网客服:http://www.lampbrother.net