关于敏捷开发方法(Agile Software Development)的阅读笔记

  对“敏捷开发”(Agile Software Development)这个词,我是在这学期邹欣老师《现代程序设计》课上第一次听到的,刚听到时并不知道其具体指什么,只是从字面上直觉其意思应该是快速开发之类的。这次从 Agile Guide 、 The New Methodology 以及其他一些中文资料上较为详细地了解了敏捷开发方法及其与传统开发方法相比的优势所在,收获颇丰。下面谈谈在这次阅读中所学习到的东西。

一、什么是敏捷开发方法

  通常而言,敏捷开发方法是一种以人为核心的、循环的、迭代的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态(来自百度百科)。我想,其关键之处在于迭代。

二、敏捷开发方法的核心思想:适应变化(Adaptive)和以人为中心(people-oriented)

  软件开发方法的发展经历了从没有、到繁重的工程方法、再到敏捷开发方法的过程。早起软件开发方法没有完整的规划,是一个短期的、即时的、边写边改的、组合的过程,当系统很小时这种方法可能很有用但是当系统较大时就无能为力了;为了改变这种状况,引进了”方法论“(methodology)的概念,借鉴工程领域的实践提出了规划驱动的方法(plan-driven methodologies)或工程方法(engineering methods)。为了让软件开发更具可预测性(predictable)和更有效率(efficient),强调在软件开发前制定详细的规划来约束开发过程,但成效也并不显著;后来诞生了敏捷开发方法,这种方法企求在无过程和繁重的过程(no process and too much process),也就是上述两种方法中找到一个平衡点,以不多的步骤过程获得合理的刚刚好的结果。其核心有两方面:

  ※ 强调适应性(adaptive)而非预测性(predictive):不是先制定详尽的需求计划然后按着计划按部就班地做,而是先做出个雏形,然后根据需求的细化或变化进行迭代开发,对需求做出充分的响应。从某种程度上说,这种开发方法不仅不忌讳需求的变化甚至在开发的过程中需求变化得越细越明确,其产品结果越好。

  适应性不仅指在开发过程中修改软件来适应需求的变化,更包括自适应的过程,即通过每个阶段的回顾和总结来(What did we do well? What have we learned? What can we do better? What puzzles us?)来发现自身的问题,继而选择一个更合适的方式或过程来进行开发工作,从而不断完善开发过程。

  ※ 强调以人面向人而不是面向过程(people-oriented rather than process-oriented):工程方法强调事先制定详尽的过程(process)以便让参与进来的人都能按照计划按部就班地做好工作,而敏捷开发方法断言制定过程不能作为一个开发团队技能的组成部分,其角色是支持团队的开发工作。在开发过程中,应以人为中心,让他们与应用领域的业务专家充分接触来汲取业务方面的专业知识,合理安排成员的工作,合理评价、衡量每个人的工作成果,从而成为一个高效的、有责任的开发团队。

三、敏捷开发的价值观

  在极限编程四个价值观的基础上扩展到五个:Communication(沟通), Feedback(反馈), Simplicity(简易), Courage(勇气), Respect(谦逊)

四、具体的敏捷开发方法

  xp(extreme programing)极限编程、Scrum、Crystal、Context Driven Testing、Lean Development精益开发、(Rational) Unified Process等

五、对敏捷开发方法与传统工程方法的对比的一些看法

  读完这篇文章 (The New Methodology) ,我觉得这两种开发方法最大的不同在于着眼点的天壤之别,即 adaptive process 与 predictive process 的区别。

  对于敏捷开发来说,强调适应性

“It is adaptivity in the context of a project adapting its software frequently to meet the changing requirements of its customers.”

  而对工程方法来说,着重通过完整的需求制定具有预测性的计划

“Everything else in software development depends on the requirements. If you cannot get stable requirements you cannot get a predictable plan.”

   1、开发过程的差异。

  传统的工程方法(或如文章中所说,成为规划驱动方法)强调先详细了解客户的需求,然后分析需求并制定周密的开发计划,可称之为 “规划编程”。但是想了那么多、那么全面、那么复杂值得吗?要知道,计划是赶不上变化的。相反,采用敏捷开发的方法,关键是先搭出个总体的框架,不要太在意与细节;然后在实践的过程中不断补充、添加细节,在实践的过程中不断完善,一有新的两点就可以加进来,这样不仅能完成任务,而且灵活性很大,给开发过程中产生的很多奇思妙想以实现到项目中的机会,大大提高了项目的质量,从某种程度上也大大减少甚至避免了规划编程的一个很大的缺点——deadline的压力。积少成多,日积月累、集微致盛的哲理在这里得到现和运用。

  2、需求变化所带来的影响的差异。

  通常,在开始的时候,客户并不真正知道自己想要什么,他们只是有个相当模糊的想法说自己想要个什么样的、能干什么事的软件,传统开发方法在开始前需要想法设法地去探寻客户到底要什么,在这方面它们投入很多,但是结果往往是他们的产品并不是很贴近用户所需,更甚,这时用户不可避免地有新的需求补充,这对开发者来说是致命的打击,不管是在精神上还是在精力上、开发过程上。敏捷开发则不同,它先把一次两次迭代开发的产品拿给用户初步体验,用户在使用这个产品的过程中越发清晰地体会到了哪些功能是有价值的哪些是可以舍弃的,越发明白他们自己到底想要什么样的东西。与此同时,开发者也越来越清楚地知道用户要什么,在下次迭代中应该侧重于哪些方面的开发,这样就达到了 ”双赢“ !这可以说是对用户需求会不断变化这一令人头疼的现实的充分利用,在这里,!"A late change in requirements is a competitive advantage",用户需求的变化成为了一个优点,与传统开发方法害怕用户需求变化形成了鲜明的对比!!!

  3、产品偏离用户需求的程度的差异

  

  传统工程方法design在整个开发时间中所占的比重很大,一旦制定完规划后便付诸实践,这个实践所占的比重一般比 design 少。只要做好design,其开发速度便可以变得很快,因为每一步都规划好了,只要按部就班就可。但也正因为其按初期的需求分析进行开发,在开发过程中缺少与用户需求方面的继续沟通,导致了一个致命缺点——这时,初期需求分析的失之毫厘很可能导致最后产品与用户的需求差之千里,导致”徒劳一场“;而迭代开发则是 ”In an adaptive process“—— 在最后定稿前的每个迭代过程都充分与客户交流,一有偏差就改正,这样就更早地发现了不符合需求的地方并及时解决,把产品与需求的差异扼杀在摇篮中,可以说开发的过程就是不断解决现实与需求之差异的过程,就是不断修正的过程,最后自然而然地非常接近用户真正想要的东西,从这方面来看,敏捷开发甩传统的开发过程几条街!

  4、产品的衡量标准的差异

  传统开发方法由于是按需求分析来做的,因此衡量一个产品是否成功在于是否很好地符合根据需求做出的计划,是否准时和物符所值(on-time and on-cost);

而敏捷开发则看中经济效益——对客户来说产品的价值是否比其投入更多,即是否物超所值。如问文章中所说:” A good predictive project will go according to plan, a good agile project will build something different and better than the original plan foresaw.“

  

就个人的理解,我想或许我们可以说,迭代过程中体现出来的适应性(adaptive)是敏捷开发方法的精髓,也是它如此备受推崇的核心优势之所在!

附:敏捷宣言的十二条原则     敏捷宣言遵循的价值观

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

phpbreak跳出几层循环_PHP跳出循环之“break”

前面给大家讲解了PHP控制循环语句,知道了,当我们的程序块满足一定的条件后才会跳出循环,而跳出循环则是使用我们的break或者continue关键字。本章,将会先给大家讲解“break”跳出循环。在前面的讲解PHP循环控制语句“while”循环的…

Vuex 4.0 正式发布!新年,官方生态齐聚一堂。

Vuex 4 官方版本正式发布。Vuex 4 的重点是兼容性。Vuex 4 支持 Vue 3,但是仍然提供了与 Vuex 3 完全相同的 API,因此用户可以在 Vue 3 中直接复用他们现有的 Vuex 代码。下文会把破坏性的改动列出来,请注意查看。在源码的 example 文件夹[1]…

原生js实现给指定元素的后面追加内容

参考链接:http://www.jb51.net/article/35412.htm 原生js实现给指定元素的后面追加内容 var header1 document.getElementById("header"); var p document.createElement("p"); // 创建一个元素节点 insertAfter(p,header1); // 因为js没有…

文档中根元素后面的标记格式必须正确。

文档中根元素后面的标记格式必须正确。 php或其它语言动态输出的xml&#xff0c;最开始<标记 前面有空格&#xff0c;最后面>标记 后面有 空格 导致xml解析出错 解决办法: var data:String evt.target.data;//兼容FireFox, php输出的xml data data.substr(data…

lstm数学推导_如何在训练LSTM的同时训练词向量?

你本来也不用自己手动进行词向量更新啊&#xff0c;你搞这么一出最后收敛到0那不是必然的么&#xff1f; 霍华德 老师的答案已经给你推导出来了。实际上你问的这个问题很简单——只要把Embedding层本身也当成模型参数的一部分就可以了&#xff0c;一开始不使用外部词向量&#…

Javascript在页面加载时的执行顺序(转载)

原文&#xff1a;http://dancewithnet.com/2007/03/22/order-of-execution-of-javascript-on-web/ 一、在HTML中嵌入Javasript的方法 直接在Javascript代码放在标记对<script>和</script>之间由<script />标记的src属性制定外部的js文件放在事件处理程序中&a…

TClientDataSet[27]: 字段值的约束(或叫输入限制)

Required、Precision、MaxValue、MinValue:begin{ Required: 必填字段 }with TIntegerField.Create(Self) do beginFieldName : ID;Required : True;DataSet : ClientDataSet1;end;{ Precision: 浮点数精度}with TFloatField.Create(Self) do beginFieldName : Float;Precision…

年度总结文章的抽奖结果公布

大家好&#xff0c;我是若川。2月4日&#xff0c;发表了我的2020年度总结文章《若川的2020年度总结&#xff0c;水波不兴》&#xff0c;本以为阅读量应该突破一千会比较快&#xff0c;实际上比较艰难&#xff0c;而且还掉粉10来人。2020年运营公众号以来&#xff0c;不知不觉发…

php 正则表达式 匹配中日韩字符(GBK)

转载链接&#xff1a;http://www.cnblogs.com/ITEagle/archive/2013/01/14/2859775.html 首先是这些非英文字符的编码范围&#xff1a; 这里是几个主要非英文语系字符范围 2E80&#xff5e;33FFh&#xff1a;中日韩符号区。收容康熙字典部首、中日韩辅助部首、注音符号、日本假…

linux多线程求和_linux 多线程信号处理总结

linux 多线程信号总结(一)1. 在多线程环境下&#xff0c;产生的信号是传递给整个进程的&#xff0c;一般而言&#xff0c;所有线程都有机会收到这个信号&#xff0c;进程在收到信号的的线程上下文执行信号处理函数&#xff0c;具体是哪个线程执行的难以获知。也就是说&#xff…

Elon Musk

人物事件 成长学习 1971年6月28日&#xff0c;埃隆马斯克在南非的比勒陀利亚出生&#xff0c;他的 埃隆马斯克 父亲是一名南非机电工程师&#xff0c;母亲是加拿大人&#xff0c;从事营养师兼模特。[8] 1981年&#xff0c;10岁的马斯克就拥有了自己的第一台电脑&#xff0c;并…

真诚推荐这7个大佬的公众号,碎片化学习

逆水行舟&#xff0c;不进则退。我们的工作已经占用了大块的时间了&#xff0c;剩下的只有各种碎片&#xff0c;最适合碎片时间学习的&#xff0c;莫过于优质的技术干货公众号啦~以下这些是小编精选&#xff0c;里面有很多资讯和资源&#xff0c;内含干货&#xff0c;希望能给大…

[转]Windows 7 产品密钥是否安全

提到Windows 7&#xff08;或Windows Server 2008&#xff09;有些人认为自己的产品密钥&#xff08;Product Key&#xff09;很安全&#xff0c;甚至在公司内部有些网管也认为公司部署的Windows 7 系统的密钥不会泄露。但其实并非如此&#xff0c;众所周知我们的密钥都是写在注…

HttpWatch的Result中出现Aborted的原因分析[配图]

转载链接&#xff1a;http://www.cnblogs.com/yutiansanshou/archive/2013/02/01/2889486.html 我们在使用HttpWatch进行Web调试的过程中有时候会看到非HTTP Status Code&#xff08;状态码&#xff09;的值&#xff0c; 例如&#xff1a;(Aborted)。 (Aborted)是HttpWatch中定…

android显示布局边界的边距_Android设计规范 Material Design-Layout(2 度量与边框)

度量与边框基准网络所有组件都与间隔为8dp的基准网格对齐。排版/文字(Type)与间隔为4dp的基准网格对齐。在工具条中的图标同样与间隔为4dp的基准网格对齐。这些规则适用于移动设备、平板设备以及桌面应用程序。有关详细信息请参见组件一节。有关详细信息请参见字体排版一节。边…

《大规模分布式系统架构与设计实战》

《大规模分布式系统架构与设计实战》 基本信息 作者&#xff1a; 彭渊 丛书名&#xff1a; 大数据技术丛书 出版社&#xff1a;机械工业出版社 ISBN&#xff1a;9787111455035 上架时间&#xff1a;2014-2-21 出版日期&#xff1a;2014 年2月 开本&#xff1a;16开 页码&…

WINDOWS下的squid

今天写这篇教程目的在于分享自己在WINDOWS主机下配置squid的方法。哪些地方写的不完善或是不完整或是需要修改的地方&#xff0c;大家可以提出。我会第一时间纠正。下面看正文部分。先提条件&#xff0c;您预安装配置squid的这台计算机必须是联入网络的&#xff0c;系统版本是w…

Provide/inject 真的可以取代 Vuex 吗?

Hello&#xff0c;各位小伙伴&#xff0c;接下来的一段时间里&#xff0c;我会把我的课程《Vue.js 3.0 核心源码解析》中问题的答案陆续在我的公众号发布&#xff0c;由于课程的问题大多数都是开放性的问题&#xff0c;所以我的答案也不一定是标准的&#xff0c;仅供你参考喔。…

php 计算代码执行时间

转载链接&#xff1a;http://blog.csdn.net/php_boy/article/details/6450678 class runtime {var $StartTime 0;var $StopTime 0;function get_microtime(){list($usec, $sec) explode( , microtime());return ((float)$usec (float)$sec);}function start(){$this->S…

参数方程求二阶偏导_偏微分方程

常微分方程&#xff08;ODE&#xff09; 的时候我们更多是关于时间的导数。偏微分方程&#xff08;partial differential equation) 则不仅仅是与时间相关&#xff0c;加上了与空间位置相关的一些信息。解当 ODE 满足 利普希茨连续&#xff08;Lipschitz continuity&#xff09…