您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 微软架构团队敏捷开发实践-文档
IT产品经理@awebc.com更多精彩尽在微软架构团队敏捷开发实践(1)在最近几次与客户面对面的交流中,我有幸分享了我们团队如何在日常工作中进行敏捷软件开发。毫无疑问,这在中国开发人员中是个热门话题,我也想利用博客这个平台与更多的读者进行书面的交流。当然关于敏捷开发利弊得失的争论有不少,而相关的开发模式也分成了TDD(TestDrivenDevelopment),Scrum,XP(eXtremeProgramming)等流派。就我个人而言,一个团队是否严格遵循某种既定的敏捷方法并不重要,但一定得选择并采用一种(或几种)最适合自己开发团队和开发项目的。我认为重要的是团队能否遵循《敏捷软件开发宣言》所涉及的12条原则。在我深入这一议题前,请允许我介绍一下团队:我们属于微软开发工具部(DeveloperDivision,以下简称DevDiv),这个部门拥有几千名软件工程师,核心产品VisualStudio系列的用户从软件开发爱好者一直到大型企业里的专业开发人员及架构师。大量而且复杂的依赖关系、代码改动、紧迫的开发周期等因素使管理软件开发生命周期并按时发布高质量的VisualStudio产品极具挑战性。为了降低风险和复杂度,DevDiv在开发VisualStudio2008过程中采用了功能分支架构(FeatureBranchStructure)和功能小组模型(FeatureCrewModel)。其实这一方式之前已在Office开发团队的实践中取得不错的效果。它的最大好处之一就是使负责某个功能的团队在独立开发过程中有更大自由。由于篇幅所限,在这篇博文中我将侧重介绍我们团队是如何进行敏捷软件开发的。我们团队负责VisualStudio系列中的VisualStudioTeamSystemArchitectureEdition,帮助架构师、运营经理及开发人员以可视化方式构造面向服务的解决方案、降低(软件产品开发的)复杂度。目前我们已开发了基于UML和DSL几个建模工具。这基本上是一个全新项目。从产品开发来看,我们属于全球分布式开发,团队分布在三大洲的四个城市,包括亚洲的上海,北美洲的雷德蒙和夏威夷,以及欧洲的剑桥。为了尽可能减少分布式研发对团队间交流所造成的障碍,我们尽量使功能小组的成员集中于一地。基本上,每个功能小组的核心部分都在某一个城市完成,在其他城市可能会有个别工程师参与相关开发。例如,我们在上海就有一个功能小组,其他一些工程师在雷德蒙的公司总部工作。但有时,基于客户场景的特殊要求,我们也会将一个功能小组拆分成若干个,由多个城市的团队同时开发。在本文后半部分和之后的系列文章中,我所谈及得敏捷软件开发流程都是同一个功能小组所遵循的,即是我们中国团队所遵循的。我们中国团队主要负责开发基于UML的核心图形设计工具,包括即将发布的LogicalClassDesigner,UseCaseDesigner。此外,我们还负责在项目中提供建模元素视图功能的ModelExplorer。我们所采用的敏捷开发方法是Scrum的修改版。就如我之前提到的,我们认为敏捷开发方法和技术没有哪一种是万灵丹,适合自己才是最好的。我们的团队中已有两位工程师参与过Scrum实践,也因此促成我们最终选择了它。下面是一个我们敏捷软件开发流程的概要视图:IT产品经理@awebc.com更多精彩尽在产品待开发事项(ProductBacklog,视图的左上角)可以被视作一份这个团队以优先级排列的、需要完成的功能需求单:来自相关产品利益相关者(Stakeholders)对产品提出一系列高端要求。例如,我们最初的要求是为客户增加逻辑级(更抽象的)和物理级(更靠近代码)建模提供支持,由此衍生出了高端功能需求,诸如开发在逻辑级方便客户生成逻辑模型、兼容UML的关系图和开发帮助创建无力模型的DSL关系等。然后我们会对将要支持的UML关系图种类按优先级进一步分解(UML共有13种不同的关系图)。产品利益相关者的意见会驱动整个优先级选择过程,最终我们得出五个最重要的关系图:LogicalClassDiagrams,UseCaseDiagrams,SequenceDiagrams,ActivityDiagrams和ComponentDiagrams。于是,团队依据当时对产品和市场的了解,以故事标题的形式完成一份产品待开发事项。无疑,整个开发工程中一旦要求发生变化,也会导致需求排列优先级的变更。在与客户的交流中,我被问得最多的问题之一是是否需要在敏捷开发过程中创建架构模型设计。和咨询公司一样,我的答复也是:视情况而定:)。围绕BigDesignUpfront(BDUF),YouAreNotGoingtoNeedIt(YAGNI)以及让团队在开始实施新功能时“重构”现有的代码/设计等所存在陷阱的争论也不少,其中有不少值得借鉴。尽管如此,我坚信设计初期存在这么一个阶段可以尽责地做架构设计以生成高端架构。例如,你打算建一个网上贷款流程的应用程序,你可能需要决定在这个架构里有几层。当然,能有这样一个基于最初要求的,并可能随着项目进展有所变更的架构是很重要的。在我看来,重构在敏捷开发中有其重要地位,但是如果是变更基础架构的“大重构”代价就太大了。如果大家感兴趣,我将在之后的文章中与大家探讨架构在敏捷软件开发过程中所扮演的角色。在我们团队所遵循的敏捷软件开发实践过程中,我们的项目被分解成类似Scrum的若干个四周sprints或迭代开发周期。尽管没有测试驱动开发(TestDrivenDevelopment)或结对编程(PairProgramming),但我们的开发人员会编写单元或签入测试(Unit/Check-inTest)来检查功能,开发和测试工程师也会在一起调试、调查或评审某个特定问题和变更等。我们还会使用极限编程(eXtremeProgramming)中的使用者故事(UserStory)模式。事实上,我们的产品待开发事项和每个迭代周期中的待开发事项(SprintBacklog)都会以故事的形式被追溯。这些使用者故事就是描述一个系统的最终用户会如何使用某个特定功能。通常,我们都会在一个Sprint阶段的最后一周计划下一个Sprint阶段:通常负责某个功能的IT产品经理@awebc.com更多精彩尽在团队(主要是主管们)会依据团队需要侧重的故事来进行由下至上的计划;然后再与产品利益相关者对项目中故事优先级的规划相协调;协调后的需求优先级清单一般会在Sprint的第一天完成。团队于是评估这些使用者故事,并完成设计初稿、实施成本,确认故事完成的标志。依据这个设计和成本,团队将承诺这个Sprint将完成的内容。微软架构团队敏捷开发实践(2)十分感谢你们通过博客或者私下里给我的反馈。我希望在这篇博文中回答一些你们提出的问题。同时,为了延续整个系列的行文思路,我也会涉及一些我们团队计划sprint的方法以及sprint过程中发生的事情,并穿插着回答你们提出的那些问题。首先,我想说的是,不存在敏捷无需计划的神话。可是,敏捷开发中的计划的确和传统软件开发中的计划有着很大区别。正如我在上一篇博文中所说,我们针对利益攸关方(stakeholders)给出的上层需求创建了带有优先级的产品待开发事项(productbacklog)。这一带有优先级的任务列表形成了最基本的sprint计划。在这一过程中,我们一般遵循三阶段的步骤:在主管间进行的预计划阶段,所有团队成员都参加的计划阶段以及包含利益相关者的计划提交阶段。这里的关键是:计划是在所有成员的通力合作中进行,最重要的是由组员自发来制定标准、而不是依赖于某个项目经理。预计划阶段在上一个sprint的最后一周进行,在这一阶段中,团队中分别带领项目经理,开发和测试的几位主管会聚集到一起讨论出在即将进行的下一个sprint中,需要开发的故事(story)列表。这个过程取决于很多因素,其中最重要的是:上一个sprint的进展情况,从利益相关者那里得到的反馈,需求或故事优先级发生的变化以及预计的团队速度。项目经理(有时甚至是开发人员或者测试人员)在阐述故事的时候会尽量简短到只描述出目标、故事的简单介绍以及故事的具体流程。我们发现OneNote很好的满足了我们这一需求(稍后会给出一个故事的截图)。产品待开发事项总是列出对客户有价值的条目,同时它也可以增加这个团队要求的条目。但是,只有那些最终会给客户带去价值的条目才可以出现在待开发事项中。举例来说,创建并维护一个持续集成服务器以持续保证最终产品的质量,这样的条目被允许出现在待开发事项中的。计划阶段通常在sprint的第一天进行。在开会前,项目经理会把OneNote页面的链接发送给组员,以便大家评估,并且为计划会议做好准备。通常,组员会在OneNote页面中交换意见,从而在会议之前澄清那些不明了的地方。在计划会议当天,团队组员会聚集到一起,过一下所有的故事,解决之前发现的任何问题,把故事进一步细分成一些任务,并描述每个故事的验收测试。组员同时也会对完成这些故事所需要的时间做一个大致的估计,然后根据这IT产品经理@awebc.com更多精彩尽在中,团队可以完成哪些故事。计划提交阶段在之后的一天进行,主管会再度聚集在一起并且向利益相关者介绍团队承诺完成的任务。此时,利益相关者可以提出建议对优先级进行调整。比如,如果团队成员可以完成故事A,B以及C,但是不能完成D和E,利益相关者可以建议团队在这一个sprint中完成A,B,D以及E(假设D和E消耗的总时间和C相同)。然后,项目经理会把这些故事输入用来管理我们项目的VisualStudioTeamFoundationServer。注:我们花了好几个sprint来学习并总结出以上这个计划流程。这就是sprint回顾(我会在以后的博文中提及)发挥的重要作用。现在,让我来回顾一些针对我上一篇博文提出的问题:在sprint中的变化以及干扰有一位朋友提了这样一个问题,变化是敏捷方法的核心,那么团队应该如何应对sprint过程中发生的变化呢?诚然,快速有效的应对变化是所有敏捷方法的核心部分,然而,在sprint过程中的干扰始终对生产力有着不良影响。在我们的团队中,我们总是尽量避免sprint过程中的干扰,把变化延缓到下一个sprint中。因为我们把sprint的长度控制在4个星期,所以对于那些变化,意味着他们平均需要等待2个星期。:)最起码,我们希望团队在应对变化之前,先完成那些计划了的故事。这一策略当然需要利益相关者的支持,并且在之前就达成一致。干扰对团队的影响很容易观察到,方法之一就是留意团队速度的下降。(比如在燃尽图上看到曲线的变化)代码重构:另一个问题是该怎样应对因需求改变导致的重构现有代码。当研究一个新的设计时,重构是有效的方法;当代码量不大时,重构也不是一个大问题。然而,一旦你的代码量开始变大,重构的代价就会变得很昂贵。由于利益相关者的反馈和需求的变化,我们也曾有相当一部分代码需要重构。在考量代码重构问题时,最重要的依据是重构对于产品和团队的影响。举一个例子,我们曾不得不改变当一个图形被拖动到另一个图形内部时的产品行为。因为在最初设计这一行为的时候,我们的信息不够充分。在初期的实现之后,我们注意到有一些人已经对这一行为记录了bug,因为他们认为产品的表现和他们的预期不同。我们针对这一情况采取了下列的方法:1)收集更多的反馈以明确预期的行为;2)提供了一个穿刺(spike)方案(译者注:Spike指在产品线的外部开发的试探性的原型系统),调整了产品的行为;3)对穿刺方案进行代码复查和“伙伴测试”确保解决问题。(译者注:伙伴测试指找产品组成员帮忙适用产品的新功能,以查找问题)4)对已发生的变化撰写单元测试。另外,我需要指出的
本文标题:微软架构团队敏捷开发实践-文档
链接地址:https://www.777doc.com/doc-736784 .html