最近和同事讨论敏捷开发如何在进度和文档之间找到平衡?居然发现大家理解各异。什么是敏捷开发?敏捷开发是否意味着省略很多过程文档?具体如何实践?我们一起分享下“知乎”中大家的心得。
以下是总结自知乎的高投票率回答
一、什么是敏捷和敏捷开发
@付聪,中国移动
首先,敏捷开发是一种过程控制论,通俗的说,就是一种做事情的方法。
1. 它适用于软件,因为软件是软的,可以改。要是硬件,改起来就没那么方便了;
2. 它适用于客户不知道自己要啥的情况,其实,这样的客户占绝大多数。因为客户不知道要啥,所以你需要不断帮客户弄明白他到底想要啥。换句话说,你需要和客户沟通,合作,倾听反馈,持续改进;
3. 它适用于竞争激烈的市场,这样的情况下,赶在竞争对手前交付一个不完美但至少能用的产品非常重要;
4. 它适用于快速变化的市场,你在埋头造一辆汽车的时候,客户已经想开飞机满天飞了,这就需要你能一步步的把汽车改成飞机,还能按时交付;
5. 它适用于在一个地方办公的小团队,一般10个人以内。这样能使敏捷中主要的沟通方式“Face to Face” 是可行的;
其次,敏捷开发是一套工具集,里面有形形色色的工具,你可以不搞敏捷,但可以用那么一两个来提高工作效率。比如:
1. 站会:三个问题,简洁有效的小团队沟通方式;
2. 看板:直观反映工作进度,反映流程遵守情况,反映流程缺陷;
3. 演示,计划,反思会:适合于小团队的协作和优化反馈方式;
4. 用户故事:站在用户的角度讲需求;
5. 持续集成:随时高质量交付的基础,有利于应对变化剧烈的市场;
再其次,敏捷开发是一种企业管理方式。比如:
1. 一线员工可以同时是架构师,Scrum Master,开发工程师,测试工程师,发挥了他的主观能动性,有利于创新和效率;
2. 敏捷不专注于敏捷团队中个人的绩效考核,而更多的侧重于整个团队的绩效,更好的避免了KPI驱动模式;
3. 把大项目拆分成小项目去做(每个Sprint都是一个迭代,需要输出一个高质量的版本,相当于完成一个小项目),把bug的生存期控制在一个迭代以内,降低了风险,也减少了后期改bug的工作量;
4. 把数十人的大team 分成几个敏捷团队,这几个敏捷团队的Scrum Master/PO再组成一个更高一级的敏捷团队,利用站会,反思,看板等等敏捷元素,可以避免数十份邮件也不能解决一个小问题,大家互相踢皮球,沟通不畅的大企业病;
5. 老板可以是最大的PO,他给下面的高管讲idea(User Story),定期检查Demo,把控产品用户体验,负责和外界的沟通合作-----比如乔布斯,360的周鸿祎等;
二、为什么需要敏捷开发
@何明璐,IT领域,网名人月神话
用两个词吧,一个是拥抱变化,一个是进度可视。
1.任何软件类系统或项目,即使你前期花在需求上的时间足够长,你也很难在需求阶段真正的分析和挖掘出所有的需求。有些需求注定会在设计实现或用户使用过程中才逐渐出现。要承认软件开发中存在这种不确定性。而瀑布模型将这种识别变化延迟到最好的测试或用户使用阶段才发现,极大的增加了返工或变更成本。敏捷思想里面通过短周期迭代,尽可能早的交付可用的迭代版本来拥抱和适应变化。
2.任何一个软件项目,需求或设计做完我们并不清楚进度是否真正完成了60%或者更多,任何不是经过测试通过的功能我们都很难把握真正的完成进度情况。因此在敏捷里面换了一种思路,如讲这个项目拆分为100个粒度差不多的功能点,如果有60个功能点全部完成并通过验证和测试,我们就比较有把握说整体进度完成了60%。这种可视化的评估进度模式在瀑布里面较难以做到。
(实际上,敏捷是一种思路,敏捷开发是一种实践。适用于: 周期短,人员较少,早期需求变化频繁,高风险的项目 ,不适用于: 行业需求较为固定,开发周期长,市场稳定的项目;)
三、敏捷开发是否意味不用写文档
@何明璐,IT领域,网名人月神话
如果理解为敏捷开发后不用写文档是对敏捷开发很大的误解。敏捷开发的重点是轻文档,而不是不要文档。而这种轻我原来也讲过,对于全新的系统开发最好是在有总体方案或架构后再开始轻。
对于怎么理解轻文档,我建议你好好看下scrum里面的product backlog和sprint backlog。注意这就是文档的一种形式,而且这种文档包括了需求,业务场景,实现思路,验证和测试方法,估算等多个内容的按user story的追溯。而不是按传统软件工程思路拆分为多个文档。
@Blues,scrum sprinting
敏捷开发是重沟通,轻文档。文档要适度,既不能成为项目团队的累赘,也要出现争议的时候有具可查。
先说需求文档,分为两部分,一方面是框架性的需求文档,对功能、交互方式、出错或边界情况的表现进行总体描述,这种文档不需要过于细致,因为产品经理组织语言写文档,开发读文档,理解文档都要消耗大量时间,最好是以总体概括的方式来做,开发在做需求设计时候与产品人员进行频繁密切沟通,最终一起形成完整文档,这中间开发、测试人员对于文档严谨性是有很大贡献,不必要求产品经理全部把边界细节都写出来。
另外一方面,作为良好的协作习惯,任何沟通产生的结论都应该存档!邮件是一种比较好的形式。每次会议结束,问一句结论呢?谁出纪要?不是说文档不重要,而是通过见面沟通,把需要文档描述很细节的内容达成共识。
概要设计详细设计,视需求逻辑难易,规模大小而定。逻辑复杂的项目,概要设计作为帮助开发理解需求的一种手段。大型项目,详细设计架构设计不可避免。一句话规模的需求,随便做做就算了。这其中都要不断的当面沟通!前提是项目成员不能太死板,也有一定磨合,并能力较强。
四、敏捷开发如何实践
@张硕,敏捷开发的寻路人
想一想我们做的项目有多少部分是做出来永远不会有人用的,交付出来到客户那儿才发现根本不是客户想要的,之后返工也好,客户重启项目也罢。
只要付出了努力,却没能体现出相应的价值,那就是浪费。
敏捷宣言的那拨人我相信就是想着如何才能尽可能消除浪费,在凑在一起吃吃喝喝滑滑雪之后,总结出来了4条消除浪费的方法:
可工作的软件》完备的文档
客户协作》合同谈判
个体与互动》流程和工具
响应变化》遵循计划
毕竟宣言是需要落地和实施的,说得挺热闹的,但我们该如何响应变化,如何客户协作,如何生产可工作的软件,都是问题。
所以在统一了思想之后,接下来的实践各有不同,scrum、精益就应运而生,我们采用迭代的方式响应变化和增进客户协作,我们用持续交付持续生产可工作的软件,我们用站会、看板来促进个体与互动。
上面说的东西都是改变生产关系层面的,生产力跟不上的话再好的生产关系都也是桎梏。比如我们的开发流程就是很长,大家代码质量不高,所以无法做到每个迭代结束后都能有所交付,我们代码结构不好,所以我们没法做到快速响应变化。
为了提高生产力,所以又应运而生了一些技术工程实践:测试驱动、领域驱动、结对编程、持续集成、持续交付、重构等等。以上每一点都大得可以写一本书。
所以说,敏捷开发的核心思想就是消除浪费,让我们付出的每一分努力都能有所价值,之后的敏捷宣言和各种流程框架是提出了一种新的生产关系,用来适应大牛程序员们先进的生产力,而如何提升生产力,又产生了很多技术工程实践。这就是敏捷开发的体系。