【IT168 技术文章】
软件过程的改进是一个长期的过程,属于长期的利益。如果长期利益和短期利益相冲突的时候我们应该如何处理。我们有什么办法来令短期利益和长期利益结合起来呢?
意图
权衡短期利益和长期利益。
示例
金商软件是一家专门针对小型企业销售软件产品和定制开发的公司。他们销售的软件来自于国内的一家知名软件厂商。而公司内部的软件人员主要从事定制开发,一方面是满足用户的一些特殊需要,另一方面是为了发展自己的软件开发力量,以图日后开发出自己的产品。这种策略刚实施了半年的时间,目前公司的开发人员只有5个人。由于公司的销售能力很强,因此公司总是能够得到大量的订单。由于公司目前已经拥有开发力量,因此得到的订单也不像从前,以产品为主,定制为辅。而是一些完整的开发项目。从10月份开始,公司已经签了4个项目,按照公司的习惯,一般都承诺在3个月内完成项目。可是根据软件部分的估算,目前的任务,大概需要60个人月的时间。到了11月,开发部的所有人员已经连续加班1个月了。其中2个项目由于增加需求,同意把项目的开发周期延长一个月,但是和60个人月的工作量比起来,这点时间似乎是杯水车薪。在时间的强大压力之下,开发人员不得不牺牲软件质量,而软件的最后完工看起来是那么的遥不可及。
上下文
自从加入到面向对象开发地阵营以来,我们深为这门开发艺术所感动。编码工作在面向对象思想地指导下显得那么具有美感。以往过程式编码失控之后的那种无力感再也找不到了。面向对象带给我们的是极大限度的重用性,当然,我们需要付出前期投入的成本。从学习面向对象以来,我们学会了使用一种抽象的方式看待世界,思考问题。有些时候,我们同一些仍然保持传统编程习惯的软件公司交流时,我们发现似乎面向对象并没有体现出太大的优势:
"面向对象技术可以极大的重用现有的构架,大大提高开发速度。"
"我们现在通过增加人手和加班的方式,也能够很快的完成一个项目。"
"面向对象技术可以减少软件的维护成本。"
"一般我们会指定一些开发新手来维护公司以往的项目,这方面的成本并不高。"
"面向对象能够不断的积累项目经验,为后续的项目开发提供保证。"
"通过雇佣有经验的开发人员,我们可以直接获得开发经验,而不用自己积累"
"面向对象是未来软件开发的主流。"
"保证项目及时完成是管理层最关心的,等到市场上的面向对象程序员足够多之后我们再采用面向对象吧。"
"此外,现在采用面向对象,人员需要全新的培训,我们没有多余的人手;由于没有经验,直接把面向对象用于项目实施存在风险,而我们的项目时间都太少了"
这一段对话点出了面向对象技术的困惑,但也反映了软件开发中短期利益和长期利益的冲突。
问题
如何在软件开发的短期利益和长期利益中寻求平衡点?
方法
面向对象的迷思
我们的疑惑是从面向对象开始的 。归结其原因,是我们并没有真正的认识面向对象。
"面向对象符合现实世界的特性,因此会更加简单。"
"我们决定从这个项目开始采用面向对象技术,并安排了为期2周的学习时间。"
"由于采用了先进的面向对象技术,我们把开发周期缩短1/3。"
如果你对面向对象有上述的理解的话,说明你对面向对象技术的理解存在误区。首先,面向对象和面向过程的不同在于思维方式的根本不同,因此,转向面向对象技术决不是一个一蹴而就的过程,而是需要不断的学习,不断的磨练。如果需要为这个学习过程制定一个时间的话,我想也应该是在8~14个月之间。其次,在刚开始采用面向对象技术时,并不能够节省项目的开发时间,相反,因为学习和尝试面向对象技术的需要,项目的所需时间会大幅度延长。面向对象技术的威力在经过一段时间的积累之后会慢慢的显露出来,你会发现一个新的软件只需要对现有的类进行重用,编写少量的代码,甚至使用代码生成器就能够完成。这使得软件的开发成本大幅度的降低。这个时候,软件开发将会进入良性循环的周期。
为什么面向对象技术会有如此大的威力呢?原因在于面向对象的抽象思维。
了解了面向对象的知识之后,我们发现其实面向对象的主要威力是它使用一种特定的方法,将一些不断重复的事情简化了。问题在于,要让软件组织学会使用这种方式是需要代价的。那么,你是否愿意付出这种代价?今天付出1块钱,明天能够收回10块钱的事情每个人都会做。但是让你每天投入10000块钱,坚持2年,这样你会在未来获得10倍的回报。这种事情就未必会有人做了。研究面向对象技术,发展软件组织的技术框架需要很大的前期投入,而效益却是慢慢显现的。这就造成了短期利益和长期利益的矛盾。其实,除了面向对象技术之外,软件组织中还存在很多同种性质的矛盾: