ITPUB??ì3
ITPUB论坛 » 项目过程 » 敏捷软件开发:原则、模式与实践

标题: [精华] 敏捷软件开发:原则、模式与实践
离线 lawer-bbc
版主


精华贴数 2
个人空间 0
技术积分 17086 (53)
社区积分 2195 (509)
注册日期 2007-1-12
论坛徽章:107
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章ITPUB新首页上线纪念徽章  
      

发表于 2007-5-12 22:36 
TDD的三条军规

这些年来,我喜欢用下面这三条简单的规则来描述测试驱动开发:

   1. 除非这能让失败的单元测试通过,否则不允许去编写任何的产品代码。
   2. 只允许编写刚好能够导致失败的单元测试。 (编译失败也属于一种失败)
   3. 只允许编写刚好能够导致一个失败的单元测试通过的产品代码。

对于任何功能,一定要从编写它的单元测试开始;但是到了原则2,你就不能再为那个单元测试写更多内容。只要一出现该单元测试代码编译失败,或是断言失败,你就必须停下来开始编写产品代码;但是到了原则3,你就只能编写产品代码,直到让测试编译成功或通过断言为准。

仔细想想,就会发现如果不是去让一些东西编译或是执行,你就根本没办法去写代码。确实,这也正是关键所在。我们所做的任何事情(无论是写测试,写产品代码,或是重构),都要保持系统能够一直运行。跑通测试的时间间隔应该是以秒或是分钟级的,即使那只有10分钟,也都太长了。

想了解实际的操作过程,可以看看“保龄球游戏中的Kata”(译注2)一文。

现今有很多程序员,每当他们头一次听到这种技术的时候,会想:“这种做法太愚蠢了!”“这会让我慢下来,这是时间和精力的浪费,让我无法思考,无法设计,还会打乱我的思路。”然而,试想,当你走进一个房间,里面都是用这种方式工作的人们,会发生什么情况?你随便选个时间,随意找个人,一分钟以前,他们所有的代码都跑通过。

让我再重复一遍:一分钟以前每个人的代码都能跑通!不管你找谁,也不管你何时去找,一分钟以前他们所有的代码都跑通了!

如果你所有的代码自始至终都能跑通,那么你会多长时间用一次调试器?答案是,不会太经常。只要敲几下^Z就能很容易的恢复这些代码到跑通时的状态,然后再试着把前几分钟的代码写一遍即可。而如果你不经常调试,那么会省去多少时间呢?而现在你花在调试上的时间又有多少呢?一旦你有调试过,你又要花上多少时间来修复这些bug呢?如果你能够大大减少这些时间的话,又会如何呢?

好处还不只这些。如果你采用这种方法,那么每小时你都会产生好几个测试;每天就有十几个;每个月就几百个;一年下来,你所编写的测试就会有数千个。你可以保留着这些测试而且在任何你希望的时候去运行它们!什么时候运行它们呢?随时!只要你做了改动,就去运行它们!

有些代码已经混乱不堪了,可是我们为何不去清理它们呢?我们担心会破坏它们。但如果我们拥有测试,我们就有理由确信这些代码不会被破坏,或是说我们可以很快的就找到被破坏的地方。如果我们有了这些测试,我们就对代码发生改变无所忌惮。如果我们看到混乱的代码,或是一个不清晰的结构,可以毫无顾虑地清理它。因为有了测试,代码重新变得易修改了;因为有了测试,软件重新变“软”了。

好处还不只这些。如果你想要知道如何去调用一个特定的API,就会有一个测试能够告诉你;如果你想要知道如何创建一个特定的对象,就会有个测试能告诉你。你想知道的任何有关这个系统的,都有一个测试能够去示意。这些测试就像是小型的设计文档,小型的代码示例,描述了系统的工作和使用方式。

你是否曾经整合过一个第三方库到你的项目中呢?你拿到一本厚厚的精致的帮助文档,在结尾处,有一沓薄薄的示例附录。你会选择哪个去阅读呢?当然是示例了!那就是单元测试啊!它们是这份文档中最有用的部分;它们是如何使用代码的鲜活的例子;它们是极其详细、完全没有歧义的设计文档,相当的正规甚至可以执行,而且不会与产品代码相脱离。

好处还不只这些。如果你曾有过增加单元测试到一个可以工作的系统中的经历,你会发现那一点儿都不好玩。你很可能会发现想跑通测试,你一定是要么去改变系统中的部分设计,要么就在测试上作假。这是因为你试图去测试的系统并不是基于可测试设计的。例如,你想要测试某个函数f。然而,f调用了另外一个从数据库中删除记录的函数。在你的测试中,你不希望这条记录被删掉,但却没有办法来阻止它。这样的系统就不是基于可测试设计的系统。

当你遵循TDD的三条规则的时候,你的所有代码天生就可测试!而且另一个能形容“可测试”的词汇就是“可解耦”。为了单独的测试一个模块,你就必须把它解耦。所以TDD强制你去解耦这些模块。确实,如果你遵循这三条规则的话,你会发现你可能比起从前来能做出更多的解藕。这就强制了你去创造更好的,低耦合的设计。

收获了所有的这些好处,这些愚蠢的小规则实际上好像就没那么愚蠢了吧。他们实际上很可能是一些基本而又深刻的原则。确实,在我接触TDD之前我曾做过将近30年的程序员,我不认为曾有过什么人教过我什么非常奏效但又基本的编程实践。毕竟三十年意味着很多的经验。但当我开始了使用TDD,我就被这项技术的有效性所震撼,也沉迷其中。我不会再考虑去敲一大堆代码然后平白指望它们能运行成功。对于那种先将一组模块打散,然后希望能够再将它们整合起来,并且让它们在能下个礼拜五前运行起来的做法,我也不再能忍受。在我写程序的时候,每一个决定都由这种让现在开始写的代码能在一分钟后再次执行这样的基本需求所驱使着。



译注:

1,TDD,测试驱动开发。

2,Kata,可理解为武功招式,详细解释可参见译者的上篇译文。

小注:本篇文章由邓辉先生亲自校正,并给予了很多中肯而深刻的建议,译者在此给予感谢!

(原文链接网址:http://www.butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd; Robert C. Martin的英文blog网址: http://www.butunclebob.com/ArticleS.UncleBob)

译者注:Robert C. Martin是Object Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主编,并与James Newkirk合著了XP in Practice。他是国际程序员大会上著名的发言人,并在C++ Report杂志担任过4年的编辑。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1089322


__________________
If you don't know where you're going, any road will do.If you don't know where you are, a map won't help.
E-mail:max656798@21cn.com
只看该作者    顶部
离线 lawer-bbc
版主


精华贴数 2
个人空间 0
技术积分 17086 (53)
社区积分 2195 (509)
注册日期 2007-1-12
论坛徽章:107
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章ITPUB新首页上线纪念徽章  
      

发表于 2007-5-13 15:59 
软件文档--扬弃还是传承

在本人的《敏捷软件开发:原则、模式与实践》一书中曾提到“Martin对编写文档的第一原则是:除非是必须马上撰写文档而且意义重大,否则的话就干脆不要写它”。有些人把这个意思曲解为敏捷开发一种不需要文档的开发过程,这并不属实。

文档是所有软件开发过程中必不可缺的环节,打着“敏捷”的幌子拒绝编写文档是一种不健全的偏激行径,而且这与那些不假思索就容忍产品中包含十几种不同文档,且自称是“开发过程的终极回归”的说法没什么差别。撰写文档与其它软件活动一样,也需要经过一番投资回报的权衡。我们只会在确实需要文档的时候才编写它,同时编写文档带来的收益也应该是值得其所花费的努力的。

敏捷方法需要两种类型的文档,它们分别是需求文档和设计文档,而其它所有类型的文档都是选择性的。但选择性可不是说就不需要了。

   1. 需求文档。在敏捷方法中,需求文档往往会在某次迭代之中进行。它经常先于其他开发过程,但也要到开发过程的迭代开始的时候才在内容上达到完整。此外,它也会被自动化验收测试所用。其它种类的需求文档,像是叙述型、工作流型和图像型文档,可能也会酌情使用。
   2. 设计文档。在敏捷方法中,设计文档往往是由测试优先方法指导编写的单元测试所构成的。这些单元测试都是如何使用各部分代码的鲜活的例子。其它种类的设计文档,像是类图、交互图、状态图、ER图等也可能会酌情使用。

文档是开发团队在必要的时候才创建的,当他们觉得需要的时候就编写了它,就这么简单。而且文档在开发团队自身的开发过程中并不需要,往往是客户或市场来决定它们是否需要。开发团队会使用素材卡片(译注)来预估、计划并确定具体完成时间。如果某项素材在迭代过程中并未被加入,那此项素材也一定对客户或市场来说是毫无价值的。而如果加入到了开发计划中,那一定是因为客户或是市场认为它们足够重要所致。

译注:

用户素材,原文user stories。索引卡片,原文index card。为了进行项目计划,必须要知道和项目需求有关的内容,但是却无需知道得太多。需求的特定细节很可能会随时间而改变,因此,在离真正实现需求还很早时就去捕获该需求的特定细节,很可能会导致做无用功以及对需求不成熟的关注。在XP中,我们更愿意客户在索引卡片上写下一些我们认可的词语,这些片言只语可以提醒我们一起这次交谈。用户素材就是正在进行的关于需求谈话的助记符。它是一个计划工具,客户可以使用它并根据它的优先级和估算代价来安排实现该需求的时间。



(原文链接网址:http://www.butunclebob.com/ArticleS.UncleBob.OnDocumentation; Robert C. Martin的英文blog网址: http://www.butunclebob.com/ArticleS.UncleBob)

作者简介:Robert C. Martin是Object Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主编,并与James Newkirk合著了XP in Practice。他是国际程序员大会上著名的发言人,并在C++ Report杂志担任过4年的编辑。


__________________
If you don't know where you're going, any road will do.If you don't know where you are, a map won't help.
E-mail:max656798@21cn.com
只看该作者    顶部
离线 xfwlmj52bm
初级会员



精华贴数 0
个人空间 0
技术积分 4 (146573)
社区积分 0 (1403019)
注册日期 2007-5-25
论坛徽章:0
      
      

发表于 2007-5-28 18:32 
只有这一句。。谢了


只看该作者    顶部
离线 lawer-bbc
版主


精华贴数 2
个人空间 0
技术积分 17086 (53)
社区积分 2195 (509)
注册日期 2007-1-12
论坛徽章:107
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章ITPUB新首页上线纪念徽章  
      

发表于 2007-5-28 19:08 
感谢支持,欢迎常来!


__________________
If you don't know where you're going, any road will do.If you don't know where you are, a map won't help.
E-mail:max656798@21cn.com
只看该作者    顶部
离线 122408644
失落的星辰


精华贴数 1
个人空间 190
技术积分 887 (1991)
社区积分 5699 (242)
注册日期 2007-5-15
论坛徽章:40
蓝锆石萤石祖母绿海蓝宝石紫水晶红宝石
会员2007贡献徽章生肖徽章2007版:兔生肖徽章2007版:蛇生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章2007版:猪

发表于 2007-6-16 14:12 
学习了。很多细节的东西还要注意。呵呵


__________________



其实,我忘记了,这个世界本来是很大的!
不要总是仰望,天空,其实并不高,这一次,就相信自己吧!
只看该作者    顶部
离线 122408644
失落的星辰


精华贴数 1
个人空间 190
技术积分 887 (1991)
社区积分 5699 (242)
注册日期 2007-5-15
论坛徽章:40
蓝锆石萤石祖母绿海蓝宝石紫水晶红宝石
会员2007贡献徽章生肖徽章2007版:兔生肖徽章2007版:蛇生肖徽章2007版:虎生肖徽章2007版:虎生肖徽章2007版:猪

发表于 2007-6-16 14:13 
Re: 软件文档--扬弃还是传承



QUOTE:
最初由 lawer-bbc 发布
在本人的《敏捷软件开发:原则、模式与实践》一书中曾提到“Martin对编写文档的第一原则是:除非是必须马上撰写文档而且意义重大,否则的话就干脆不要写它”。有些人把这个意思曲解为敏捷开发一种不需要文档的开发过程,这并不属实。

文档是所有软件开发过程中必不可缺的环节,打着“敏捷”的幌子拒绝编写文档是一种不健全的偏激行径,而且这与那些不假思索就容忍产品中包含十几种不同文档,且自称是“开发过程的终极回归”的说法没什么差别。撰写文档与其它软件活动一样,也需要经过一番投资回报的权衡。我们只会在确实需要文档的时候才编写它,同时编写文档带来的收益也应该是值得其所花费的努力的。

敏捷方法需要两种类型的文档,它们分别是需求文档和设计文档,而其它所有类型的文档都是选择性的。但选择性可不是说就不需要了。

   1. 需求文档。在敏捷方法中,需求文档往往会在某次迭代之中进行。它经常先于其他开发过程,但也要到开发过程的迭代开始的时候才在内容上达到完整。此外,它也会被自动化验收测试所用。其它种类的需求文档,像是叙述型、工作流型和图像型文档,可能也会酌情使用。
   2. 设计文档。在敏捷方法中,设计文档往往是由测试优先方法指导编写的单元测试所构成的。这些单元测试都是如何使用各部分代码的鲜活的例子。其它种类的设计文档,像是类图、交互图、状态图、ER图等也可能会酌情使用。

文档是开发团队在必要的时候才创建的,当他们觉得需要的时候就编写了它,就这么简单。而且文档在开发团队自身的开发过程中并不需要,往往是客户或市场来决定它们是否需要。开发团队会使用素材卡片(译注)来预估、计划并确定具体完成时间。如果某项素材在迭代过程中并未被加入,那此项素材也一定对客户或市场来说是毫无价值的。而如果加入到了开发计划中,那一定是因为客户或是市场认为它们足够重要所致。

译注:

用户素材,原文user stories。索引卡片,原文index card。为了进行项目计划,必须要知道和项目需求有关的内容,但是却无需知道得太多。需求的特定细节很可能会随时间而改变,因此,在离真正实现需求还很早时就去捕获该需求的特定细节,很可能会导致做无用功以及对需求不成熟的关注。在XP中,我们更愿意客户在索引卡片上写下一些我们认可的词语,这些片言只语可以提醒我们一起这次交谈。用户素材就是正在进行的关于需求谈话的助记符。它是一个计划工具,客户可以使用它并根据它的优先级和估算代价来安排实现该需求的时间。



(原文链接网址:http://www.butunclebob.com/ArticleS.UncleBob.OnDocumentation; Robert C. Martin的英文blog网址: http://www.butunclebob.com/ArticleS.UncleBob)

作者简介:Robert C. Martin是Object Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主编,并与James Newkirk合著了XP in Practice。他是国际程序员大会上著名的发言人,并在C++ Report杂志担任过4年的编辑。


现在我们是什么都要写文档。现在都成了文档高手了。呵呵


__________________



其实,我忘记了,这个世界本来是很大的!
不要总是仰望,天空,其实并不高,这一次,就相信自己吧!
只看该作者    顶部
离线 lawer-bbc
版主


精华贴数 2
个人空间 0
技术积分 17086 (53)
社区积分 2195 (509)
注册日期 2007-1-12
论坛徽章:107
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章ITPUB新首页上线纪念徽章  
      

发表于 2007-6-18 20:23 
Re: Re: 软件文档--扬弃还是传承



QUOTE:
最初由 122408644 发布



现在我们是什么都要写文档。现在都成了文档高手了。呵呵


大师说酌情使用文档,这种境界不好把握,就都写了


__________________
If you don't know where you're going, any road will do.If you don't know where you are, a map won't help.
E-mail:max656798@21cn.com
只看该作者    顶部
离线 lenther2002
初级会员



精华贴数 0
个人空间 0
技术积分 2 (208298)
社区积分 0 (1442852)
注册日期 2007-6-27
论坛徽章:0
      
      

发表于 2007-6-27 12:36 
不错啊,好东西

顶一下


只看该作者    顶部
离线 mydear
高级会员


来自 SH
精华贴数 2
个人空间 16250
技术积分 12950 (82)
社区积分 88888 (2)
注册日期 2003-6-2
论坛徽章:320
Heart of PUBBLOG年度发帖之星年度论坛发贴之星2008欧洲杯之星菠菜神灯NBA季后赛大富翁
NBA2008季后赛纪念徽章欧洲冠军杯纪念徽章NBA之星NBA大富翁NBA常规赛纪念章NBA季后赛之星

发表于 2007-7-28 23:47 
我是很赞成写文档得,否则如何做依据,口说无凭


__________________
只看该作者    顶部
离线 lawer-bbc
版主


精华贴数 2
个人空间 0
技术积分 17086 (53)
社区积分 2195 (509)
注册日期 2007-1-12
论坛徽章:107
现任管理团队成员管理团队2007贡献徽章会员2007贡献徽章ITPUB新首页上线纪念徽章  
      

发表于 2007-7-30 16:46 
在我们的项目中,也非常强调文档,一方面是“扯皮”的依据,同时有利于工作的延续性


__________________
If you don't know where you're going, any road will do.If you don't know where you are, a map won't help.
E-mail:max656798@21cn.com
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问