分享

你应该更新的Java知识

 seo菜鸟shcimfv 2016-04-27

2000年后,在迷茫中摸索的Java终于找到了属于自己的爆发点——企业级开发。许多方式方法,也在那时逐渐成型。我们不妨回顾那是的Java开发是怎样的面貌。

1.Java1.4已经发布,不过大多数人还用着Java1.3

2.Ant是主流构架工具,Maven还是新东西。

3.J2EE是主流,几乎所有的“现代”Java应用必须用到EJB 2

4.Gavin King发布了Hibernate,将ORM正式引入到Java世界,但许多程序员还在直接使用JDBC

5.Rod Johnson写作了《Expert One-no-One J2EE Design and Development》,其中介绍了一个框架,后来称为spring Framework。再后来,Rod Johnson用一本《J2EE Development without EJB》,向人们展示了J2EE有多么的笨拙。

6.作为一个Web开发框架,Struts正逐渐替代Servlet称为主流。

7.如果你是Java程序员,就不难发现,如今广为人知的许多技术,例如Maven Spring FrameworkHibernateStruts,当时就已成为开发者常用工具。

     遗憾的是,这些十多年前就已定型的工具和开发方式,时至今日依然是许多Java程序员的首选。我们不是说,软件技术更新得快吗?

 

十年间
    不管你是否愿意,软件行业确实一直在飞速发展,许多变化直接地或间接地影响着我们今天的工作方式。

【开源成为主流】

当年,Eric Raymond写下《大教堂与集市》,努力为开源运动争取正统地位。而今,开源早已成为广为接受的正统同理念,连当年许貌似迂腐不堪的的大众司都对开源张开了怀抱。今天的开源已成为新技术、新发展方向的代名词,“老大哥”主导软件开发方向的年代已然一去不复返了。关于Java当年Rod Johnson发起了Without EJB大战,大公司的权威轰然倒塌,以spring FrameworkHibernate等为代表的开源软件正式成为Java世界的主角。

【敏捷/精益开发成为日用品】

不管你是否认同,敏捷/精益开发直接影响了整个行业,对程序员最直接的影响是“测试”,它不再是可有可无了。优秀的程序员可以深刻理解测试能有效驱动设计。优秀的团队开始使用BDDSBE等技术,从业务层面对系统进行测试。随之而来的是持续集成变为每个团队的标配,更有追求的团队已奔着持续交付前进。而这一切理念的背后的支撑几乎都来自Java世界,无论是JUnitJez Humble在使用Java写就的就是软件中总结出来的。

Ruby on Rails带来开发思路的转变】

在一篇关于Java的文章中出现Ruby显得有些突兀,但Rails问世之初,真是震撼了整个软件行业。其中诸多理念产生了深刻影响,例如约定优于配置、DSL、轻量级部署、自动化等,且不说有多少模仿Rails的框架诞生,单看后来出现的Java框架在表达性上所下的功夫,就能够略知一二。

【多核带动函数式编程兴起】
   
多核处理器问世,另并列/并发编程收到了更多关注。经过一段时间的研究,人们发现许多技术的来源自函数式编程,从新认识到他的价值,原本只在函数编程语言中实现的技巧,已经日益体现在Java程序之中。

【互联网让资源丰富】

2000年之后,互联网泡沫虽然破灭,但不妨碍互联网技术的飞速发展,它逐渐成为人们日常生活中重要的一部分。我们能第一时间与世界最新技术接轨,与高手过招。借助开源技术兴起的互联网公司又用云、大数据等基础设施回馈产业,进一步降低了互联网的准入门槛。Java的部署方式从此巨变,唾手可得的运资源让部署不再是一件难事,名噪一时的应用服务器似乎也到了蜕变的边缘。

【程序设计语言不断发展】

The Pragmatic Programer》曾建议程序员每年学习一门新语言。最近十年是程序设计语言蓬勃发展的十年,仅在我们熟悉的JVM上,就有多种新型语言诞生,如GroovyScalaJavaScript这样的流行语言移植到了JVM,它以逐渐成为平台。即便是Java语言自身,从58,也有了天翻地覆的变化,只不过,现在许多人学到的Java还是最原始的版本,语言自身的表达能了都未能完全发挥。

 

十年后

即便是把钝刀,从新磨砺,依然可以披荆斩棘。如果把十年间的运用回Java,他可以熠熠生辉。

【整洁代码与DSL

傻瓜都能写出技术机可以理解的代码,优秀的程序员要编写人能理解的代码。

这是Martin Fowler 1999年在《重构》中写下的第一句话,遗憾的是,还有许多团队每天努力加班写面条一样的长的代码。Kent Beck告诉我们什么代码是好代码——Clean Code with Test。至于什么是Clean CodeRobert Martin写了整整一本书——《Clean Code》。但对于眼中只有功能代码的程序员,无法理解可读性的重要性,自然也就无法理解新近这些貌似等价的更新,只能继续在焦油坑中挣扎。

我将DSL视为整洁代码的自然扩展,代码不仅要可读,更要最求良好的表达性。对于Java程序员,有两层含义:一是选择程序库的重要表准,功能相近者,有良好DSL者胜;二是我应该深入了解语言的特性,有能力打造只记得DSL,让程序更整洁。

对于整洁的代码不断最求,恰是后文几项值得我们深入探索的根基。

【Java“新”语言】

Java 5按说都已经过时了,不少的程序员却还是不能充分利用语言的特性简化代码,例如以下方面:

1.泛型不仅适用在容器上,还可以把很多Object踢开;

2.Annotation,许多人只是拿来用,却从未考虑构建自己的annotation简化代码;

3.Static import可以让我们写出漂亮易读的代码;

4.利用参变,API可以很灵活。

如今Java 8已经问世,有了lambda、default method,代码可以进一步简化,只不过,要走的路还很长。

【函数式编程】

之所以应该学习新语言,更多的是为了学习新思想,而不仅是语法。对于许多Java程序员来说,函数式编程时新思想,虽然它已经存在几十年了。函数式编程的好处有下面一些。

1.函数组合可以降低代码解耦。

2.列表转换思维方式可以消除大多数for。

3.不变性让软件更稳定。

4.惰性求职可以减少资源耗费。

 

函数式编程有多重要,看看Java8加入Lambda便可略知一二。纵然只运用老版本,我们依然可以借助如Guava这样的程序库相关功能。当然,如何从分发挥函数式的威力,尤其是在Java世界里,还有待进一步发掘。

【新风格程序库】

所谓新风格,不是新功能,而是那些符合现代程序设计风格的程序库。在我看来,除了基本功能,一个很重要的标准是,拥有设计良好的API,按前面的标准,大多拥有良好的DSL。

下面列举了几个符合这种风格标准的程序库,几种是开箱即用,也是读者从本文获得的最直接的收获。

1.首先是Guava,只要你做Java项目,就应该用Guava。它在某种程度上弥补了JDK的不足。举个简单的例子,将文件写入字符串,如果用JDK实现,光想着异常处理都会让人头疼不已。Guava是一个现代程序库,有着更易用的API,还有集合类、缓存等新功能。Guava做得怎么样?看看Java 8的文档就能知道,一些API几乎原封不动地从Guava上借鉴而来。

2.如果把JDK的抄袭作为一种赞扬,除了Guava,另一个值得赞扬的程序库就是Joda Time。正如每个Java程序员都知道的,JDK原有的日期数据库设计非常糟糕,Joda Time正是为了避开这个问题。因为他设计得好,所以才有了JSR 310——现已成为Java8的一部分。不过,从发展来看,距离Java8广泛使用还有很长的路要走。大多数人还会继续与Java6作斗争。

3.Hamcrest和Mockito,是两个测试库。Hamcrest让我们更好地写断言,而Mockito则能更好地写Mock对象,它们脱颖而出完全是因其良好的API设计。

4.DropWizard可理解成一个开发REST服务的框架,但其实它什么都没做,只是将自己已有框架集成。它同前面几个程序库有很大的不同,更多地代表了一种开放式——轻量级部署风格,抛开沉重的应用服务器。它未必是未来的赢家,但值得了解。

其实,还有一些不错的程序库值得推荐,比如,实现ActorAkka,实现相应是编程的RxJava,这些库往往代表了特定的程序设计风格。

【测试、测试、测试】

必须强调一点,测试是每个开发者必须做的事。自动化测试并费仅靠一个框架就能完成,想让测试成为开发的帮手,还需要从多个方面耐心打磨。开发团队容易忽略的方面是,构建开发者与其他角色连接的测试,这类测试有许多名字:验收测试、BDDSpecification by Example,重点在于,这是开发人员的工作,要让其他角色易于理解。如果你认为Java测试就是JUnit,只能说明一点,你落伍太多了。且不说前文已经提到的HamcrestMockito能让测试质量得到大幅度提升,但说JUnit只是一个单元测试框架,用它做其他类型测试简直如同用汇编开发Web应用。对于业务层面的测试,Cucumber是很不错的选择,不过,其缺省版本使用Ruby实现的。对于执着的Java程序员,Cucumber其实也有Java版本。如果你非要尝试更纯粹的JavaConcordion是另外一个选择,用他写完的测试,完全可以成为一个漂亮的网站。

【自动化】

自动化对每个项目来说都是必不可少,不仅包括编译和运行测试,还包括开发过程的几乎每个方面。一个简单的例子是,开发者应该自动化生成IDE工程,而不需要手动配置了。具体到Java领域,首先是工具的变化,请告别AntMaven,开始使用GradleBuildr。使用完整程序设计语言支撑的构建工具,才能真正做到将开发的方方面面自动化,因为团队的特殊需求,只能靠自己编码实现。

【轻量级部署】

这是一种摆脱“老大哥”的趋势。在许多Java程序员的概念中,部署一定要有专门的应用服务器,这边是当年的“老大哥”圈套。所谓轻量级,站在开发角度来看,部署不一定要专门的服务器,现在一种趋势是采用嵌入服务器,完全可以做成独立应用。对于程序员来说,意味着我们有机会在IDE调试服务,而不再杀鸡用牛刀地每每动用“远程调试”大招。轻量级部署可以自然延展到Devops,本着“基础设施作为代码”的理念,将部署完全自动化。再进一步,如果云结合,意味着随时随地可以创建应用服务。有了这样的轻量级部署,再加上为服务的理念,就可按需拓展服务,更好地实现自动化运维。

Java.NEXT

Java.NEXT,通常意味着我们可使用不同程序设计语言,让Java开发进入另一个层面。JVM上各种语言蓬勃发展,彻底打破了Java最初“一种语言,多个平台”的理念。但习惯的力量是强大的,对于习惯了Java开发的企业来说,即便同在JVM平台,完全使用新语言也几乎无法实现。但我们可以采取逐步渗透的方式,在不同的场景下,选择不同语言,先行尝试。例如选择Gradle的团队实际上已经在用Groovy做构建脚本,也可以使用Scala做单元测试。

【遗留系统】
   
改进如此之多,可能会让一些有追求的Java开发团队见异思迁。但实际往往是残酷的,让既有系统一步到位地全面履行几乎是不可能完成的任务。改进必须有计划、有步骤。更现实的做法是,建立团队的技术雷达,描绘改进愿景,然后逐步引入新技术,减少对就技术的投入,一点点完成技术的升级换代。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多