转载

Java 20年:历史与未来

作为最受欢迎的编程语言之一,Java已经走过了20个年头。从已经落寞的诺基亚到现在火热的电商系统,我们都能看到Java语言的身影。从1995年的第一个版本到现在的Java 1.8,我们甚至能从Java的版本迭代中看到不同时代编程语言关注的重点。经过了过去20年的发展,Java已经成为如今使用最为广泛的企业级语言。为了庆祝Java的第20个生日,InfoQ为此采访了Java技术专家彭晨阳(网络ID:板桥)。

InfoQ:您是哪一年开始接触Java的?还记得当时『世界』是怎么看这门语言的吗?

板桥:我大概是2000年之前开始接触Java,当时大家都认为Java慢,几乎没有几个人看得上眼,那时使用Perl/C实现CGI比较快,PHP很方便。

InfoQ:能回忆下你的职业生涯中与Java相关的经历吗?

板桥:2000年之前使用Perl开发过一个类似西祠、西陆社区网站,随着功能日益复杂,维护拓展比较麻烦,打算使用Java改造升级。但是Java比较复杂,当时有EJB等规范,因此误用过EJB来做产品,其实EJB更适合做企业中可靠性要求比较高的项目。而对于社区项目来说,性能是关键,这个道理后来我从CAP定理中才得到答案,当然当时也没有听说过CAP理论,这段教训是相当深刻的,EJB很难掌握,运行起来更慢,最后也以失败告终。

之后研究学习了Jive开源Java论坛,对其设计模式与缓存两个优点进行了综合学习与应用。有一段时间参与过手机游戏的开发,那时客户端是J2ME,但是游戏逻辑不加载在客户端,而是将客户端只作为界面展现,类似今天的浏览器+Angular.js这样富客户端。当然,这个系统对网络要求比较高,但是当时无线网络3G还没有推出,后来放弃了,从该项目中我意识到高性能的大型并发系统使用Tomcat这样的普通Web服务器已经无法承担,于是对异步消息JMS等技术产生了兴趣。

之后,陆陆续续参与过一些项目的咨询和设计,大部分都比较普通,无非是CRUD增删改查。于是萌生了做一个快速开发框架,在不丢失多层架构的基础上能有Delphi等二层架构的开发效率,这大概是JDON框架的原型。当然,该框架后来从快速开发为首要目标转移到灵活性为首要目标。

做了不少项目后,需要寻求理论指导,原来的数据库+Java路数已经不能包打天下,后来逐步开始引入DDD领域驱动设计CQRS和EventSourcing。

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定理也隐含了以读写操作为基础的语境。

受访嘉宾介绍

彭晨阳,Jdon.com创办者和版主。软件开发设计咨询从业20年,10余年Java开发经验,拥有ERP、大型游戏、互动电视三网合一等架构经验。独立咨询顾问,个人擅长复杂系统的软件架构和领域建模。流行新技术思想的传道者,主持解道网站跟踪国际最新软件架构思想和设计技术。首个国内Java开源框架项目Jdon框架的设计者。

感谢臧秀涛对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群 Java 20年:历史与未来 )。

正文到此结束
Loading...