敏捷开发
什么是敏捷开发
敏捷开发(Agile Development)是以用户需求为核心、通过迭代方式快速响应变化的软件开发方法,强调将大型项目拆分为可独立运行的子项目,确保软件持续处于可交付状态 。其核心是通过短周期迭代完成增量开发,每个迭代需交付可工作的软件,涵盖编码、测试与质量验证全过程。
该方法遵循《敏捷宣言》四大价值观:个体与互动高于流程工具、可运行软件高于详尽文档、客户协作高于合同谈判、响应变化高于遵循计划。典型实践框架包括Scrum、极限编程(XP)和看板(Kanban),辅以持续集成、用户故事设计等技术手段,通过每日站会、迭代复盘等协作机制提升交付效率 。实施过程中需管理产品待办列表,优先处理高价值需求,并持续优化技术债务
原则
敏捷建模(AM)定义了一系列的核心原则和辅助原则,它们为软件开发项目中的建模实践奠定了基石。其中一些原则是从XP中借鉴而来,在Extreme Programming Explained中有它们的详细描述。而XP中的一些原则又是源于众所周知的软件工程学。复用的思想随处可见。基本上,本文中对这些原则的阐述主要侧重于它们是如何影响着建模工作;这样,对于这些借鉴于XP的原则,我们可以从另一个角度来看待。
核心原则
◆主张简单
当从事开发工作时,主张最简单的解决方案就是最好的解决方案。不要过分构建(overbuild)软件。用AM的说法就是,如果并不需要这项额外功能,那就不要在模型中增加。要有这样的勇气:不必要对这个系统进行过分的建模(over-model),只要基于现有的需求进行建模,日后需求有变更时,再来重构这个系统。尽可能的保持模型的简单。
◆拥抱变化
需求时刻在变,人们对于需求的理解也时刻在变。项目进行中,Project stakeholder可能变化,会有新人加入,也会有旧人离开。Project stakeholder的观点也可能变化,努力的目标和成功标准也有可能发生变化。这就意味着随着项目的进行,项目环境也在不停的变化,因此开发方法必须要能够反映这种现实。
◆第二个目标是可持续性
即便团队已经把一个能够运转的系统交付给用户,项目也还可能是失败的--实现项目投资者的需求,其中就包括系统应该要有足够的鲁棒性(robust ),能够适应日后的扩展。就像Alistair Cockburn常说的,进行软件开发的竞赛时,第二个目标就是准备下一场比赛。可持续性可能指的是系统的下一个主要发布版,或是正在构建的系统的运转和支持。要做到这一点,不仅仅要构建高质量的软件,还要创建足够的文档和支持材料,保证下一场比赛能有效的进行。要考虑很多的因素,包括现有的团队是不是还能够参加下一场的比赛,下一场比赛的环境,下一场比赛对组织的重要程度。简单的说,在开发的时候,要能想象到未来。
◆递增的变化
和建模相关的一个重要概念是不用在一开始就准备好一切。实际上,就算想这么做也不太可能。而且,不用在模型中包容所有的细节,只要足够的细节就够了。没有必要试图在一开始就建立一个囊括一切的模型,只要开发一个小的模型,或是概要模型,打下一个基础,然后慢慢的改进模型,或是在不再需要的时候丢弃这个模型。这就是递增的思想。
◆令投资最大化
项目投资者为了开发出满足自己需要的软件,需要投入时间、金钱、设备等各种资源。投资者应该可以选取最好的方式投资,也可以要求团队不浪费资源。并且,他们还有最后的发言权,决定要投入多少的资源。
◆有目的的建模
对于自己的产出,例如模型、源代码、文档,很多开发人员不是担心它们是否够详细,就是担心它们是否太过详细,或担心它们是否足够正确。不应该毫无意义的建模,应该先问问,为什么要建立这个产出,为谁建立它。和建模有关,也许应该更多的了解软件的某个方面,也许为了保证项目的顺利进行,需要和高级经理交流方法,也许需要创建描述系统的文档,使其他人能够操作、维护、改进系统。如果连为什么建模,为谁建模都不清楚,又何必继续烦恼下去呢?首先,要确定建模的目的以及模型的受众,在此基础上,再保证模型足够正确和足够详细。一旦一个模型实现了目标,就可以结束工作,把精力转移到其它的工作上去,例如编写代码以检验模型的运作。该项原则也可适用于改变现有模型:如果要做一些改变,也许是一个熟知的模式,应该有做出变化的正确理由(可能是为了支持一项新的需求,或是为了重构以保证简洁)。关于该项原则的一个重要暗示是应该要了解受众,即便受众是自己也一样。
◆多种模型
开发软件需要使用多种模型,因为每种模型只能描述软件的单个方面,“要开发现今的商业应用,我们该需要什么样的模型?”考虑到现今的软件的复杂性,你的建模工具箱应该要包容大量有用的技术(关于产出的清单,可以参阅AM的建模工件)。有一点很重要,你没有必要为一个系统开发所有的模型,而应该针对系统的具体情况,挑选一部分的模型。不同的系统使用不同部分的模型。比如,和家里的修理工作一样,每种工作不是要求你用遍工具箱里的每一个工具,而是一次使用某一件工具。又比如,你可能会比较喜欢某些工具,同样,你可会偏爱某一种模型。有多少的建模工件可供使用呢,如果你想要了解这方面的更多细节,我在Be Realistic About the UML中列出了UML的相关部分,如果你希望做进一步的了解,可以参阅白皮书The Object Primer -- An Introduction to Techniques for Agile Modeling。
◆高质量的工作
没有人喜欢烂糟糟的工作。做这项工作的人不喜欢,是因为没有成就感;日后负责重构这项工作(因为某些原因)的人不喜欢,是因为它难以理解,难以更新;最终用户不喜欢,是因为它太脆弱,容易出错,也不符合他们的期望。
◆快速反馈
从开始采取行动,到获得行动的反馈,二者之间的时间至关紧要。和其他人一起开发模型,你的想法可以立刻获得反馈,特别是你的工作采用了共享建模技术的时候,例如白板、CRC卡片或即时贴之类的基本建模材料。和你的客户紧密工作,去了解他们的需求,去分析这些需求,或是去开发满足他们需求的用户界面,这样,你就提供了快速反馈的机会。
◆软件是你的主要目标
软件开发的主要目标是以有效的方式,制造出满足投资者需要的软件,而不是制造无关的文档,无关的用于管理的工件,甚至无关的模型。任何一项活动(activity ),如果不符合这项原则,不能有助于目标实现的,都应该受到审核,甚至取消。
◆轻装前进
你建立一个工件,然后决定要保留它,随着时间的流逝,这些工件都需要维护。如果你决定保留7个模型,不论何时,一旦有变化发生(新需求的提出,原需求的更新,团队接受了一种新方法,采纳了一项新技术...),你就需要考虑变化对这7个模型产生的影响并采取相应的措施。而如果你想要保留的仅是3个模型,很明显,你实现同样的改变要花费的功夫就少多了,你的灵活性就增强了,因为你是在轻装前进。类似的,你的模型越复杂,越详细,发生的改变极可能就越难实现(每个模型都更“沉重”了些,因此维护的负担也就大了)。每次你要决定保留一个模型时,你就要权衡模型载有的信息对团队有多大的好处(所以才需要加强团队之间,团队和项目投资者之间的沟通)。千万不要小看权衡的严重性。一个人要想过沙漠,他一定会携带地图,帽子,质地优良的鞋子,水壶。如果他带了几百加仑的水,能够想象的到的所有求生工具,一大堆有关沙漠的书籍,他还能过得去沙漠吗?同样的道理,一个开发团队决定要开发并维护一份详细的需求文档,一组详细的分析模型,再加上一组详细的架构模型,以及一组详细的设计模型,那他们很快就会发现,他们大部分的时间不是花在写源代码上,而是花在了更新文档上。
敏捷开发的原则
1. 快速迭代
相对那种半年一次的大版本发布来说,小版本的需求、开发和测试更加简单快速。一些公司,一年发布仅2~3个版本,发布流程缓慢,它们仍采用瀑布开发模式,更严重的是对敏捷开发模式存在误解。
2. 让测试人员和开发者参与需求讨论
需求讨论以研讨组的形式展开最有效率。研讨组,需要包括测试人员和开发者,这样可以更加轻松定义可测试的需求,将需求分组并确定优先级。 同时,该种方式也可以充分利用团队成员间的互补特性。如此确定的需求往往比开需求讨论大会的形式效率更高,大家更活跃,参与感更强。
3. 编写可测试的需求文档
开始就要用“用户故事”(User Story)的方法来编写需求文档。这种方法,可以让我们将注意力放在需求上,而不是解决方法和实施技术上。过早的提及技术实施方案,会降低对需求的注意力。
4. 多沟通,尽量减少文档
任何项目中,沟通都是一个常见的问题。好的沟通,是敏捷开发的先决条件。在圈子里面混得越久,越会强调良好高效的沟通的重要性。
团队要确保日常的交流,面对面沟通比邮件强得多。
5. 做好产品原型
建议使用草图和模型来阐明用户界面。并不是所有人都可以理解一份复杂的文档,但人人都会看图。
6. 及早考虑测试
及早地考虑测试在敏捷开发中很重要。传统的软件开发,测试用例很晚才开始写,这导致过晚发现需求中存在的问题,使得改进成本过高。较早地开始编写测试用例,当需求完成时,可以接受的测试用例也基本一块完成了。

浙公网安备 33010602011771号