zoukankan      html  css  js  c++  java
  • 敏捷软件开发理念了解

     

    学习思路:是什么?为什么?怎么办?

    一、敏捷开发是什么?

    1、敏捷宣言

    个体和交互       胜过  过程和工具

    可以工作的软件   胜过  面面俱到的文档

    客户合作  胜过  合同谈判

    响应变化  胜过  遵循计划

    2、原则:

      1) 尽早的、持续的交付有价值的软件以满足客户,是我们优先要做的首要任务。

      2)拥抱需求变更,甚至是在开发的后期。敏捷过程利用变更为客户带来竞争优势。

      3)经常交付可以工作的软件,从几周到几个月,交付时间越短越好。

      4)在整个项目开发期间,业务人员和开发人员必须每天在一起工作。

      5)围绕斗志高昂的人来构建项目。为他们提供所需的环境与支持,并且信任他们能够完成工作。

      6)在团队内部最高效的传递信息的方式是面对面的交谈。

      7)可以工作的软件是进度主要的度量标准。

      8)敏捷过程倡导可持续发展。出资人,开发者和用户应该尽可能保持稳定的开发速度。

      9) 保持关注先进的技术与设计有助于提高敏捷性。

      10)简单---尽量减少工作量的艺术是至关重要的。

      11) 最好的架构、需求、设计来源于自我组织的团队。

      12)每隔一段时间,总结反思如何让团队变得更高效,并相应地调整自己的行为。

    3、从市场角度思考:满足变化的市场需求以获利

    1)用户价值:

    人:当市场发生变化时,根据市场反馈的信息和个人经验快速灵活的调整产品,使产品重新满足市场需求,占领市场先机。

    产品:产品在满足当前需求情况下,最小化时间和金钱成本,最大化商业价值;同时当需求变化时,产品能够以较低时间和金钱成本满足新需求以获取商业价值。

    2)团队价值

    人:为满足变化的需求,需要发挥人的创造力,要创造就要给予人更大的自由度。鼓励团队成员不断的学习和尝试新技术和新思想,不要思维固化。为了避免混乱,敏捷开发前提是 成员自我管理能力较高、团队达成共识、成员专业能力较强。

    产品:软件必须能够适应变化的需求,必须在最低时间和金钱成本下,对功能进行增删改查。

    3)直接沟通和信息反馈

    减少因沟通不畅,导致获取不到必要的信息,导致最终产品与真实需求偏离过大。

    问题:开发前期一大堆文档,最终产品无法满足客户重要需要且多出很多几乎不用的功能。解决:通过经常的面对面的直接交谈获取用户真实的需求,弱化中间介质文档。客户也是逐渐认识自身需求的。

    问题:开发中后期,市场变化了,用户需要对功能简单进行增删改,找到软件开发公司,却发现修改及其困难!解决:软件开发整个周期,甚至投入使用后,必须考虑可拓展性和灵活性。

     

    二、为什么提倡敏捷开发?---开发中遇到问题:

    1、僵化性:很难对程序进行改动,因为每个改动都会迫使许多对系统其它部分作出改动;

    2、脆弱性:程序的改动往往会导致一些无关的地方出现问题;

    3、顽固性:很难解开程序的纠结,使之一些功能成为其它程序能够公用的组件;

    4、粘滞性:即做正确的事情比做错误的事情要困难很多,程序对环境和某些不可预料的事情太过于依赖;

    5、不必要的复杂性:设计中包含不具任何直接好处的基础架构,换句话来说就是有设计过度的嫌疑,考虑的变化太多,导致系统过于复杂,影响当前功能的实现;

    6、不必要的重复:代码中有重复的结构,而该重复的结构本来可以使用抽象和接口进行统一。

    7、晦涩性:代码很难阅读,理解,没有很好的表现出意图;

    三、敏捷开发具体怎么做?--案例分析

    1、结合自身情况:结合你公司的现状,如组织结构、管理方式、规模、文化等;

    1)团队在透彻理解敏捷理念的基础上,灵活的选择或创造最适合自己的实践,避免教条化!当察觉自己陷入教条化时,要问自己敏捷开发是什么?为什么采用敏捷开发?怎么做?

    注释:教条化,也叫教条主义、本本主义,是一种僵化的态度。要么一切从已有理论出发,要么一切以主观出发,而不从实际出发,不客观思考,反对具体情况具体分析,否认实践是检验真理的标准。

    2Scrum--侧重于项目管理

    1)三大角色:

    产品负责人(Product Owner) 个人感觉就是:产品经理。

    主要负责确定产品的功能和达到要求的标准,指定软件的发布日期和交付的内容,同时有权力接受或拒绝开发团队的工作成果。

    敏捷教练(Scrum Master) 个人感觉就是:项目经理。

    主要负责整个项目中的顺利实施和进行,以及清除挡在客户和开发工作之间的沟通障碍,使得客户可以直接驱动开发。

    敏捷团队(Scrum Team)  个人感觉就是:开发团队。

    主要负责软件产品在Scrum流程下进行开发工作,人数控制在5~10人左右,每个成员可能负责不同的技术方面,但要求每成员必须要有很强的自我管理能力,同时具有一定的表达能力;成员可以采用任何工作方式,只要能达待办事项或迭代清单(Sprint Backlog)的目标。

    2Scrum--迭代开发流程:

    1)产品负责人确定产品列表(Product Backlog),按优先顺序排列;

    2)敏捷团队根据产品列表,做工作量的预估和安排;

    3)团队召开迭代计划会议(Sprint Planning Meeting) 从产品清单中挑选一个用户故事(Story)作为本次迭代完成的目标,这个目标的时间周期是1~4个星期,然后把这个用户故事进行细化,形成一个待办事项列表;

    4)每个成员根据待办事项清单再细化成更小的任务(细到每个任务的工作量在2天内能完成);

    5)每日站立会议,控制在15分钟左右,每个人都发言,内容:昨天做了什么,今天要做什么,是否需要帮助?会后大家在任务看板上更新自己的任务纸条。

    6)每日集成,每天下班前单元测试代码通过,签入代码并且编译通过;工具:TFSSVN

    7)当一个用户故事完成,也就是待办事项列表被完成,也就表示一次迭代完成,这时进行演示会议(Srpint Review Meeting),也称为评审会议,产品负责人和客户都参加,团队成员向他们演示自己完成的软件产品;

    8)最后就是 总结会议(Sprint Retrospective Meeting),以轮流发言,交流自己的收获和不足,放入下一轮迭代的产品需求中。

    注释:

    任务看板(白板、黑板)包含:未完成、正在做、已完成的工作状态,假设你今天把一个未完成的工作已经完成,那么你要把小卡片从未完成区域贴到已完成区域。

    2、极限编程(XP--侧重编程实践:

    1)价值观

    沟通:修改他人代码是要及时口头沟通,避免混乱和返工,文档、报表、计划来不及;

    简单:够用就好,不要冗余设计;

    反馈:经常与客户互动、单元测试、持续集成(签入编译成功)、

    勇气:重构、

    谦逊:互相尊重、编码规范

    1)实际操作

    (1)完整团队:业务人员或领域专家和开发人员尽可能在一个房间;

    (2)用户故事:从产品列表中提取来的一组重要需求,细化为可自行的待办事项列表;

    (3)短交付周期:前提条件是新版本有足够商业价值。

    (4)结对编程:一个编码一个检查,然后轮换;

    (5)测试驱动开发:先单元测试在编码;

    (6)重构:先编写代码在进行重构。

    (7)代码集体所有:共同所有共同负责。

    (8)持续集成:提前暴露集成问题。

    (9)隐喻:打比方,用客户听的懂的语言和客户交流。

    (10)计划游戏:软件的范围、下一次迭代的发布时间、用户故事的优先级应该由业务人员决定;而每个用户故事所需的开发时间、不同技术的成本、如何组建团队、每个用户故事的风险,以及具体的开发顺序应该有开发团队决定。

    (11)简单设计:反思“我们可以预测变化”和“需求不会发生改变”的错误,然后做出合适的设计。

    (12)编码规范:在编码中逐渐形成统一规范。

    (13)拒绝加班,丰富业余生活。

     

    五、对敏捷的常见误解:

    1、敏捷开发意味着不需要文档、设计和计划;

    2、敏捷只适用于小项目开发;

    3、敏捷只会对研发产生改变;

    4、管理者不需要亲自了解敏捷,只需要管理上支持就可以了;

    5、引入敏捷只需要按照既定的步骤去做就可以了;

    6、敏捷只是管理者的噱头,跟编码人员无关;

    7、敏捷只注重特性的快速交付,在敏捷下架构不重要了。

    极端错误:敏捷开发能解决一切实际问题,好像它是完美无缺的;反之,发现敏捷开发也有解决不了的问题时就全盘否定它的优点。

    六、设计原则

    1、SRP:单一职责原则

    思想:高内聚,低耦合;

    应用:一个类应该仅有一个引起它变化的因素。

    2、OCP:开发封闭原则

    对扩展是开发的:出现新需求,模块能够进行功能扩展。

    对于更改是封闭的:对模块扩展时,无需对原有程序代码或dal文件重新编译。

    方法:接口封装、抽象机制、多态思想。

     

    3、LSP:里氏替换原则

    子类可以替换父类并出现在父类能够出现的任何地方。

     

    4、DIP:依赖倒置原则

    高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。

     

    5、ISP:接口隔离原则

    模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来。

    思考:

    1遵循敏捷设计去发现问题;

    2应用设计原则去诊断问题;

    3应用设计模式去解决问题;

    注意:应用敏捷设计、设计原则、设计模式都是为了解决实际问题,切勿盲目套用,否则会导致设计难以理解的复杂性和代码的冗余。

    参考资料 1敏捷软件开发解读--华为2009

    http://wenku.baidu.com/link?url=Chsf6BgfKY0BCmOLUAq5qn6znhHe4-3HCNAEw4UYua3O_B6x817wqb3hBu3erBMopdGOqb6lyWnxDMgCmAPhEZlv2LTwnDr7DcHQ4glyWEa

    2敏捷开发之XP --博客园博客

    http://blog.csdn.net/fw0124/article/details/48713959

    3敏捷开发之Scrum扫盲篇 ---CSDN博客

    http://www.cnblogs.com/taven/archive/2010/10/17/1853386.html

    4、敏捷软件开发:原则、模式与实践(C#版)/Martin.R.C著 ,邓辉、孙鸣译

  • 相关阅读:
    liunx 用户切换 su sudo
    tomcat 虚拟目录
    如何用vue封装一个防用户删除的平铺页面的水印组件
    webpack入门学习手记(一)
    理解跨域及常用解决方案
    封装一个优雅的element ui表格组件
    使用Koa.js离不开这十个中间件
    深入理解let和var的区别
    编辑器IDE之VSCode
    WTF!! Vue数组splice方法无法正常工作
  • 原文地址:https://www.cnblogs.com/hao-1234-1234/p/6085649.html
Copyright © 2011-2022 走看看