自动化开发
上面提到的技术可能过时,但是思想值得借鉴。
持续集成
除掉构建脚本中的气味
对于脚本这一块,研发确实比较慵懒,比如我。没有更加规范,甚至没有这个意识。
这一点可以进行拓展:只要和项目相关的东西,无论内外,都应该做到尽可能的规范简洁。
-
惟 IDE 的构建
-
复制-粘贴式的编写脚本方法
-
冗长的目标
-
庞大的构建文件
-
没有清理干净
-
硬编码的值
-
测试失败还能构建成功
-
魔力机
-
格式的缺失
持续测试
Junit
Junit + mockito + powerMock
基础测试
DBUnit
数据库相关测试
Selenium
功能性测试
JUnitPerf
性能测试
断言架构可靠性
通过分析代码的度量报告,比如由 JDepend 工具生成的报告, 您可以有效地判定代码是否实现了确定的架构。
CI 反模式
知道不要做什么,也可以学到很多知识。
签入不够频繁
反模式:由于所需的修改太多,源代码长时间签出存储库。
解决方案:频繁地提交比较小的代码块。
破碎的构建
反模式:构建长时间破碎,导致开发人员无法签出可运行的代码。
解决方案:在构建破碎时立即通知开发人员,并以最高优先级尽快修复破碎的构建。
反馈太少
反模式:团队没有把构建状态通知发送给团队成员;因此,开发人员不知道构建已失败。
解决方案:使用各种反馈机制传播构建状态信息。
垃圾反馈
反模式:团队成员很快被构建状态消息淹没(成功、失败或界于这两者之间的各种消息), 所以开始忽视这些消息。
解决方案:反馈要目标明确,使人们不会收到无关的信息。
缓慢的机器
反模式:用一台资源有限的工作站执行构建,导致构建时间太长。
解决方案:增加构建机器的磁盘速度、处理器和 RAM 资源,从而提高构建速度。
膨胀的构建
反模式:把太多的任务添加到提交构建过程中,比如运行各种自动检查工具或运行负载测试,从而导致反馈被延迟。
解决方案:一个构建 管道(pipeline)可以运行不同类型的构建。
使用自动化加速部署
外部化属性
对于不同的目标环境,配置值(例如文件位置、主机名、数据库名和端口号)可能各不相同,因此不能进行硬编码(例如在源代码中)。
这些属性在 *.properties
文件中得到了完善的管理。
通过外部化属性,可以使用同一个构建脚本在一个环境中编译,然后在另一个环境中部署,而不需要修改或重新编译源代码。
可以使用 auto-config 工具等。
自动化 DBA
Data Definition Language(DDL)语句(如删除现有数据库、创建数据库和创建数据库用户) 以及 Data Manipulation(DML)语句(如 insert语句)可以轻松地脚本化并作为构建脚本的一部分运行。
而且,还可以远程执行这些语句。
发行和部署
远程部署和本地部署在实现方面并非完全不同,它仅需要一个不同的通道, 从而将资源安全地从一个位置复制到另一个位置(从构建机器复制到目标环境)。
在大多数企业中,安全性至关重要,因此仅仅使用 FTP 和 telnet 并不能满足需求。 在这种情况下,SCP 和 SSH 可以轻松完成任务。
自动负载测试
使用 JMeter 创建自动化测试、将测试作为自动构建的一部分运行, 以及将测试设置为每天自动运行(通常当机器的使用率低时)。将测试作为预定构建的一部分运行可以让您:
-
在任何时候执行负载测试
-
在开发过程的初期检测并解决负载和性能问题
-
监视构建服务器的最新的负载测试和性能测试报告
-
减少依靠单个人配置和运行测试时可能出现的瓶颈和错误
文档化
文档的痛处
有两个关键性的问题制约着软件开发的文档化。
-
似乎没有人会去阅读文档。
-
几乎是在编写文档的同时,它就已经过时了。
常见的工具
-
使用 UMLGraph 生成当前源代码的 UML图。
-
使用 SchemaSpy 创建 实体关系图(ERD),归档数据库中的表格和关系。
-
使用 Grand 生成构建目标以及它们之间的关系的 Ant 构建图。
-
使用 Doxygen 生成 源代码文档。
-
使用 DocBook 制作 用户文档。
持续重构
Martin Fowler 编写了 《Refactoring》
-
使用 CheckStyle 度量 圈复杂度(cyclomatic complexity), 并提供诸如 Replace Conditional with Polymorphism之类的重构,以此来减少 条件复杂度代码味道
-
使用 CheckStyle 评估 代码重复率,并提供诸如 Pull Up Method之类的重构,以此来移除 重复代码
-
使用 PMD(或 JavaNCSS)计算 源代码行,并提供诸如 Extract Method 之类的重构,以此来淡化 大类代码味道
-
使用 CheckStyle(或 JDepend)确定一个类的 传出耦合度(efferent coupling),并提供诸如 Move Method 之类的重构,以此来除掉 过多的导入代码味道
实现自动化数据库迁移
手工变更数据库
常见的由 DBA 进行操作:(一些公司直连研发都没有)
自动化
使用工具 LiquiBase 进行数据库的自动更新。
使用基于向导的安装程序
提供一种简单的方式来安装您的软件,这对于吸引和留住用户至关重要。
PS:对于互联网或者是传统项目,war 包之类的不需要到用户本地部署的不在此范围内。
war、jar 可以通过 CI 结合 shell(bat) 脚本搞定。
IzPack
我们看过 Antigen、AntInstaller、Denova、install4j、InstallAnywhere、IzPack、NSIS 等工具。
但是根据项目的特定需求,我们最后决定使用 IzPack: