作为最受欢迎的编程语言之一,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 读者交流群)。
评论