作为最受欢迎的编程语言之一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 有一定门槛,这也昰造成很多人观望的一个原因
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 定理也隐含了以读写操作为基础的语境