Java 是最流行的编程语言之一,它经历了几个发展阶段 ?未来的发展前景如何?Java 9 将推迟到 2017 年发布,最受关注的特性如何?Java 核心类库组专家杨晓峰,带来他与 Java 不得不说的那些事。 【访谈实录】 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 需要充分认识到一个东西的价值才加进去,这对于整个语言的发展,就会减少很多的历史包裹。 |