微信号:infoqchina

介绍:有内容的技术社区媒体

【Sunday Talk】Java21年始——语言如人生,不努力奔跑,就会被赶超

2015-05-31 13:18 郭蕾

编者按:


1995年,横空出世的Java语言以其颠覆式的特性迅速获得了开发者的关注。跨平台、垃圾回收、面向对象,这在当时都是不可思议的事情,而Java却完美地在一门语言中实现了这一特性。时至2015,Java已经走过了20个年头。从已经落寞的诺基亚到现在火热的电商系统,我们都能看到Java语言的身影。从95年的第一个版本到现在的Java 1.8,我们甚至能从Java的版本迭代中看到不同时代编程语言关注的重点。


作为一种语言,Java毫无疑问将编程语言设计带领到一个新的高度。只是Java也需要思考,20年后的今天,“曾经”又或者“正处于被变成曾经危机中”的新特性,已经不再是什么新鲜词。新的开发语言如雨后春笋萌发茁壮。


针对Java与新语言的发展现状与未来趋势,InfoQ特整理对Java技术专家彭晨阳、Go语言大牛郝林专访内容。大家可以从两位专家对相关问题的回答中找寻相关性,从不同维度思考进行观点鉴别,发表自己的观点参与讨论。


彭晨阳(板桥):思想是不断变化的,大数据实时流处理系统是Java新领域


InfoQ:很多人都在唱衰Java,您能结合Java的发展现状和趋势谈谈Java的前景吗?


板桥:Java发展到今天已经20年了,作为一个编程语言确实不简单,想当初人人受怀疑的慢语言到今天通用的健壮语言,真是大智若愚啊。Java代表的面向对象思想确实给工程领域带来了革命性的变化,当然思想是不断进化发展的,如今人们开始看好函数式编程语(FP)。尽管Java 8也加入了函数语言的特点,但是OOP和FP两者到底是不同的编程范式,不过掌握FP有一定门槛,这也是造成很多人观望的一个原因。


Java在数据流处理方面还是很有竞争力的,而大数据实时流处理系统是Java的新领域,在这个领域有Apache Kafka、Apache Samza、Apache Storm、Apache Spark的Streaming模块和最新的Apache Flink。Spark是基于JVM的函数语言Scala编写,其余都是Java编写。


InfoQ:JVM的普及促使相关周边语言不断涌现,你怎么看这些JVM语言?

板桥:以Scala为代表的JVM语言发展迅速,Scala语言特性是首先区分不变性和可变性,当初使用EJB时首先要区分是无状态和有状态,这说明思路是一脉相承的。可变性的状态是造成副作用和各种Bug的罪魁祸首,可能我们如果只是把可变状态使用数据库实现时没有注意到这种问题。其实这个问题遍布在应用的每个角落,特别是使用类和对象这个OOP概念实现时最容易发生。一个类或对象包括字段和方法,如果这个字段值是可变的(可变状态),我们使用这个对象时如果不打开它的类代码是无法得知它有可变状态的,那么就会导致各种副作用发生。


而函数编程由于函数方法是第一公民,没有什么东西挡在它的前面,没有类或对象包裹着它们,因此,它们无法私藏可变状态字段,能够确保应用系统每行代码都是基于不可变的基础之上。


如果说Scala之类JVM的函数语言适合不断添加功能函数的应用场景,那么Java之类的OOP语言适合不断增加实体物体的应用场景。前者好动,后者好静。


InfoQ:Java是如何拥抱云时代的?

板桥:Java在云时代面临以Go语言为主的容器(Docker等技术)生态圈的挑战。其实JVM也是一种容器,但是这种容器特性正在被Linux学习与赶超,那么,JVM的定位就可能比较尴尬。Docker之类容器可以在本地笔记本或电脑上运行,然后同样可以部署到云上运行。当在云上运行时,Kubernetes能够以一种可控的方式升级容器从而实现运行管理一批容器,如同一个大型船队或舰队一样,你可以控制它们的流量访问量,可以指定多少个容器来扩展支撑一个服务的运行,随着访问量提升,你通过增加容器数量能够整个系统的负载能力。


当然,Java的大型分布式系统越来越多,Java在云计算与分布式系统中还是扮演主要角色,形成一个大型的生态圈。当我们站在泰山之上,一览众山小,当你在全球拥有多个数据中心时,语言已经变得不那么重要了,关键是架构设计。


InfoQ:Go语言这两年比较火热,你怎么看这门语言?与Java相比,他有哪些优劣?

板桥:Go语言相对Java主要优点是其并发组件模型,Java的并发比较低级,无非是多线程与锁,想搞清楚Java中各种锁的用途,包括数据集合Collection的线程安全性与性能差异对比,需要花费大量时间与精力,包括使用经验。而Go语言使用了Channel/CEP这样的组件简单封装了多线程与锁,将以前JMS的Queue队列模型架构引入到了语言之中,两个对象之间交互只要通过Channel通道就可以。这种模型保证了并发性,有简化了编程模型,无疑受到很多人的欢迎。Go语言当前也受到更加强劲的Rust语言挑战,如果说,Go语言的Channel是一种有形的设计,那么,Rust语言的并发模型达到无形的设计,只要你编写好函数方法,安全性与并发性就无形中得到了解决,不用专门去思考并发,有意识地去使用并发组件模型编程。


InfoQ:现在的开发语言特别多,Java、Go、PHP、Rust、Python等,你认为未来语言的发展趋势是怎么样的?

板桥:现在的开发语言如雨后春笋,主要原因是CPU进入多核并发时代,以及大型架构进入分布式系统,如何使用一种语言从微观的CPU多核之间并发到数万台服务器之间的分布式计算处理,这种大一统的愿景促使人们在不断探索。


在Java中,我们可以通过框架来实现这点,以我前几年研发Jdon框架为例,虽然能够勉强实现并发与分布式,但是这种实现需要很强的知识背景,不利于初学者上手。而要达到普及这个目标,必须从语言入手,让语言初学者在学习掌握语言以后,无形中就会实现了并发与分布式。


Go语言在这方面比较突出,其并发模型以读写操作为基础。请注意,Java等语言并发模型没有这么高,它们是以线程为基础,再应用到读写场景中,而我们现实中必须以读写为基础,再应用到具体业务场景中,这里面高低层次:线程–>读写操作–>业务应用,无疑越靠近业务应用的语言越能简化我们的开发,而分布式系统也是基于读写操作,著名的CAP定理也隐含了以读写操作为基础的语境。



郝林:Java9又会是一个里程碑式的版本;Go属于一种语言,却是一种革新



InfoQ:今年的5月23日是Java的第20岁生日,转眼间,Java已经走过了20年,版本号也已经更新到Java 8。你怎么看Java这门语言?在这20年里,有哪些对你印象比较深刻的Java事件?


郝林:我觉得Java语言一路走来赚足了眼球也惹来了众多非议。就拿它随着Sun公司的没落被流转到Oracle公司来说吧。我记得当时有一大批Java程序员在网上扬言要摒弃Java语言,并且一部分人真的这么做了。但事实证明,Oracle更好地发展了Java。我认为从Java 7开始这门语言相当于迎来了第二春,在发展上增速了不少,各种新鲜特性和类库层出不穷。Java 8给我印象最深刻的就是对Lambda表达式的支持。这使得Java真正地对函数式编程提供了支持。这是质的改变。也终将使Java语言走得更远。


InfoQ:从版本迭代的角度看,你认为Java的发展经历了哪几个阶段?


郝林:我是从Java 1.3的末期开始接触它的。所以在我看来Java 1.3之前就属于萌芽期吧(虽然那时它已被广泛使用了)。从1.4开始,Java语言有了很多改观,比如NIO、更多的垃圾回收器、性能上的提升、Java EE规范的逐步简化,等等。所以我认为从此Java进入了第一个高速发展期(也许有上一个但我没赶上)。到了Java 6的时候,发展速度其实已经减缓不少了。这也可能是由于Java正处于被交接阶段的缘故。不过,我不得不说,Oracle的调整动作很快,在几乎没有什么断档的情况下,Java的发展又开始“跑”起来了。这也是我在前一个回答中说的“第二春”。


InfoQ:JVM的普及促使相关周边语言不断涌现,你怎么看这些JVM语言?


郝林:这就是Java真正牛的地方。它不单单是一门语言,更是一个平台。到目前为止,JVM语言已经有很多了,但是发展最好的是Scala。它解决了一些Java在程序开发方面的问题。但是,我认为它的方向有所偏颇。我觉得“简化”往往比“丰富”来得更直接,效果也会更好。相比之下,Clojure语言就做得很好。但是由于它是一个Lisp语言的方言,编码方式和思维方式与Java的面向对象思想相去甚远,所以仅仅被一小部分Java程序员接受。总之,JVM语言让Java更加流行了。它们虽不完美,但却功不可没。


InfoQ:很多人都在唱衰Java,您能结合Java的发展现状和趋势谈谈Java的前景吗?

郝林:任何一个流行的技术都会有人唱衰,更何况Java已经发展了20年了,中间又经历了种种坎坷。我觉得Java 9又会是一个里程碑式的版本。我很期待。我认为在我可预见的未来Java不会没落。实际上,Java语言在企业级软件领域的霸主地位是不可动摇的。在互联网软件领域,它虽然受到了各种开发成本更低的语言(比如Ruby和Python)的不断侵蚀,但是仍然占有一席之地。这正说明了Java生命力的顽强。不过,相比于Java语言,我更看好Java作为一个平台的前景。


InfoQ:你什么时候开始接触Go语言的?相比于Java语言,它有哪些优势?


郝林:我接触Go语言实际上并不算早,大约在2013年的上半年。那时候Go语言的版本是1.0,1.1版本正处于开发期。Go语言给我的第一印象就是支持多种编程范式、提供了给力的程序构建和发布工具,以及在并发编程方面的极度简化。在当时,我认为Java语言的不足恰恰就包括了这几个方面。所以我义无返顾的开始学习并使用Go语言。事实证明,Go语言虽属于新兴语言,但它却是一种革新。另外,与Java语言一样,Go语言的向后兼容做的很好。并且,为了以防万一,它提供了一个命令用于自动地把旧版本的Go语言程序源码调整为当前版本的源码。诸如此类的“便捷大法”还有很多。许多在Java世界中只能依靠额外的类库或工具才能完成的事情,在Go语言看来却是手到擒来。当然,这种实实在在的优势也有诞生时间不同的缘故。正是由于Java已经历经了太多,所以在很多方面都很难改变。我觉得这是所有编程语言都应该正视的问题。显然,Go语言的创造者们已经意识到了这一点。


InfoQ:出色的并发性能是Go语言区别于其他语言的一大特色。相比于Java的并发编程,它有哪些显著性的优势?


郝林:说到并发,Go语言给人们的第一印象就是便捷。在这便捷之下,Go语言权衡了各方面利弊,做了大量的工作,使得我们用极低的开发成本就可以编写出拥有超高运行性能的Go语言并发程序。其中最大的亮点就是,Go语言把“激活”需要并发执行的代码块的操作内置了。我们仅通过一个关键字“go”就可以轻易地完成这项操作。还记得我们在Java中为此需要编写的代码是多么的冗长吗?侵入式的接口实现声明和类继承声明、复杂的匿名内部类,以及困难重重的线程间协调和调度。这些都是不可忽视的程序开发维护成本。我们在编写和修改这样的并发程序时都要保持头脑和思路的绝对清晰,否则就会埋下祸根,搞出不易察觉和定位的Bug。另一方面,如果透过表象看本质的话,我们就可以看到Go语言为了程序员的方便而做的大量的工作


笼统地讲,Go语言把对内核线程的使用和调度操作都内置到其运行时系统中了。但是,它远远要比一个线程池复杂得多。Java线程与内核线程之间关系是1:1的。而Go语言的Goroutine(可以看做是Go语言中执行并发代码块的实体)与内核线程之间的关系是M:N的。这让我们可以使用成千上万个Goroutine去执行并发代码块而仅仅耗费极少的内核线程。关于Go并发编程更详细的介绍,大家可以参看我著的“图灵原创”图书《Go并发编程实战》。


InfoQ:Java和Go语言的使用场景是不是不一样?

郝林:Java语言与Go语言在使用场景方面其实有很多相似之处。例如,它们都适用于服务端程序的构建,并且可以很容易地编写出页面模板文件。又例如,它们在桌面软件方面都比较捉襟见肘。有意思的是,就本身而言,Go语言在适用领域的优势更强,而在不适用领域的劣势也更加明显。优势方面我就不再赘述了,下面说说劣势。比如,用Java编写桌面程序起码还有Swing和JavaFX可选,但是Go语言官方至今还没有一个成熟的解决方案。当然,这仍旧与诞生时间有关。另外,我们还可以用Java语言编写Android应用程序。Go语言目前虽然已经涉足,但还不完美。不过我在这里爆料一下,我很期待能用Go语言编写iOS应用程序。实际上,Go语言在这方面已经有所进展了。总之,两种语言在适用领域方面有所重叠但又有些不同。在很多情况下,我们可以混用这两种语言。


InfoQ:现在的开发语言特别多,Java、Go、PHP、Rust、Python等,你认为未来语言的发展趋势是怎么样的?


郝林:的确,现在的编程语言层出不穷、多如牛毛。但是编程语言的兴衰是有规律可循的。第一个规律是顺应时代的语言才能有更好的发展。正如Objective-C因iPhone和iPad的诞生而变得火热至极那样。而Java也因Google公司的“横插一足”而在移动程序开发领域占领了制高点。当今的计算机世界正处于“云”的时代,而从处理器的角度看也正处于多核时代。谁能够更好地把握住这些时代标签,谁就会在发展上更具优势。当然,这里说的“把握住”是需要有真功夫的。只喊不练不起任何作用,而且还会遭人唾弃。第二个规律是能够解决问题的语言就是好语言。对于任何场景都是如此。我相信每个技术团队都会在选择编程语言时进行一番权衡。哪种编程语言能更快更好地解决问题(这也涉及到开发和维护成本),它就肯定会胜出。从这方面看,编程语言并没有好坏之分。它们都必有独特的优势和擅长做的事情,否则就根本不会诞生出来了。而问题的解决能力几乎是发展趋势的唯一评判标准。“多快好省”就是选择编程语言的要诀。这也会从侧面预示一个编程语言的发展趋势。说了这么多,我另一个想要表达的意思是:对于它们的未来,我无法预知:)。



回复关键词查看对应内容:

React | 架构师 | 运维 | 云 | 开源 | Kubernetes | 架构 | 人工智能 | Kafka | Docker | Netty | CoreOS | QCon | Github | Swift | 敏捷 | 语言 | 程序员 | 实践 | 物联网 |



如果想要评论本篇文章,想看下其他读者都有什么话想说,欢迎点击“阅读原文”参与讨论。


版权及转载声明:


极客邦科技专注为技术人提供优质内容传播。尊重作者、译者、及InfoQ网站编辑的劳动,所有内容仅供学习交流传播,不支持盗用。未经许可,禁止转载。若转载,需予以告知,并注明出处。

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 七夕节到了,单身的程序猿在等什么 setTimeout 的黑魔法 CVP首推最有价值专家"琅琊榜”,Cocos新力量蓄势发力 【原译】webpack 2和babel 6的tree-shaking 豆瓣混合开发实践