@huanmu
2017-06-22T07:44:02.000000Z
字数 4627
阅读 305
作者 | 丁雪丰
记者 | 木环
Java诞生二十余载,而各有千秋的新语言则层出不穷;平安壹钱包的丁雪丰15年前接触Java,而他依然最喜爱Java。那么为什么他对Java如此笃定呢?而在为数不少的框架中,为什么他又选中Spring框架?Spring技术有哪些适用和不适用的场景?为了一探究竟,InfoQ对丁雪丰先生进行了采访。
此外,丁雪丰先生还将作为演讲嘉宾出席中国首届Spring Summit技术峰会,并进行《有了Spring Boot,内部框架还缺什么?》的主题分享。此次峰会由Pivotal和极客邦科技联合主办,会议分设 Spring生态10余个技术主题,邀请了十余位中美专家,将从从企业上云、传统行业在数字经济时代机遇与挑战等宏观战略层面,以及微服务、DevOps、Reactive、CloudNative Java等微观技术层面,来诠释如何完成企业数字化转型这道考题。Spring Summit 2017官网已经上线,各位读者可以移步了解详情。
InfoQ: 您从事Java开发数年,您怎么评价这门语言?为什么Java会成为世界上使用者最多的语言?
丁雪丰:我是在2002年机缘巧合下开始正式学习并使用Java的,在那之前我都在使用微软系的东西。当时做的Java应用很多还是Applet,在页面上呈现出酷炫的效果,用Servlet和JSP做后端服务的还不多。开个玩笑,当时Java号称“write once, run anywhere”,我天真地相信了,后来才理解到这真的只是一个美好的愿望。不过这并不妨碍Java的成功,我本人也是一名坚定的Java用户(虽然我经常会去学习各种新语言,但主要工作语言一直是Java),如果翻看这几年的TIOBE排行榜,你就会发现它长期位居榜首,这就是大家对Java的认可。
一门语言好不好是仁者见仁智者见智的事。不过如果一门语言缺乏活力,那要么就是小众无人问津,要么就是开发者也放弃维护了。Java有着庞大的社区和使用者,虽然出于商业等原因,步伐显得不如一些新兴语言这么快,但一直在稳步向前发展,同时还在不断借鉴其他人的经验,所以有理由相信,Java在未来的一段时间里仍然会处在一个很好的位置上。
很多人觉得静态语言不够灵活,但我觉得这是Java能被众多软件厂商接受的重要原因之一,它能够适用于庞大的研发团队。试想一下,如果我只能在运行时才知道一个接口返回的是什么,那上下游之间得要下多少成本来保证传递正确的内容?而静态语言绝大部分内容都是明确的,就算有问题,多数也能在编译时发现。
另外,我觉得面向对象思想的传播,也是Java被广泛接受的原因之一,在那个时候说起OO,大家第一想起的就是C++和Java。根据OO理论设计的系统能够几乎“无缝"地用Java实现出来,再配合一些工具,代码生成更是大大提升了开发的效率。在大规模工业化的开发过程中,这是非常重要的。
最后,我想强调一点:通常大家说起Java都是指语言,但我们不能把Java狭义地理解为Java语言,个人认为Java这个平台才是关键,才是真正获得成功的东西。 Java平台的开放和包容,让它不仅可以运行Java语言开发的代码,还可以运行Ruby、Python、JavaScript、Scala、Groovy等很多语言写的代码,因此其他语言的开发者可以很轻松地切换至Java平台。
InfoQ:现在新的语言层出不穷,其中不乏一些深受欢迎的语言。那么,Java现在有哪些新的挑战?您对Java 9 有怎样的期待?
丁雪丰:关于这个问题,我以前在InfoQ上发表过一篇文章《作为一名Java程序员,我为什么不在生产项目中转向Go》,以Go语言为例,我认为这是一门非常出色的语言,在一些场景下有着比Java更好的表现,但正如我上面说的,Java不仅是一门语言,更是一个平台,它有着完善的生态环境,很多特性虽然语言本身不具备或者不尽如人意,但生态环境中总有更好的解决方案。
而且,真的在实际的生产中,语言本身往往只是考量的众多因素之一,我能用某种语言很快地完成一个功能的开发,但能不能让10个人、50个人都又快又好地以一样的标准完成开发工作呢?有一套好的设施、工具甚至可执行的标准会容易很多,所以我认为生态环境要比单独的语言本身更为重要。
说到Java 9,很多人都会期待模块化,但其实我更希望Java 9出来的时候,Java 8可以再普及一些。总是会有人觉得新东西不太靠谱,要用低一个版本的东西,觉得用的人多了,经过时间检验了。君不见,如今还有很多运行在Java 6甚至是Java 1.4上的系统,什么时候能让大部分人感受到Java 8的魅力呢?
InfoQ:能否回溯下Spring的进化史?
丁雪丰:说起Spring就不得不提Rod Johnson,Spring诞生于他的那本《Expert One-on-One J2EE Design and Development 》,而他的另一本《Expert One-on-One J2EE Development without EJB》真正让Spring红透半边天。
Spring最早诞生在2004年,个人认为在2.0版本以后,也就是上面提到的那本书出版后国内的开发者才大范围地接受Spring,当时国内的满江红社区还组织翻译了大量的开源框架的官方文档,包括了Spring、Hibernate、Seam等等,这也在很大程度上推动了这些框架在国内的落地。
(注:Spring框架是开源的Java/Java EE 全功能站的应用程序框架,以Apache许可证形式发布,由Pivotal开发并维护。)
再往后,Spring的版本不断迭代,其核心的部分并没有太多的变化并开始趋于稳定;不过逐步开始发展Spring的子项目,诞生了类似于Spring Data、Spring Batch、Spring Integration等诸多周边的子项目,将很多功能都从Spring Framework中移到了子项目中。
现在到Spring的官方网站上,各种项目不下20个,所有的这些子项目中,近期最热门的当属Spring Boot和Spring Cloud。这一对搭档极大程度上降低了使用Spring快速开发生产级系统的成本,而且能够方便地使用各种成熟的技术与设施,使得开发此类系统的门槛大幅降低。
InfoQ:能否向大家介绍下您所理解的Spring技术?Spring框架有怎样的特点?它最适合怎样的项目情景?
丁雪丰: Spring已经不再仅代表一种框架,它与Java一样,都已经有了一个完整的生态环境(比如上文中提到的众多子项目)。
先聊聊狭义的Spring,即Spring框架。从最开始接触Spring 1.x起,它特有的模块化设计就让人感到学习和使用起来没有负担,因为我只需要去掌握需要的那些模块就行了,比如Spring Core、数据访问、MVC等等,至于Remoting那些功能,大概有个印象就行,知道它有哪些功能,在需要的时候去翻看相应的文档就好了。
在后来的演进过程中,Spring框架变得越来越大,显得有些臃肿,但开发者们还是只要关心自己要用的那些东西就好,了解下新的特性和用法,而且它在很多情况下还是能够完美兼容的,所以升级时的负担也不会很重。
至于其他的特点,网上有很多资料,我就不再在此赘述了。
而广义的Spring则是Spring的生态,Spring将很多功能拆散到众多子项目中,每个子项目专注于某个特定的功能,比如Spring Security就专门处理安全相关的问题。并且,多数子项目都发展得很不错,市面上至少都能找到基本单独介绍一个子项目的书。
正如我前面提到的,在所有这些子项目中,Spring Boot和Spring Cloud是近期最为热门的项目,早期Spring还有一个Spring Roo的项目,用来生成项目工程和各种代码,但后来Spring团队发现代码生成并不是一个特别理想的做法。在Spring 4.x引入了大量注解,提升自动化配置能力,Spring Boot正是在此类能力的基础之上,大大降低了需要编写的配置和代码量,它替开发者做了绝大部分选择,让开发者能更专注于业务本身。
个人认为,但凡Web、后端服务这类的项目都可以放心大胆地使用Spring Boot,哪怕是一整套项目都使用Spring Boot也不会有太多问题。比如国外的Netflix,国内的淘宝、支付宝,都是几乎全部由Java使用,广泛使用Spring技术,不少也在使用Spring Boot,甚至是向Spring Boot和Spring Cloud贡献代码。
但Spring也不是万能的,比如涉及硬件的一些场景就没什么发挥余地了,在开发板或者嵌入式设备上,还是选择更合适的东西吧。
InfoQ:您怎样看待框架?它是很好的工具,但是一定程度上是不是也有不足和束缚?项目多大之后就建议一定使用框架?
丁雪丰:在我看来,框架要做的事就是把大量最佳实践固化下来,降低开发者的使用成本,让大家能聚焦于做什么,而不是怎么做。比如Mina和Netty就把怎么写出好的网络通信代码的经验固化了下来,Google Guava就把Google里大量Java的最佳实践变成了人人可用的东西。
其实使用框架也确实有束缚,一旦你使用了一种框架,那你的系统在很大程度上来说有被绑定在上面了,切换的成本是非常高的。举个例子,在存储层使用了Hibernate来做ORM,之后想完整切换到myBatis,几乎就是重写整个DAO的底层。
不过,情况也并非总是这么糟糕,也有容易的,比如一开始使用Log4J 1.x作为日志框架,后续想切换到LogBack,不用把所有日志的包都重新import一遍,使用log4j-over-slf4j就好了。
至于项目多大之后使用框架,个人认为,在条件允许的情况下,只要能够帮助降低开发的复杂度,提升效率,无论什么规模的系统都可以使用合适的框架。
InfoQ:能否和大家分享下您的Spring学习历程?新手是否建议直接学习框架?框架需要理解掌握到什么程度?学习框架需要源代码?
丁雪丰:我自己最早就是翻译Spring的官方文档和书籍,从Spring 1.x到2.0,再到2.5。翻译的过程让我对整个Spring框架有了比较多的了解,很多功能虽然一时用不上,但翻译和审校时总是会看个几遍,于是也能了解个大概。再到后来各种子项目则是在新出来时做个了解,实际工作中需要用到时再详细阅读文档。
另一方面,多做一些分享和交流,准备分享材料的过程也是对自己知识的梳理和总结,会有很多意想不到的收获。比如,之前准备一个Spring Cloud和微服务相关的分享,大部分网站和文章都会拿Eureka做例子,我特意去用了下平时不怎么接触的Spring Cloud Consul服务发现。
至于后面两个问题,我觉得是水到渠成的事情,不用刻意去纠结。
对于新接触Java的同学,学习基本语法自然是第一步,随后需要找些小项目来练手了,这时自然就会接触到一些框架,所以新手接触并学习框架是件很自然的事情,不用去想该早点或者晚点。
平时把框架用好就行了,遇到问题会有思路去排查和解决。二八法则可以说是普遍适用的,对一个框架了解20%就能满足大部分的日常需求。可这并不能算是用好,因为你总是会碰到些这样那样的问题,出现问题时自然就会去翻看对应部分的代码,所以学习框架的源代码也是迟早会发生的事情。