XML | HTML | TXT
您当前位置:软件开发 >> 新闻动态 >> 软件开发行业资讯 >> 浏览文章

软件开发方法需要理论的支持

  对于正在寻找软件开发方法的人来说,问题不在于是否能找到答案,而是确定答案是否满足要求。下面来论述一下软件开发方法学必须经历深刻的变革。应该放弃当前依赖于新词和政治式宣传的状况,转向基于理论和实验验证的严肃的科学工作。

  软件方法学是一个特殊的领域。按原理它应该是基于科学的工程学科,但目前的实践中它却时而像时装业,时而又像搞政治。

  时装业每年都要有一种新潮流,在匆忙跟风中,人们将好的和坏的一起抛弃。人们不是从自己的经验中学习,而是跟着自认为更好的走,因为其他人都说这样更好。创新者们常常抱怨,大公司拥抱变化非常缓慢,但事实上并非如此,许多大公司非常渴望尝试新事物。真正的问题在于,他们也会更快地放弃,还没等认真用起来呢,在过程和工具上的不菲投入就打水漂了。

  在政治中,重点不是放在难题的切实解决,而是口号、宣传和煽情。理念不是通过对利弊仔细的讨论来提出,而是像品牌那样进行营销,借助一些大师的一些金口玉言来传播。每一种方法都试图忽略自己的同类,如果不得不承认它们的存在,通常也会恶意贬低,这弄得一线人员无所适从。

  最终,很少有新思想能运用在大规模的项目里,因此对大系统开发中的质量、生产力和上市时间等等都没有产生什么影响。过去四十年中软件开发方法中出现的所有新概念里,只有少数大的创新——结构化编程、对象技术、设计模式和UML等对行业产生了真正的影响。

  这些都是不成熟的表现。我们的学科该长大了。

  席卷业界的最新一波浪潮是“敏捷”。敏捷方法的确做出了许多贡献,并使我们再次注意到人在软件工程中的中心地位。一些敏捷的经验很可能仍然会在未来的方法中继续存在。与此同时,敏捷领域也为上面谈到的现象提供了活例子。作为一个重视人甚于过程和工具的运动,敏捷却提出了许多被宣传为“新的”过程和工具,而且没有说清楚其中哪些是真正新的,哪些只是已有概念的重述。很多一线人员很自然地就被弄晕了。先不说这些“新”概念的价值如何,对它们的推广方式就颇为引人注目:先是为这个方法精心编写了一份基础性文献的—个宣言,更多的是第一人称复数的情感诉求,而缺少事实依据。这种风格对于吸引眼球可能有效,但随着概念日益成熟,还是应该采用更传统阐释形式。

  在工程和科学中,一种新技术的提出者与任何人一样都急于推广自己的发明,但是也会很小心地确定应用这项新技术在什么地方存在不足或者未经证实。然而,很少有软件方法学者会提供这样的警示信息。太多人夸大了自己的方法与前人的差异。每一次变革(比如对象技术)中,有多少突破其实是已知概念的调整?逐渐改进当然没有错,科学和工程中大量进展都是如此实现的。但是,将每一次改进都包装成革命,就没意思了。

  我们目前软件开发的方法,无论是商业还是公司内部,新还是旧,需求已知还是不清,实际上都只是来自方法文献中各种元素的组合,加上一些特定于领域或者业务的扩展。基本的成分是一个个实践。

  如果我们将这些基本成分从大杂烩中分离出来,大家就可以建立自己所需的方法。这种方法是以模块的方式设计的,能够在不断总结经验的基础上快速演进,响应我们快速变化的行业的需求。

  经济压力是当前的时代特征,与时装业的跟风和政治宣传一样都不会完全消失。但是,所有关注软件工程价值的方法学者都理应为学科找到存在的理由。

  我们所缺乏的是作为一门科学和工程学的基础:理论及其验证。我们应该采取以下步骤,将软件方法学转变为一种严谨的工作。

  软件开发是一种人的活动,但它也是由若干明确定义的步骤组成的,而且我们对这些步骤之间关系已经有了充分认识。至少,在有经验的从业人员脑中,对这些概念的定义和理解都是不言自明的。但这还不够,我们需要坚实的软件开发理论。形式化方法为我们提供了进行建模的正确工具,含有约定构造(contract)的面向对象语言也可以实现同一目的。如果软件开发的任务和限制没有精确的、无歧义的模型,我们就无法显著地进行改善。模型应该独立于具体方法(只描述问题,而非解决方案);模型应该不仅包含定义和公理,而且还应该包括描述所有系统和可行方法的定理——这恰恰是形式化模型经常缺失的部分。

  所有方法在被过度宣传的差异之外,都有许多共同的属性。而以理论作为基础,我们将描述出任何有效的开发高质量软件的方法都应该满足的属性。毕竟,它们都是用来开发软件的,而且都承认软件开发中有一些东西总是需要。我们总是要写代码,用某种方式进行测试,总是要考虑需求(无论要不要文档),总是有backlog(无论显式还是隐式),总是需要计划。

  我们需要找到软件开发本质的不能再简化的内核。例如,通过研究大约50种方法包括XP和Scrum,我们已经找到了一个包含超过15个元素的内核,其中的元素是我们总要做的事情或者总要生成的东西。

  有了内核之后,所有方法都可以进行描述和比较。我们可以从所有广泛使用和经过验证的方法或者过程中采集隐含的实践,比如架构、组件、迭代等等。有些实践是重叠的,比如用例驱动开发和特性驱动开发。有些是互相补充的,比如用例驱动开发和按约定设计。

  内核清除了方法之间表面存在的差异,比如不同方法中只是称呼不同的相同事物。比如,RUP所说的迭代在Scrum中称为sprint,但是它们基本上说的是一回事。通过这种清理,可以明显地看出不同方法之间真正的差异。

  因为内核对于任何具体的实践都是中立的,我们可以简单地分辨出不同实践之间的实际区别,不是表面上的,而是深层次的。这将减少各种方法中包含的“宗教”成分。


手机:18678812288 E-Mail:1069706080@qq.com
地址:山东省济南市舜耕路泉城公园东门园内向北50米 鲁ICP备07011972号 版权所有2008-2013 山东赢德信息科技有限公司