www.martinfowler.com/articles/newMethodology.html#FromNothingToMonumentalToAgile
engineering methodologies(工程方法,又或则plan-drive methodologies,计划驱动方法),这些方法通
过对开发过程进行严格而详细的规定,以期使软件开发更可预知以及获得更高的开发效率,这种强调前期计
划灵感来源与其他工程领域的实践,从而得名工程方法。不过工程方法虽然存在了很长时间,但并没有引起
人们太多的注意,对其主要的评批是太过于个官僚化,太多德事情需要做,会延缓整个开发进程。
agile methodologies(敏捷方法)以对工程方法的反其道而行得以发展,主要是在无过程和过度过程中寻找
一种平衡,即从合理的过程中获得满意的回报。
敏捷方法与工程方法有一些明显的区别,其中之一反映在文档上,敏捷方法不是面向文档(document-
oriented)的,其倡导的是在给定的任务中使用更少的文档,敏捷方法更象是面向代码(code-oriented):
文档的核心应该是源代码
文档方面的特点并不是敏捷方法的关键所在,文档减少只是表象,其更深层次的特典是:
1.敏捷方法是强调“适应”而不是“预见”,工程方法试图在代码构建之前定制一个详细的计划,若项目庞
大,那么就需要在一个很长的时间跨度内作出详细计划。然后依照计划进行开发。这种方法的本质是拒绝变
化的。而敏捷方法强调的是“welcome change”,其目的就是设计出适应变化的过程,甚至通过改变自身来
适应变化。
2.敏捷方法是面向人(people-oriented)而非面向过程(process-oriented)的,工程方法的目标是定义一
个适合所有人使用的过程。 而敏捷方法则认为没有任何过程可以替代开发组的技能,所以过程的作用应该是
为开发组提供支持
将设计与建造分离开来?
《代码大全》的部分比喻在
Martin Fowler的文章中显得有些不合适了,软件工程不同于传统的工程项目,比如土木工程。工
程方法的思路类似与传统的工程项目,将设计与建造完全分开,因为在传统的工程项目了,设计与建造是两个截然不同的活
动,设计是难以预计的,需要昂贵的有创造性的人员,建造过程则比较机械,只需要按部就班的工作,这样在建造过
程中就能使用技能相对较低的人员。然后土木工程与软件工程存在许多不同,首先,土木工程中,设计相对与建造无论是在时
间上还是经费上都要少得多。但软件工程中编码所占的时间一般要少的多,McConnell 指出在大型项目中,编码和单元测试只
占15%,这几乎和桥梁工程中的比例倒过来了。即使把所有测试工作都算作是建造的一部分,设计仍要占到50%。
对比软件工程和传统工程,可以得出一些结论:
1.在软件开发中,具体建造费用低得可以认为是没有。
2.软件开发中所有工作都是设计,因此需要富有创造性的才智之士。
3.创造性的过程是不太容易计划的,因此,可预见性或许是个不可能达到的目标。
4.我们应该对用传统工程来隐喻软件构造保持足够的警觉,因为它们是不同类型的活动,需要不同的过程。