那么,这个理想的软件工程实施模型究竟是个什么样子呢?具备哪些特点呢?下面从几个方面概括一下。
首先,软件工程的首要任务是对工作任务的细分,也即把工作拆分,实现流水线式的作业化,而且这还不仅是企业内部自己的工作任务流水线化,而且还应该涵盖在整个软件产业链中工作任务的流水线化,也即能够实现软件企业间的“半成品”性质的大颗粒度软件复用。
我觉得从技术上来说,这绝对已不成问题,因为软件的模块化实现技术现已非常成熟,那就是我们可以采用基于组件的开发技术,因为它能够实现非常优良的软件的模块化细分。当然我们也都知道,组件开发技术不是什么新鲜玩艺,通常我们总把它与面向对象开发技术放在一起来理解,并做出一些比较,认为组件开发技术是比面向对象开发技术更好的一种软件开发的技术方法。诚然,这种观点也没什么太大的不妥;但是我认为,这种对组件技术的理解可能不是很准确,如果究其本质,面向对象开发技术与面向组件开发技术,这两者之间也许并无太多的关联,或者说它们根本不是一回事。我们可以这样认为:面向对象开发是一种编程思想;而组件则仅仅是一项技术,是一项接口的技术。组件技术能够实现二进制意义上的软件模块复用,它能够使得模块间的耦合性更小,从而提供软件模块的可复用性,及软件模块的可扩展性,同时还为能够轻松实现软件模块的动态装载与更新。
组件技术虽然能够实现很好的软件模块化,但是我想仅凭这点是远远不够的。而更重要的是,我们模块化之间的沟通接口必须是规范的、统一标准的,并公开的。因为只有这样统一了接口的模块化软件,它才能真正让这个软件产品,能够实现跨多个厂家的流水线式的生产作业过程。而且,只有实现了接口的统一标准化,才能有效去判断某个模块组件的好坏优劣,才能够实现组件间的优胜劣汰。而现在的实际情况是,我们的接口设计太随意,太多样化了。
我想微软的COM/COM+当初设计时所预期的目标,肯定也会是建立起能够以这样一种松散合作方式,来构建软件产品的生产开发平台(本文,我们把这种方式称为“流水线式的产品作业链”)。在这个平台环境下,每个公司专注于自己擅长的那一块工作任务,并最终以组件的方式把这个功能模块发布出去;而这些可以被形象地称为半成品,它可以被其它公司进一步加工和封装为颗粒度更大一些的组件;最后软件产品的集成商,可以将这多个大颗粒度的组件,通过连接器来把它们集成为一个最终的软件产品。但是从现在实际情况来看,当初这种美好的设想在今天并没有完全成为现实。究其原因,我认为最为关键的因素,就是因为它们对接口设计没有统一的规范所导致。或者说,COM/COM+对接口的规范化设计没有构成很好的约束力,这就导致对实现同一类功能的某些组件,可能它们会是完全是由不同人来所设计并实现的,所以其接口也可能会截然不同。例如,一个mp3播放的组件模块,有的人可以只实现了对某一种格式(如16bit量化标准)的mp3文件实现播放;而另外一个类似功能的mp3播放组件有可能它是封装为Activx形式而进行发布的;而还有的mp3播放组件可能只对输入mp3文件路径时能够予以正确播放,但是它却不能直接播放音频流等。
总之,这些没有统一规范接口的组件,对于使用它们的软件集成商来说,便会觉得无所适从,因此对于我们大多数软件公司来说,对于我们大多数软件开发者这来说,我们经常更愿意是自己来实现软件产品的每一部分的主要功能,而总觉得现在已有的那些个组件,虽然它们似乎已经实现了我想要的那部分功能,但还总是觉得它们不太好用,或不太适合自己,或不能很好的满足自己。
所以说,微软的COM/COM+并没有能够真正地成为流水线式的产品作业链平台,它不能像其它工业产品的生产过程中的那样,其各个零件之间的接口设计都很规范,因此最终的产品也很容易被组装和拆卸,而且半成品的厂家来源也都是很丰富的,大家有优胜劣汰的选择标准和机会。而现在的仅有的一些可复用的组件几乎都是随微软的开发平台一块发布出来的,而更多的软件开发公司很难真正参与到这个平台中来。因此我们不妨直接了断地说,现在所谓的许多软件平台,其实它们都不是真正意义上的开发平台,因为它们没有发挥出一个真正平台所应该有的那些功能,它没有扮演“有效而公平地分工”的这种角色,当然最终也就难形成为高效的流水线式的产品作业链环境。
所以说,对于理想的软件工程应用模型中,最为适合的一种开发方式是“基于接口的编程”。当然,基于接口的编程,这也绝不属于什么创新思想!俺个人在这里也无意炒作概念。而只是觉得“基于接口的开发方式”比“基于组件的开发方式”,它的这种提法更为合理和科学一些,因为它更重点强调接口设计的规范性和公开化,它这不应该属于某个公司的私人财产,而应该是为大家所共有的共享资源财富。其实我觉得可以通过一个协会性质的团体来促进接口设计的统一规范化,类似于RFC标准制定的那种流程方式。另外,如果模块之间的接口规范化了,合理化了,那么这毫无疑问将对软件的测试和软件质量的度量提供了方便,而且也会因此给软件质量的提高有了更多的保障。
刚才上面的讨论,我们的重点是从技术角度上进行了较全面的阐述,也即通过接口的规范化设计,来保证“流水线式的产品作业链平台”顺利实施。但是仅从技术上能够实现就已经万事大吉了吗!不是,当然不是!因此接下来的内容中,我们来探讨另一个至关重要的因素,那就是“利益的合理分配机制”问题。
有合作就会有收获,有收获就会有如何分配!如何使经济利益的分配更为合理?这绝对是一个人类所面临的自古至今都存在的难题?当然,它同时也是一个非常关键、也非常敏感的问题。分配机制是否合理?这毫无疑问会直接影响事情的成败!而事实上,现在出现的很多问题,其最终的根源都是由于我们的狭隘利益观所导致。因此,为了使得“流水线式的产品作业链平台”不是我们想象中的空中楼阁,那么就必须要为它建立起一个合理而公平的利益分配机制。而这一点,恰恰是我们目前基于组件(或基于服务)方式下进行软件产品开发过程中,解决得最不理想的一个关键环节。
想一想,其它工业产品的生产过程中,各方对利益的分配那是有相当的默契。各种环节的半成品都可以明码标价、公平竞争、自由而畅通的销售。但是现在软件产品的中间环节中的半成品,却很难有这样良好的市场环境。当然,这其中的一方面可能是由于软件产品本身的一些特点所导致的,但我想更根本的原因,是因为我们狭隘的自私主义所导致。如其它工业产品的半成品可以一个卖多少钱,而且一个萝卜一个坑,一个半成品只能被消费一次。但软件产品中的半成品却不是这样,它可以被充分的复用,按说这应该是软件产品生成过程中的优势,但是如果生产组件的提供商,自己辛辛苦苦开发出来的半成品只能被卖一次,收一次钱,但却可以被无限次复制使用,那么它这家公司当然干不下去这个行当。
因此我们必须要很好的解决掉这个问题后,才能最终实现“流水线式的产品作业链平台”。虽然本人现在对此还没有想出更好的具体的解决方案,但是我坚信这是一定可以做到的。因为,如果我们不能够实现对软件产品中的半成品(组件模块)实现公平交易,那么我们的软件工程技术就一定难以取得实质性的突破,也难以真正地去消除软件危机。
当然我还乐观地认为,其实这个问题也许没有我们想象中的那么难以解决!因为首先从技术上,由于我们前面所说的采用了面向接口的开发方式,使得组件模块之间的接口规范化了,这样就为软件半成品提供了很好的可度量手段,而且由于有了统一的接口标准,有了公平的市场竞争平台,于是同一功能的组件也必然会有多的提供商,这样组件间就有了良性竞争的环境,我们可以很好地实现组件的优胜劣汰。而且也为组件模块的定价提供了市场机制。其次,就是应该提高我们自身的素质,坚决打击盗版。因为一个良好的秩序,对整个软件产业链环境中的良性运转是至关重要的。虽然对组件的复制重用很容易被实现,但是从良心上来说,你使用了人家辛辛苦苦开发出来的产品,也应该给人家付费呀,这是最现代社会最基本的经济规律,按劳分配吗!当然,我们也许可以设计一些方法来让组件的盗版更难进行,或者我们可以设想,找到一种方法,去统计应用程序对组件使用情况,如计算调用次数,或CPU运行时间等,总之,我们可以按任务的实际工作量来进行利益的合理分配。
综上所述,我们是要形成这种一种局面:那就是按组件模块的方式来发布和销售软件产品(或半成品),并以此来获得自己该得的那份利润;来代替现在仅按最终软件产品(或软件服务)才能销售获利的方式。其实,如果我们的软件产品按照这种方式生产出来的话,那么对提高它的最终的软件产品质量将是大有帮助的,因为我们可以建立起一个责权利相一致的质量保证体系。就好像我们现在的其它工业产品那样,每个厂家必须保证自己的产品或半成品的质量,而集成商则更专注于产品的统一协调上。如果某个零件出现质量问题,那么生产这个零件的厂家将应该承担主要责任。这套规则我觉得同样它也适用于对软件产品的质量保证上,首先是全行业(或某一个产业的应用系统)形成一个统一的接口规范;然后大家按此规范,各尽所能,根据自己的资源情况,做自己适合的那一个组件模块,在保证接口规范统一的基础上,组件模块的提供商将要主要测试组件内部的运行情况;之后大家各自发布自己的组件模块,并因此获利,同时也将承担起维护和升级这个组件的任务;最后,软件产品的集成商可以根据自己的需要,从众多组件模块中优胜劣汰,挑选出自己认为性价比最为合适的半成品组件模块,来组合出最终的软件产品,当然软件集成商重点要测试各个组件的接口是否遵循规范,以及组件间的协同工作情况。如果最终用户遇到某个意外崩溃,那么可以从例如一个特殊的故障纪录子系统中,来认定这个事件该由谁来承担相应的责任。
最后,我把这几关键的几点总结一下,如下:
1、采用面向接口的编程方式,对接口设计进行统一的规范化,并且通过组件技术,使得软件产品有更好的模块化特性。
2、建立一个合理的利益分配机制,按组件模块的方式来发布和销售软件产品(或半成品),并以此来获得自己该得的那份利润。加强专利保护,坚决杜绝盗版;
3、研究出一个对组件模块的质量进行规范化度量的统一方法。
4、建立起一个责权利相协调一致的质量保证体系。