杨晓峰:保守的设计思想也许是 Java 的最大优势
Java 是最流行的编程语言之一,它经历了几个发展阶段 ?未来的发展前景如何?Java 9 将推迟到 2017 年发布,最受关注的特性如何?
【本期嘉宾】
杨晓峰,OpenJDK Committer,Oracle 首席工程师,Java 核心类库北京团队 leader。2011年加入 Oracle Java 团队,经历了从 JDK 7 到 JDK 9 的研发过程,目前领导 Java 核心类库团队,专注于 JDK 核心类库新特性的测试和开发,希望对 Java 技术的演进和普及做出贡献。加入 Oracle 前,就职于 IBM,从事 IBM 企业数据合规产品开发。
【访谈实录】
1、您的编程之路是怎样的?对 Java 有着怎样的情怀?
最初我从事的是企业软件开发工作,做数据规约类的产品,算是比较小众吧。有一些金融类企业有数据规约的需求,这个产品就是利用 Java EE服务器、Windows 集群和关系型数据库等技术,来存储结构化和非结构化数据,以满足企业文档归档、查询、分类等各方面的需求。那时候,我只是一个 Java 使用者。后来,机缘巧合来到了 Oracle JDK组。从 “ 别人家的孩子变成自己家的孩子”,这种转变心态变化很大。听到有人说 Java 不好,我会认真听取到底是怎么回事,其实,我会很生气的,哈哈。
Java 连续多年是市场占有率第一,而在服务器端,Java 责无旁贷更是 Top 1。可以说现在大部分传统软件公司或互联网公司的服务器端都是基于 Java 语言的。对此,我会感到很骄傲。
同时,Java 是一个全栈语言,从前端到服务器端,从普通网页应用到数据分析,各个领域都可以用 Java 实现。而且在许多领域,它都可以说是做的最好的。我觉得这个可能也是 Java 非常大的一个优势。
前两年的统计数据称, Java 程序员数量大约 900 多万。这么庞大的群体充分证明了 Java 是非常优秀的语言。
2、您觉得 Java 会过时吗?用的人越来越少,慢慢弱化,进而被新的语言取代吗?
我觉得编程语言要看具体的场景。比如 Scala 这类语言的兴起,很大部分是用于大数据分析,一些 functional(函数式)语言的特性,比如闭包等语言特性,提高了开发效率,还有 Clojure 主要用于编写并发程序等。 Java 最初是完全的面向对象语言,那时算是非常领先的概念。但在实际的具体应用中,functional(函数式)语言在某些特定的场景下也体现出了优势,Java 也在吸收这些东西。
目前来看,Java 在 2016 年初好像又创了市场占有率新高。也许,有一天,它也会老去,但是目前没有看到这种趋势。
3、Java 9 将要发布,从版本迭代的角度看,您认为 Java 的发展经历了哪几个阶段?
哦,我谈谈我个人的粗浅看法吧。
第一是雏形阶段。最初 Java 虽然适应了互联网的大潮,但可能大多是实现嵌入设备或者写一些 Applet 。在 Java 1.2 的时候,Java 被划分成 Java EE(J2EE)、标准的 Java (J2SE),还有为移动设备和嵌入式设备设计的 J2ME。 Java 逐渐找到了自己的定位。
第二是蓬勃发展阶段。在 1.4 版本发布后,Java 得到了蓬勃发展。那时候不只是 Sun,BEA、IBM、HP 以及包括 google 一系列做企业软件或互联网的厂商,都在使用 Java。
Java 除了本身语言的演进,J2EE 框架、J2ME、J2SE 也不断地扩展性能,还包括第三方框架、工具的演进,使 Java 达到了全面爆发期。那时候,Java One 差不多是 IT 界最火爆的科技峰会之一。
第三是平稳发展期。Sun 公司被 Oracle 收购后, Oracle 对 Java 进行了持续不断的投入。比如 Java 8 里面有很多革命性的变化,包括 Lambda ,stream 等一系列的特性。从用户接受速度来看, Java 8 是有史以来最受欢迎的 Java 版本。
这就用事实打破了 Oracle 对 Java 不再投入的一些言论。也许国内很多互联网公司大部分可能没有切换到 Java 8,但从全球看,Java 8 的市场占有率其实很高。Java 本身实际上还是在快速演进,在一些领域可能会有相互借鉴的过程。
4、能简单分享下您最满意或最喜欢的 Java 9 新特性吗?
我觉得当然就是 Jigsaw。 Java 9 应该说核心就是 Jigsaw 项目,也就是 Java 模块化。在 Java 以前的版本,语言层面并没有真正意义上的模块化。 classpath 仅仅是个容器,然后 jar 并不能提供模块之间的 boundary(边界),这在一定程度上导致了 Jar Hell 的问题。换句话说就是依赖关系特别复杂,很多稍微有一定规模的应用都需要用 Ant, Maven 这类工具维护复杂的依赖关系。因此,不管是在开发还是运行阶段,可能都是有很多潜在问题。
由于模块化本身在语言层面对模块进行了抽象,使得很多问题在一定程度上得到缓解。模块化是 Java 深入语言层面的一个改变,也是需要巨大的勇气和投入的。因为从语言层面上进行模块化,从虚拟机、类库、编译阶段的功能各个层面都需要去做改变。而很多人都了解,Java 团队和社区在 Java 8 和之前就做了很多前期工作。经过很多年的积累,到今天也不是所有的功能都定稿了,还有一些遗留待讨论的问题。
5、您认为一位 Java 大牛和一位普通 Java 程序员之间最大的区别是什么?
因为我也不是大牛,所以我也不是很确定。
我觉得很多东西是体现了一个工程师的成长,而不仅仅是 Java 程序员。通常来说,一个初级工程师往往是还不能独立完成任务,在经过一定时间的积累后,就可以在没有别人的帮助下独立完成任务。
此后,如果还想要往更资深的方面发展,那么就需要能够有提出解决棘手问题的方案的能力。比如针对复杂问题的时候的解决方案,这个 solution 不是拍脑门决定的,而是针对问题和需求,提出有理有据,能够说服大家的一个 solution。因此,我觉得资深工程师或是资深 Java 程序员,需要有独当一面,能够有提出针对困难问题提出完整、可靠和高效的解决方案的能力。
我个人认为,程序员不写代码肯定是没办法提高的,所以要多练习,多实践。另一方面,就是要对技术问题进行讨论,往往需要一个有更多经验的前辈的指导。比如在社区,从一开始试图解决几个问题,不断坚持,有比较明显的贡献后有可能成为 Committer 。在这过程中,你的技能再加上领域知识达到一定程度,有特别明显贡献,那你可能就是大牛。
所以说要多练,多学,多听,不断地积累。也许有捷径,但有些事情是必须要做的。
6、对于大家对 Java 设计思想太过保守的评价,您怎么看?
这个评价也许符合一定的事实。有个著名的 Java 技术书籍作者 Ben Evans 曾说 “ 保守的设计思想也许是 Java 的最大优势。”
Java 已经 21 年了,可以说是现在企业软件的基础之一。它对兼容性各方面提出了极高的要求。在添加新的东西的时候,不能轻易去破坏原有的使用习惯或者是代码,否则会带来极大的反弹。另外,有些东西一旦进入标准的 JDK 里面就很难再修改了,就是我们想去重构一个正在被广泛使用的东西是十分困难的。如果是第三方类库,可能想怎么写就怎么写。有觉得设计不合理的,也许在下一个版本重构掉即可。但是,这种情况,在 Java 社区里是无法通过的。
Java 社区不是一个人,一个公司可以说了算的。Java 的任何一个修改,没有经过专家组的意见,是无法集成到 JDK 代码库里面去的。很多东西,一开始很多人觉得很有意思(fancy),但过两年大家在使用后发现并没有解决什么实际问题,此时如果已经加进 JDK 里面的话就麻烦了。JDK 需要充分认识到一个东西的价值才加进去,这对于整个语言的发展,就会减少很多的历史包裹。
7、现在能听到很多唱衰 Java 的声音,能结合Java的现状和趋势谈谈 Java 的前景吗?
有句话说:没有绯闻的明星不是真明星。如果一个语言,不断地创造市场占有率的新高,然后在很多网站,机构受欢迎语言排行榜上也是长期保持第一。如果说它在衰落是不符合实际情况的。
使用 Java 的用户量比较大。但每种语言,每个人有不同的 taste 。Java 也不可能迎合所有的人,确实也有很多需要改进的地方。Java 专家组可能优先选择最多人期待的,认为有必要的特性去做的。
Java 8 被采用的速度和市场占有率都创了新高。前几天我看到一篇文章写道,曾经在某些时候,特定的问题,用某种语言解决更方便。后来发现这些问题,最后很多变成了最适合用 Java 写。也就是说好多一开始用别的语言,比如 python 或事其他语言写蛮好,但是最后大家发现,其实还是用 Java写最好。
为什么呢?首先, Java 有最大的用户群体,有上千万的用户。然后, Java 在性能和语法特性上不断地提高,比如说原来 Java 是标准的面向对象语言,但是最近这些年的趋势,尤其是大数据,并发等领域,发现传统的函数式编程也是有很大的优势。包括开发效率和执行效率。 比如 Java 中的 lambda、Stream 以及未来的一些特性,在这方面就也能够做到非常高的优化。新学习一种语言的代价和你熟悉的一种语言新加一个特性的代价是完全不一样的。
除了 Java 本身,还有一系列运行在 JVM 上语言,这么巨大的开发群体,本身就是一个巨大的财富,如果说轻易就抛弃它显然是不现实的。在我看来,Java 的未来会更加辉煌。
8、现在的开发语言特别多,像 Java、Go、PHP、Rust、Python 等,您认为未来语言的发展趋势会是怎样?
也许所有的语言未必是一个趋势吧。总的来说,语言毕竟是一种工具,是我们用来解决问题的工具,所以效率和能力是基本方面。
语言的演进总的来说,是提高我们的生产力,要么是开发效率,要么是执行效率。很多语言体现了殊途同归的趋势。比如 PHP 的新的语法,我好像在前几个版本的 Java 中看到了那样的语法。当然, Java 里面也吸引了一些其他语言的特性。如 lambda、stream,某些语言早就有闭包。所以我觉得,语言的发展应该是不会固守当前的东西,肯定是根据生产力发展的需要,比如说确实有些领域用 functional(函数式)编程有优势,那 Java 可能会在这方面做更多的演变,除了 lambda 和 stream ,可能未来会添加更多特性。
9、最后,对于刚刚开始学习或有意向学习 Java 的新人有怎样的一些建议?
多练习,多多实践,但是不管是看 code,还是写 code,也不要仅仅埋头前进。
我是属于比较笨的,我的方法就是先想办法上手,主要是通过实践的方式上手,然后进行系统性的学习。一开始的时候不要掉在书的海洋里面,人很难长时间(半年或一年)保持只看或者只学习一个东西。因此,快速地让自己去会一些东西,在实践中提高。
另外,我觉得如果想要走得更远,还是需要基础知识扎实,技术基础知识就像大厦的地基。
链接:https://www.jianshu.com/p/9ef9abb0eb2b