郑晔
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/
本文选自程序员电子版2015年5月B刊,该期更多文章请查看这里。2000年创刊至今所有文章目录请查看程序员封面秀。欢迎 订阅程序员电子版 (含iPad版、Android版、PDF版) 。