写点什么

克服在企业中应用敏捷方法的技术挑战

  • 2010-10-14
  • 本文字数:4324 字

    阅读完需:约 14 分钟

在企业中应用敏捷方法是一项具有挑战性的任务。实现敏捷不像安装软件那样能在一天内完成。而是需要适应企业环境,其中包括:文化、技术和组织方面。本文将探讨面临的一些挑战,这些挑战与建立开发环境、自动化测试、持续集成相关,并且同在企业环境中明确完成的定义(DoD)相关。

建立开发环境

每位技术负责人和开发经理都想缩减团队成员建立开发环境的时间。然而,为了在项目中获得较高的产出,开发人员要持续投入许多精力,让事情变得有条不紊。缺乏文档, 是建立开发环境时间过长的关键原因。第二个关键原因是建立过程中包含多少手工步骤。那么,如何克服这些挑战呢?关于文档我遵循几个信条——简单,注重细节和自动化。简单是指,让文档的创建、维护、查看以及传播保持简单。在为我的团队建立开发环境相关的内容时,我使用 wiki 来管理。wiki 页面有一名所有者,它会作为迭代的一部分被更新。注重细节是指,记录建立环境所需的内容时,要形成明确且易懂的指南。这表示,为了让开发人员开始编写代码并与团队的其余工作进行整合,要记录下开发人员所需的所有细节。下面是我在有关开发环境的 wiki 页面中所记录的:

  • 需要安装的软件包列表:在我的案例中,这部分需要 Java Developer Kit (JDK)、 Eclipse 整合开发环境 (IDE)、Apache Ant、Apache Axis 以及 SQL Server 精简版管理工具。
  • 每个安装包要包括安装文件的位置(网络驱动器 / 外部网 / 内部网 / 其他)以及安装所需的证书。例如,apache ant,在我们 subversion 版本库中的位置,是由 subversion 工作副本指定的相对路径——/Software/Apache/Ant/1.7.0。
  • 对于每个安装包,要指出在机器上需要配置的系统变量及本地变量。例如,ant 需要 ANT_HOME 变量,axis2 需要 AXIS2_HOME 环境变量指向开发机器的目录结构。
  • 需要获取的其他库列表——包括任何 java 文档(JARS)、.NET DLL 文件或是其他文件。例如,用于访问 Microsoft SQL Server 2005 的 Java 数据库连接 (JDBC) JARs,或者使用 IBM Websphere MQ 所需的 JARs。
  • 如何让用户访问消息队列服务器、数据库服务器和远程机器——联系人、以及相关步骤和表单的链接。诸如开发环境中的应用程序认证信息或用户特定的认证表单这类细节,可以在这里指定。例如,我指定了一个 email 模板,其中包括登录用户名、我们团队的应用程序标识符和联系人姓名,这一模板用于给我们的中间件支持组发送 email,以获得访问消息队列服务器的权限。
  • 源代码是如何组织的?如何获取代码库的访问权限?这一部分会提供一个代码组织结构的概要。例如,我是基于数据域(客户数据、账户数据、文档数据)以及核心可重用的公共模块(例如:logger、router、exception handler、notifications manager 等)来组织代码的。这一部分也会提供 subversion 主干的位置以及如何得到代码库写权限的指南。
  • 通过源代码控制系统建立代码的工作副本(或者本地开发副本)。基于企业桌面应用程序的政策,这一部分提供了关于工作副本位置的指南。例如,用户只拥有某个特定目录的写权限。
  • 关键文件的位置——应用程序日志文件、错误文件、服务器跟踪日志、线程(堆栈)信息。例如,Tomcat servlet 容器日志和 Websphere MQ 绑定文件的文件路径。
  • 浏览队列和添加队列的步骤。这一部分指出了在消息队列服务器中开发人员需要注意的重要队列。这部分还会提供创建新队列的命名规范,以及相关的支持信息。
  • 浏览数据库表格,创建像数据库表格、数据库视图和存储过程之类的数据库对象。在我的案例中,这一部分包含了用 SchemaSpy 生成的 SQL Server 2005 数据库文档。
  • 开发人员使用的脚本 / 工具——开发人员用于自动化日常任务的工具。例如,能编译并执行 JUnit 测试套件的 apache ant 脚本,以及能基于 java 源码生成 javadoc 的脚本。

建立开发环境最重要的方面或许就是自动化了。自动化有几个优点——在整个流程中坚持自动化,就算不能消除错误,也能显著地减少错误。下面是一些自动化所面临的挑战:

  1. 缺少机器的管理权限:由于安全原因和公司政策,系统管理员也许不会对开发人员开放开发机器的所有权限。这可能会阻碍软件安装、设置环境变量和执行脚本。
  2. 需要与外部部门进行协调:外部部门可能会提供安装软件,提供证书或是批准安装软件的请求。
  3. 需要利用托管解决方案:大型企业会有为中间件功能(消息队列,企业服务主线,应用程序适配器)提供支持的专用共享主机,与它们交互通常需要得到技术支持。

这些挑战或许并不总能被解决,但还有一些办法来处理它们。对开发人员而言,所有所需的软件——不管来自何处——把它们加入源代码控制系统。确保使用一致的命名和放置规范来组织软件包,标识出版本号和程序库依赖关系。这能确保每个开发人员不用在公司内四处询问就可得到所需的软件包。对于那些需要由其他部门去安装的软件包,可以创建脚本来生成请求,如果可能的话,甚至可以通过程序提交请求。一旦他们从源代码控制系统中得到文件的工作副本,你就会想要建立一个 “设置”脚本。在我的项目中,我有一个 apache ant 脚本,用于建立用户级环境变量、在开发数据库中创建用户编号 / 密码、从网络目录拷贝许可密钥至用户的 windows 配置中,并为团队支持的各种 web 服务生成 XML 消息样例。

自动化测试和持续集成

开发人员因各种各样的技术原因而不进行自动化测试。我常听到下面这些理由:

  • “我有我更喜欢用的工具”——这个工具可能是开发人员自己创建的,或是来自某个特定的开源或厂商的软件套件。这个工具可能会些局限,但开发人员会拒绝承认或予以解决。
  • “没有测试数据”——尤其在需要多系统 / 进程之间协调数据时。

工具问题可以通过各种方式解决。向他们说明使用如 JUnit 或 NUnit 等标准测试工具的好处,指出用脚本进行整合的好处,并具有可持续的、可重复的方式进行测试的能力。在大型企业中,不太可能所有的人都使用同一工具。更现实的做法是,同一部门的开发团队至少有一套标准的工具集。我所做的是,提供标准的自动化测试脚本——这些脚本用于对 JUnit 测试用例进行编译、执行,生成报告并通过 email 发送报告——这些脚本是每个开发人员开发环境的一部分。当开发人员从源代码控制系统中下载工作副本时,测试脚本已经就位,并且他们会继续加入自己的测试用例。我们团队有一个标准的测试目录结构,其中放置着测试用例和测试套件,脚本会从中选取并执行测试用例。另外,在代码复查期间,我会确保不但要复查代码,同时也要复查测试代码。对未包含在自动化测试中的测试用例进行重构也是复查工作的一部分。这同样适用于包含了硬编码数据的测试代码,把硬编码数据改为从配置文件或者数据库中读取。例如,一个测试方法指定用户角色为 BRANCH_SUPERVISOR,而不是从配置文件中去获得。复查时,把这一属性保存在一个由名称 - 值数据对组成的文件中,重构该测试方法,使之从属性文件获取用户角色。这样一来,这一属性也可以被其他测试使用了。

对 SOA 项目来说,服务中整合了应用程序服务器、遗留系统、数据源或应用程序包,一系列的系统测试也是必不可少的。最初,这些测试可以使用暂时代替后端整合点的 mock 对象执行。但最终你会希望在真实的整合点上运行这些测试。在这种情况下,测试数据以及与多系统相关的数据极为重要。缺少良好的测试数据,特别是需要跨系统的数据,是导致无效自动化测试的一个重要原因。对需要依靠数据复杂性和系统运行时依赖较多系统的情况,可以分阶段解决这一问题。可以从数据的本地副本开始,开发人员查询多种数据源并填充到本地存储。这听起来非常像是手工操作,但如果数据是新的并且 ETL 作业 / 批处理过程对数据存储的填充还未完成,这也许是启动测试更为简单的方式。随着时间的推移,你可以建立起一套类,封装了来自多种数据存储的测试数据,确保数据的有效性和质量,并把填充测试数据作为持续集成脚本的一部分。无论如何,如果把测试用例代码和获取测试数据的细节解耦,就更易于改变数据源策略而不影响测试代码。我的团队最初用配置文件来提供测试数据,随后把数据迁移到一组数据访问类中,并通过这些类获取所需测试数据。例如,我们用 Data Access Object 设计模式创建了一组 java 类,这些类封装了对客户数据和账户数据项的操作。这些类提供了一个简单的有增删查改方法的接口,JUnit 的测试方法可以通过它访问这些类。如果一个测试方法需要获取客户数据,它会导入 DAO 工厂和特定的 DAO 类并调用 getCustomer() 方法。在提取特定客户对象时,测试可以继续执行其余的逻辑。测试不需要了解如何查询数据并将其打包至一个对象中的,而且这些接口能被其他测试重用。

定义什么是完成

在企业中,为完成指定一个标准是非常棘手的。在开发环境中执行地非常好的代码在测试环境下也许根本无法工作。这也许是由于安全令牌 / 安全政策、网络 / 连接问题、系统不稳定或是由于质量保证(QA)团队或终端用户更严格的质量测试。为了尽量减少迁移代码时的意外,完成标准中应当包括:

  • 建立一套全面的测试套件,这些测试套件是可复用的,并最大限度的减少(如果没法消除的话)硬编码的数据值。
  • 在持续集成的过程中加入测试套件。例如,在我的团队中,这意味着在特定目录中加入 JUnit 测试套件,apache ant 脚本可以从这一目录中提取并执行那些测试。
  • 自动化测试用例不但要覆盖功能测试还要覆盖性能测试(例如,使用像 JUnitPerf 这样的工具,通过使用性能阈值实现测试场景自动化)。
  • 获得广泛的测试数据。如果测试需要整合遗留系统,让开发遗留系统的团队同你们一起创建测试并定义测试标准。开发人员未必总能了解在遗留系统上工作需要注意的细微差别。开发环境下测试良好的一些场景,并不能反映生产环境中的实际数据。
  • 代码复查不仅要在内部团队中进行,而且也要在基础团队中进行(例如,DBA、系统管理员)。

总结

本文谈到了在企业中应用敏捷方法面临的一些挑战,并提出了一些应对的策略。使用自动化脚本和检查清单以一致的方式建立开发环境,使用标准的工具和透明的测试数据有助于自动化测试和持续集成,并确保对完成有一个更严格的标准。这些方法并非无所不包,但它们会帮助团队在企业环境中获得更高的生产效率。

关于作者

我是 Vijay Narayanan,一名软件开发团队的负责人,为一家金融服务公司建立可重用的数据服务及商业过程自动化组件。我参与过的一些项目,从单用户系统到大型分布式多用户平台上的一些服务,都有涉及。我关于软件重用的博客是: http://softwarereuse.wordpress.com/

查看英文原文: Overcoming Technical Challenges for Adopting Agile Methods in the Enterprise


感谢石永超对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2010-10-14 21:192681

评论

发布
暂无评论
发现更多内容

2023年MQTT Broker技术选型时需要考虑的7个因素

EMQ映云科技

云原生 物联网 IoT mqtt 企业号 4 月 PK 榜

300+页!卷王级别Java面试宝典-阿里服务端开发与面试知识手册!

Java你猿哥

Java spring JVM 面经 SSM框架

应用部署引起上游服务抖动问题分析及优化实践方案

京东科技开发者

应用部署 jsf 企业号 4 月 PK 榜 上游服务抖动

SpringBoot 集成 atomikos 实现分布式事务

做梦都在改BUG

OpenHarmony社区运营报告(2023年3月)

OpenHarmony开发者

OpenHarmony

低成本,全流程!基于PaddleDepth和Paddle3D的三维视觉技术应用方案

飞桨PaddlePaddle

人工智能 飞桨 PaddlePaddle 三维视觉

厚礼蟹!阿里最新SpringBoot核心笔记,一夜爆火于Github。

Java你猿哥

Java Spring Boot JAVA开发 SSM框架

GitHub上疯传数万次!蚂蚁内部绝密分布式高可用算法笔记太香了

做梦都在改BUG

Java 分布式 高可用 算法

面对“失业焦虑”我们可以尝试自媒体分享| 社区征文

浅羽技术

三周年征文

高可靠多层板制造服务再获认可!华秋荣获创想三维优秀质量奖

华秋电子

EMQX Cloud BYOC版本发布:在您的云上体验全托管的MQTT消息服务

EMQ映云科技

物联网 IoT 云服务 mqtt 企业号 4 月 PK 榜

文盘Rust -- 用Tokio实现简易任务池

京东科技开发者

rust runtime tokio 企业号 4 月 PK 榜

揭开“虚拟化已死”的5大谎言与真相

科技热闻

被裁后,狂刷大牛分享的607页JUC源码分析笔记,立马拿蚂蚁offer

做梦都在改BUG

Java 高并发 JUC JCF 集合框架

太强了!阿里技术官新产"Spring高级源码阅读指南",爆火全网

Java你猿哥

Java spring SSM框架 spring ioc spring aoc

Java中的异常处理详解(try、catch、finally、throw、throws) | 社区征文

共饮一杯无

Java 异常处理 三周年连更

BSN-DDC应用合约解读汇总(2023年一季度)

BSN研习社

华秋干货分享:SMT钢网文件的DFA(可焊性)设计

华秋电子

后端开挂!一个接口实现CRUD操作,这款工具绝了!

Java你猿哥

Java 接口 后端 crud

得帆云DeMDM,业内首家基于低代码技术构建的主数据管理平台

得帆信息

低代码 数据治理 数据清洗 主数据管理 主数据管理平台

【4.7-4.14】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

人人自媒体的时代,程序员该如何利用好自己的优势?我记住了这些神器...

浅羽技术

工具 自媒体 写作技巧 三周年连更

【问题解决】解决 swagger2 默认地址失效

Java你猿哥

Java JAVA开发 swagger2 java项目

BAT必刷!GitHub顶级“2023并发编程全优笔记”晋升公司架构组!

Java你猿哥

Java 多线程 面经 SSM框架 多线程并发

如何在ABAP里用函数式编程思想打印出非波拉契Fibonacci(数列)

汪子熙

SAP abap Netweaver 思爱普 三周年连更

华为19级大佬10年心血终成百页负载均衡高并发网关设计实战文档

做梦都在改BUG

Java 负载均衡 高并发 网关设计

业内首份!医疗数据安全政策汇编发布(附下载)

极盾科技

数据安全

从零学习SDK(6)调试和测试SDK的库

MobTech袤博科技

SpringBoot 多Module Proguard混淆(Gradle)

Java你猿哥

spring Spring Boot proguard

爆肝一月!527页文档详解SpringCloud微服务和分布式系统实践

小小怪下士

Java 分布式 微服务 后端 SpringCloud

活久见,java8 lamdba Collectors.toMap()报NPE

做梦都在改BUG

克服在企业中应用敏捷方法的技术挑战_研发效能_Vijay Narayanan_InfoQ精选文章