软件和硬件的一个重要区别是其生产过程相对简单,成本效率主要在设计过程。很多人都在推崇构件化软件设计。可以看到很多会议、研讨和论文都在关注构件化设计,让人感到前景应该不错。想来也是,如果软件能像硬件那样用构件来组装,软件业肯定不是现在这种局面。但为什么现实不是那样呢?是技术问题还是别的什么障碍?构件技术的确还不成熟,但面向对象构件技术已经发展多年,已经有很多成熟构件被广泛使用,并且显著提高了编程效率,只是软件还远没有形成硬件那样的产业链:从零部件制造到产品组装,应有尽有。只有少数公司推出商品化程序构件,罕见有公司依靠构件设计为生。我想,其中的最大障碍应该不是技术,而是软件产品的流通方式。
试想,假如你设计了一套流媒体编码解码构件,并且以此为基础推出流媒体软件产品,你将有成千上万潜在客户。但要是把这套构件卖给别的企业搞二次开发,你的客户很可能不会超过十个。这样,你只能期望卖出很高的单价,或是从你客户的收入中提成。前者根本别指望,后者实际操作起来也很困难。要是微软那样的大牌公司有兴趣,他们会直接买下你的公司,好把一切掌握在手中。小一点的公司或许会和你谈条件,但谈成的希望很小。层次更低的公司干脆买一套构件,然后复制 N 份嵌入自己的产品中。你很难象硬件那样掌握零部件数量,也很难象软件最终产品那样靠加密和法律来控制拷贝。也就是说,软件的流通方式在制约着构件的商品化交易,所以,大家一窝蜂都去搞最终产品,低层次重复开发,严重的资源浪费,软件和硬件的差距越拉越大。看来,要解软件业困局,必须想法建立适合构件的流通方式。
最容易想到的办法是远程调用,也就是把程序构件放在网络服务器上,通过互联网来调用。这样,构件提供者销售的不是程序代码,而是计算服务。买方在自己的应用系统中通过远程调用获取计算服务。卖方则以某种方式来统计服务量(例如,可以按用户数量或调用次数来统计),并获得相应收益。这种远程调用需要互联网状态良好才能顺畅运行,而且不适于过频和过密的访问,因此其应用范围很有限。
另一种办法是把软件固件化,也就是把构件代码保存在闪存这类非易失器件上,作为插件嵌入构件需求方的应用系统。这是真正意义上的插件,而不是软件概念中的虚拟插件。当然,作为一种程序构件,应该有一种方法可以随时插拔和灵活组合。例如,用类似 U 盘的器件作为接插底座,可以插入多个微型 ID 器件,每个 ID 器件保存一个独立开发商的的程序构件代码。其实,整个应用系统甚至操作系统都可以按这种方式来组合,外购插件只是其中一部分。也就是说,把计算机软件全部预装成固件,以插拔方式接入系统总线,在逻辑上形成有机的程序组合。对嵌入式系统来说,这应该是一种不错的设计方案。甚至便携式 PC 机也可以采用这种设计。
这种方式的优点很明显。构件开发商可以象硬件开发商那样提供零部件,而不是提供任人宰割的程序代码。无论是靠加密还是靠法律来保护,这种构件都可以象硬件那样去操作,其产权保护比纯软件要容易得多,市场交易的难度也大大降低。不过,设计这样的系统需要有成熟的硬件平台,尚有很多问题需要探讨。例如,一个软件系统如果包含很多这样的插件,很可能会出现接触不良,导致系统不稳定。可选的解决方法是采用光电或无线接口这样的非接触式传输,但那样会增大体积,同样会限制插件数量。
程序构件技术的大发展将使软件业焕然一新,也会给整个信息技术带来颠覆性变革。但是,如何才能促进这项令人神往的技术快速发展,需要业界深思。总的感觉是,无论什么技术,只有具备了广泛的可支付的市场需求,才能获得强大的发展动力。程序构件技术也同样如此。