本系列短文将以 java 为基础的多人协作的 web 软件项目来展开讨论。其它类型的项目可以根据需要进行增减。
软件项目的根本
一个软件项目成功的根本在于定义好不同层面的接口,并且由专业人员对不同层面的接口予以实现(参考Do IT 方法)。因而,本系列短文主要会围绕接口的定义以及如何高效地完成接口等问题上。
软件项目的环境
一个软件项目可以分为以下几个环境:
- 开发环境 提供给开发人员进行开发的环境,开发从员可以快速测试所开发的内容。开发环境可变动性非常大。
- 测试环境 提供给测试人员进行测试的环境,测试人员可以在该环境中对所开发出来的项目进行测试,测试环境相对比较稳定。
- 生产环境 提供给用户使用的环境,用户可以在该环境中使用项目的成品。
三个环境的物理关系
在物理上,三个环境一般是相互独立的。开发环境在开发人员的机器上,测试环境会部署在内部一个服务器上,生产环境会部署在对外的服务器上。
开发环境中,会有多台开发的机器。适用于多人开发,每个人开发独立的模块,这样的并发开发模式可以提升整体开发效率。
开发完成后的代码将部署在测试环境,测试环境除了使用的对象不同以外,其余的配置与生产环境几乎完全相同。保持这种相同性,就是为了减少在项目由测试环境中转变为生产环境的时候会因为某些不同的配置而导致生产环境中的应用与测试环境中的应用完全不同的风险。
测试环境中的服务器数量需要尽量与生产环境保持一致,服务器是高性能的计算机,不同于开发环境中的个人电脑,服务器可能会根据需要进行一些优化。开发环境中的个人电脑没有此要求。
生产环境与测试环境类似,生产环境中的计算机会对外公开,由实际的使用者使用。
利用好三个环境
基于三个环境的特点,需要考虑如何利用好三个环境。这涉及到以下问题:
- 如何提升单台机器上的开发效率
- 如何提升各机器上开发代码的集成效率(各机器开发的代码需要集成在测试环境中)
- 如何提升测试效率
- 如何提升从测试环境到生产环境中的部署效率
以下内容将初略介绍这些问题的解决方案。这里再一次说明:本系列短文是针对 java 的多人协作 web 项目而讨论的。
使用 maven
maven 建立了单机开发规范,并且也是持续集成的利器,还是二进制代码的管理工具。使用 maven 可以带来以下的便利:
- 统一开发人员目录格式。让项目的开发目录保存一致,可以减少开发人员学习、了解新项目的代价
- 明确 jar 包依赖关系。明确任何一个项目所使用的 jar 包版本,这样可以减少 jar 包冲突的风险
- 项目与编辑器无关。可以使用任何编辑器来开发项目。
- 强大的插件对开发辅助。maven 中有很多插件,可以用于辅助开发,如 jetty
- 对开发完成的 jar 包进行版本管理。
使用 svn
svn 是文本代码管理工具,使用 svn 可以有如下好处:
- 集中保存所有代码。单台电脑上代码出现问题,可以从 svn 上下载代码。
- 对代码进行版本管理。代码出现问题,可以回退到正确的版本。
职责分离
职责分离是指,在开发的时候,尽可能通过接口来分离不同的模块。比如,一个项目,可以将页面代码与提供数据的代码分离;也可以将提供基础功能(如,字符串操作)的代码与业务逻辑代码(如,保存一个定单)分离。职责分离带来的好处:
- 降低整个系统的风险,可以对出现问题的模块进行局部修改或者替换。
- 提升解决问题的速度。出现问题之后,可以快速定位问题所在的模块。
- 加强可维护性。职责分离之后,软件的逻辑会更加清晰,便于后期维护。
- 便于管理。可以在更细的层面对软件进行管理,而不是等到软件整体做完之后才知道软件做成什么样子。
- 便于复用。单独完成的模块,可以被重复利用。
以上可以解决单机开发的效率问题。
测试驱动
测试驱动是敏捷开发所推崇的开发模式。测试驱动也是一种微型Do IT 方法。其主要过程是:写测试代码(设计接口);写实现代码(实现);用测试代码测试(测试)。测试驱动可以带来以下好处:
- 代码质量得以保证。因为所有的代码都经过测试。
- 代码更加符合使用。因为首先写测试代码的时候,考虑的是怎么使用会好一些。
- 可以增量开发。可以重复 写测试代码,再实现,再测试,再写测试代码 这样的循环,对代码进行增量开发。增量开发可以一步步地走向目标,当遇到 Bug 时,也可以很快知道 Bug 就是由当前所写的一小部分代码而产生的。
快速响应测试
快速响应测试指,在测试环境中,测试人员可以快速了解项目的状态,哪些功能是可以测试的,哪些功能在接下来可以进行测试。在测试出问题的时候,可以快速将问题提交给开发人员,开发人员可以快速让测试知道问题将在什么时候解决。这样做的好处:
- 增量开发:测试出的 Bug 可以很快定位。
- 开发完成即测试完成。开发完成之后,测试很快就可以完成。