越来越“简单”的Java
郑晔
Java,20 岁了。从我写下第一行 Java 代码,迄今已有十余年了,眼见 Java——这个当年刚刚找到自己成长方向的懵懂少年,成长为如今当之无愧的业界王者。它已拥有世界上最庞大的开发者社区,以及无可匹敌的生态系统。这也 意味着,选用 Java 做任何应用,都有着强有力的业界支撑,而无需担心自己孤独前行。
崩坍的“标准”
我刚成为 Java 程序员时,还是一个蛮荒年代,什么东西都鼓励自己动手丰衣足食,虽然开源的苗头已有星火,但大多数企业的态度是,非我族类,其心必异。我依然记得自己的第一个正式 Java 程序是实现一个 SMTP 服务器。
我从 SocketAPI 一路写了上来,先是实现了粗略的 SMTP 协议,然后,再实现我们的应用协议。虽然这种做法对于个人从下到上理解知识体系是有好处的,但每个人都从头造轮子,对于工程开发而言,只是在浪费时间。
那也是 Java 企业级开发大行其道的年代。背靠着 Sun 这棵大树生长起来,这几乎也意味着最初的 Java 就是 Sun 销售服务器的附赠品。而有能力为这些服务器买单的几乎都是些不差钱的大企业。Sun 也瞅准了这些金主,大力地推动着“复杂”的企业级标准,著名的 J2EE。在那个年代,写 Java 程序不写 EJB,不谈几句分布式事务,你都不好意思说自己是做 Java 程序的。几乎主流的声音都在大谈企业开发的复杂度,不断拓展着想象的边界,似乎每个 Java 程序员面对的都是世界上最复杂的问题。即便应用只是一个简单的管理系统,或是仅仅做消息转发,我们需要的也一定是一个价格昂贵的应用服务器,编写只有部署 到上面才能运行的 EJB,因为这是官方推荐的做法,只有这么做才正宗,只有这么干,才叫企业级。
有一次出差在外,临近下班,我发现了程序的一个 Bug。实际上,我们的程序就是一个按照官方推荐做法编写的 EJB,只有部署到应用服务器才能运行。我的调试方案就是加上一些打印语句,然后部署到应用服务器上,看输出的结果,再加上另外一些语句,再部署,如此往 复。那时我们用的是 Sun 的应用服务器,只有用它的发布工具将应用打包,然后把几百兆的程序上传到服务器上,每一次上传都要至少十几分钟。最终,我定位到了问题,只修改了一行代 码,问题解决,但时间已经晚上九点多,三个多小时的时间多半都在等待部署中浪费。
我不认为我所喜欢的软件开发应该是无意义的消耗,一定是哪里出了错。周边的人给不了我答案,我只有到网上搜寻,于是,我知道了敏捷、知道了开 源、知道了软件设计,也知道了世界上有一堆 Java 程序员对官方说法的不满。那段时间,我疯狂补习着各种各样的软件开发知识,我越发觉得“简单”开发才应该是软件开发的本来面目。
那段时间恰逢软件开发理念变革的年代,SpringFramework、Hibernate 等如今还在影响 Java 程序员的框架刚刚发轫,企业级开发“WithoutEJB”理念初出茅庐。倍受 J2EE 开发模式折磨的程序员大量地讨论着各种方法的优劣。那时,我也开始带队做项目,于是,我便笨拙地践行着这些新理念。我用的第一个 SpringFramework 的版本是 0.8,我开始用设计去隔离数据库访问,尝试把 EJB 踢出我的项目,努力在本地完成所有的开发测试,尽量少用应用服务器。如今想来,还真要感谢我当年的项目经理,那么信任我,让我放手折腾。
幸运的是,没过多长时间,大多数 Java 程序员跟上了先行者的步伐,于是,我们看到更多的人拥抱开源理念,探索敏捷,SSH(Spring、Struts 和 Hibernate)成了业界的主流。所谓官方标准已经失去了公信力,加之像 JBoss、Tomcat 这样的开源服务器的兴起,那些靠卖应用服务器当年大赚的厂商开始凋零,拥有 WebLogic 的 BEA 早早投靠了 Oracle,IBM 的 WebSphere 已成明日黄花,最可惜的是最官方的 Sun,生了 Java,却挣不到 Java 的钱,现在也成了 Oracle 的一部分。
“简单”的前行
一段大戏尘埃落定,历史车轮却不曾停下。今天的 Java 之所以是今天的模样,因为更多的新思潮仍在不断冲击。
随着互联网的兴起,Web 开发成了业界开发的主流。原本 Java 程序员的日子是相当不错的,开发标准的逐渐建立,各种开发框架也日渐完善,各种工具也逐渐丰富。但这时候,一个 Rails 的框架横空出世,所有人都见识了如何在十五分钟内编写一个 Blog。而十五分钟都不够 Java 程序员写好 XML 配置文件。新思潮的到来,让 Java 程序员开始重新认识 Java 开发。我们确实已经从 J2EE 的笨重走了出来。但有了新的对比目标,Java 开发依然是前路漫漫。Java 程序员们继续不断努力探索,研究如何用好 Java5 带给我们的语法转变,研究怎样用 Java 实现一些动态语言的效果,研究提升 Java 程序的表达性。今天,我们有了更多的选择,甚至在很多方面已经彻底与 XML 说再见了。选择一个程序库,功能的实现只是其中一部分原因,而表达性也成了重要的参考因素。
当开发 Web 的人越来越多,有人突然站出来说,你们做得不对,这个人就是 HTTP 协议的设计者之一 RoyFielding。后来的事,我们都知道了,RESTful 架构开始兴起。与之相随的是,当年那个叫 Ajax 的技术被越来越多的人实现网页的动态效果。人们发现,Ajax 和 RESTful 服务简直是天作之合。后台提供服务,前台提供展现,一个新兴职业随之兴起,它叫前端程序员。对那些 Java 程序员来说,这也是美事一桩,我们再也不必用 Freemarker、Velocity 或是 JSP 编写那些四不像的 HTML 了,大家都可以集中精力做好自己最擅长的事情了。这种结合的另外一个妙处是,开发人员越来越多地使用 JSON 作为前后端通信协议的承载,而被抛在历史故纸堆的方式叫做 WebService,又是一个大公司推进的以 XML 做基础的东西。要知道发送 Ajax 请求的基础对象可是叫做“XMLHttpRequest”,影响之大可见一斑。
多核的兴起让程序员们纷纷探索起怎么编写并行代码,研究来研究去,大家发现许多好的编程理念都来自一个叫函数式编程的编程范式。这个曾被务实的 程序员束之高阁的东西又被人重拾起来。越研究,就越觉得函数式编程是个好东西,可惜 Java 没有提供函数式编程的原生支持。于是,人们一边喊着在 Java 语言里添加支持,一边自己动手模拟函数式编程,借鉴函数式编程理念。这两件事后来都有了结果,我们今天有了 Java8 的 Lambda,对于使用之前版本的 Java 的人来说,Guava 也可以让人部分享受函数式编程的乐趣。虽然不是完整的函数式编程支持,但对于大多数习惯使用传统 Java 的人来说,这些支持已经可以让 Java 比从前优雅一些了。
当年采访 C++ 之父 BjarneStroustrup,如何看待 Java 的简洁,他的回答是,时间不够长。大师之见果然长远。与我初涉 Java 时相比,今天的 Java 可以说已经有了天翻地覆的变化,而且,我相信,这样的变化还将继续下去,Java8 的威力尚未完全发挥,Java9 已经在路上了。令人欣慰的是,这种变化是让开发越来越简单,Java 程序员的生活越来越轻松。
作者简介:郑晔十多年工作经验的程序员,Duke 选择奖获奖作品 Moco 的创始人,前 ThoughtWorks 首席咨询师,创业大潮新鲜人,目前投身于智能硬件领域,致力于简化智能硬件的开发方式。他多次在各种媒体上发表文章,在各种技术大会上做过演讲,分享自己 对于软件开发的理解,特别愿意吸收新的知识,也愿意与人畅聊软件开发。
微博:@dreamhead 个人主页页: http://dreamhead.blogbus.com/