银弹:中国造 (程序员6月刊)


 2004-06-05 00:00:00       748

    十九世纪末,汽车还只是有钱人视作玩物的奢侈品。当时,一辆车从原材料加工到整车组装,都由工人自始至终手工完成。1903年初,福特意识到,降低汽车价格,必须进行批量生产;首先要使零部件具有通用的性能,这样才能实现大批量生产,在装配时也不会因零件不统一而浪费大量时间,顾客也容易进行维修和保养。这一“标准化”的生产方式神奇的成为了世界工业的“通用法则”。1913年,福特又把流水线的概念推广到汽车制造的总装线上,使一辆汽车的生产最快时仅需要10秒。截至今日,大批量生产方式,仍被称为福特生产方式。

    长久以来,能够按照汽车流水线方式生产软件,被认为是软件业真正走向成熟的标志,这也就是软件工程师心中梦想的流程化生产的“软件工厂”模式。

    为了实现工厂化的软件生产,很多人开始尝试不同的方法。重量级软件开发的软件工程理论在较早期被引入,力图通过严格的软件开发管理来模拟工厂的管理模式;然而,在某些工具大量的宣传下,这种管理带来了些许改变,但并没有在软件开发本身的技术方面有新的重大突破,并没有真正解决软件工厂模式在技术实现上存在的巨大缺陷。事实也证明,当一个系统有几十万、几百万个变量的时候(就如有几十万、几百万行代码的软件),只靠管理是很难解决所有问题的。

    于是,一些软件大师转由开发技术上寻求大幅提高开发效率的思想和方法,从结构化设计到面向对象的思想,无不围绕这个目的,其中也包括了构件技术,它被认为能从根本上提高开发效率,是打造软件工厂的核心技术。然而,这一名词在提出之后的二十多年时间里,却一直没有引起足够的重视。

    近阶段,国内又有厂商纷纷打起“面向构件技术”的口号,令人惊奇的是,这些厂商所处的层面截然迥异。其中有开发嵌入式操作系统的科泰世纪,有基于J2EE技术开发电信等行业Web应用基础平台的普元,甚至还有开发Office产品的无锡永中。本是风马牛不相及并相距甚远的软件领域,但当这些公司的技术带头人聚在一起时,却都对同一个话题津津乐道。科泰世纪的首席科学家陈榕说:“为什么能够说到一起去?这是因为我们做的都是一回事,都在打造面向构件的开发和应用平台,并且现在这项技术才真正开始走向成熟。”

    面向构件思想的发展

    要了解面向构件的思想,首先需要明确什么是构件。构件作为名词出现已经近二十多年,而且其定义也一直在发展过程中。有人认为Com就是一种构件,或者EJB、Cobra都是一种构件,很多公司也都在宣传自己的构件技术。对此,现在的构件定义已经发展到:一个构件,就是一组业务功能的规格,而目标代码包括从二进制代码、各种中间层的编译后代码,甚至代码的运行环境和网络环境都渐渐退居第二。

    编程上曾经出现过结构化设计和OO的思想,这些技术和思想都力图从对软件模块或者颗粒的封装上创造出革命性的变化。OO讲的是封装、集成和多态等特性,但这些都是面向源代码的,包括现在热门的重用技术也仅仅是针对代码的管理。但面向构件针对的是业务规格,不需要源代码,可执行代码或者中间层的编译代码,无论是C++、Java还是C#编译出来的,在这个层面上可以做到代码的集成、封装、多态,做到AOP。这才是面向构件的精髓。微软的.Net支持跨语言的集成,就说明其封装的也是业务规格,跨语言集成也是面向构件的核心技术。从这个意义上讲,面向构件技术是OO的未来,也是软件工厂能够成为现实的必要条件。陈榕说:“软件工厂一定不是源代码拼装起来的,而是目标代码拼装出来的。就像零件生产一样,给你一个螺丝就可以拧上,而不是从炼铁、图纸开始,告诉你铁怎么炼,这不是软件工厂。”

    同时,面向构件技术与构件技术相比,有了升华。面向构件技术的关注点不在于构件本身的技术实现,而在于如何把应用系统分解成稳定、灵活、可重用的构件,在于如何利用已有的构件库组装出随需应变的应用软件。举个简单例子,在汽车流水线出现之前,汽车也是由构件组成的,它的每个构件都是经过手工打造完成的;而以面向构件思想制造汽车的时期,就发生了完全的升华。面向构件体系和构件技术,就如同福特的汽车流水线生产与以前手工打造汽车一样。现实开发过程中,很多人用Cobra写出的构件并不具备通用性和灵活性,因此如何打造一个通用、易用的面向构件的开发环境是非常重要的。普元CTO黄柳青说:“我们是从一个面向构件的环境中去分析应用,如何做出灵活、重用的构件来思考的。”

    面向构件技术还包括了另一个重要思想,这就是程序在动态运行时构件的自动装载。这种特性也借用了Java语言的一些思想。Java同以前的语言相比,出现了质的变化。很多人将Java想成OO,和better C++,其实它们完全不是一个境界。比如C语言只讲编译时,只是封装一个一个的零件,而Java平台关注的是运行时,把所有零件自动、动态的连接起来运行。C++只是静态源代码的集成,而Java是动态的组装,它关注的是如何打造运行的service,.NET关注的也是如何打造运行平台。因此,程序员一定要把Java和.Net当作是动态的,不是编译时,而是运行时。

    因此,这一思想突破指出了一条拼装软件所必须的动态模式和平台的思想。因为需要平台帮助其搭配各种构件,因此Java做了虚拟机,.NET也是如此。这些思想给面向构件技术的开发打造了基础,面向构件技术同样也会有一个这样的平台来动态的加载和组装构件。这也是为什么面向构件技术直到最近才被认为成熟起来的原因。Rose的发明人Booch就曾表示,到了2000年我们才学会编程。

    在以前的编程中,开发的Framework指的是代码的集成关系,模块之间如何静态的链接,这样开发就变成为了一个非常复杂的软件工程,每次开发都需要重新发明轮子。而按照面向构件的思想,软件开发就会比现在容易很多,因为面向构件的Framework指的只是运行时的框架,是对业务规格的集成,整个系统仅由标准的构件组成,并且这些构件可以随时更换。

    国际主流大厂商也早已理解了面向构件的思想,并将这种思想广泛用在各自的产品中,只不过表达方式不同而已。微软的5万人在用.NET编写Longhorn,IBM所提出的On Demand的口号,这些技术的实现都用到了面向构件的思想,从这个角度看,他们的策略都很正常,而且是必然的。

    国内厂商打造面向构件的开发和应用平台

    国内的一些软件企业同样也看到了面向构件思想的潜在价值,基于不同的层次开始将软件开发平台按照自己独创的模式进行探索实践。普元基于J2EE技术打造了一个面向构件的Web应用开发平台。这个平台中,屏蔽了Java底层技术的细节,软件工程师只需在了解和熟悉所提供的基本Web构件和构件生成利用体系后,就可以自主开发和应用更大的构件。黄柳青博士曾是中国最早的互联网应用开发商亚信科技的CTO,早期他们在开发电信互联网应用的时候,就发现了原来的代码开发模式存在很大的不足,经常会浪费很多精力用在底层Web技术的代码开发上,而无法集中精力将应用做的更为顺畅和快速。于是他和原亚信CEO刘亚东认准了这个方向,投资了5000万人民币,埋头开发了三年推出了这个平台,现在已经得到了极大认可。

    黄柳青说:“按照我们的体系结构,最下面是J2EE,中间是面向构件的平台,一方面让应用层次描述应用,同时把我们的系统部署到不同的环境中,最上面是ERP、CRM这样的应用,让他们把行业知识构件化。在这个过程中,他们选择自己的品牌。我个人认为,开放性的系统是一个趋势,未来横向的开放性的模型比较好,按照不同层次分工,各自做专长的领域是比较成功的模型。”

    无独有偶,科泰世纪也推出了面向构件的嵌入式操作系统平台,并且采用了JAVA和.NET之外的第三条技术路线,这就是利用传统的C和C++编译器加上自行定义的构件描述语言,使最后生成的构件同时具有C++二进制代码的效率和类似于JAVA、.NET的类描述信息(class-info)。CEO陈榕说:“这主要是综合考虑如何解决效率的问题和零件动态拼装的问题”。操作系统要求其开发平台生成的代码质量要好、效率要高,但在与外部构件或者其他厂商构件(包括JAVA、.NET平台开发的构件)沟通的时候,还可以自动转换为XML和WEB Services的通讯协议。科泰世纪在面向构件技术上实现了一个重大的突破。这就是原来的DLL、CORBA这种构件是通过手动、半自动连接的,而现在的构件可以通过自描述,在运行过程中自动连接,他们仿照JAVA的虚拟机的思想,做了一个基于CPU“母语”(native code)的可以动态连接和管理构件的平台,这也就是科泰世纪所称的操作系统。陈榕表示,这和一般意义上的C++构件还不完全一样,应该算是构件的一种扩展。实现动态连接就可以使得这些构件不需要人工干预,能够自动连接,寻找和下载。DLL对于运行时如何动态连接起来这方面的具体技术并没有成熟,而现在他们的技术可以保证这些构件在运行的时候能够动态的拼装,并发挥最大的效能。陈榕说:“这是一个自动的过程,体现了服务的概念。”

    而无锡永中却在探索将面向构件的编程应用到Office产品的开发中。永中Office因为采用了Java作为开发语言,自然也遵循了Java的标准。永中的研发资深副总刘沅认为,现在的微软Office软件中包括了各种各样功能的Dll,有些Dll功能即便不需要也会在程序启动的时候全部加载,而无法实现只要需要表格绘制功能时才动态加载这一模块。而面向构件的新技术就可以解决这些问题,将不同功能做成构件,只有在需要使用这些功能的时候才从网上或者本地加载这些构件模块,实现整个Office的功能。

    其实,国内的一些管理软件厂商也或多或少的做了构件平台的开发工作,只不过所做的仅限于对自身产品开发的提升,并没有产生一套通用的构件开发平台。这些国内厂商不谋而合走到了一起,共同致力于将面向构件思想扩展到具体的应用和开发平台领域。正如陈榕说言:“大师打造的平台思想,正在逐渐被世人所接受,全世界的开发者现在逐渐才明白,原来程序应该这样写。现在我们这些人是死心塌地的来做这件事情了。”

    面向构件颠覆了什么?

    没有银弹?!

软件越来越复杂,时间要求越来越短,软件的代码从20年前的几百行到现在的上百万行。虽然高级语言的描述能力在增强,由于句子数目是固定的,高级语言就只有几十个变化的句子,描述的代码只能增长,这样软件中的变数越来越大,任何一个系统开发完成后很难测试,而且用CMM这种管理模式更无法解决这个变数的问题。因此,黄柳青认为,“软件没有银弹是因为系统中的变化因子是在指数级的变化。”而现在,一旦我们将一个软件转变为由构件来进行开发,软件就不是由100万行代码,而是有几千个构件构成的,这样变化的因素就少了,控制和管理的能力就加强。

    同时,构件的内涵也可以不断扩展,比如集成电路尽管其内部电路在不断的增加和复杂,但从外部看来仍然是一个集成块。计算机尽管越来越复杂,但打开机箱,其中的部件反而减少了很多。所以不管软件系统多么复杂,都可以看作是一些构件的组成,系统的构件数可能是固定的。因此,构件的范畴也可以不断扩大,整个系统的复杂度由以前不能控制的代码指数级增长变成了可控制。因此,曾表示“没有银弹”的Frederick Brooks后来表示:构件技术就是软件行业的银弹。

    而且,现有的很多系统的扩展也适合采用构件的形式,比如,CRM要和现有业务系统融合,必须要把现有的模块打碎才能融合,因此以后的企业管理软件可能都会是很小的构件,他和日常的业务系统结合起来。这样系统内和系统间采用面向构件的系统来实现是最为有效的。

    面向构件对程序员的影响

    很多工程师都把自己定位在了做衣服、做家具层次的技术工匠,他们对一个软件如何做的非常精致、如何更好看这种技术底层的内容非常感兴趣,觉得接触的技术越多,自己就越高级,越资深。但与此同时,随着对技术完美的追求,却感觉做软件就像吃青春饭,只是挣的钱比别人高一点,几年之后,年级大了,便感觉未来充满了不确定性。好不容易C语言清楚了,出现了VB、Delphi就不行了,搞清楚了这些语言,又出现了Java。所以,我们一方面可以看到很多程序员对工匠型工作非常满意和投入,但同时又发现,在这个过程中又很快失去了自己的位置。教育上也是如此,最早培养的是C语言的工程师,现在又培养Java的工程师。都是将语言放在了一个专业的层面上来学习,这样当当C++已经不再热门之后,这个专业就荒废掉了。

    程序员一定要把自己放在更高的层次和不同的角度来看问题。黄柳青认为,尽管语言和算法也非常需要,但在学习的过程中需要对计算机系统有一个更高层次的理解,如果能够通过编程语言的技巧能够升华到更高级别的话,那个体的价值也就会随之升高。这就像学建筑的也要学习施工等课程,但学习这些课程并不是目的。所以,学编程语言不是目的,而是要对软件体系和软件能力理解,并要结合业务知识。如果我们一直抱着某种语言不放,那要么变成古董,要么发展空间会变小。

    因此,程序员要调整心态,正确看待自身的位置,这也是包括在职工程师和计算机专业学生都需要深刻思考的问题。黄柳青表示,“对于软件工程师来说,编程语言只是他们使用的一个工具,工具就需要选择好用和方便的,然而我们追求的不是工具,而是用工具描述出来的软件和系统。”未来,越来越多的懂软件的人同时也是业务的专家,业务知识会成为他竞争的核心力。比如,一个电信的开发部门拥有一些多年Client-Server开发经验的工程师,当面临Web技术时,如果从外面雇佣一些懂Web技术的新人,这种做法往往会很失败,因为电信中的复杂流程不是一两天就可以培训出来的,相反,即使同样一群人,采用面向构件的技术,经过简单培训后可以变成互联网应用的专家,利用原先他们已具有最核心的价值,使用面向构件的工具,很快将业务知识转变成基于J2EE的架构。

    同时,面向构件技术也给软件设计师提供了更大的发展可能,将会有更多人探讨如何使用构件技术搭建一个很好的软件,而不是去考虑技术细节。软件架构师也是从建筑师的内涵转来的,这些人并不负责采伐树木,而是根据定位、美学和建筑理论方面的理论进行升华后设计的,他可以在同样的地方,用同样的材料设计出不同的建筑。因此,当软件开发人员从这个角度看软件的时候,他的思想会得到升华,自己的灵魂也可以得到解放。我们可以这样说,以后的软件肯定不是要求从几万行代码这样做起,而是由构件作为基本元素来搭建的,软件工程师可以根据自己的美学追求和用户的需求把软件设计的更好。软件设计最终将会成为一个专业,课程主要讲述如何从应用的角度把一个软件搭建好,设计好,这就像房子如何设计的更美、更时尚、更合理一样成为永恒的课题。

    你已经有拖拉机了,还需要铁锹吗?

    有些公司认为,汇编已经够了,或者面向结构化编程已经可以解决问题了,这也很正常。陈榕说:“这就像我们发明了拖拉机,但还有需要铁锹的地方。各有各的用处,但大家一定要意识到,我们已经有拖拉机了。”开发人员必将意识到:我们真的已经走进了一个新的编程时代,这一变化是针对整个软件开发领域的,从最小的软件到最大的系统都适用。

    随着面向构件技术越来越成熟,关注底层技术的开发人员会越来越少,但他们会去做一些更加核心的有价值的工作。陈榕说:“国外像我们这样全身心投入到面向构件领域的人很多,很多国外小公司都是从做个别零件发展到自己做系统,现在发现可以工厂式制造了,这些公司就又回到原来集中精力开发各种不同的零件了,主要是在制造JAVA零件。我认为系统软件领域,也就是C语言占主导地位的地方,开展软件工业化生产同样大有可为。这在世界上也还是个崭新的课题,回头看看现在常用的系统软件构件技术,比如COM、CORBA、GNOME(用于Linux桌面系统)、XPCOM(用于Mozilla)、UNO(用于OpenOffice)等,他们与JAVA和.NET相比的思想相比,差距很明显。”

    尽管业内人士认为面向构件技术将在未来两三年内被广泛的接受,但从多方面反馈看,普通程序员对面向构件的技术还普遍缺乏了解,这也与学校教育和媒体的宣传不够有关。陈榕说:“面向对象等技术也同样经历了逐渐被接受的过程,宣传的重要途径是在学校中推广和在媒体上宣传。要了解面向构件编程,只是读读代码还很不够,还需要真正的去写,从中才可以得到真正的感觉,你会喜欢上这种编程方式的。” 为此,科泰世纪还决定今年夏秋之际将他们的“和欣2.0”源代码开放出来供开放人员阅读和学习。

相关阅读: