这是一个以键盘鼠标为谋生工具已十多年的人初次进行专门的Java开发的体验和感受,对于Java程序员,这些也许早就习以为常,那就把这当成从一个来自不同世界的新人眼里看看他们自己的工作;对于我的Domino同行,这些体验或许将来有更多共鸣的可能。
在加入到这个Java产品开发团队之前,我的Java开发经验如下:十几年前跟着一本Java入门书做练习写的几个Applet,Domino项目开发中写的几个读写数据库和外部邮件的代理,XPages开发中的少量Java Beans和一个流程库。除此之外就只剩下对用Java做web开发涉及到的繁多的名词Struts、Hibernate、Spring……耳熟而已。
我的工作是给一个大型Java产品增添功能,面对的环境如下:
Linux操作系统,意味着Shell命令和脚本、SSH连接和PuTTy客户端。
JBoss应用服务器
MySQL数据库
Eclipse+Maven+GitHub的开发环境
采用Apache CXF的Web Service开发,随之而来的就是WSDL、SOAP、XML Schema、JAXB……
我的感觉就像从一间熟悉的暗屋走出,霎时被强烈的阳光照得睁不开眼。撇开我专栏文章一直在讨论的Domino在技术架构和开发上的独特性,这样的个人感受恰恰反映了一个封闭的适用于专门领域的开发平台与一种通用的(Versatile)开放的编程语言和环境之间的巨大和根本的差异。
Domino环境下的快速开发是建立在现成的封闭不透明的基础架构之上的,在传统的客户端应用程序开发里,用户管理、权限管理、登录过程、应用程序界面、与邮件的集成以及视图等等都是系统自带的功能。这一方面极大地省去了开发者的时间和精力,保证了应用程序的基本框架上的可靠性,另一方面这些“黑盒”一样的功能基本没有代码接口,无法定制、调整和优化。在设计应用程序的这些部分时,程序员与其说是在开发,更像是一个软件用户。
Java等通用语言的开发则完全不同。一切都是建立在可查询的代码基础上的。没有现成的功能,同时也没有天然的限制。各种框架和工具类库应需而生。
如果说Domino程序员时常遇上的问题是没有足够的资料和文档,Java同行则只可能抱怨“信息”太多,规格说明(Specification)、标准、API文档、汗牛充栋的教材和随处可寻的参考资料、当然数量最多的是不断衍生和更新的技术、框架、类库和工具的资料。我曾经和朋友说过,一个入行五年的Domino程序员和只有一两年经验的新手在知识和能力上有较大差别,但是再干上五年,改变就不大了。这样的论断对Java程序员大概不适用,即使有十年经验的程序员,仍然会面临不断涌现的新知识和技术。记得我刚开始学习LotusScript类的文档时,觉得它们的功能范围和数量都有限,偶尔要用到Java和.Net时对包罗万象的类库很有兴趣。现在由于记忆力和求知欲的下降,在做Java开发时每每需要查询API文档和技术资料,就像读一篇文章不断遇上生字要查字典一样,有些不堪其苦了。对比今昔,如同一个嫌游泳池里没有风浪过于平静的人突然被扔进太平洋,刚从一个浪里钻出,又被一个巨浪拍下。
转到这个新环境下开发,给我印象最深的还是三点:
一是开源环境下Java积累的代码如此之多。使用Maven,轻松地往项目里添加几个依赖的jar,Maven自动计算和下载的依赖项之多可能会让你大吃一惊。互联网上大量的Repository构建了一个代码重用和共享的海洋,在这里你才会意识到全球Java程序员工作在一个无差别的环境里,无数大脑日积月累的集体成果。每个人的贡献就像水滴一样汇入大海。Java自带的庞大类库在可以依赖使用的资源面前也显得小巫见大巫。可使用的代码之丰富和便利,也使得一个项目或产品迅速被公共代码胀大。我目前开发的产品的war文件总体积已达到五百多兆。
二是体验到Java的惊人内存需求。一个应用服务器动辄消耗上G的内存,各种开发工具也张开血盆大口,以百兆为单位吞噬着内存。反观运行本机码的Domino服务器和传统的客户端,空闲时每个进程只占用区区几兆内存,整个Domino服务器加起来也不过几十兆。Java的跨平台特性和开发高效从这个角度便可以用“以空间换时间”来概括了。可以这种海量相提并论的就是日志的数量,几分钟的部署若干个war的时间里,屏幕疯狂地刷动。一天下来,鼠标没点几次,应用产生的日志就已数十兆。
第三点与Java语言的特性相关。因为不像在Domino那样的环境里有许多现成且却无法改动的功能,所有feature都要依靠代码实现,并且Java的语法本身有些冗赘(即是需要大量的所谓Scaffold),导致代码的数量随项目的成长迅速增多。Domino中的项目受制于平台限制,得益于现成功能,规模都不大。典型的各种文档管理、流程应用数据库,都可以一人开发和维护,即使是复杂的一整套OA和企业的业务系统,代码的总量也不很大,一个人完全可以掌握所有的细节。与此相对地,一个复杂的Java产品代码上十万行,每个开发人员都只可能熟悉其中部分,对产品的整体则仅有结构上的理解。