作者:孟岩 来源:CSDN博客   酷勤网收集 2007-12-02

摘要
  我见过抱怨COM难用的,我自己也经常抱怨COM不好理解,但从来没见过对COM持否定和严厉批判态度的。这位作者写道:COM的滥用导致现在软件质量的严重下降,COM的设计可以说是软件史上最严重的一次设计失误,COM的设计违反了软件设计的基本原理

我刚刚看到华中科技大学新近出版的一本新书《多任务下的数据结构与算法》,作者周伟明。这本书的主题虽然是被无数次重复过的数据结构和算法,但是由于加了一个“多任务”的帽子,就焕发出了光芒。多核时代已经到来,所以我们过去的很多经验都需要刷新了。这本书的作者显然在这方面有很丰富的经验,书中从多任务的观点出发,针对很多传统的数据结构和算法设计都作了探讨。比如提到STL中传统的iterator在多任务情况下要么会出错,要么会导致分时效率低下,并且给出一个新的iterator,以适应多任务的要求。可见确实是经验之谈。

不过最令我感到震动的,是这位作者对COM的严厉批判。说实话,我见过抱怨COM难用的,我自己也经常抱怨COM不好理解,但从来没见过对COM持否定和严厉批判态度的。这位作者在他的书中这样写道:

“对于模板库,或者任何一种技术,都得看应用的场合。其实,任何一种思想和方法的滥用都会导致严重的后果。就像设计模式的滥用一样。例如,COM的滥用导致现在软件质量的严重下降。COM的设计可以说是软件史上最严重的一次设计失误,COM的设计违反了软件设计的基本原理,但就这样一个设计居然被推广到整个业界使用,造成的危害实在太大了。我们可以看到,很多常用的软件的BUG越来越多,动不动就死掉或要求发送错误报告什么的,很多情况估计都是拜COM所赐。虽然微软现在再也不敢提COM了,但它的副作用短期内仍然难以消除,特别是在中国,谈到设计时很多人现在还在言必称组件。”(1.1节)

“即使是一些著名大公司开发的软件依然达不到很高的质量,经常出现版本升级越高BUG越多的情况。也许有人会问,这不是在危言耸听吧?其实读者只要看看自己手头经常在用的操作系统和办公软件就知道为什么说这句话了。”(1.5节)

“像前面提到的COM一样,实际上是一种设计模式,但是被不加限制地推广给用户使用,而大部分用户的水平还没有上升到懂得在什么情况下该使用什么设计模式那么高的层次,后果便是设计模式被滥用,于是我们看到大型软件的质量是越来越糟糕。”(1.5节)

坦率的说,我对于作者的观点是不赞成的,我手上没有证据表明是COM导致了微软软件质量的下降(真的下降了吗?至少我不觉得今天的Word 2003比10年前的Word 95更容易崩溃。)。不过我赞赏这位作者敢于说出自己真实想法的勇气。因为怕得罪人,或者怕被人拍扳转,而不敢把自己的想法说出来,是我们中国开发者的一个毛病。对什么事情有了看法,敢于说出来,而且敢于写在正式发表的文章和图书里面,这在今天是需要勇气的。只有勇于提出异议,才能够引起争论,加强认识。也许,你揭穿的真的就是狗皮膏药,皇帝的新衣。

可惜的是,作者在做出一些论断的时候,并没有给出确凿的论据。也许是因为这本书的主题并不是“组件技术批判”,不宜离题太远吧。不过我很希望作者有机会能把自己的观点系统地阐述一番,并且产生一些争论。不管怎样,这对于提升大家的认识还是大有好处的。也希望听到其他朋友对于COM以及这位作者的观点讲出自己的看法。

评论

#   1000copy 发表于2006-05-25 22:51:00  IP: 222.210.92.*
版本升级越高BUG越多 恐怕和com没有多少关系,就好像红楼梦的一大家子本身就是不稳定的集合体,稍微有些不够勤勉都会导致bug的积累。

#   flyingxu 发表于2006-05-25 23:16:00  IP: 218.80.68.*
估计和com无关,举的理由也没有说服力

#   ITLionWoo 发表于2006-05-25 23:27:00  IP: 58.100.90.*
按照他的说法,C++语言是世界是最烂的语言,用它写的程序不知出现了多少的BUG。晕。

#   sevencat 发表于2006-05-26 06:25:00  IP: 222.68.42.*
版本升级越高BUG越多在大型软件中很正常的。
COM在业界已经被大规模使用了,MS自己也仍在大规模使用,.net说实话也可以理解为加强版的.com了。

iterator级的多线程安全,我没做过,这样做效率太差了。跟JAVA的做法倒有些相似了。


#   ccc 发表于2006-05-26 11:39:00  IP: 222.37.57.*
stl 的iterator在多任务、多线程情况下要做同步处理这是常识,没什么好说的。

COM 是商业和技术发展的必然,但不是终点,任何恶毒的批判全面的否定都是幼稚的表现,或者泄露自己的某些阴暗面。

#   ahao 发表于2006-05-26 12:01:00  IP: 221.137.221.*
COM无疑是成功的,虽然我不太懂:)看看国外卖组件的网站就知道了,完成了API到DotNet的成功过渡.任何一个技术都有它出现的理由,如果有人觉得COM烂,那请你发明一个更好的,否则请闭嘴.Corba也极难,也有很多人说烂.但也很成功不是吗?
我发现很多人如果弄不懂一个东西就喜欢说它烂.还是安静点多学习学习吧.

#   sunxiunan 发表于2006-05-26 12:51:00  IP: 208.22.104.*
这又是一个无知者无畏的例子。

十年以前这位朋友在做什么?在当时的环境下提出COM思想使用COM的人,比如don box,现在仍然是大牛,当时这位朋友如果也搞编程,怎么没见提出什么新的想法,北大青鸟的构件编程还不如COM呢。

而且,10年对于计算机编程思想来说,就是隔着一代人。COM实际上根CORBA或者XPCOM、KPART这些组件思想没有太多区别。可能实现上有些问题,但设计思想绝对是先进的。

现在流行的GNOME、KDE、J2EE、DotNET无不体现着组件编程的光辉色彩。包括各种网络框架。

by 孩子气孙秀楠宝宝网
www.sunxiunan.com

#   ahao 发表于2006-05-26 12:07:00  IP: 221.137.221.*
想让一个容器是线程安全的很容易,但又要通用又要高效又要好用又要有正确的行为的(即使一个容器是线程安全的,也不能保证它的最终行为是用户预期的),你去写个试试?我相信世界上没人能写.
所谓设计,就是很多个选择的组合,取舍的艺术.平衡的艺术.
动不动叫嚣着别人怎么烂,自己怎么强的人,只能显出自己的无知,井底之蛙.

#   ishou 发表于2006-05-26 19:18:00  IP: 202.156.155.*
任何东西滥用都可能出现问题。COM被滥用出现的问题,怎么能怪罪到COM技术本身。
C/C++中使用COM构件不是太方便,甚至可以说很麻烦,倒是脚本语言中利用ActiveX接口,操作COM构件往往十分方便!

#   feelapi 发表于2006-05-27 02:17:00  IP: 219.236.200.*
我觉得COM的问题不在于以上所说的,关键在于:COM依赖Windows,依赖于COM library。我们可以使用COM的协议,但是可以不使用COM Library 地实现。这个是有实例的。是有很多软件使用COM,但是大家想过为什么那些不用COM的软件么?为什么Google不用COM实现他的网络界面(或许可以这么说)?仅仅是因为要COM不能跨平台?这个不只是商业问题,这是技术问题.不只是软件设计的问题.

无知者无畏?想哭啊。为什么Google成功?

技术就是技术,为什么不老老实实?

#   feelapi 发表于2006-05-27 02:50:00  IP: 219.236.200.*
所谓的COM,..NET都是在应用层的东西.很多软件都是在设计好核心应用的数据结构和算法之后,才考虑根据市场和商业的需求使用这些技术.我这么说很多人要拍砖了,我还是要说,和真正的系统级比起来,这些就是应用的东西.

我建议大家可以研究一下别人的软件.
XMLSpy, 界面使用BCG,主要的编辑控件使用scintilla.但是重要的是他的功能.这些是别人的又怎么样?
Unigraphics NX. 其中某些模块使用Python, tcl.可是关键的内核是使用纯C开发的,难道仅仅是因为历史和维护的原因?在这种系统中,COM,.NET 是用来做上层接口的,不是做底层架构的.

所谓设计,就是使用合适的算法和数据结构,乃至合适的"外壳"技术达到软件的功能和市场目标.这么说尽管不是很严密,但是我觉得COM,.NET更多的是应用层的技术.不是很多人认为的那么高层度的东西.

为什么我们不关注最基本的计算机科学应该关注的内容?
太难?
没钱赚?
别人都做好了,我么没法做了?
没机会做了?
不值得做了?
搞学术的东西对目前中国的现状没有帮助?
搞学术的都是骗人的?
学校里学的都是没用的?
从零开始开发太浪费了?
技术上没法跨越多年的技术鸿沟?
学术研究的东西在中国很难商业化?
中国缺少硅谷的商业化环境和技术环境?

鲁迅怎么说来着:世上本没有路,走的人多了,就成了路。失败了?就否定到不了罗马?

我觉得很多人都被洗脑了,都觉得中国人没法赶上这拨了,做不了基础的工作了,那20年前呢?

计算机专业都会上什么计算机文化吧。没有无数的失败和尝试,那来的计算机文化?

扯了不少蛋,见谅。

#   yyy 发表于2006-05-27 13:10:00  IP: 61.144.28.*
我觉得发表回复的时候应该抱着讨论问题的态度, 可以给别人的观点下定论,但不要给观点的作者扣帽子.
他说的并不全无道理, 人们对COM有太多的抬举, 以至于很多并不需要COM的地方也采用COM, 这跟设计模式,GP,STL的使用一样,滥用只会适得其反. 作者说这个观点, 可能是想说明,大多数时候这些基础的数据结构和算法已经足够了, 并不需要特意去采用很多流行的东西. 一切从需要出发.

#   mcs51a 发表于2006-05-27 16:50:00  IP: 58.34.144.*
COM 这玩意,不够简明. net要好多了.

#   Shawn 发表于2006-05-29 14:08:00  IP: 221.10.24.*
COM符合C++设计的初衷.

#   kk 发表于2006-05-31 10:55:00  IP: 222.222.54.*
几年前我读过《Inside COM》,感觉COM设计得够丑陋的,可当时主人还故能玄虚,敝帚自珍。

#   jq0123 发表于2006-06-02 13:47:00  IP: 218.81.255.*
对,COM就是太玄虚了。
好用才是真道理。

#   feelapi 发表于2006-06-02 22:44:00  IP: 219.236.200.*
为什么不从 Inside OLE2 开始?那个才是王道阿。可惜从来没看完过。

#   spirit.moon 发表于2006-06-03 13:27:00  IP: 219.232.42.*
这位说COM导致软件质量严重下降,还是偏激了一点。虽然我同意COM/ACTIVEX技术复杂,但软件质量下降不能只怪于COM技术的复杂度

事实上现在WINDOWS的系统越来越向COM靠拢。包括。NET也没有抛弃COM
WINDOWS上,你可以用脚本完成很多工作,如果你熟悉WINDOWS上的ACTIVEX对象的话。

windows也是没有办法。COM主要的优势还是一种“与语言无关的二进制代码标准”。当时的开发语言太多太复杂。无法互相沟通。ACTIVEX/COM技术的出现,让各种语言编写的代码可以互相沟通调用。 VC,BC,VB,DELPHI,你能想象吗?从这点来讲COM强调复用的。这是好的。当然COM复杂也是要承认的。VB编写COM/ACTIVEX很简单。VC下却太TM复杂。虽然后来有ATL的加入,事实上仍没有对COM编程有很多的简化,光是接口计数引用,类型转换就能让初学者头疼不已,尽管编程细节上有很多现成的可借鉴的,但你仍然需要非常小心。更别说远程COM,什么对象上下文了。我至今为止也未曾很了解COM,我所接触的只是用ATL编写一些其他语言无法实现的功能,供他们使用。

与JAVA比起来,光是讲接口定义与实现,那COM真是太复杂了。这个不得不承认。


#   sunxiunan 发表于2006-06-05 11:47:00  IP: 208.22.104.*
前面一位朋友提到了google,

首先google并没有很多GUI的东西,而微软能占领desktop,不可能不考虑GUI。两者根本不具有可比性,如果说MSN live或者MSN search跟google比还差不多。

其次google的桌面软件大部分都是windows版本的,不信可以自己去查,比如picasa做了个linux,大家都会拍手相庆,其实还是用了wine这个模拟器。

之所以鄙视这种人,是因为中国的高校里太多这样的序里冒套的人。(大连话,很虚浮,不实际的意思)光有结论没有论证的过程。自己都逻辑混乱,如果去教别人?

我也会说这样的话,google必死,当google死的时候,大家就知道我说的一定正确。

#   KAKA 发表于2006-06-06 11:32:00  IP: 192.168.1.*
是书呆子吧,也就在学校里搞搞,
给我打下手都不要的。
我面试过程中也会有这样的对话:

“怎么把一个std string转到BSTR?”
“什么叫BSTR?”
“你简历不是写着熟悉COM吗?熟悉一样东西的基本要求是能熟练处理字串,任何语言都一样,COM也一样。”
“我只看过一些书。”
“你可以走了。没有用COM做过系统人根本不能说自己熟悉COM,哪怕他看了10本COM的书,只能说知道。只有在一线写过3年以上C/C++代码并且智商在140以上的人才能真正领会COM。”

COM的设计思想是自然的,先进的。软件的设计就是接口的设计。

COM是难学吗?对于符合我说的条件的人,COM的基本原理可以在几小时内熟悉,并能用C/C++构建出一个COM对象。熟悉原理之后,再化几天或者一周的时间读一遍ATL的一些关键类,用ATL写方便一些了吧。剩下的就是慢慢熟悉各种接口,用到什么去看什么。

J2EE搞得更复杂吧?

#   KAKA 发表于2006-06-06 10:45:00  IP: 192.168.1.*
先好好的写几行代码
无知者无畏

#   djfu 发表于2006-06-08 12:50:00  IP: 61.141.179.*
COM其实就是包装了设计模式,没有那么复杂;

#   tangyzh 发表于2006-06-09 12:41:00  IP: 218.249.161.*
复杂的东西不一定就是坏的,简单的东西不一定就是好的。复杂不能成为逃避学习和贬损的借口,复杂的东西理解了就不复杂了,COM也是如此。COM无非是实现可执行二进制代码层面上的复用,并且可以跨语言。

#   Goleo 发表于2006-06-12 12:01:00  IP: 192.168.1.*
您怎么什么书都看哪,还是比较闲。

#   bigfanofcpp 发表于2006-06-12 18:23:00  IP: 218.97.244.*
COM和BUG没有直接关系。。。。。。
我理解的COM是“桥梁”,是为了代码之间的“二进制”兼容,是个中间层。
而BUG是代码细节的事情,主要是逻辑问题。

#   zcpro 发表于2006-06-19 14:10:00  IP: 60.176.140.*
com是个好东西,虽然很复杂。
最近在写个库,由好几个dll组成,结果遇到很多问题,最终的解决方法很多都是借鉴了com的思想,这回终于明白了什么叫“二进制代码层面上的复用”,或者说明白了这么做有多难。
要是com不考虑跨语言支持,只为c++服务该多好,可以少很多累赘

#   Franklin 发表于2006-06-23 16:14:00  IP: 63.161.86.*
我想.net没有抛弃COM,如果说我们真正在意的是"组件技术"及其背后的设计思想。非常明显:COM的特质还在dot net里面,只是好多琐碎的事情交给compiler. 软件质量的提高离不开好的开发工具,优雅的语言。

#   Tony & Bob 发表于2006-06-25 22:00:00  IP: 218.80.177.*
“二进制代码层面上的复用”可以进一步理解为“目标代码层面上的复用”。也就是从COM发展到.NET了。“目标代码层面上的复用”是每个程序员不可回避的话题。

COM的发明人是Tony Williams 和 Bob Atkinson。Tony是个美籍英国人,绅士风度,与世无争。土生土长的老美Bob是个粗人,与Tony性格相反,没几句话就是骂人的脏话。如果Bob读了那本书,“Fuck you!”已经喊出口N回了。所以,媒体、大会很少请他们。因此他们很少抛头露面。Don Box只是N年之后写了“Essential COM”书的作者,没有参与过任何COM研发。相比CSDN最近请来的所谓“大师们”的洋和尚,Tony和Bob的造诣应该是可以用“登峰造极”来形容。

小屁孩儿们,还是学会尊重长辈吧。


#   Tony & Bob 发表于2006-06-25 22:19:00  IP: 218.80.177.*
顺便说一句,《Inside OLE2 》的作者基本不懂COM,属于“写不好,瞎写”那种。第二版前言,他自己说,“这次(第二次)终于明白(OLE)一点了。”

COM发表于1992年初,其代表产品就是OLE 2.0。

#   abenking 发表于2006-06-27 00:15:00  IP: 58.61.72.*
现在很多人都在喊叫COM,组件之类的东西.我对它了解的不多,本来打算学习一下的,去书店买那本号称最有名的书<com本质论>居然买不到,去网上购,也没有...我当时只是纳闷.现在一下子觉得,如果这个技术这样NB,怎么介绍他的书籍都不出了.对国外的书市了解的不多..不知道在COM发明者有没有再去写一些关于COM的书,似乎也没有见到那些使用的人写出关于COM的书了.

至于作者为什么要在这本写数据结构的书里来批判COM..我也觉得有点怪怪的..

只是看见作者说COM违反了软件的基本设计原理,我从来没看到过那本书介绍过什么软件基本设计原理,请问有没有人懂软件基本设计原理是什么,这里有没有什么玄机?

作者说COM带来的BUG很多.大家也都说COM的一些做法很繁琐..我到是觉得繁琐正是产生软件BUG的重大问题所在.繁琐就意味着不好设计,不好测试吧.. 而作者说违反了软件设计的原理...搞不懂..软件设计的原理到底是什么呢????

还有啊~~~这里很多人在骂..呵呵..
让我想到:
1.人们都坚信地球是平的时候,提出地球是圆的人,最后得到的结果..而事实却是如何呢?
2.以前看过一篇文章.说中国的程序员.只能见到眼前的东西..给你C++,你就学.人家说好.你就说他好..可是就连C++之父.也说C++有它的弊端.而中国的程序员又有几个人在骂C++语言本身的呢?也不知道谁到底是井底之蛙呢?

我觉得还是正确的面对这些技术的问题好一点.要不有一天那个设计COM的人也说COM不好的话..上面这些人该怎么给自己找回面子呢?

什么时候可以看见我们中国人能设计出一个语言.一种设计思想啊~~ ^_^~~~

对于软件设计理论.有知道的人..还是烦劳给介绍一下吧...
=====================================
振兴中国软件技术
支撑起中国软件的一片天空







#   yyyyy 发表于2006-06-30 10:05:00  IP: 202.114.26.*
这本书看过很好!

#   hong 发表于2006-06-30 10:47:00  IP: 58.49.254.*
我倒是在书店里看到这本书了,中间有几段还是比较精彩的。比如
使用树的遍历算法来实现Xcopy功能。

#   michaelyuan 发表于2006-07-13 11:09:00  IP: 219.136.15.*
看过这本书的介绍,有些内容还是挺不错的,比较关注的是多任务及软件质量,COM的好坏我不敢下结论,不过对于一项技术的应用,肯定有它的利弊,最主要的为你的客户和你自己选择对双方都有利的技术才能够达到你想要的客户满意度

#   hong 发表于2006-07-14 10:33:00  IP: 58.49.248.*
呵呵!希望作者能对已经做出的论断给出进一步的论据,系统地阐明自己的观点,即使因此引起争论,还是有益于提升大家的认识。

#   hustp 发表于2006-07-14 10:36:00  IP: 58.49.248.*
本书 从多任务的观点出发,针对很多传统的数据结构和算法设计都作了探讨。比如提到STL中传统的iterator在多任务情况下要么会出错,要么会导致分时效率低下,并且给出一个新的iterator,以适应多任务的要求。可见确实是经验之谈。

本书的主旨并不为批判com,作者从自己的角度表达了自己的观点.
对本书花费了大量的心血.建议读者看看,可以丛中学到不少内容.
可以从多个角度了解新的思想.

#   Perry 发表于2006-07-15 01:32:00  IP: 58.39.2.*
作者说的质量下降并不是指微软自己开发的产品,而是以windows为平台以com为主要算法承载对象的第三方独立软件开发商(ISV),相信作者自己也曾经参与过这样一些项目才感受到如此的切肤之痛的。com并不是developer-frendly和user-friendly的东西,当你开发过程中依赖组件太多的时候,那么各种莫名其妙的错误的伴随就再也挥之不去了。作为ISV你可能经常会受到客户抱怨说你的产品不能正常工作,而你也毫无头绪究竟是哪个组件出了问题。直到你费尽千辛万苦研究出来的时候,哪个出错的组件的供应商可能面临和你一样的问题,很有可能人家已经放弃了后续的开发和维护,你就被架空在那里,感觉到非常无助。于是我们经常会在某些公司或者机构里面看见一台强大的服务器,却禁止安装和使用任何应用,甚至不允许windows update,只为了保证其中一个负荷很小的应用能够正常运行的怪现象。若楼主不仅仅是凭空在技术层面讨论而是去参与过几个这样的项目,遭遇几次这样的问题,就会理解作者为何如此憎恨com了。

#   wdx04 发表于2006-07-17 20:47:00  IP: 221.226.224.*
这本书标题就有问题,多任务和多线程又不是一个概念。COM也不是好东西,本来M$搞COM就两个目的,一是想通过COM组件来提高VB的竞争力,另一个目的就是想借此打压Borland。Windows下的C++程序员只是牺牲品而已。

#   owen 发表于2006-07-18 21:33:00  IP: 59.44.109.*
请大家宽容的看待问题,我买了这本书,觉得这本书确有不少值得关注的地方。作者提出自己的一些看法也没什么不可以。而且有些问题通过讨论、争论会变得更清晰,有助于大家得到共识。即便达不成共识,也能增加对问题的理解。

#   COM是最容易学习和掌握的技术! 发表于2006-07-24 08:44:00  IP: 222.171.38.*
COM是最容易学习和掌握的技术!

#   COM是最容易学习和掌握的技术! 发表于2006-07-24 08:50:00  IP: 222.171.38.*
COM是最容易学习和掌握的技术!

#   Lixeon 发表于2006-08-14 15:25:00  IP: 60.176.177.*
人品差不能怪政府,
个人技术水平差不能怪COM

#   Lixeon 发表于2006-08-14 15:31:00  IP: 60.176.177.*
STL在设计上本身就没考虑多任务互斥。线程、临界区之类的多任务相关的东西是平台相关的,而stl是平台无关的。不知道那本书的作者写那个新的iterator的时候是用了Windows的线程和互斥模型还是UNIX下的线程和互斥模型。

#   Jacklondon Chen 发表于2006-09-07 03:19:00  IP: 218.79.151.*
都是扯淡。自己不会写就算了。我最早用 VB 写 COM 的时候,那才较容易!!连数据类型都不用自己转换。VC 写 COM 虽然难了一点,也没有什么特别的。
像 Mozilla 和 Apache 都要在 Unix/Linux 模拟 COM,那位周伟明老兄懂什么?
Windows 上面的 DLL 和 COM 技术都是领先于其他操作系统的。Unix/Linux 上面的动态连接库到现在还没有普及到 Windows DLL 的一小半,至于 Java 的 jar 根本就没有什么版本管理。哎,一代不如一代!!!

#   txg531 发表于2006-09-25 10:21:00  IP: 210.43.106.*
没有最好的技术,只有最合适的技术

#   hansion3406 发表于2007-06-29 17:15:26  IP: 202.118.2.*
一个技术,有它的应用之处,
没有必要说好和坏的。

适当的时候,用好它,不出错就可以了~

来自:http://blog.csdn.net/myan/archive/2006/05/25/755482.aspx

分类: 组件技术

上一篇:性能优化,控件和组件概念浅析   下一篇:没有了


关于酷勤 | 联系方式 | 免责声明 | 友情链接