Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2014-01-19) 项目技术栈

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

总结一下当前项目使用的各技术。

基本工具

Java 这是一个Java项目,我们用的是1.6版本

Idea 经过我们的推广,项目组全部使用IDEA community version。它对Java和git的支持相当好,对web开发要弱一些,不过我们项目里web占的比重很小。在结对以及团队培训的过程中,我们熟练的快捷键操作让新成员对IDEA有相当的期待。IDEA中各种流畅贴心的功能,实在是太方便了

git 在多人团队里,git强大灵活的功能,让我们对代码提交、合并和管理有相当大的控制能力。不过对于新成员来说,git的难度还是比较大。另外在客户提供的电脑上,windows xp+cygwin,让git操作非常慢,随便一个操作都以分钟计。这对于当前情况来说是一个没法解决的问题

Jenkins 为了持续集成。Dev和Tester各有一条pipeline,从编译到单元测试到部署到端对端的测试,一条龙服务。虽然红多绿少,但这是从开始到现在所有人都强烈支持的东西。主要由刘峰同学负责维护,用得很熟练

gradle 构建工具。开始用的是maven,后来觉得太繁琐,在志恒同学的大力支持下,终于换成了gradle。虽然感觉速度上没快多少,但是用起来的体验要好很多,比如干净的输出,干净的语法。虽然自己还没写过代码,但是看到它详细丰富的文档,我觉得心里上没太多压力。

Cygwin 由于程序将部署在linux机上,所以本地也搞了一个cygwin仿真一下。由于客户机上各种安全限制,在cygwin上vi/git用起来经常各种出错,另外访问文件系统特别慢。只能忍。

程序库和框架

Spring, Hibernate, Spring MVC 企业开发的老三样。不过同样的东西,用得好跟用得不好完全是两回事。我们来之前的代码就不说了,后来在志恒同学的主导下,有一个模块里展示了它们比较好的用法之后,我总算觉得代码好看多了。现在的用法应该是主流的用法:注解+xml配置,声明性事务,注解标示controller。唯一的问题就是感觉现在的配置文件太多太乱,经常理不清头绪,还有spring在启动时报错实在不好调。我总觉得我们在项目里解耦解得有点多了,追求让每个模块都尽量保持独立,但最后又需要做不少额外的工作再把它们串到一起

Jetty 项目主要是个后台程序,但需要通过web提供一些功能,所以内嵌了Jetty,由java代码启动Jetty,在web.xml里再初始化spring等。这样那些用来启动Jetty的类就无法被spring托管,有时候让人感觉别扭。我觉得还不如直接把项目做成一个web程序,更加方便一些。既可以直接以命令行的方式指定用jetty来启动它,也可以放到某个web容器里,更加灵活一些。不过现在前期已经做了太多,所以只能这样了

commons系列和guava 这差不多属于必备的了。我用commons比较多,志恒用guava比较多。

JMS 程序与外部交换数据时,使用了一些商业产品的Jms server。内部也使用了一些开源的jms server,将某些操作分割为多个不同模块。我个人赞同作为数据源外部使用,但对于内部,似乎增加了不必要的“解耦”成本。有时候用多线程或并发库就能搞定的事情,用了jms queue以后,总觉得像是把一个整体硬生生的切成了几块,然后在它们之间插上了细管来保持交流。同一个模块里的东西,不是应该强调“高内聚”吗?

HttpClient 项目需要通过Http与外部某些服务进行交互,使用了坑爹的HttpClient。这家伙从3.x到4.x,代码几乎全部重写;从4.0到4.3,又几乎重写两遍。在网上找的例子和代码,基本上都是过时的,一贴过来就报各种各样的Deprecated。我认为HttpClient是典型的过度设计,代码写得复杂无比,什么模式都往里面套。其实多数人用它也就是连个网页,下载或上传点什么数据。应该是一把水果刀,怎么就做成了铁锹。最为郁闷的是它对连接池的管理和各种超时设置,这种最容易出错、不清不楚的东西,很难找到文档详细描述它,我只能靠看源代码和写各种测试、连蒙带猜,到最后心里还是不太有底。最坑爹的是,它居然没有默认提供一个合理的超时时间,曾经我们本该几分钟跑完的程序,卡了十几个小时,就是因为它跟服务器端的http连接,怎么就卡着不动十几个小时。以后做项目一定避开它。http://stackoverflow.com/questions/5415111/alternatives-to-apache-httpcomponents,里面提到了Jetty的HttpClient,有机会试一下

Junit和Mockito 单元测试必备,不多说。需要提一下的是,之前客户使用重型武器PowerMock来写测试,后来总算被我们干掉了

Args4j 很不错的库。当我们需要给一个Java程序传大量参数时,用它可以优雅的解决参数传递的问题

Dom4j 需要解析XML,并使用Xpath从里面提供一些数据。我不喜欢XML,它本不应该这么笨重,多数时候我们只是简单的用到部分功能。我同样不喜欢Xpath,因为我没有找到以某个节点为根去定位元素的方法。(这里http://stackoverflow.com/questions/2618136/running-xpath-on-child-node提到了一种方式,以后试试。)不过对于企业内部不同系统之间交换数据,XML可能是最普遍的选择了。

snakeyaml 测试里用它读取一些文件,根据测试数据生成一些实例,比较方便

moco 没错,还用到了moco,不过只是在测HttpClient的那些超时参数时,用它来模拟一个会延时发送数据的http server。总体来说还是比较方便,不过可能我的用法比较偏,还是有一些问题。也许有时间时会再试试,提个Issue什么的

jquery 有一些网页需要javascript。志恒同学开始想用Angularjs,被我们否决,毕竟到客户手里之后,基本上没人能维护了。最后还是用了最稳妥的jqurey和最普通的javascript写法。

Bash和Python 用来写Shell脚本。简单的直接Linux的bash,繁杂的用python。这块主要由刘峰同学复杂,是他的强项。

comments powered by Disqus