敏捷开发 ——关于项目管理与开发的整理、思考与总结【原创】

目录
[隐藏]

一.背景

在最近参与的新项目开发过程中,项目团队成员逐渐增加,业务需求更加复杂和庞大,需要参与的角色也越来越多在实际工作中发现现有的开发流程和模式已经不能满足需求。项目组成员也明显遇到或感受到不同方面的困难,如需求不明确,进度延期,任务预算增加,产品质量不高等问题。除此之外,公司现有的开发方式和过程并不规范,没有统一的指导流程。

面对开发过程中遇到的问题,项目成员开会进行了讨论,大家发表了意见,也提出了一些好的建议并实施。然而,针对目前的管理和开发模式,我认为还依然处于“游击战”阶段,存在不系统,不明确,不统一等问题,没有从根本上解决问题。随着公司的成长以及对未来发展的期望,公司应该积极学习并实践业界主流项目管理和开发方法。在软件领域,较为出名的开发模式——敏捷开发模式,值得学习与借鉴。

下面我将从面临的问题、敏捷开发的优点、如何进行敏捷开发三个方面进行介绍,给出实践敏捷开发的优点和理由。本文只作为引入,后续将会给出更为详细的实践方案。敏捷开发涉及开发的方方面面,内涵丰富,甚至需要专业的指导才能有效执行。事实上,敏捷开发只是一个代名词,在敏捷开发提出的一些方法和流程并非一定采用,但通过了解学习,其涉及的一些思路和建议,值得参考,甚至可以采用灵活的方式应用到我们的工作中来,其最终目的在于提高工作效率和产品质量。

二、问题现状:

我们目前的开发过程是这样的:首先我们获取需求点,由产品经理画出一版原型图。然后组织项目组成员(参与人员不定)开会,仓促的根据原型图过需求。然后对需要改进的部分修改后发出原型图版本二。再通过会议确认,明确开发人员,之后就进入研发阶段。

然而,问题随时间不断暴露出来:最经常发生的事情就是大家在承诺的时间点不能按时交付每次询问进度的时候,会被告知还差一点就完成了,或者还需要其他资源的配合而无法完成。例如通常的说法是“底层部分已经做完了,还差页面部分就可以搞定了”,然而实际情况是又过了相当的时间才真正完成。此外,在项目经理观察进度的时候,还经常遇到责任人不清,业务交互负责人混乱等问题。如果细心的话,会发现一个现象:我们经常在会议上发问:“这个负责人谁?这个由谁跟进?”

还有一些其他问题,例如目前公司人手不够,需要招聘各种人员。然而新人进入公司需要一个适应过程,不仅仅是熟悉业务和技术架构,更主要的可能还在于熟悉组织里人员,了解业务负责人,鉴于熟悉有个过程,出了问题不知道或者不会主动询问其他人,这样就影响了开发效率。

我们的问题涉及到项目管理层。如果从一个管理者角度出发:一个团队的项目经理,任务的完成情况通常是其最关心的内容之一,比如说分配的任务是否能够按时间完成,整个项目的进度是否尚在计划之中,团队内的人是不是都在高效地工作,大家有没有什么困难,这些是经常会关注的问题。在软件开发团队中,任务的分配、跟踪和管理通常是这个团队管理者的一个重要的工作内容。项目经理会询问每个开发人员的开发进度,当需求的计划交付时间点逼近的时候,这种检查会越来越频繁,开发人员感受到压力,有时候甚至需要加班来完成开发工作。然而尽管花了很多精力去跟踪和检查每个需求的完成情况,还是有很多出乎期望的事情在不断发生。任务越来越不可控,计划通常无法按时完成,每天对大家的检查花了大部分时间,然而却不能揭示出真正的问题。

尽管每个团队的问题可能不完全相同,但是当我们审视这些项目的运作和管理方式的时候,不难发现一些诸如多任务并行等共性的问题,这些问题给软件项目带来了各种各样的浪费。当一个团队采用瀑布开发模式的时候,开发阶段全部结束之后测试人员才会介入,开展测试活动,在一个通常很漫长的开发阶段内,各种开发活动中的浪费、估计的不准确,以及成员自己的拖沓、被打扰、问题阻塞等,都被掩盖住了。项目经理只能看到交付的最终时间点,问题不能及时的暴露,而等到问题被暴露的时候,可以使用的调整手段也非常有限。

总结以上问题,大致总结为以下几点:

1.组织开发流程不统一,不明确

2.无法快速有效定位责任人,接口人

3.新成员加入成本高

4.问题无法第一时间暴露,缺乏有效的问题跟进

5.无法有效管理项目进度

以上列出的并非我们遇到全部问题但这些问题都在时时刻刻影响项目进展效率和质量。为了解决这些问题,我们需要一个明确的方法和规范。熟悉敏捷方法的人员可能都知道,敏捷方法包含一系列实践来帮助团队实现短周期快速交付,更好地响应需求变化。比如说user story方法(一种定义需求的方式),将需求从用户价值的角度进行组织,避免将需求从功能模块角度划分。小粒度的用户故事可以在一两周的迭代内完成开发和测试(并行开发),从而可以缩短交付周期。

三、敏捷开发的优点

在软件工业界,敏捷开发已成为众多高效开发团队的制胜之道。在欧美软件企业中,有近半数企业已采用敏捷方法进行开发,而近几年受软件外包和外企的带动,敏捷开发在中国也出现了日渐普及的态势,如腾讯内部几乎所有的开发团队都在实施敏捷方法。敏捷开发的流行绝非偶然,其最大的推动力是采用这种方法所能带来的收益。相关统计表明,敏捷开发可以将效率提高3-10倍,软件的质量也有更加可靠的保证; 同时,还给团队内的每个成员提供了良好的发展机会,技术和合作水平都能得到相应提高。

敏捷开发是一套完整的,成熟的,经过实践的开发方法,或者说是开发的流程。它会指导我们用规定的环节去一步一步完成项目的开发,告诉我们如何去做。通过敏捷团队运作,激发出每一队员的最大潜能,以最大合力完成软件产品开发。

敏捷开发能在以下几点提供帮助:

1. 精确。瀑布模式通常会在产品起点与最终结果之间规划出一条直线,然后沿着直线不断往前走。然而当项目到达终点时,用户通常会发现那已经不是他们想去的地方。而敏捷方法则采用小步快跑,每走完一步再调整并为下一步确定方向,直到真正的终点。

2. 质量。敏捷方法对每一次迭代周期的质量都有严格要求。一些敏捷方法如极限编程等,甚至使用测试驱动开发(test-driven development),即在正式开发功能代码之前先开发该功能的测试代码。这些都为敏捷项目的整个开发周期提供了可靠的质量保证。

3. 速度。敏捷团队只专注于开发项目中当前最需要的、最具价值的部分。这样能很快地投入开发。另外,较短的迭代周期使团队成员能迅速进入开发状态。

4. 丰厚的投资回报率。在敏捷开发过程中,最具价值的功能总是被优先开发,这样能给客户带来最大的投资回报率。

5. 高效的自我管理团队。敏捷开发要求团队成员必须积极主动,自我管理。在这样的团队中工作,每个团队成员的技术能力、交流、社交、表达和领导能力也都能得以提高。

在以上几点中,也许改善管理和提高软件质量是我们的最大收益。

最后,当我们采用了规范明确的开发流程后。团队之间就可以无障碍沟通,尤其对于新员工来说,他可以第一时间了解公司技术结构,开发过程,并准确找到需要交互或交付的负责人。只要他是一个合格的IT行业人员,他就会知道敏捷开发里说了什么,从而明确该怎么去做。 

四、为什么敏捷开发可以解决我们的问题

为了解释这个问题,首先要了解一下敏捷开发的相关概念。

1.什么是敏捷开发?

敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。我们必须明确敏捷开发不是一个技术,而是一种方法,或者说是软件开发的流程;这种开发方式的主要驱动核心是人。

常见的瀑布开发模型是以文档为驱动的,在瀑布的整个开发过程中,要写大量的文档,把需求文档写出来后,开发人员都是根据文档进行开发的,一切以文档为依据。而敏捷开发它只写有必要的文档,或尽量少写文档,敏捷开发注重的是人与人之间,面对面的交流,所以它强调以人为核心。

2.什么是迭代?

迭代是指把一个复杂且开发周期很长的开发任务,分解为很多小周期可完成的任务,这样的一个周期就是一次迭代的过程;同时每一次迭代都可以生产或开发出一个可以交付的软件产品。

3.关键词Scrum

在了解敏捷开发或者查阅相关文档资料时,常会遇到一个关键词Scrum,简单解释一下:

敏捷是一种指导思想或开发方式,但它没有明确告诉我们到底采用什么样的流程进行开发,而Scrum就是敏捷开发的具体方式了,是一个包括了一系列的实践和预定义角色的过程骨架(是一种流程、计划、模式,用于有效率地开发软件)。(Scrum的英文意思是橄榄球运动的一个专业术语,表示“争球”的动作)

接下来,我们就需要知道敏捷开发到底如何帮助我们:

我们知道任何一个工作都是有流程的一个软件的开发过程大致如下: 

项目启动→建立产品原型→形成效果图→进入研发阶段→研发成功后进入测试阶段→测试过后将问题反馈给研发人员进行调整-→多次测试确认没有bug。

这就是一个完整的开发过程。而敏捷开发就对每一个节点进行了规范和指导。

下面提供一个具体的开发案例,可以快速了解敏捷开发的流程:

1.定义团队中的角色。

在敏捷开发中,有三类角色:利益相关者(stakeholder) 产品所有者(product owner) 开发团队(developer team(scrum master))。其中在开发团队中包含了Business Analysis(业务分析师)、 Developer(研发人员) 、Tester(测试人员)、 Technical Architect(架构师)、UserInterfaceDesigne(UI设计师)对于利益相关者需要关心产品,可交付可使用的产品。对于产品所有者,他需要去规划这个产品,从开发团队获得反馈。

2.我们首先需要确定一个Product Backlog(按优先顺序排列的一个产品需求列表),这个是由Product Owner负责的;

3.敏捷开发团队根据Product Backlog列表,做工作量的预估和安排;

4.有了Product Backlog列表,我们需要通过 Sprint Planning Meeting(Sprint计划会议) 来从中挑选出一个Story作为本次迭代完成的目标,这个目标的时间周期是1-4个星期,然后把这个Story进行细化,形成一个Sprint Backlog;

5.Sprint Backlog是由Scrum Team去完成的,每个成员根据Sprint Backlog再细化成更小的任务(细到每个任务的工作量在2天内能完成);

6.在Scrum Team完成计划会议上选出的Sprint Backlog过程中,需要进行 Daily Scrum Meeting(每日站立会议),每次会议控制在15分钟左右,每个人都必须发言,并且要向所有成员当面汇报你昨天完成了什么,并且向所有成员承诺你今天要完成什么,同时遇到不能解决的问题也可以提出,每个人回答完成后,要走到黑板前更新自己的Sprint burn down(Sprint燃尽图);

7.做到每日集成,也就是每天都要有一个可以成功编译、并且可以演示的版本;目前我们并没有实现每日集成但我们已经在使用的jenkins就有这个功能,它可以支持在服务器上自动获取最新版本,然后在服务器中编译,如果通过则马上再执行单元测试代码,中间有任何失败,都会用邮件通知相关人员立刻跟进。并且定期产出报表,监控项目进展与质量

8.当一个Story完成,也就是Sprint Backlog被完成,也就表示一次Sprint完成,这时,我们要进行Srpint Review Meeting(演示会议),也称为评审会议,产品负责人和客户都要参加(最好本公司老板也参加),每一个Scrum Team的成员都要向他们演示自己完成的软件产品(这个会议非常重要,一定不能取消);

9.最后就是Sprint Retrospective Meeting(回顾会议),也称为总结会议,以轮流发言方式进行,每个人都要发言,总结并讨论改进的地方,放入下一轮Sprint的产品需求中;

对于上文提到了一些场景,示例如下:

Product Backlog 的示例

每日的站立会议:参会人员可以随意姿势站立,任务看板要保证让每个人看到,当每个人发言完后,要走到任务版前更新自己的燃尽图。

图片1

任务看版:任务看版包含 未完成、正在做、已完成 的工作状态,假设你今天把一个未完成的工作已经完成,那么你要把小卡片从未完成区域贴到已完成区域。每个人的工作进度和完成情况都是公开的,如果有一个人的工作任务在某一个位置放了好几天,大家都能发现他的工作进度出现了什么问题

10

图片3

五、总结

至此,基本上通过上文可以了解什么是敏捷开发,以及对敏捷开发的过程有了一个感性的认识。之所以说是感性认识是因为文中并敏捷开发的方方面面进行介绍。这里提到的只能说是冰山一角,例如测试驱动开发,如何高效开展站立会,怎样利用任务版等核心内容都没有展开介绍。敏捷开发精髓并非三言两语可以表述并理解,这部分内容将会另起炉灶,详细介绍例如对于任务版,我会会推荐一个在线工具:teambition。这个工具可以提高项目、进度、人员管理的效率(附录会先提供一个案例)。

事实上,我们有些团队已经在实践敏捷开发中的一些方法和工具,如站立会、jenkins、单元测等。但这些并没有形成统一的规范和指导,应用也不充分,如对jenkins的使用。一些好的方法,技术和工具应该分享推广,甚至形成指导文档和方案(例如对后台新框架就缺乏指导文档,自行学习摸索的成本较高,效率较低)。这些技术和文档逐渐形成并留存,将形成宝贵的公司资产。

最后,我想说敏捷开发并不是万能的。甚至有一篇《为什么Scrum不行?》文章详细指出了敏捷开发的缺点。例如工作任务紧,无法贯彻持续执行,对敏捷开发流程不熟,需要学习成本等。但对于一个新概念、新方法,我们应该秉持积极的态度,了解、学习、消化、实践。最终目的在于改善我们的工作和产品。本人并非精通敏捷开发,但在学习实践的过程中就收货颇丰。在此分享一些建议和意见,希望提供一些灵感,激发更多的思考。文后提供了一些优秀的敏捷开发方面的文章,本文中也借鉴了其中的部分内容。鉴于篇幅就不摘录介绍,感兴趣的可以详细阅读学习,相信会有更多收获。期望会有更多讨论和分享,发表各自看法和意见,产生更多灵感和创意火花。

六、部分参考

《敏捷软件开发基础: 持续集成环境的构建》http://www.ibm.com/developerworks/cn/java/j-build/

《敏捷开发中高质量 Java 代码开发实践》http://www.ibm.com/developerworks/cn/java/j-lo-agile/

《我的测试之旅》http://www.ituring.com.cn/article/1017

《为什么要敏捷开发,敏捷开发有什么好处?》http://qing.blog.sina.com.cn/2355431344/8c6507b0330007zf.html?sudaref=www.baidu.com

《我们需要什么样的敏捷开发?》http://developer.51cto.com/art/201402/430304.htm

《蒋炜航:敏捷开发的实战经验》http://developer.51cto.com/art/201301/378700.htm

《敏捷开发之Scrum扫盲篇》 http://www.cnblogs.com/taven/archive/2010/10/17/1853386.html

《为什么Scrum不行?》http://coolshell.cn/articles/5044.html

分享到:

发表评论

昵称

沙发空缺中,还不快抢~