发布新日志

  • 敏捷团队的建立感悟(1)

    2015-01-06 14:53:46

    最近给一个公司做Scrum Master,有很多感悟:

    1. 一开始接触的时候,感觉该公司已经做了2年的敏捷开发了,而且走的是XP
    2. 实际接触以后,发现实际情况完全不一致
    3. 很多人对敏捷本身理解就很浅
    4. 导致对敏捷开发产生了很多错误的理解
    5. 生套很多名词,最后就集中在一个快字上
    6. 实际上产品,开发,测试一团糟


    所以,挣扎了三个月之后,决定从以下方面入手:
    1. 先对所有人进行基础培训,在最基本的概念上达成一致
    2. 在非实质性的敏捷开发时,不妨屏蔽这个混乱的名词,强调一下瀑布/迭代
    3. 推行敏捷的理念:瀑布开发本身也是可以敏捷的,不冲突;迭代只是能够让开发敏捷起来的一种方法
    4. 从源头上推动:先教会产品人员书写User story开始,培养他们的需求来源于真实客户需求
    5. 压制项目开发的模式,走服务提供的模式
    6. 压制高层领导的无谓指挥
  • 敏捷中常见的陷阱

    2014-10-16 14:47:12

    以下这些,往往是一个敏捷团队会不知不觉中犯的错误,而不是一个非敏捷团队因为不懂而瞎做的。因为他们本质区别在于:一个是因为上一个成功的迭代没有涉及,从而忽略其中一些;一个是强行的去执行,以为自己就是敏捷。

    Adding stories to a sprint in progress
    往进行中的Sprint添加新的故事

    敏捷的团队有时候因为需求更新或者细化后发现新的/隐藏的用户故事。这是因为在计划会议中大家忽略了。
    非敏捷的团队习惯了在制定好计划后,觉得有些东西需要提高优先级,强行添加,从外部打断了敏捷过程。

    Lack of sponsor support
    缺少领导层的支持

    敏捷的团队因为过于自组织,对于一些外部环境未必能够及时感知,比如和其它团队形成了竞争,浪费了资源。
    非敏捷的团队认为自己能够管理自己,对领导成的风险控制反感,强行封闭自己,认为必须遵循不能干扰的原则。

    Insufficient training
    缺乏充足的培训

    敏捷团队中有些成员能够完成一些任务,但是如果有更好的培训的话,能提高团队的生产率。
    非敏捷团队往往就是随意根据需求抓人,连很多背景内容都没有讲解就强行开发。

    Product Owner Role is not properly filled
    Product Owner角色没有充分发挥自己的职责

    敏捷团队中的PO因为信赖团队,降低了验收力度和沟通成本,从而带来风险。
    非敏捷的团队的PO很多时候过多的干预了团队的既定任务和计划。

    Teams not focused
    团队缺乏统一的目标

    敏捷的团队的统一目标很多时候因为减少了日例会的效率,从而出现信息不一致。
    非敏捷的团队只有一个最终目标,没有个人目标和团队目标的契合过程。


    Excessive Preparation/Planning
    过多的准备和计划

    敏捷的团队因为过于习惯了充分考虑一切,从而浪费了产品上线的最好时机。
    非敏捷的团队因为没有良好的团队合作,从而在执行过程中不断的重新储备和修改计划

    Problem-Solving in the Daily Scrum
    在日例会中解决问题

    敏捷的团队经常将几句话能说明的事情放到例会中讨论结束
    非敏捷的团队直接将例会变成了讨论会。

    Assigning Tasks
    分配任务

    敏捷的团队因为对某些人的信赖,不自觉的将一些任务推送给了特定人员
    非敏捷的团队是直接分配任务给每个人

    Scrum Master as a contributor
    Scrum Master参与交付

    敏捷团队的Scrum master有时候因为了解过多,不自觉的参与了交付过程中的某些任务。
    非敏捷的团队习惯性的在团队中指定一个人作为Scrum Master

    Lacking test automation
    缺少自动化测试

    敏捷团队习惯性的认为保持了代码的稳定,通过结对编程增加了bug排除率,所以自动化规模较小。
    非敏捷的团队只是对功能进行了自动化,甚至是GUI层面,缺乏深层次的自动化代码检查。

    Allowing technical debt to buildup
    允许技术型的债务积累

    敏捷团队经常喜欢研究更新的的技术,越级更新,缺少了中间的稳定版本。
    非敏捷团队很少去更新技术和框架。

    Attempting to take on too much in a sprint
    试图在一个sprint里交付很多

    敏捷团队经常在成功的累积产生足够的信心,想增加一部分,或者偶尔加班。
    非敏捷团队完全不知道优先级和产品战略,直接就拼命的堆功能。

    Fixed time, resources, scope and quality
    限定时间,限定资源,限定范围,限定质量要求

    敏捷团队认为能够在四限下完成交付,缺少风险管理和应对手段。
    非敏捷团队往往目标是四限,最后只是去cover限定时间。

  • 敏捷十二原则

    2014-10-16 14:23:20

    敏捷本身有一些基础的原则,通过这些原则对你现行的软件开发流程进行敏捷化。


    1. Customer satisfaction by rapid delivery of useful software

    我们最重要的目标,是通过持续不断地及早交付有价值的软件使客户满意。

    也就是说,我们敏捷化的第一个方向就是转换软件开发的目的,从满足产品的设计要求,到能够快速获得产品用户的反馈并及时响应反馈。

    所以,敏捷的交付周期一般较短,目的就是能尽快将产品展示给用户去使用,并通过使用来产生真正有价值的回馈。

    同时,这也要求了开发能将产品需求实现过程中,尽可能的切割成一个个独立的小特性。User Story是广泛使用的方法。



    2. Welcome changing requirements, even late in development

    欣然面对需求变化,即使在开发后期也一样。为了客户的竞争优势,敏捷过程掌控变化。

    很多公司纠结到底是什么时候允许需求变化,是因为他们还在意于每个交付周期的产出量。真正的敏捷过程,在一个产品的前期会有大量的failed的sprint。所以Git的流行就满足了这方面的需求。


    3. Working software is delivered frequently (weeks rather than months)

    经常地交付可工作的软件,相隔几星期或一两个月,倾向于采取较短的周期。

    有很多团队,觉得为了交付一个产品特性,需要很多底层构建,所以无法满足持续的交付可工作的软件。其实,这是因为在计划会议时,把很多非交付性的或者技术型任务加入了交付迭代中。所以合理的安排任务很重要,必须保证产品设计能够切分成足够独立的特性。对于那些不可分割的底层架构,需要单独的团队去完成。所以看板是很重要的工具,他能将不同的团队的工作协调起来。

    4. Close, daily cooperation between business people and developers

    业务人员和开发人员必须相互合作,每一天都不例外。

    很多敏捷团队都只包含开发人员,这个没有问题,但是每日例会,或者Scrum Master要经常推动开发团队和业务人员进行沟通,因为很多变化就在每日的沟通中就能够潜移默化,不用等到最后一天去fail掉整个sprint


    5. Projects are built around motivated individuals, who should be trusted

    激发个体的斗志,以他们为核心搭建项目。提供所需的环境和支援,辅以信任,从而达成目标。

    敏捷团队的每个人都是独立的交付个体,他们进行自我管理,通过主动精神形成一个敏捷的团队。在这个过程中,需要整个外部环境的支持。要保证他们的资源需求,保证他们的培训力度,保证他们的团队建设,保障他们的个人利益,然后不要打断他们,才能形成一个敏捷的团队。 从来不会有一个敏捷团队能依靠自己的资源建设成功。

    6. Face-to-face conversation is the best form. of communication (co-location)

    不论团队内外,传递信息效果最好效率也最高的方式是面对面的交谈。

    每日例会是为了寻求帮助,但是沟通要在很多情况下同样适用面对面的交谈。各种会议,各种方案,文档,计划的审核,都需要每一个人发出自己的声音。任何情况下,先保证面对面交流达成一致,然后才用文本方式归档。结对编程,就是两个开发面对面的交流中实现代码,包含可设计,验证,开发,自测,code review等过程在内。

    7. Working software is the principal measure of progress

    可工作的软件是进度的首要度量标准。

    怎么衡量进度,任何口头,数面的确认都没有一个已经能够Demo的产品有说服力。所以,我们要拿Demo作为验收的关键点,没有完成Demo,就没有完成进度。


    8. Sustainable development, able to maintain a constant pace

    敏捷过程倡导可持续开发。责任人、开发人员和用户要能够共同维持其步调稳定延续。

    敏捷是要团队能够稳定的开发,产品才能稳定,质量才能稳定,所以加班是反敏捷的。


    9. Continuous attention to technical excellence and good design

    坚持不懈地追求技术卓越和良好设计,敏捷能力由此增强。


    产品更新,不光是需求更新,还会包含技术和架构的更新。这也是一个敏捷的团队成功的标志之一。因为这是每个成员的主动精神的集中体现,愿意将自身的发展和团队的目标绑定一致。


    10. Simplicity—the art of maximizing the amount of work not done—is essential

    以简洁为本,它是极力减少不必要工作量的艺术。

    敏捷要求简洁,简洁的目的是只为了目标达成而必须的工作才去做,所以简洁的架构才更具有扩展性和衍生性。认为设计具有扩展性是复杂的设计过程,那么他对架构设计就是个门外汉。

    11. Self-organizing teams

    最好的架构、需求和设计出自自组织团队。

    自组织团队的标准可以认为是每个团队的成员的工作目的都是为了同一个目标,大家没有相互依赖,而是相互支持。同时,自组织也意味着团队的所有成员都是平级的,任务是自己选择的,而不是分配的。

    12. Regular adaptation to changing circumstances

    团队定期地反思如何能提高成效,并依此调整自身的举止表现

    敏捷的另一个含义就是不断的反思,过程改进,从而不断的重复正确的,成功的步骤达到目标。







  • 敏捷宣言

    2014-10-16 10:12:57

    最近做敏捷推广,发现很多人虽然号称了解敏捷,但是实际的一操作,很多人明显的完全不懂什么是敏捷,所以最后只能从头做起。

    今天就准备先讲一下敏捷宣言,也就是敏捷的价值。

    首先我们看一下敏捷的原文:Agile Software Development。很多人都知道这是敏捷软件开发,然后就自动理解为一种新的开发方法或者模型,区别于瀑布,迭代等。岂不知,这应该是敏捷的软件开发的简写。也就是说Agile是个形容词,是说让软件开发变的灵活具备快速应对变化的意思。很多人都没理解到这点,所以出发点就错了。

    然后看看中文mediawiki上的解释:

    敏捷软件开发,又称敏捷开发。是一种从1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力。

    它们的具体名称、理念、过程、术语都不尽相同,相对于“非敏捷”,更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发中人的作用。

    好吧,不说了,基本上都是似是而非

    看看英文版的:

    Agile software development is a group of software development methods in which requirements and solutions evolve through collaboration between self-organizing, cross-functional teams. 

    敏捷软件开发是一个需求和解决方案不停演化的自组织,跨功能团队所拥有的一系列软件开发方法的集合。

    It promotes adaptive planning, evolutionary development, early delivery, continuous improvement and encourages rapid and flexible response to change.

    它促进了自适应式规划,演化式开发,预先式交付,持续式改进,并鼓励快速和灵活的响应变化。


    明显的理解有差异的,这就是中国的通病,很多人只看别人翻译,或者到处转载那些明显有问题的听起来简单的解释,反而南辕北辙。

    所以想了解敏捷软件开发当初的起源,就需要真正的去看一下敏捷宣言。


    敏捷宣言从一个整体来说需要按如下顺序阅读读:
    (要注意,敏捷宣言每一项是按顺序来的,也就是说有相互的依赖)

    We are uncovering better ways of developing software by doing it and helping others do it. Through this work we have come to value:

    我们一直在实践中探寻更好的软件开发方法,身体力行的同时也帮助他人。由此我们建立了如下价值观:

    Individuals and interactions over Processes and tools
    个体和互动 高于 流程和工具
    Working software over Comprehensive documentation
    工作的软件 高于 详尽的文档
    Customer collaboration over Contract negotiation
    客户合作 高于 合同谈判
    Responding to change over Following a plan
    响应变化 高于 遵循计划
    That is, while there is value in the items on the right, 
    we value the items on the left more 也就是说,尽管右项有其价值,我们更重视左项的价值

    1. 首先强调人和交流
    2. 首先强调能够展现的软件
    3. 首先强调团队合作
    4. 首先强调按需变化,动态调整
    5. 但是,并不是说我们追求左边4项就认为右边四项不重要了
    6. 也就说流程和工具还是必须的,是为了更好的个人产出和高效沟通
    7. 能够展现的软件是由那些必要的文档实例化的结果,文档对软件是强力的补充
    8. 合同谈判的目的是为了树立统一目标,然后双方合作,而不是单方检验
    9. 计划是开始的基础,我们在计划上调整响应变化,而不是没有计划。
    10. 右边4项必须存在,才能让左边四项发挥更大的作用
    11. 左边4项就是为了让右边4项敏捷起来
    12. 敏捷的软件开发是基于有序的开发基础上,更具备灵活性。


    让我们逐一看一下这四项

    1. Individuals and interactions 

    in agile development, self-organization and motivation are important, as are interactions like co-location and pair programming.

    个人的重要性体现在自我组织和主动精神上。
    而限制工作区域和结对编程都能带来良好的交互。

    所以真正敏捷的团队的人都知道,敏捷对每个人的要求很高。需要很强的主动精神,愿意为了达到团队价值全力贡献自己的价值。然后具有很强的自我组织和自我管理的能力。同时,能够和团队所有成员高效协作。

    这就是为什么一个敏捷团队很少会换人,保持团队的稳定,才能保证团队的敏捷性。为了团队建设,大家面对面的坐在一个限制性的区域里从而能够随时沟通非常重要。而结对编程使得大家能够不停的互相促进,并形成同一种风格,使得产品的稳定性极大增强。

    2. Working software 

    working software will be more useful and welcome than just presenting documents to clients in meetings.

    能够直接演示的软件远远比文档更容易被客户所接受。

    我们能够通过各种文档向客户演示我们要交付的内容,但是这些东西对客户的吸引力完全没有一个能够展示的软件更有力。通过实际的展示,讲解,操作和试用,能够得到极大的UE提升。

    但是,Demo的时间毕竟有限,各种文档还是必须的,用户不可能在那么短的时间内有效的获取所有信息,所以Demo之后/之前,都可以进行一次文档交付,让用户获得更多的详细信息。

    3. Customer collaboration 

    requirements cannot be fully collected at the beginning of the software development cycle, therefore continuous customer or stakeholder involvement is very important.

    需求在软件开发周期的初始阶段是不可能充分获取的,所以和用户协作不断的探讨和更新需求是非常重要的。

    合同讨论的其实是一个大的框架,我们首先要知道我们大体要完成内容,这样才能够集中精力去做。也就是说先有Scope,然后才能去制定交付。否则,纯粹开放型的需求等于没有需求。 很多产品人员认为需求可以不断的变更,其实是因为他们根本对客户的需求没有理解透彻,从而不断更新。

    敏捷强调更新,强调过程中补充,但是不是说你连最起码的目标都不清楚。而且,所谓的补充信息不能是关键点,只能是迭代更新,而不是增量更新。敏捷更会控制需求变更,而不是纯粹的接受所有变更。 所以在很多敏捷框架中,都指明了能够进行需求变更的时间段,以及变更的风险,以及sprint失败的条件。

    4. Responding to change 

    agile development is focused on quick responses to change and continuous development.

    敏捷开发关注于快速的响应变化和持续开发。

    敏捷开发响应变化的目的是响应用户的变化。 也就是,真正的变化是你在给客户进行Demo之后,然后由客户发起的需求变化。而不是在研发过程中,不停的由产品经理发起变化。为了避免这种情况,所以各个sprint周期才会普遍采用一周/二周的短时间段。就是为了能够用1/2周的损失避免1/2个月的时间损失。

    所以很多人认为敏捷就是迭代的/增量的开发。其实跟这个一毛钱关系没有,很多敏捷做得好的公司,只要产品目标明确,瀑布开发也能够很敏捷。

    所以敏捷不依赖于你采用哪种开发模式,它是你如何让你的产品开发敏捷起来而采用的所有方法的集合。现行的敏捷框架都是每个公司自己的成功结果。

Open Toolbar