敏捷开发中的持续集成应该如何做?(2)

发表于:2013-03-04来源:IBM作者:Martin R. Bakal Jen点击数: 标签:敏捷
架构在最多 50 名团队成员的较小型项目中很有帮助,但是,如果超出了这个规模,就必须做一些前期工作,以了解组件化、重用和可变性。此前期分析使

  架构在最多 50 名团队成员的较小型项目中很有帮助,但是,如果超出了这个规模,就必须做一些前期工作,以了解组件化、重用和可变性。此前期分析使您可以拆分团队,但仍发布协调的产品。在让硬件和软件开发人员一起工作也是这样,就像对包括嵌入式软件的复杂系统一样。

  仿真

  通过在仿真模型中捕获架构,团队可以看到系统如何响应不同的输入。这种形式的早期测试可以验证系统是否如预期般执行,从而满足要求。这也使得设计人员能够可视化设计的任何意想不到的后果。在检查代码文本时,很难看出这些意想不到的后果。当查看系统模型时,它们会变得明显得多,在查看工作中的系统模型时,它们甚至变得更加明显。

  在这种方式中,建模和仿真让测试和集成可以在设计工作开始时就立刻开始执行,从而消除了在嵌入式硬件尚未可用时可能遇到的延迟。它可以节省对那些不可行的早期架构原型所进行没有必要的大量投资。即使您的确有可用的硬件,持续集成也要求不断地构建。

  越早需要看到结果,构建环境就会变得越昂贵。由于 CI 的主要目的是尽可能快地提供结果,仿真使您能够在无需支付超高硬件成本的情况下进行测试。它还提供了一个更简单的方法来沟通组件的功能,这对于敏捷开发中常见的结对编程和 “代码审查” 非常有价值。

  构建自动化

  持续集成要求构建自动化,也就是说,提供让软件自动编译和链接到可执行文件的能力。速度非常重要,因为大型构建可能需要很长时间。如果没有快速、可靠的构建,就会缺乏解决集成问题所需的洞察力。在运行集成构建时,会识别由两位或多位开发人员所做的更改之间的冲突,以便解决该冲突。所以,如果发现问题,要解决前一个构建的冲突的开发人员可以通过硬件仿真来测试更改后的代码,不会耽误其他开发人员的工作。但是,要实现这种效率,则必须不断进行集成构建,在上一个构建完成时就立刻开始新的构建。这与其他流程所使用的每天一次或每周一次的构建非常不同。

  当然,这种方法要求构建自动化,因为要将一天中反复多次开始构建的任务指定给一个人是不切实际的。此外,构建应快速执行,这往往要求构建是多线程的。多线程的构建可以使用软件的不同组件,利用在某个其他组件上运行的构建并行地执行这些组件,从而加快汇总的构建时间。它的确需要更多硬件和更复杂的脚本。脚本变得越复杂,构建管理工具就会变得越有价值。

  工作管理

  主要的敏捷概念是将工作拆分成为易于管理的小块的价值。这也是 CI 的基本前提:及早地、经常地改正错误。这样就可以避免它们稍后在项目中发展成为更大、更难解决的问题。

  该技术提供的好处之一是能够提供在项目时间表中多个日期进行构建和测试的更小的功能性发布。通过验证来自团队的架构、需求和时间表估算,每个交付都降低了项目风险。在敏捷方法中,尚未完成的工作被称为积压(backlog)工作。如果您开始将工作分配给小交付增量(被称为冲刺),分配给某个冲刺的工作被称为冲刺积压(sprint backlog)。分配给未来冲刺的剩余工作被称为项目积压(project backlog)。目标是将在冲刺定义的时间内可以实现的尽可能多的工作项分组到冲刺中。

  此流程高度依赖于指标的收集,使团队可以更准确地预测任务所需的时间量,并推算出可以放入某个冲刺交付的任务量。然而,与这些指标等价的是,数据收集即使对于小团队也非常繁琐。当您将这些小团队组合在一起来产生更加复杂的产品时,任务会相当庞大,且无法手工完成。

  市场上有很多产品可以帮助组织完成其工作,跟踪工作的完成状况,并生成与工作完成了多少、完成的速度、完成的质量等有关联的指标。如果遵循了 CI 实践,则必须将所确定的集成错误迅速添加到工作积压中,并作为高优先级移动到列表的顶部。在这方面,在市场上最好的产品提供了新工作项和构建管理系统之间某种程度的集成,因此,在每个构建后识别的错误就可以迅速得到修复,并与现有工作项集成,优先升级,并路由到正确的团队。

  质量管理

  质量管理是确保所有产品要求均已经过测试的开发生命周期实践。该工作需要得到组织和理解,使正确的测试可以在需求变更时得到更新。质量管理有助于项目经理回答以下问题:

  如果我的产品必须在下周发布,哪些部分将会产生最大风险?

  我们是否可以在没有低层要求的情况下发布产品?

  这是否是一个高品质的发布?

  在面对加快交付周期的市场压力时,快速回答这些问题可以帮助业务充满信心地将产品发布到市场。管理人员可以更好地了解要添加哪些资源、在何处调整产品特性,以及何时重新建立交付日期,从而获得最大优势。

  利用测试驱动的开发,测试的概念对于开发工作更加重要。在 TDD 中,需要根据需求编写测试,然后开发代码,直到它通过测试。这将确保没有创建额外的功能,即开发团队称为 “镀金” 的东西。即使额外的功能或特性似乎是一个好主意,但在不要求驱动决策时,额外的工作可能会提高成本,并增加交付时间。最终产品可能并没有实际提高客户满意度。

  自动测试

  在创建多个构建后,团队需要重新测试之前的版本中的可行功能。这个重新测试的流程以前被称为 “好代码(good code)”,现在称之为回归测试(regression testing)。它确保没有因为刚刚完成的变更而将错误引入或重新引入之前测试过的代码。利用 CI,可以将自动的回归测试编写为脚本,在每个构建结束时运行。这使得开发人员能够得到有关在在新构建中发现的错误的即时反馈。这一步是为了通知开发人员,他们所生产的新代码在按要求(或没有按要求)工作。如果没有回归测试,开发人员只知道构建已完成。由于无论如何都必须创建测试,所以 TDD 并没有添加额外的工作。它只是将工作的顺序颠倒了,首先创建测试,然后编写代码。

  即使没有任何自动化测试,传统的瀑布式开发项目也是有可能生存的。可以描述和构建项目,然后让一大堆人不断对其进行测试。但只要您开始定期发布,这一流程就会出现问题。手动测试一个在一天中被多次构建的系统是不可行的。

  协作

原文转自:http://www.ibm.com/developerworks/cn/rational/continuous-integration-agile-development/