Wiki: http://en.wikipedia.org/wiki/Agile_software_development
在按照我的理解方式审查了软件开发的生命周期后,我得出一个结论:实际上满足工程设计标准的惟一软件文档,就是源代码清单。
简介
2001年,为了解决许多公司的软件团队陷入不断增长的过程泥潭,一批业界专家一起概括出了一些可以让软件开发团队具有快速工作 、响应变化能力的价值观和原则,他们称自己为敏捷联盟。敏捷开发过程的方法很多,主要有:SCRUM,Crystal,特征驱动软件开发(Feature Driven Development,简称FDD),自适应软件开发(Adaptive Software Development,简称ASD),以及最重要的极限编程(eXtreme Programming,简称XP)。极限编程(XP)是于1998年由Smalltalk社群中的大师级人物Kent Beck首先倡导的。
极限编程
设计和编程都是人的活动。忘记这一点,将会失去一切。
极限编程(XP)是敏捷方法中最著名的一个。它是由一系列简单却互相依赖的实践组成。这些实践结合在一起形成了一个胜于部分结合的整体。
下面是极限编程的有效实践:
敏捷开发
人与人之间的交互是复杂的,并且其效果从来都是难以预期的,但却是工作中最重要的方面。
敏捷软件开发宣言:
虽然右项也有价值,但是我们认为左项具有更大的价值。
当软件开发需求的变化而变化时,软件设计会出现坏味道,当软件中出现下面任何一种气味时,表明软件正在腐化。
敏捷团队依靠变化来获取活力。团队几乎不进行预先设计,因此,不需要一个成熟的初始设计。他们更愿意保持设计尽可能的干净、简单,并使用许多单元测试和验收测试作为支援。这保持了设计的灵活性、易于理解性。团队利用这种灵活性,持续地改进设计,以便于每次迭代结束生成的系统都具有最适合于那次迭代中需求的设计。为了改变上面软件设计中的腐化味,敏捷开发采取了以下面向对象的设计原则来加以避免,这些原则如下:
上述中的包的概念是:包可以用作包容一组类的容器,通过把类组织成包,我们可以在更高层次的抽象上来理解设计,我们也可以通过包来管理软件的开发和发布。目的就是根据一些原则对应用程序中的类进行划分,然后把那些划分后的类分配到包中。
下面举一个简单的设计问题方面的模式与原则应用的示例:
问题:
选择设计运行在简易台灯中的软件,台灯由一个开关和一盏灯组成。你可以询问开关开着还是关着,也可以让灯打开或关闭。
解决方案一:
下面图1是一种最简单的解决方案,Switch对象可以轮询真实开关的状态,并且可以发送相应的turnOn和turnOff消息给Light。
解决方案二:
上面这个设计违反了两个设计原则:依赖倒置原则(DIP)和开放封闭原则(OCP),DIP原则告诉我们要优先依赖于抽象类,而Switch依赖了具体类Light,对OCP的违反是在任何需要Switch的地方都要带上Light,这样就不能容易扩展Switch去管理除Light外的其他对象。为了解决这个方案,可以采用ABSTRACT SERVER模式,在Switch和Light之间引入一个接口,这样就使得Switch能够控制任何实现了这个接口的东西,这也就满足了DIP和OCP原则。如下面图2所示:
解决方案三:
上面图2所示解决方案,违返了单一职责原则(SRP),它把Switch和Light绑定在一起,而它们可能会因为不同的原因而改变。这种问题可以采用ADAPTER模式来解决,适配器从Switchable 派生并委托给Light,问题就被优美的解决了,现在,Switch就可以控制任何能够被打开或者关闭的对象。但是这也需要会出时间和空间上的代价来换取。如下面图3所示:
敏捷设计是一个过程,不是一个事件。它是一个持续的应用原则、模式以及实践来改进软件的结构和可读性的过程。它致力于保持系统设计在任何时间都尽可能得简单、干净和富有表现力。
从4月中旬开始,我们部门进行了破天荒有史以来第一次敏捷项目实践,两周的时间虽然 不长,但是整个团队感觉无论从技术上,还是沟通与合
作上,都有很大收获。当然,还有很多我们事先没有想到的纰漏和问题,经过与团队每个成员的面谈,我为后续的迭代整理出了下列的优化流程。
说明:
◇在下面的流程中着重迭代开始的规划和迭代中,开发团队与测试团队的协作过程,对PO的review会议和回顾会议没有做详细阐述
◇本流程仅针对我们目前特有的项目,有些特征不具有一般性。
◇其中使用到的一些缩略用语
PM: 项目经理/项目负责人/项目协调人
US/us: user story
PB: product backlog
PO: Product Owner
1. PM根据上个迭代的结果,对已有的PB做修正,添加需要修正的BUG,未完成的us等,并提交给PO作为参考
2. PO根据PB和自己的业务需求,并根据优先级 顺序,提出本次迭代希望完成的us和PB; 并对这些us和PB的细节部分进行整理
3. PO将整理后的us和PB提交给PM
4. PM提前一天将po提交的文档作为planning meeting会议提纲的一部分,分发给项目团队
5. 项目团队成员仔细研究PO的需求,并记录自己针对业务需求和逻辑的想法或疑问
6. PRODUCT PLANNING会议
a) 参与者:PO,PM,开发团队、测试团队
b) 过程
i. 项目团队对PO提出的需求进行讨论, 并由会议记录人记录每个us的细节
ii. 涉及到某个业务细节,讨论的时间不超过5分钟, 并且最终拍板权在PO手中
c) 会后
i. 由会议记录人负责,将本次迭代涉及到的us 其描述和相关细节,直接建立在部门内部的 wiki中
记录形式:所有的us按照迭代的周期不同 放在不同的page中,每个us以 panel相包裹
7. ITERATION PLANNING会议
a) 参与者:PO(可选),PM,开发团队、测试团队
b) 过程
i. 根据us和记录的PB,对本次迭代的任务进行 拆分和估算
ii. 要考虑各个任务之间的前后逻辑关系, 以确定优先顺序
注意:估算时,应该把DEBUG的时间也要考虑在内
iii. 如果估算的时间超过了本次迭代的可用时间,那么PM找PO进行协调,请求放弃不能完成的US和PB
c) 会后
i. 会议记录人负责将会议中最后确定的任务分配情况提交给PM
ii. PM在jira中建立任务并分配到人
使用us作为jira中的COMPONENT
同时使用us作为一个task的名称,将与该us相关的任务作为subtask作为us task的子问题
8. DBA 可以开始考虑在数据库中进行建表等操作了
9. ITERATION DESIGN会议
a) 参与者:PM,开发团队、测试团队
b) 过程
i. 根据本次迭代要完成的任务,开发团队与测试团队确定每个us和PB 要验收测试所涉及到的代码接口
ii. 开发团队使用类图、顺序图等uml工具,对 代码中的一些接口和调用方法进行名称的定义
iii. 可以使用照相手机等工具,把白板上绘制的简要图表拍摄下来,并上传至部门的wiki中
10. PM准备一个项目变更日志,用来记录迭代中,某时间点发生的变化,包括下列内容
a) 数据库字段的变化
b) us的细节的补充
c) ......
注意:对该日志的访问必须方便和直观
下面进入开发阶段
11. 开发团队
a) 采用tdd的方式,完成各自的任务
b) 每当一个任务中的细小任务完成,并确认在 本地编译无错误,而且单元测试都可以通过后, 才允许上传到ci服务器
c) 上传完成后,开发人员要注意即时监控ci服务器的反应, 如果有问题,马上进行解决
d) 当开发人员确认自己的任务完成后,对应的sub task可以解决, 并且记录工作实际完成时间
e) 每个任务的完成,都有可能触发一次CODE REVIEW的过程
i. 如果发现问题,或者需要对代码进行重构, 在完成后,负责人要修正任务的实际工作完成时间
f) 团队针对一项任务的CODE REVIEW结束,并且负责人修改完成后,该负责人可以针对自己剩余商未开始的任务,调整估算的时间,
12. 测试团队
a) 负责维护测试库
b) 并且要根据与开发团队定义好接口, 撰写针对每个us的自动化测试脚本, 准备自动化测试的TEST SUITE
13. PM
a) 当一个us相关的任务都完成后,PM修改jira中的us task的状态,变更为"等待集成测试",并通知相关的开发人员和测试组 马上对
该us进行集成测试,并在测试完成 后,马上进入修正阶段
14. 在这个过程中,如果任何人发现US有任何不完整的地方, 都应马上与PM和PO进行协调和沟通,如果需要马上补漏的, 发现者应该对wiki中
的相关us进行补充。如果不需要在本次 迭代中进行考虑,那么PM应该记录到项目变更日志中
15. 开发人员仍然要坚持每日立会,每日立会后,PM更新BURNDOWN CHART
16. 项目中用到的一些特殊的技术,可以考虑在某日立会之后, 用半个小时左右的时间,该技术的掌握者向整个团队分享该知识
进入迭代收尾阶段
17. 所有的us都已经完成(测试团队完成验收测试,开发团队修正完毕并且无误)
18. PO REVIEW 会议
19. 团队回顾会议
Agile
敏捷开发
Backlog
一项工作
Build
值软件编译构建好的一个可运行的版本
Burndown chart :
用来显示当前还剩下多少工作未完成的图形化工具。通常以时间为横轴,本次迭代要完成的工作为纵轴。
Code Review
代码审核,通常由非代码编写者完成。
Daily Scrum Meeting :
每日 Scrum 会议。每天 15 分钟的每日例会 , 每个人回答三个问题:上次例会到现在我完成了哪些工作;在下次例会前我将完成哪些工作;有没有什么事情阻碍了我的工作。
In Progress :
进行中
Product Backlog :
产品功能特性列表,主要由产品责任人负责维护并定义优先级。
Product Backlog Item :
产品功能特性列表中的条目,每个条目就是一个工作单元,大小必须限制在团队可以在一个迭代内完成,同时一个工作单元可以被分解成许多任务。
Product Owner :
产品责任人。负责确定 Backlog 中各条目的优先级,同时解决所有关于需求的问题。
Safari
苹果操作系统上的浏览器
Scrum
Scrum 一词来自英式橄榄球,它把软件开发团队比作橄榄球队。 Scrum 是当今流行的敏捷开发方法之一。
Scrum Master
负责管理每日 Scrum 流程的人,是 Product Owner 和 Team 之间的桥梁,推动双方的合作,负责为 Team 成员解决障碍和问题,保证他们工作的进行。相当于传统项目的项目经理或主管。
代表 Scrum 的一次迭代,周期通常是 30 天。期间不能给 Team 增加额外的需求,确保迭代结束时能够获得预期的结果。
Sprint Planning Meeting :迭代开始之前的计划会议,由 Team 与 Product Owner 之间商讨本次迭代的目标,决定本次迭代要完成哪些工作。
Sprint Review Meeting :
Sprint 评审会议。在迭代结束时召开, Team 展示这个迭代中完成的功能,一般是以 Demo 本迭代中完成的功能的形式来展示。
Sprint Retrospective Meeting :
Sprint 回顾会议。在一个迭代的评审会议之后召开,由 Team 与 ScrumMaster 共同讨论这个迭代中哪些地方做得比较好,哪些地方需要改进。使团队持续成长。
Stakeholders :
利益相关者。项目成败对他们影响不大的一类人,参与提出产品的需求,积极提出反馈意见。
Sprint :
Task
任务
Team :
跨功能的 Scrum 团队,人数限制在 5-9 人,可能包括的角色有开发人员、架构师、测试人员、 UI 设计师等。是一个自组织的团队,他们自己决定如何最好地满足用户需求,并承担责任。
User Story :
用户故事 ( 情景 ) ,从用户的角度,对系统的某个功能模块所做的简短描述。
wiki:
维基百科,是一种开放和共享的在线文档编辑系统,任何人都可以在系统中编辑修改文档。最早的应用是在线开放式的百科全书,现在广泛应用于各种文档系统。