记忆3 - 软件复用 - SilverBullet

来源:互联网 发布:mysql select db 编辑:程序博客网 时间:2024/05/06 08:22

软件复用 - SilverBullet

Brooks博士在1986年说“No Silver Bullet”。软件复用到底是不是Silver Bullet,我不敢枉下评说。但是我个人认为,复用是解决目前很多问题最有效的方法。

比尔盖茨在《未来时速》的第一章中说,“我有一个简单而又强烈的信念。将您的公司和竞争对手区别开来的最有意义的方法…就是利用信息来干出色的工作…我可以预料您的反应。不对,应当是高效的企业程序起作用!是质量!是创造品牌和取得市场份额!是与客户保持密切关系!当然成功依靠所有这一切。…如果您对质量问题不警惕,如果您不建立品牌,如果您对客户的服务很糟糕…如果您干够了蠢事,您就只好关门停业。”

如果您是软件开发组织的老板,您和竞争对手区别开来的最有意义的方法是什么呢?

实施软件工程当然是解决“软件危机”的最好方案。如果您不注重软件质量,如果您不关心软件过程,如果您不使用面向对象的方法,如果您不利用合适的开发工具,如果您不实施有效的项目管理来组织这一切,也就是说,如果您干够了蠢事,那么只好关门停业。

《未来时速》的序言中说,“如果说80年代是注重质量的年代,90年代是注重再设计的年代,那么新世纪的头10年就是注重速度的年代”。不要重新发明轮子。是的,但是那还不够,最好不要再自己造轮子,就更加能赶上速度。我们认为,大规模软件复用将是一个开发组织区别于竞争对手的最有意义的方法。


呼唤大规模软件复用:

复用(或者重用,英语为Reuse)是很简单容易理解的思想。构建一栋大楼,不会从烂泥开始,而会使用现成的砖和钢材等。开发一个应用程序同样不需要重头开始。

Ivar Jacobson在《Software Reuse, Architecture, Process and Organization for Business Success》(下面引用为《Software Reuse》)中写道,依赖于关键任务业务信息系统的公司,成功意味着建立于软件之上的产品和服务必须使自己的软件“更快,更好,更便宜”。进入市场的时间更短;软件的质量要更好;开发和维护成本要更低。而达到这些目标主要有两个途径,第一个途径是提高软件生产机构的效率,第二个途径是软件复用(Software Reuse)。

提高软件生产机构的效率方面,我们使用更高级和功能强大的语言,如UML,面向对象的编程语言,使用更自动化的工具,如协作工具,编译器,调试器,这和我们使用更先进的材料,更大型的工具来建更高的楼房相似。只有新材料和工具还不够,我们需要使用更好的方法,更多的现成的建筑块,(使用烂泥烧制的砖,用传统的建筑方法,根本就不可能在短期内建成东方明珠),更快速的建更高更漂亮的大楼,同样,我们要使用更好的方法,更多的可以复用的软件模块,才能更快,更好的建立更大的程序。软件开发组织要想显著地改进软件开发工作,必须将大规模软件复用付诸实施。


复用的优点:

引用《Software Reuse》的内容:很多公司通过复用取得的成就使们坚信,管理层可以期待获得如下优势。

1.产品投放市场时间:减少为原来的1/2到1/5

2.缺陷密度:降低为原来的1/5到1/10

3.维护成本:降低为原来的1/5到1/10

4.整体软件开发成本:降低大约15%,长期项目可降低高达75%


可以复用的资源:

1.人。这里指人的隐性知识,如,思想方法,经验,直觉。隐性知识是不能被文档化的,也很难表达出来,只能在潜移默化中体会到。

2.Body of Knowledge。如,PMBOK,SEWBOK,CMM。

3.软件开发过程。文档化的开发过程,如,RUP,XP。

4.技术,方法和表达符号。如,OO,组件开发,分析模式,体系结构模式,设计模式,Unit test & Refactoring,UML,JAVA。

5.工具。如,协作工具,开发工具,管理工具。

6.源代码,2进制代码,文档模板。

是的,可以复用的东西很多。很多人一讲到复用,就认为应该彻底一点,把能复用的都复用上。我们认为人类的文明是大的复用资源,但是那又有什么意思呢。现在面临的关键问题是:复用什么,怎么复用最有效果,最简单,最直接,而不是一咕脑儿全复用。下面我们来简单分析一下这些可以复用的资源。

人。显性知识,就是能文档化和表达出来的知识,可以通过记录,学习来达到复用。但是隐性的知识,人走了,就没有复用的基础了。况且,一个环境中的隐性知识,也未必能复用到另一个环境中。人员不能随便流动。

Body of Knowledge,软件开发过程,方法学和表达符号。这一些其实就是人的显性知识。任何人和公司都能得到。这种复用方式不够简单和直接。我们拿到奔驰车的设计资料和制造过程资料,是否马上可以做出和德国奔驰公司一样的产品来吗?不能。但是,如果没有设计资料和制造过程资料,那么可能根本造不出车来。图书馆里有浩如大海的书籍,那些都是人类文明的结晶,试问一下,我们个个都是博学多才的人吗?但是没有这些书籍又会怎样?是的,Body of Knowledge,软件开发过程,方法学和表达符号,是必须的,但是不是最有效的,也不够简单和直接。

工具,源代码,2进制代码,文档模板。上面的复用资源作用的结果,就得到了工具,代码,文档模板,而这些资源又反过来影响和改进上面提到的复用资源。这里讲到的资源,复用很简单,直接,效果也很明显。大规模的软件复用,就是要复用代码和文档模板。


复用的条件:

要实现代码复用,首先需要技术,方法和语言的支持。大多数的软件开发公司已经开始采用面向对象的方法和语言,基于组件技术进行软件开发。复用的基础已经形成。

要实施复用,软件开发公司可能需要改变组织结构,软件开发过程。这需要公司普遍接受复用的思想,愿意投资和有改变的勇气。

复用的内容,需要建立在普遍接受的体系结构之上。

 

复用的体系结构:

复用粒度:函数和数据结构,类,函数库,类库,独立服务包,framework。

函数和数据结构,还是类,主要受程序语言的影响,和分析设计没有直接的关系。使用面向过程语言,复用的单位是函数和数据结构,并把一组功能相近的函数组织到函数库中。使用面向对象的语言,复用的单位是类,并把一组功能相近的类组织到类库中。使用不同的语言,有些是面向对象的,有些是描述性的(如HTML),这时候使用什么复用单位呢?

砖是建筑业中非常常用的基本的复用单位,但是,现在很少有摩天大楼是直接用砖堆成的,一方面是使用砖不会显著的提高生产效率,另一方面,可能根本就不能用砖建立大厦。同样,复用的单位如果是函数,数据结构,类,也一样不能显著的提高生产效率,甚至不能构建应用,现在有些应用程序,并不仅仅是一种语言构成的,比如WEB应用程序会同时使用html,javascript,java,sql,这一些可能根本不能用类来组织,或者用类的组织方式效果不理想。

显著提高建筑的生产效率的,是使用钢筋混泥土,借助工具浇灌出一个框架,然后用砖进行修饰。应用程序可不可以用框架开始呢?

Application Framework,某个领域内的某一类应用程序的一个模板,是某种风格和模型的体系结构的部分实现。某个领域内的某一类应用程序,往往有共同的地方,比如,大型超市的POS机系统,不同超市的POS机系统有相似的地方,我们把这一些相似的地方预先做好,实现成framework,那么为某一家超市定制系统的时候,效率就会高的多。

独立服务包(stand alone service package),砖太小,整个大厦又太大,还需要有中等粒度的东西,比如整体厨房,整体卫生间等,他们独立于大厦存在。软件系统也一样,单个类太小,一个Application Framework又太大,还需要一些独立存在的服务包,比如O-R mapping的服务包,Log服务包。

单个的类可能没有什么用处,或者复用不方便,所以,不要直接复用成百上千个单独的类,而应该复用类协作的结果,也就是服务。服务不仅要方便使用,还要完整。举个例子,我们选中一家超市去购物,两个目的,一是买到自己想要的物品,二是愉快的购物体验。所以,超市不仅提供了众多的商品,还提供很多服务,比如电梯,购物车服务等。超市提供的不仅仅是单个的购物车,而是完整的购物车服务,我们很方便的从超市入口拿到购物车,用完以后我们随便放在一个地方都可以,应为超市有专门的人会收集这些购物车,把他们放回到超市入口去。如果我为了享受购物车服务的好处,先要排半个小时的队,用完了以后必须放在指定的地方,那么不用也罢。

另外,所有的软件服务,最好能和Framework配套,以framework为基础,那样重用更方便。Framework和服务包应该是相互相成的。


复用过程:

如果没有明确的复用程序和系统化的开发复用思想的指导,大规模的软件复用是达不到的。关于如何复用,我们以后再讲。