极限编程 - 实践
极限编程中有四个基本活动。它们是:
编码
测试
倾听
设计
这四个基本活动需要根据极限编程的原则进行结构化。为实现这一点,定义了极限编程实践。
这12个极限编程实践实现了极限编程的目标,并且在其中一个实践薄弱的情况下,其他实践的优势将弥补它。
“极限编程解释”的作者肯特·贝克 (Kent Beck) 将 12 个极限编程实践定义如下:
计划游戏
短迭代发布
隐喻
简单设计
测试
重构
结对编程
集体代码所有制
持续集成
40 小时工作制
现场客户
编码规范
极限编程的四个领域
极限编程实践可以分为四个领域:
快速、细致的反馈:
测试
现场客户
结对编程
持续流程:
持续集成
重构
短迭代发布
共享理解:
计划游戏
简单设计
隐喻
集体代码所有制
编码规范
开发者福利:
40 小时工作制
在本章中,您将详细了解极限编程实践以及每种实践的优势。
极限编程实践一览
下图显示了极限编程是如何围绕极限编程实践展开的:
计划游戏
极限编程中的主要规划过程称为计划游戏。游戏是每次迭代(通常每周一次)都会进行的会议。计划游戏的目的是通过结合业务优先级和技术估算来快速确定下一个版本的范围。随着现实超越计划,更新计划。
业务和开发需要同步做出决策。业务决策和开发的技术决策必须相互协调。
业务人员需要决定:
范围 - 系统在生产中具有价值需要解决多少问题?业务人员能够理解什么是不够的,什么又是过多的。
优先级 - 如果你可以选择,你想要哪个?业务人员比开发人员更能根据客户的意见来确定这一点。
版本的构成 - 在业务方面,软件比没有软件更好之前需要做多少工作?开发人员对这个问题的直觉可能完全错误。
版本的日期 - 软件(或部分软件)的存在会在哪些重要日期产生重大影响?
技术人员需要决定:
估算 - 实现一个功能需要多长时间?
后果 - 只有在了解技术后果的情况下,才应做出战略性业务决策。开发人员需要解释后果。
流程 - 工作和团队将如何组织?团队需要适应其运营的文化。软件必须编写良好,而不是保留封闭文化的非理性。
详细调度 - 在一个版本中,哪些故事应该首先完成?开发人员需要自由地首先安排开发中最冒险的部分,以降低项目的整体风险。在此约束下,他们仍然倾向于将业务优先级提前到开发中,从而减少由于时间限制而必须在发布开发结束时删除重要故事的可能性。
因此,计划是客户、业务人员和开发人员之间合作的结果。
计划游戏 - 优势
计划游戏具有以下优势:
减少浪费在无用功能上的时间
提高客户对功能成本的认识
减少计划中的猜测工作
短迭代发布
您应该快速将简单的系统投入生产,然后以非常短的周期发布新版本。每个版本都应该尽可能小,以便它是:
可在短周期内完成
包含最有价值和最直接的业务需求
一个可运行的系统
短周期的持续时间可能因需要构建的软件而异。但是,需要确保选择最短的持续时间。
短迭代发布 - 优势
短迭代发布的优势在于:
频繁的反馈
跟踪
减少整体项目延误的可能性
隐喻
根据剑桥在线词典 - 隐喻是一种表达方式,经常在文学作品中发现,它通过指代被认为具有与该人或物体相似特征的事物来描述一个人或物体。例如,“心灵是一片海洋”和“城市是一片丛林”都是隐喻。
您应该用一个简单的共享故事来指导整个开发,讲述整个系统的工作方式。您可以将隐喻视为要构建的系统的架构,以便所有参与开发的人都易于理解。
隐喻由特定领域的元素组成,并显示它们的互连性。使用的语言是领域语言。为了识别技术实体,需要一致地使用隐喻中的词语。
随着开发的进行和隐喻的成熟,整个团队将从检查隐喻中找到新的灵感。
良好架构的目标是为每个人提供一个连贯的故事来工作,一个易于被业务和技术成员共享的故事。因此,在极限编程中,通过要求隐喻,我们很可能会得到一个易于沟通和阐述的架构。
隐喻 - 优势
隐喻的优势在于:
鼓励使用系统的通用术语
减少流行语和术语
一种快速简便的解释系统的方法
简单设计
系统应该在任何给定时刻尽可能简单地设计。额外的复杂性一旦被发现就会被消除。
在任何给定时间的软件的正确设计是:
运行所有测试
没有重复的逻辑,例如并行的类层次结构
陈述对开发人员重要的每一个意图
具有尽可能少的类和方法
为了获得简单的设计,请消除任何您可以消除的设计元素,而不会违反前三条规则。这与建议相反 - 为今天实现,为明天设计。如果您认为未来是不确定的,并且您可以快速增强设计,那么不要在猜测上添加任何功能。
简单设计 - 优势
简单设计的优势在于:
不会浪费时间添加多余的功能
更容易理解正在发生的事情
使重构和集体所有制成为可能
帮助程序员保持正轨
测试
开发人员不断编写单元测试,开发需要通过这些测试才能继续。客户编写测试以验证功能是否已实现。测试是自动化的,因此它们成为系统的一部分,并且可以持续运行以确保系统的运行。结果是一个能够接受变化的系统。
测试 - 优势
测试的优势在于:
单元测试促进测试完整性
测试优先为开发人员设定目标
自动化提供了套件回归测试
重构
在实现功能时,开发人员总是会问是否有方法更改现有代码以简化添加功能。在添加功能后,开发人员会问他们现在是否可以看到如何简化代码,同时仍然运行所有测试。他们重构系统而不改变其行为以消除重复,改进沟通,简化或增加灵活性。这称为重构。
重构 - 优势
重构的优势在于:
促使开发人员主动改进整个产品
提高开发人员对系统的了解
结对编程
在结对编程中,所有代码都是由一台机器上的两名开发人员编写的,使用一个键盘和一个鼠标。
每对中有两个角色:
第一位开发人员(拥有键盘和鼠标的人)考虑如何最好地在此处实现此方法。
另一位开发人员则从更战略的角度思考:
这种方法是否可行?
还可能有哪些其他测试用例无效?
是否有办法简化整个系统,以便当前问题消失?
配对是动态的。这意味着两个角色 A 和 B 可以交换位置,或者他们可以与其他团队成员配对。更常见的是,团队中的任何人都可以作为合作伙伴。例如,如果您对某个您不熟悉的领域的某个任务负有责任,您可以要求最近有经验的人与您配对。
结对编程 - 优势
结对编程的优势在于:
三个臭皮匠,顶个诸葛亮
专注
两个人更有可能回答以下问题:
这种方法是否可行?
有哪些测试用例可能无效?
有什么办法简化它?
集体代码所有制
在极限编程中,整个团队对整个系统负责。虽然每个人都了解每个部分的一些内容,但并非每个人都同样了解每个部分。
如果一对正在工作,并且他们看到改进代码的机会,他们就会继续改进它。
集体代码所有制 - 优势
集体代码所有制的优势在于:
有助于减轻离职团队成员造成的损失。
促使开发人员对整个系统负责,而不是对系统的一部分负责。
持续集成
代码每天集成和测试多次,一次一组更改。一个简单的做法是有一台专门用于集成的机器。一对准备好集成的代码:
在机器空闲时坐下。
加载当前版本。
加载他们的更改(检查并解决任何冲突)。
运行测试直到它们通过(100% 正确)。
一次集成一组更改有助于了解谁应该修复失败的测试。答案是当前配对,因为上一对将测试留在了 100%。他们可能不得不丢弃他们所做的工作并重新开始,因为他们可能不知道足够的代码来实现该功能。
持续集成 - 优势
持续集成的优势在于:
减少了本来很长的持续时间。
由于发布前所需的时间最短,因此可以实现短迭代发布实践。
40 小时工作制
极限编程强调每个团队成员每周的工作时间有限,基于可持续性,最多每周45小时。如果有人工作时间超过这个时间,则被认为是加班。加班最多允许一周。此做法旨在确保每个团队成员保持精力充沛、富有创造力、谨慎细致且充满信心。
每周40小时制——优势
每周40小时制的优势在于:
大多数开发人员超过40小时后效率就会下降。
重视开发人员的福祉。
迫使管理层寻找真正的解决方案。
现场客户
在团队中加入一位真实的、全职的现场用户,以回答问题、解决争议和设定小型优先级。这位用户不必只花费40小时在这个角色上,也可以专注于其他工作。
现场客户——优势
拥有现场客户的优势在于:
可以快速、准确地回答真实的开发问题。
确保开发出的产品正是所需的产品。
正确地确定功能优先级。
编码规范
开发人员编写的所有代码都符合以下规则:
通过代码进行沟通。
尽可能减少工作量。
遵循“只写一次”原则(避免重复代码)。
团队成员自愿遵守。
这些规则在极限编程中是必要的,因为所有开发人员:
可以从系统的某一部分切换到系统的另一部分。
每天轮换搭档几次。
不断重构彼此的代码。
如果不遵循这些规则,开发人员就会倾向于采用不同的编码实践,代码随着时间的推移会变得不一致,并且无法确定团队中谁编写了哪段代码。
编码规范——优势
编码规范的优势在于:
减少开发人员重构他人代码的时间。
减少对内部注释的需求。
要求代码清晰、明确。