Duke选择奖获奖作品Moco创始人郑晔:十年Java路
我原本是个C程序员,阴差阳错,步入Java大门,转眼十余年。
郑烨·Duke选择奖获奖作品Moco的创始人
初涉Java
当我抱着一颗成为优秀程序员的心和一些写C程序的本领步入职场,加入了一个以做C为主业部门,准备大展手脚时,领导通知我,有一个Java项目缺人。于是,我捧起了一本Java教材,成为了一个Java程序员。
我的第一个正式Java程序是实现一个服务器,其协议是一个基于SMTP的应用协议。生猛是职场新鲜人的基本属性,我从Socket API开始一路写了上来,先是实现了粗略的SMTP协议,然后,再实现我们的应用协议。今天开来,这实在是一种浪费时间的做法,找个开源的SMTP实现,再上面直接做应用就好了。但在那个蛮荒年代,什么东西都要自己动手才能丰衣足食,开源的苗头已有星火,但大多数企业的态度是,非我族类,其心必异。不过,这种做法对于我建立个人的知识体系来说,却是大有裨益的。
后来,项目越做越多,代码越写越多,经验也越来越多,Java用起来也就越来越得心应手。但与经验一同增长的是困惑。Java开发中的一些内容我虽然在实践,却无法理解,比如EJB。这种不理解不是技术上的,而是我想不明白为什么要用它。或许今天的Java程序员已经有很多人不知道EJB为何物了,但在十几年前,那个Java企业级开发大行其道的年代,只要是Java开发服务端应用,必须谈到企业级标准,也就是当时名满天下的J2EE,而EJB又是J2EE中的当红小生。即便应用只是一个非常简单的应用,也一定需要一个价格昂贵的应用服务器,编写只有部署到上面才能运行的EJB,因为这是官方推荐的做法,只有这么做才正宗,这有这么干,才叫企业级。
有一次出差在外,临近下班,我发现了程序的一个bug。我们的程序就是一个按照官方推荐做法编写的EJB,只有部署到应用服务器才能运行。我的调试方案就是加上一些打印语句,然后部署到应用服务器上,看输出的结果,再加上另外一些语句,再部署,如此往复。那时我们用的是Sun的应用服务器,只有用它的发布工具将应用打包,然后把几百兆的程序上传到服务器上,每一次上传都要至少十几分钟。最终,我定位到了问题,只修改了一行代码,问题解决,但时间已经晚上九点多,三个多小时的时间多半都在等待部署中浪费。
我不认为我所喜欢的软件开发应该是无意义的消耗,一定是哪里出了错。周边的人给不了我答案,我只有到网上搜寻,于是,我知道了敏捷、知道了开源、知道了软件设计,也知道了世界上有一堆Java程序员对官方说法的不满。那段时间,我疯狂补习着各种各样的软件开发知识,我越发觉得“简单”开发才应该是软件开发的本来面目。
那段时间恰逢软件开发理念变革的年代,SpringFramework、Hibernate等如今还在影响Java程序员的框架刚刚发轫,企业级开发“Without EJB”理念初出茅庐。倍受J2EE开发模式折磨的程序员大量地讨论着各种方法的优劣。那时,我也开始带队做项目,于是,我便笨拙地践行着这些新理念。我用的第一个SpringFramework的版本是0.8,我开始用设计去隔离数据库访问,尝试把EJB踢出我的项目,努力在本地完成所有的开发测试,尽量少用应用服务器。如今想来,还真要感谢我当年的项目经理,那么信任我,让我放手折腾。
新理念的注入,让我在新项目中更加得心应手,对于软件开发的理解也日益加深。适逢公司内部举办了一次Java技术大赛,实力和运气相加,我一举拿下了冠军。
反思Java
作为一个写C程序出身的人,做Java总觉得满足不了我内心的一些需求。所以,我做出了一次职业调整,准备告别Java。当时以为是告别,没想到只是暂别,几年后,我又回来了。那几年,应该是我扩展视野一段时间,我做过很多不同类型的项目,用到了很多不同的技术,但是,工作上的项目真的就没再动过Java。
但要说我完全离开的Java也不恰当。那是Ruby On Rails兴起的一段时间,需要人投身到Web开发的大潮中。而我更感兴趣的是Ruby这门程序设计语言。刚好网上有个人在做一个叫XRuby的项目,要把Ruby编译成Java的字节码。出于对语言实现的热衷,我以极大的热情加入了这个项目,研究Ruby语言的实现,研究Java字节码的编写。这是我参与的第一个开源项目,因为选择了一个合适的切入点,所以,很快就有很多人开始关注到这个项目,其中就包括ThoughtWorks。
ThoughtWorks是软件业界的思想领导者,当时它正在力推Ruby这个技术栈,而当时的Ruby开发者并不多。因此,我得到了ThoughtWorks公司的橄榄枝,从此成为了一名ThoughtWorker,并将随后的八年时间贡献给了它。ThoughtWorks的确给了我更多开眼界的机会,我也开始把各种语言、各种技术融汇在一起思考,当然这其中包括Java。ThoughtWorks有许多机会做企业级软件的开发,而我也由此重回Java开发的行列。
在周游了各种技术之后,我发现,我对Java有了全新的认识,也许是一个更客观的认识。Java拥有世界上最庞大的社区,各种程序库几乎可以满足满足各种需求;当今计算机领域最有挑战的问题,无论是大数据还是高并发,Java都是走在前头的。对企业而言,Java程序员的数量是企业采用Java最直接的证据。
当进入到职业生涯的第十个年头,我很认真地思考了一个问题。十年的经验,我做过很多项目,但我究竟有什么拿得出手的东西呢?我很难回答这个问题,我突然意识到一个关键问题,我需要专注的做一件事。所以,我决定不再四处游荡,专心把精力放在Java开发上。因此,在后来的项目安排上,我拒绝了所有的非Java项目,开始集中注意力。
专注做Java的第一个成绩是,我开始了自己的又一个开源项目,Moco,一个模拟服务器的项目,解决软件开发中一直存在的一个痛点,集成。多年的积累让我选择了一种优雅的方式去解决这个问题,而也逐渐得到了更多同行的认可。Moco很快就在ThoughtWorks内部用了起来,在一些社区活动上做过介绍之后,在外部也拥有了很多用户。转过年来,Oracle将JavaOne开到了中国,Moco报名参加了Duke选择奖的评选,幸运的是,Moco成为了Duke选择奖的获奖作品。这也让我越发相信坚持的力量。
这段时间,我还在思考另外一件事情,游历了多种软件开发技术之后,我发现,虽然Java技术日新月异,但Java社区还有很多人对Java的理解停留在十几年前。于是,我着手把自己对于现代软件开发的理解和Java相结合。我先写了一个系列的文章,叫做《你应该更新的Java知识》。在ThoughtWorks内部,我组织了一个课程,把这些需要更新的现代Java开发知识一一分享了。在2014年北京的QCon上,我把这一系列的提纲做了一个分享。原本还考虑进一步将这些内容整理成书,因为自己实在懒惰,加之工作的忙碌,这一想法也就作罢了。一些没有写出内容,就只好留在脑子里了。