|
阅读:1429回复:3
VC不是梦想,C++需要自由的心
关于对于VC/MFC/ATL的评论问题,其实我很早就想写一篇文章来阐述自己的观点,
不过又觉得这种容易引发论战的文章实际上是在空耗大家的时间, 不如做点实际 工作. 但是现在中国程序员群体的思想走向已经到了一种非常危险的一边倒的地步, 上几期电脑报上登出了几名14岁的小孩子, 刚刚学会写几个程序, 就把VC列为自己 的梦想. 我去年找工作的时候,连续被几个公司问会不会VC,得到我的答复之后, 他们怎么也不能相信一个学了四年C,两年多C++,还利用“空闲”时间学习了Java、 Perl的人,一个敢于在“专长”一栏里写上“掌握C++”的人,居然只是对VC“略 有了解”,我从他们的表情中看出一种不屑:“你还敢说自己懂C++?你还有时间 去学别的东西?连VC都不会,水平能高到哪去?”我并没有费力去向他们解释VC外 面的世界更精彩,因为之前我在提到STL这个词汇的时候,已经留心他们目光,那是 一种冷漠、茫然和无动于衷。一切都已经十分清楚,解释是徒劳的,他们根本不知道VC外面还有C++。 当然不劳大家担心,我最终还是找到了一份满意的工作。但是这种经历对我的触动 是很大的,因为我已经深深地感觉到,当我们中国的程序员好不容易能够有机会以 一双开放的眼睛面向整个世界的时候,我们的思想又被迅速地封闭了起来。一个叫 微软的巨人用一只巨大的圆规在我们的思想里画了一个大圈圈,并且对我们说: “天就是这么高,地就是么大,你们享受吧!”伊甸园的生活是快味的,但是, 当我们所有人都被牢牢地限制在一个范围之内,听命于一个上帝的清规戒律时,我看不到我们自己的未来还有什么希望,我甚至看不到我们自己存在的意义。 不自由,勿宁死! 我们的能力当然是有限的,在相当长的一段时间里我们所能到达的疆界还是会远远地小于先驱者开拓的界域。但是我确信,就在现在,我们的能力至少可以突破微软给我们划定的天地。微软是好的,她很体贴,很出色。但是不论是微软也好,巨软也好,在我们程序员的心中,没有凯撒。我们可以把你当朋友,但是你别想做我们的主子!我们一定要走出去,虽然我们知道极限是存在的,很长时间里我们是不可能超过前人的,但是我们一定要出去。我们可以因为累死而在探索的道路上而止步,但决不能在人为设定的篱笆前畏缩不前。 C++是我最钟爱的语言,我愿意投入一辈子的时间在她的身上。VC也是一个好东西,在Windows下我最喜欢的C++编译器。MFC/ATL也都是好东西,如果将来需要,我也会认真地学习它们。但是,我心中的天地比这要宽广的多,标准C++所定义的语言性能集和标准库,是更加绚丽的风景线;STL所带来的通用编程时代的曙光,更令我心驰神往;设计模式的精美与一致,面向模式编程范式的初现端倪,面向对象软件工程的成熟与巨大希望,TAO/ACE的庞大与精致,我们中国人自己的C**语言的动人心魄,...,让我目不暇接的珍宝太多太多。虽然我所能接触到的东西只是一小部分,虽然在这个过程中我更加深刻地发现自己的水平是多么的不值一提,但是我已经可以大声宣称:外面的世界很精彩! 我知道我们都还是生活在现实世界中的,精神上的快乐不足以填饱辘辘饥肠。但是 我们现在是在说C++啊!想想你为什么不用更简单、更好挣钱的VB、Java、Delphi, 偏偏要把已经够难学的VC当成自己心中的理想呢?不就是因为VC能够代给你自由、 自信和自豪吗?如果你意识到VC同样是道更大的篱笆墙,你为什么不愿意冲出去, 获取更大的自由、自信和自豪呢? B.Stroustrup说:“我想大家学习C++,应该是为了解决哪些开创性的问题,而不是 一次次地重复解决哪些已经有了成熟的框架和现成的解决方案的问题。”C++是开拓 者的语言,是思想者的语言,是“高手”层次之上的语言。或许在实用性、简单性 方面,现在和将来都会有许多语言不断地超越它。但是,我认为在相当长的一段时间里,在构造和表达软件工程思想和创造性软件的开发领域,不会有什么语言能超过它。或者说,精通了C++语言及其思想的程序员,在思想深度和对新技术的领悟能力上上是远远超越其他语言使用者的,我们或许应该称这种人为程序员中的思想者。正因为如此,我认为被限制在VC的圈圈里,不是一个C++程序员能够容忍的。 我觉得,作为一名真正的C++程序员和自由的思想者,更应该有有一颗仁慈的心。不要整天纠缠与C++和JAVA谁好谁次的争论,不要一听说某软件使用VB做的就鄙夷起来,更不要拒绝学习其他的语言。C++难学、难用,距离应用层面比较远,这些问题我们应该坦率地承认,可能的话做出一些努力来改变这些情况。应该积极鼓励把其他语言与C++混合使用,让C++成为它们背后坚实的支撑。我不是公司的老板,但是我觉得,如果我的企业能拥有这种水平的程序员,我会为自己的企业而骄傲,也会给他最高的薪水。 附: 我个人认为MFC实现上的缺陷: MFC是在89年代末,90年代初定型的,当时C++还十分不完善。在当时来讲,MFC是相当先进的。但是从那以后,C++发生了(可以说是)革命性的巨大变化,与新的C++相比,MFC的体系结构和实现机制显得比较落后,很多优秀的C++特性都没有被合理地应用,反而自己另起炉灶搞了一摊。而且VC这种语言也越来越不象C++了,完全为微软自己的应用而量身定制,甚至不惜违反标准。(不过在编译技术尤其是优化技术上的确还是无人能及) MFC由几个缺点让我比较不满: 1. 大量使用稀奇古怪宏, 搞的代码不象个样子. 真佩服有些人那么耐心地去分析它们. 2. 消息映射的实现机制十分笨拙. 不用继承我可以理解, 但是为什么不用委托, 而要 用表驱动? 还是那句话, 搞的代码不像个样子. 3. 对于底层SDK的封装太薄, 面向对象的感觉不足.(当然也有他的好处, 不过这毕竟是 C++!) 4. 自己另起炉灶搞了RTTI, SEH, CString, CObjXXX(Container)这些东西, 实现的 又不太好, 早几年还可以理解, 现在则完全落伍. 5. 很多场合本来是标准库可以一展身手的地方, MFC完全没用上. 6. 为了迎合MFC, 编译器的很多地方都违反标准. 7. Doc/View体系的局限性, 想突破很难. 话说回来, MFC还是一套出色的工具. 但是现在它事实上已经成为了对中国C++程序员的一个威胁, 它把太多的精力和资源吸引到支路上面, 而对于主干道上真正的好东西视而不见. 矫枉必须过正, 所以我不惜得罪一大批人, 写了上面的文章. 正如开篇所 说, 我一向认为无休止的争论是空谈误国, 该说的话已经说了, 大家可以批评讨论, 但我大概是不会再回到这个话题上来了. |
|
|
|
1C#
发布于:2001-07-22 13:24
作者:velese
那边也有一些评论,拷贝一个到这里吧。以下文字中一部分是myan的原文,一部分是评论。
在这个行业里面我也混了五六年了,加上学校里面滚爬了两年。在工作中我一直用VC,但是还没有在MFC上面开发过什么程序,所有对MFC的了解来自于平常在家里为家人写点符合他们要求的娱乐程序比如CD播放器。我老妈眼睛老花,分辨商业播放器上play和forward按钮不是容易的事情:退到能看清楚的位置上就够不着鼠标了。还有一个是记账程序(我安装了一个MS的Money,可是连我自己都不怎么会用),这个程序就用了SDI-DOC/VIEW结构。我写的播放器程序界面上只有一个大大的按钮和大大的Mouse Cursor,按一次就开始放,再按一次就PAUSE。如果在播放状态下双击,就STOP了,好在我老妈的手经过练习还能分辨CLICK和DOUBLE-CLICK。不知道各位看到我的程序要笑掉几颗大牙。我老妈说“这样好!”。 我只会两种计算语言:prolog和C/C++。前者是我的兴趣所在,后者是我的饭碗,其他的语言我练习的程序加起来不到200行,其中一半是Java。在工作中我写过的代码有些用在Solaris下,更多的用在大家不常用甚至不曾听说过的实时系统中,他们都不需要图形界面。我用VC调试所有这些程序,直到最后才转移到目标平台上编译连接和集成测试。我也是个很偏激的人,不愿意为了迎合大多数而装出随和的样子。因此我还是很欣赏这位myan兄忧国忧民的风范的,虽然我对他在这里的观点不敢苟同。 理不辩不明,怎么会是浪费时间呢,myan兄有空还是回来看看吧。 主 题:VC不是梦想,C++需要自由的心 作 者:myan 关于对于VC/MFC/ATL的评论问题,其实我很早就想写一篇文章来阐述自己的观点, 不过又觉得这种容易引发论战的文章实际上是在空耗大家的时间, 不如做点实际工作. 但是现在中国程序员群体的思想走向已经到了一种非常危险的一边倒的地步, 上几期电脑报上登出了几名14岁的小孩子, 刚刚学会写几个程序, 就把VC列为自己的梦想. 我去年找工作的时候,连续被几个公司问会不会VC,得到我的答复之后,他们怎么也不能相信一个学了四年C,两年多C++,还利用“空闲”时间学习了Java、Perl的人,一个敢于在“专长”一栏里写上“掌握C++”的人,居然只是对VC“略有了解”,我从他们的表情中看出一种不屑:“你还敢说自己懂C++?你还有时间去学别的东西?连VC都不会,水平能高到哪去?”我并没有费力去向他们解释VC外面的世界更精彩,因为之前我在提到STL这个词汇的时候,已经留心他们目光,那是一种冷漠、茫然和无动于衷。一切都已经十分清楚,解释是徒劳的,他们根本不知道VC外面还有C++。 C++是什么?VC是什么?VC不是语言,而是C++的一个实现的一个开发环境。作为C++的一个实现,它主要针对Windows平台做了非常有限的编译器扩展而非语言扩展。VC的本质是一个开发环境而已,为什么作者要将自己混同于一般老百姓说出“VC外面还有C++”这样的话呢。VC也绝不是MFC或ATL。VC的另一个本质是它完全针对Windows平台:它和它的生成产物只能在Windows上运行。MFC是什么?是对WIN32API的封装而已,它属于Windows而不是VC,只是作为增值商品(就像来电显示要多收我们10块钱一样)和VC一起发布罢了。我们不能原谅作者将VC混同于MFC/ATL。 关于myan的求职遭遇,推理如下: 公理A:如果一个程序员生活在中国并于90年代在这个行业里面混饭吃,并且他“掌握C++”,那么应该“掌握”BC或VC中的一种或两种开发环境; 注:我有几个朋友读军校然后一直在军队里面搞开发,一直用UNIX。他们确实对VC仅仅“略有了解”,但是目前看不出来他们会和myan兄一样到处求职。 公理B:如果程序员“掌握”VC或BC中的任何一种,只要他能够克服或多或少的情绪,等价于“掌握”另外一种。 结论A,我们有理由认为myan可能是个骗子,或者是总是不忘记把MS写成M$以示划清界限的那种人;“可是我们要开发Windows程序,这个人不能要......” 结论B:myan兄应该承认自己掌握VC,以便让人觉得更诚实一点。 当然不劳大家担心,我最终还是找到了一份满意的工作。但是这种经历对我的触动是很大的,因为我已经深深地感觉到,当我们中国的程序员好不容易能够有机会以一双开放的眼睛面向整个世界的时候,我们的思想又被迅速地封闭了起来。一个叫微软的巨人用一只巨大的圆规在我们的思想里画了一个大圈圈,并且对我们说:“天就是这么高,地就是么大,你们享受吧!”伊甸园的生活是快味的,但是,当我们所有人都被牢牢地限制在一个范围之内,听命于一个上帝的清规戒律时,我看不到我们自己的未来还有什么希望,我甚至看不到我们自己存在的意义。 微软从来就没有画什么圈圈,否则为什么推出MFC还要推出ATL,推出6.0还要.Net。如果myan兄看到了这个圈,这个圈一定是他自己先画出来的。世界上的圈圈大抵都如此。 不自由,勿宁死! 现在我们看到myan兄如此渴望自由。可是自由是什么?myan说,自由就是C++。但是myan兄忘记了这也是个圈子,更大一点。照myan的推理,自由更应该是汇编语言,还不对!自由应该是比特,是半导体,是分子,原子......自由是夸克......过几年myan兄肯定会把C++骂的狗屁不是,然后闭门修炼,用原子为我们创造一个C++++++++语言出来。但是那时候myan已经成仙了,立即看出来他的C+++++++++又是一个圈子,一怒之下一脚踢翻,告诉我们说:只有虚无才是自由的。 我们的能力当然是有限的,在相当长的一段时间里我们所能到达的疆界还是会远远地小于先驱者开拓的界域。但是我确信,就在现在,我们的能力至少可以突破微软给我们划定的天地。微软是好的,她很体贴,很出色。但是不论是微软也好,巨软也好,在我们程序员的心中,没有凯撒。我们可以把你当朋友,但是你别想做我们的主子!我们一定要走出去,虽然我们知道极限是存在的,很长时间里我们是不可能超过前人的,但是我们一定要出去。我们可以因为累死而在探索的道路上而止步,但决不能在人为设定的篱笆前畏缩不前。 我们看到微软为了巴结我们,想方设法不断推出更体贴更强大的产品,我们才是主人。只有奴隶才会想到推翻主人的统治。myan兄发现自己一直给人家当奴隶,所以急跳起来。myan也许会说我,“这个家伙更可怜,连自己是奴隶都不知道而且还做的有滋有味——可怜的中国人!”,不劳大驾,我自己先说了。 C++是我最钟爱的语言,我愿意投入一辈子的时间在她的身上。VC也是一个好东西,在Windows下我最喜欢的C++编译器。MFC/ATL也都是好东西,如果将来需要,我也会认真地学习它们。但是,我心中的天地比这要宽广的多,标准C++所定义的语言性能集和标准库,是更加绚丽的风景线;STL所带来的通用编程时代的曙光,更令我心驰神往;设计模式的精美与一致,面向模式编程范式的初现端倪,面向对象软件工程的成熟与巨大希望,TAO/ACE的庞大与精致,我们中国人自己的C**语言的动人心魄,...,让我目不暇接的珍宝太多太多。虽然我所能接触到的东西只是一小部分,虽然在这个过程中我更加深刻地发现自己的水平是多么的不值一提,但是我已经可以大声宣称:外面的世界很精彩! 到这里myan兄终于承认自己熟悉VC了。但是他的逻辑是,因为自己对MFC只是“略有了解”,所以认为自己对VC也只是“略有了解”。事实上,掌握C++的人学习MFC的时候98%以上的时间是用来学习Windows编程的,而不是MFC本身。熟悉STL的人学习ATL也是小菜。myan原来是要写C**语言,不得了,这种语言的牛B程度是N的两次方,C++不过是N的一次方!我......我自豪我是中国人....... 我知道我们都还是生活在现实世界中的,精神上的快乐不足以填饱辘辘饥肠。但是我们现在是在说C++啊!想想你为什么不用更简单、更好挣钱的VB、Java、Delphi,偏偏要把已经够难学的VC当成自己心中的理想呢?不就是因为VC能够代给你自由、自信和自豪吗?如果你意识到VC同样是道更大的篱笆墙,你为什么不愿意冲出去,获取更大的自由、自信和自豪呢? 中学时候我们天文地理无所不学,大学里我的专业是电子,现在我每天都在写文档和编程序。我有个同事读博士花三年时间研究漏桶算法,没时间去读其他书,现在也跟我一样在这个小圈子里面混,而且看起来遥遥无期。不知道myan兄有没有憎恨自己读书太多,要回到蛮荒时代:那时候思想多自由啊,连永动机都敢想。myan兄大概很欣赏蒙古人的大炮,一箩筐石头倒进去,轰!方圆几百米遍地开花,不像现在,从飞机上把导弹打出去,瞄准了地下室就不会跑到一楼就炸了。 B.Stroustrup说:“我想大家学习C++,应该是为了解决哪些开创性的问题,而不是一次次地重复解决哪些已经有了成熟的框架和现成的解决方案的问题。”C++是开拓者的语言,是思想者的语言,是“高手”层次之上的语言。或许在实用性、简单性方面,现在和将来都会有许多语言不断地超越它。但是,我认为在相当长的一段时间里,在构造和表达软件工程思想和创造性软件的开发领域,不会有什么语言能超过它。或者说,精通了C++语言及其思想的程序员,在思想深度和对新技术的领悟能力上上是远远超越其他语言使用者的,我们或许应该称这种人为程序员中的思想者。正因为如此,我认为被限制在VC的圈圈里,不是一个C++程序员能够容忍的。 我的疑问越来越重:myan难道真是个骗子?他懂不懂语言和编译器的关系。VC是有个“圈子”,当你编译复杂的程序时,比如模板用的比较复杂,VC可能编译不下去(内部错误)。这是它的能力限制,不是它对C++语言的限制。我是一个C++程序员,用VC用的很爽,刚才提到的那个VC的缺陷我可以绕过去,并且愿意原谅它。我用过一个很老的编译器,它的符号表很小,略微大一点的C程序都不能编译,我们只好把大文件拆小。它是个C++编译器,不是一个MFC编译器,而且只要你愿意,可以把VC的编译器内核替换成比如Intel的编译器,让它只剩下一个集成开发环境外壳。 我觉得,作为一名真正的C++程序员和自由的思想者,更应该有有一颗仁慈的心。不要整天纠缠与C++和JAVA谁好谁次的争论,不要一听说某软件使用VB做的就鄙夷起来,更不要拒绝学习其他的语言。C++难学、难用,距离应用层面比较远,这些问题我们应该坦率地承认,可能的话做出一些努力来改变这些情况。应该积极鼓励把其他语言与C++混合使用,让C++成为它们背后坚实的支撑。我不是公司的老板,但是我觉得,如果我的企业能拥有这种水平的程序员,我会为自己的企业而骄傲,也会给他最高的薪水。 附: 我个人认为MFC实现上的缺陷: MFC是在89年代末,90年代初定型的,当时C++还十分不完善。在当时来讲,MFC是相当先进的。但是从那以后,C++发生了(可以说是)革命性的巨大变化,与新的C++相比,MFC的体系结构和实现机制显得比较落后,很多优秀的C++特性都没有被合理地应用,反而自己另起炉灶搞了一摊。而且VC这种语言也越来越不象C++了,完全为微软自己的应用而量身定制,甚至不惜违反标准。(不过在编译技术尤其是优化技术上的确还是无人能及) 狗屁!什么叫“VC这种语言”——对不起,我急了。 是VC环境提供的API库而不是VC自己为Windows而不是为“微软自己的应用”量身定制。原来myan先生把MFC当成了一种语言叫做“VC”,滑天下之大稽也! VC增加了一些编译器扩展,这些扩展是面向平台或为了实用而提供的,你完全可以不用。myan肯定不懂甚至不知道有Prolog语言。这种语言本身非常抽象,它的每个实现都针对平台做了很多扩展,这些扩展大部分是通过库来提供的并且无法用Prolog本 身来实现。C++语言本身就是对语言的应用妥协的产物,比如指针这东西就让B.Stroustrup非常别扭。 “无人能及”的说法让人联想到myan除了MS的软件(Windows + Office + VStudio)之外一无所知。如果确实是这样,那么如果他又对VC仅仅“略有了解”,我是老板肯定不会要他。 MFC由几个缺点让我比较不满: 1. 大量使用稀奇古怪宏, 搞的代码不象个样子. 真佩服有些人那么耐心地去分析它们.2. 消息映射的实现机制十分笨拙. 不用继承我可以理解, 但是为什么不用委托, 而要 用表驱动? 还是那句话, 搞的代码不像个样子. 3. 对于底层SDK的封装太薄, 面向对象的感觉不足.(当然也有他的好处, 不过这毕竟是 C++!) 4. 自己另起炉灶搞了RTTI, SEH, CString, CObjXXX(Container)这些东西, 实现的 又不太好, 早几年还可以理解, 现在则完全落伍. 5. 很多场合本来是标准库可以一展身手的地方, MFC完全没用上. 6. 为了迎合MFC, 编译器的很多地方都违反标准. 7. Doc/View体系的局限性, 想突破很难. 任何人写代码写多了都会喜欢宏这东西。比如delete一个指针,用下面这个宏: #define _delete(p) if(p) {delete p; p=NULL;} 再比如关闭一个HANDLE,可以用: #define CLOSEHANDLE(H) if(H) {CloseHandle(H); H=NULL;} 更进一步可以用: #define CLOSEHANDLE(CLOSE, H) if(H) {CLOSE(H); H=NULL;} 参数检查之类的非正常分支嫌烦可以这样: #define CASE(condition, op) {if(condition) op;} 这时你就可以: int f(int x) { CASE(x<0, return -1); CASE(x>128,return -1); .................. } 宏也很爽,这玩艺在C++中被保留也是为了实用和允许继承C代码而妥协的。就像C++做了很多妥协,MFC也要考虑后向兼容,保留了很多早期接口。因为MFC而使编译器违反标准的说法,我不是很清楚,C++ Builder也可以编译MFC,不知道是否违反标准。MESSAGEMAP的做法就是为了向应用妥协,否则一个程序将占用更多的内存,节省内存在90年代初是非常要紧的。 DOC/VIEW结构完全不是VC的东西,而是MFC的。不用MFC就没这个问题,用MFC也可以不用这个结构。并且DOC/VIEW结构很好呀,除非你到处乱用,那能怪谁呢,怪自己笨吧。 但是现在它事实上已经成为了对中国C++程序员的一个威胁, 它把太多的精力和资源吸引到支路上面, 而对于主干道上真正的好东西视而不见. 矫枉必须过正, 所以我不惜得罪一大批人, 写了上面的文章. 正如开篇所说, 我一向认为无休止的争论是空谈误国, 该说的话已经说了, 大家可以批评讨论, 但我大概是不会再回到这个话题上来了. 到这里,我开始怀疑myan根本不懂C++,不知道它的来龙去脉,大概刚刚入点门,就以为自己得到了阿拉丁的神灯,刚刚看到“VC外面还有个C++”,就“把C++列为自己的梦想”了。 有空还是去看看B.Stroustrup自己写的书《C++的创始和变革》吧! 哪位大虾帮我解释一下上文提到的“委托”,我打听了一下,据说是DELPHI应用领域常用的概念。 |
|
|
|
2C#
发布于:2001-07-23 00:48
Re:作者:velese
VC是什么概念?我只知道有C/C++语言,没听说过VC语言,我只知道一些操作系统上的基础知识和窗口系统的基本原理,M$为Win32 API提供了一个C++外装MFC,除了做界面其它的从来不用,而且也很少做界面。DCOM好像到是不错,没有Corba那么清晰灵活,网络还是伯克利的套接口好使,幸好Windows里面的没啥太大区别,ATL从来没用过,觉得没有必要,但是好像这些和VC用的编译器没太大关系。M$的编译速度还是挺快的,得益于预编译,是和Borland竞争的结果,原来奇慢,优化比起Intel的差了好远,和gcc也没法比,这也叫没有对手?恕我孤陋寡闻。
B.Stroustrup“我想大家学习C++,应该是为了解决哪些开创性的问题,而不是一次次地重复解决哪些已经有了成熟的框架和现成的解决方案的问题。”好像你也理解错了,并不是说C++是开拓者的语言,甚至不会C++就不是开拓者,他在强调程序的重用性,没有STL库之前,几乎每个程序员都要把数据结构里的内容实现一遍又一遍,以适合不同的用途。Stroustrup当时的工作就是研究大量程序设计问题。 没有任何计算机语言值得人投入一辈子,语言只是用来表达思想的工具,很多人学了不少种语言,只是一种平行站位,为了方便,我可以接受一门新的语言,反正也不用花多少力气,仅仅为了方便而已。谈论语言的优劣本身就比较偏激,因为不同的语言在不同的领域各有优劣,至于又造出个VC的概念就更俗了,没见过国外的网友有这么称呼的。 另外,委托是不是Proxy的译文,一种OO设计模式,很适合做消息处理。祥见设计模式一书。 |
|
|
3C#
发布于:2001-10-21 02:36
VC不是梦想,C++需要自由的心
大家真的有这样伟大么?什么有用就用什么了,鱼游在水里才会快乐。 |
|
|