回 帖 发 新 帖 刷新版面

主题:转载->"对VC的批判”->高手来评论一下这小子说的!

一家之言,VC高手不妨过来指点指点,没有人骂我,我不高兴

                               作  者:bitfan ()

注:以下的观点主要指VC6。)

1.       背景我这人喜欢偷懒,VC我断断续续学过很长的时间,最终没有能成为我想成为的那种高手,在“程序人生”中的一个贴子《怎样克服学习过程中的浮躁,来者有分》

(http://www.csdn.net/expert/topic/635/635462.xml?temp=.8159601)中我看到有很多人都说VC难学,信然!拿我来说,最终真正派上用场的还是VB和C++Bulder之类RAD开发工具。 我在想,为什么大家都在说VC难学,却又想学,许多人是不是都象我刚学VC一样,人云VC如何如何,就去学VC了,但水平与能力有限,只能成为半罐子水,花钱不少,花时间不少,花精力不少,代价更不少,却没得到什么…… 为什么大家都要“明知山有虎,偏向虎山行”?特别是许多准备进入软件开发这一行业的,用过自已的大脑仔细想过为什么要学VC吗? 我的观点要打击大家学VC的积极性了……

2.为什么用VC干活的人工资高?我认为学VC可以对一个程序员的基本功做出最痛苦的锻炼,所以经过VC苦练的人大都是金刚不坏之身,再学其它的东西就感到游刃有余了。通过VC成为高手者自然人少,以VC之难能成为高手者自然能力超群, 牛人自然工资高,这有什么奇怪的?他们付出了更多罢了。

3.不学VC的最主要理由:技术进步!不知诸位正在学VC的想没想过技术进步这个因素?如果你学VC是为了有个收入高的好工作,那么我认为你还是别学好。现在.net已经推出,编程平台的转移是必然的,这个周期大约就在两三年之内。 VC6的核心就是两大类库:MFC和ATL,前者是基于win32 API的一种FrameWork,后者是开发COM组件的类库,两者开发的是传统的Windows应用程序,学VC不学MFC,不学ATL几乎可以说没学VC!但遗憾的是学VC的人没有几个不为MFC中那些复杂的类之间的关系,那些奇怪的代码而头痛,ATL也好不到哪去,如果你事先没系统地学习COM理论,用ATL来发基于COM的组件几乎是不可能的。事实上,MFC框架就是一种设计模式,只不过微软的开发人员将其设计得非常完善罢了。那本著名的《设计模式》经典书中就介绍了23种设计模式,其中介绍的MVC模型几乎就是MFC的精髓!用MFC开发软件,你就必须遵循它的思路,你所做的工作就是在这个框架上修修补补,(当然,这个框架做Windows界面还是非常完善的,几乎考虑到了程序对界面的所有需求),但我觉得强迫别人按照一个框架去解决问题这是对人的一种束缚!可悲的是还有那么多人沾沾自喜于此!我常用C++ Builder,我知道VC的高手对这类RAD心存蔑视,但我也知道我在C++Builder中可以非常方便地从头开始应用一种设计模式,而不用费心地考虑如何将我这种设计模式嵌入到某个框架之中(当然我也可以设计出很复杂的应用多种设计模式的程序框架,C++Builder把这个工作留给了程序员自已);同样的工作,对于一个对VC不熟的人,自建若干个新类,再将其引入到MFC中不是一件简单的事,其主要原因就是MFC的复杂性。C++Builder中只需新建若干个Unit,然后写你的类,再在窗体上加一个接钮,包含上新类的头文件,new一个对象就可以用了,对于初学者而言,你说哪种解决问题的方法更直观,从程序设计的角度,哪一个效率更高?

4.从微软的策略看VC的前途!微软的策略是先用.net提供一个新的环境,然后逐步修改其OS,最终完全抛弃NT内核,其最终目的是抢占被UNIX和LINUX占据的高端市场份额(这是Borland李维说的,我觉得有道理)。现在推出的.net框架还支持原来的技术(如COM+),VC.net中也还有MFC7,但这只是一个过渡时期的产品,就象Windows 3.1被Windows 95取代一样,最终是要被抛弃的。很明显,软件发展的趋势就是不断提高软件开发的效率,在.net中开发程序绝不会有现在VC6中用MFC这样复杂和繁琐,事实上,新的平台已不再有win32 API这种平面型的开发接口,已全面立体化(类似于在C++的类库,使用方式也与C++中类的使用方式类似),而且应用程序又回到了DOS时代的简洁,只需复制整个文件夹,就可以移动一个应用程序,程序是自说明的,注册表也没有了,意味着基于注册表的COM组件技术也将被取代。这一切的变化周期估计就在两三年之内。

5.现实的考虑:诸位想想:如果你花一到两年的时间去学VC6,尤其是MFC,就算你到时是VC的绝顶高手,你却空有屠龙之技而无龙可屠,岂不悲哉!想想如果有一个DOS时代的高手跨越时空来到现在,他的技术早已被时代所淹没,如果不更新知识,他会发现要找到一个饭碗都不容易。对于所有想学VC的人,我提出一个忠告:VC的巅峰期已过。 那现在为什么还有那么多公司想要招VC的程序员?有很大的原因是对过去资源的继承。过去的投资不能白费,这还用说吗?

6.如果你打算学VC,请端正你的目的!现在学VC的目的不是为了好找工作,好拿高薪,而是因为它的复杂是锻炼一个优秀程序员的最佳方法,就象奥运长跑选手为了提高身体素质而到高原上训练一样。对于想进入软件开发大门的人我的建议是直接学习最新的技术,而且最好是现在学习今后一到两年内会成为主流的技术,而那些有志于成为windows软件高手的人,VC是必修课,不经百炼哪能成钢?而且VC肯定还会生存很长一段时间,就象现在还有用Foxpro开发的系统一样.

7.我学软件喜新厌旧:对于象我这样的平庸之辈,我脚踏N只船:最早以VB入门,从3.0用到6.0,它给我带来的收获也最多;VC我是半桶水,学了一两年就没一点成就感;C++Builder是我的爱将,是我学习C++和各种软件理论最常用的开发工具,用它也做了不少东东;真的不错,准备娶过门来了;我还对Java心存向往,很想马上去学,不过个人能力有限,还是放一放罢…… 掌握多种开发工具有一个好处,那就是可以取长补短。比如有一个图象处理程序用VC开发,而其中的报表部分我则用C++Builder做出来,再以COM组件的方式给VC调;要操作Office我喜欢用VB,要写多层系统访问数据库我喜欢用C++Builder(现在还加上Delphi),所有这些都可以在COM的基础上统一起来…… 不过COM也快完蛋了,我也要学新的东东了,可惜了我买了那么多COM的书……对了,还要加一句,对COM了解即可,别钻进牛角尖里去了,COM又是一个无底洞,也许日后再发个贴子,就叫"对COM的批判"



谢谢horris(僧推月下门)的高论。 我想就horris贴子中涉及到的几个方面谈谈看法。

1)程序框架和设计模式: 程序框架的设计体现出设计模式理论,可以看成是一个未完成的系统,程序员在这个框架之上加入实际工作的代码而形成真实的系统。而这两者的出现与广泛应用是软件开发走向成熟的必然。 为什么要提出设计模式理论和应用程序框架?很简单,就是要提高软件产品的质量和生产率。 现在主流的开发工具中都有程序框架的应用,最典型的是MFC和VCL。那么,衡量一个框架好坏的标准是什么?我可以列出几条,但我可以肯定地指出,框架的可复用性是第一位的,而易用性是第二位的,运行效率则是第三位的。就可复用性而言,MFC和VCL难分高下,而易用性则差别巨大,我就不详细说了。    

2)“运行效率”vs“开发效率”; 运行效率和开发效率这两者谁更重要? 除非是开发实时系统和某些系统核心模块(这种模块在整个项目只占很小比例),大多数软件项目考虑的是开发效率和一些其它因素,对运行效率则要求不高。 所以,象开发效率、稳定性、易用性、易维护、可扩展等就成为首要考虑的因素,而运行效率则是在保证达到前面要求的前提下再去考虑的。 另外,是否VC做出来的东西就一定好和快呢?这取决于系统设计和程序员对语言和工具的把握程度。 举个例子: 在程序设计过程中,都要对系统功能进行封装。假设系统中要将ADO RecordSet封装成一个适合特定用途的数据存取类,用VC封装工作量是C++BUILDER的好几倍(因为C++BUILDER中有一个现成的类TADODataSet封装了ADO RecordSet,基于TADODataSet自然要少很多工作),除了少数VC高手,绝大多数人用VC实现的封装都无法与用TADODataSet的封装相比拟,为什么?很简单,你对原生的ADO RecordSet的封装达不到TADODataSet的水平!开发VCL的程序员是一批牛人,这批牛人的水平是绝大多数程序员所无法达到的,牛人们既熟悉语言和开发工具,也熟悉ADO的底层原理。你用VC做出的东西,与另一个用C++BUILDER或Delphi做出来的东西相比,可能你的稳定性更差,运行速度更慢! 既然费尽心机地用VC做出来的东西还不如另一个学了Delphi3个月作出来的东西,我为什么一定要哪壶不开提哪壶? 所以,从现实的角度,我不赞成大量的程序员为了“自己造轮子”而将大量精力花费在VC上,应尽可能地复用优秀的软件组件。 开发效率是程序员吃饭和公司生存的关键因素。

3)关于.net平台下的Unmanaged和managed应用: 毫无疑问,Unmanaged程序肯定快,但我可以肯定的说,managed今后将会大行其道,特别是在企业级信息网络中。 什么叫Unmanaged应用?直接调用OS的API,直接编译生成机器码的程序。而managed应用,就是运行在一个软件虚拟机上的程序,Java就是一个典型的例子,.net也是走的这条路!Java为什么这样火,M$为什么要跟进这个步伐?很简单,这种架构更适合于现代信息网络的要求。VC6只能开发managed应用,你说说它在现代的网络化软件中会居于一个什么地位? 另外,在企业级的软件中,最重要的是什么?一个是安全,另一个是集成多种信息源!运行效率的考虑是放在最后的。Java慢,但为什么还被广泛用来开发企业级应用程序?XML和Web Service为什么被称为下一代网络技术的核心?最关键的一点是它可以使不同平台的软件相互合作!

   4)现在可以做出一个小结: 对于需要高效率、与硬件打交道、运行于传统Windows平台下的程序而言,VC是重点选择的开发工具,有志于此的程序员必须花大力气去学VC; 对于开发企业级软件和电子商务等互联网应用领域的专业程序员,根本不要去学VC,而应将精力放在标准C++,Java,C#等语言的学习上,同时重点学习.net、J2EE等平台; 对于一般的软件开发爱好者来说,VC不是必经的一条道路,可以根据实际情况选一种开发工具和语言学习; 对于还在学校学习的计算机专业学生,C++和Java是必学的,至于VC,需不需要学还要看你将来想从事的领域。 我之所以发这个贴子,是看到有很多贴子总在夸耀VC的强大(这是实情),无形之中很多人被误导了,不管什么情况,好象一学软件开发必学C++,一学C++必学VC,然后浪费大量的时间和金钱于此,费事不少,收效则低!(我周围就有很多这样的情况,包括我,都成为VC的半瓶水)先不说成为不了专业程序员的人,就是以软件开发作为职业的人,从事的领域不一样,也不一定非学VC不可。有这时间,干些别的岂不更好? 至于VC的前景,我在本贴中提出了自己不乐观的看法。诸位兄弟姐妹想必会有更多的观点,我希望大家能多多讨论一下,这不是孰优孰劣的问题,而是如何把握技术发展趋势,然后根据发展趋势来选择自己的突破口的问题。如果有多方面的观点,对大家想必都是一种启发。 期待更多的发言

回复列表 (共77个回复)

11 楼

Borland的设计师被MS挖去了,你想MS总不能花钱找不搞MFC类的人去白吃饭,自然VC7就渐渐变了.....^_^可能像BCB....其实iron兄说效率,我想在座没有几个是搞高科技的吧,差那么几ms甚至零点几ms的速度人能感觉得出来吗?又不是超人.像写一个排序的程序,用同一个编译工具,选择排序要300000秒左右(几天)排的数据,快速排序几秒就OK了,看来速度和算法关系更大.


我在论坛里面问了一个问题VC怎么做指向任何类里面函数的指针(当然是类里面公有并且同参数类型的指针).
BCB里面就可以写成typedef void (__closure *pf)(void);但是VC里面不行!VC写成typedef void (__stdcall *pf)(void);可以通过的吧,为什么改成__closure就不行了?
估计VC6那时候没有这个概念.
看看我和我朋友的对话.

YUYU 21:44:26
你举个例子
需要指向任何类的...
飘忽不定 21:44:48
例如你想实现
WM_CREATE:就执行一个函数
YUYU 21:45:12
恩..
然后呢?
飘忽不定 21:45:03
那么你就可以写一个线程,里面说明
飘忽不定 21:45:08
等下嘛
YUYU 21:45:26
继续
飘忽不定 21:45:26
一到什么事情就怎么处理
飘忽不定 21:45:43
说起来,我组织语言慢
飘忽不定 21:46:01
作如下定义:
typedef void __fastcall (__closure *pFormCreate) (TObject *Sender);

然后就可以用pFormCreate定义一个指向FormCreate的指针了:
如:pFormCreate myformcreate;
myformcreate = FormCreate;
飘忽不定 21:46:37
像上面的例子,我不必要在WM_CREATE里面写东西,我在外面写好一个函数,之后指向它就OK了
飘忽不定 21:47:10
BCB就这个好,新建立一个类,里面要写事件的话,也不必要写很麻烦,直接指向一个函数就有事件了
YUYU 21:47:42
呵呵..好
飘忽不定 21:47:38
你每次都要写一次WM_CREATE,格式看起来都不好啊
YUYU 21:48:46
呵呵..所以vc就写了消息映射.
把WM_CREATE映射到 OnCreate
飘忽不定 21:48:52
我以前在网上学来的,以前不懂得,SAIL里面多页面我只要写函数就OK了,类的事件不需要重复写.
飘忽不定 21:49:04
消息影射BCB也有啊,但是不好
飘忽不定 21:49:09
我觉得很麻烦
YUYU 21:50:01
呵呵...
你这个也不会简单啊?
飘忽不定 21:50:05
是啊,但是写成类的话,就不用修改以前的类的,
封装很好


MFC和VCL另一个最大的区别就是框架,VC,BCB,DELPHI可能都会被淘汰,工具都有它的生命周期,但是一个好的框架和思维能在比计算机语言寿命更长.记得大学时候学C++的时候老师第一句话就是,"C和C++的最大区别不是语法,而是思想."
BCB没有把底层的东西封死,你想搞其实也可以.像外国的木马禽兽,被控制端体积才51K,就是不使用DELPHI里面的类的.广外也是.

我强烈建议初学的选用BCB,程序就应该像一件艺术品,说VC好其实很多都是冲着MS的大旗的,除了速度和所谓的稳定性之外都不能找到VC比BCB好的来.
而速度就差那么....一点,稳定性其实很多都是个人的因素.
其实我觉得bitfan说得很有道理,只是一个建议罢了,何必呢.难道不使用VC的就不是高手了?我们中国人难道被别人说一下缺点或者建议就应该拿去打靶?

12 楼

虽然你们说的很高深我看得不太懂!!但我想各有各道理吧~~反正!我是VC的忠实FANS。。。。。。。。。。

13 楼

x_uy_u_n:
许多编译器有几种函数调用规范。如在Visual C++中,可以在函数类型前加_cdecl,_fastcall,_stdcall或者_pascal来表示其调用规范。调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆栈,CPU寄存器等)。在Visual C++中默认为_cdecl,这个调用规范的含义是指:函数名不变,参数通过堆栈来传递,参数的压栈顺序为从右到左,清理堆栈的责任由调用者来承担。你说的__closure可能是种新的函数调用规范吧?VC6里面确实不支持__closure,不知道VC7是否支持?我也从来没有听说过有这么个新的调用规范。只是既然VC6里面已经有了那么多的函数调用规范,你为什么还要去用这种应有不普遍的东西呢?如果你用这个去编写动态链接库的话,很可能会导致你的库不能被别的开发工具所使用的啊!
其实你所需要的那种指针根本就不难获得啊,在我的VC5所附带的C++标准模板库里面就含有一个智能指针类模板:auto_ptr。这是个功能强大的模板类,可以指向任何对象,并且更有用的是,它可以自动地回收你为它动态分配的内存,即使你的程序发生了异常也不会造成内存的泄漏!不过模板和多继承性一直是C++里面的难点,很容易出错,并且在学术上也是颇有争议的东西。我不太主张初学者在这上面花太多的时间,但是象你这样的高手应该是没有鄣碍的。
最后,你反复说没有听说过有VC能编写的软件而BCB不能作出来的。我倒是略有所闻,好象windows环境下的设备驱动程序就只能在Visual c++平台上面开发(当然用汇编也是可以的),而不能使用BCB来做。你有时间不妨查查看,有哪些硬件驱动程序是用BCB作的,或者怎么使用BCB来开发windows环境下的硬件设备驱动程序。

14 楼

如果是使用BCB,那么到处就可以看到__closure,我也是最近写的时候忽然有了这个想法,呵呵.VC里面虽然有很多,__stdcall这类的,并且指向类函数的指针可以写成void (A::*pf)(void);但是不够通用啊.既然可以有typedef void (__stdcall *pf)(void);为什么就不可以typedef void (__closure *pf)(void);?既然有这个需要,为什么不能支持一种新的办法?从C到C++,语言都是根据需要进步的.感谢iron,虽然大家看法有点不同,但是正因为有这样的不同,世界才可以进步.

15 楼

最后iron兄问"有哪些硬件驱动程序是用BCB作的?"我也不知道,没有,不代表不能写,因为VC也是程序,也是通过某些语句或者接口实现功能的,好象没有那些C++语句只有VC有而BCB没有吧?
你说"当然用汇编也是可以的",要知道BCB里面也是可以使用汇编的(不过格式和VC略有不同).
必须承认,很多接近底层的都是使用VC写的,可能使用VC的稳定性和快速等优点.更多原因是由别的原因决定的,我说过,VC就好象武侠小说的正派一样,几乎所有大学都是学VC的,有多少是学BCB的?
教授,博士,几乎都是在大学里出来的,那么自然又和VC有不解缘.高级的科技掌握在他们手中,使用的只是工具(VC),自然底层一点的东西就用VC写了.如果那些博士或者专门搞这方面的人是学BCB的,
你能说他们是因为学了BCB的原因不能写出那样的程序了吗?
去年的广东省高校标,记得就有用BCB写的控制机器的自动化程序.难道你说的硬件只能用VC啊?

16 楼

看了上面各位高手的评论,小弟真是大开眼界。我也是一个vc的疯狂爱好者,学习她也已经费了几年的时间,但是还是达不到预期的效果。在平时现实的生活中,不少人用vb,Dephi等编出来了让人眼花缭乱漂亮的程序,所以就有人意志不鉴定随波逐流,抛弃原来的信念。
    我一直认为,程序员学习vc的目的应该端正,ms把以前程序员常用的win32函数,封装成mfc,其实,我想我们自己也能把我们自己常用的函数封装成子的类库,但是现在有几个人能做出来呢,及时做出来了,也不能成为application framework。为什么呢,还是因为我们自己对于最基本的语言如c/c++等不熟悉,不能运用到炉火纯青的地步,那么,你还有什么资格去谈论那一种软件好,那一个坏呢,你永远是再步别人的后尘!当你想去评论一个东西的时候,你想想你自己有没有资格去评论,你对她有了解多少!我想以上的高手可能都是十分了得的,你们一定自以为很了解软件的精髓,也可能你们的却能对比如vc这样的软件的来龙去脉讲的头头是道,但是,要是叫你们自己去模仿如mfc中的message map,有几个人能做的大致可以!
   我想,学习vc的最终目的应该让你在学习中彻底了解c/c++以及oop的精髓,我向各位高手认为vc6马上就要被淘汰了,不知道大家认为c/c++,以及oop(面向对象)能不能被淘汰,至少我认为不可能。现在开发工具的更新越来越快,但是白遍不离其中,如果今天出了一套开发工具,你像学,明天别人说另一个好,你又要去学,那么你永远不可能进步,你永远也只是一个程序员,不能成为一个软件设计者。所以我认为vc永远也不能被遗忘,因为它给我们这些软件编程者带来了是编程的思维,而不是工具!

17 楼

你对拍电视了解多少?你又对拍电影了解多少?但是你不看电视不看电影?或者你看电视电影的时候一声不响?没有感觉?花几块到几十块钱看<<泰坦尼克号>>只为了看女主角脱衣服给男主角画那部分?
如果C已经足够了,那么花人力物力去搞一个C++干嘛.
"我也是一个vc的疯狂爱好者,学习她也已经费了几年的时间,但是还是达不到预期的效果。在平时现实的生活中,不少人用vb,Dephi等编出来了让人眼花缭乱漂亮的程序,所以就有人意志不鉴定随波逐流,抛弃原来的信念。"
现在是在搞表决心会啊?你写程序最先就是为了你自己."适合明星的不一定适合你自己."是不是别人选了适合自己的工具写出点东西来就是洪水猛兽了?中国特色的社会主义就是适合我们国情.如果说只能纯社会主义,或者纯资本主义,有那个东西吗?
你写出工具来给别人使用,只要好用,没有多少人会管你从地上挖出来还是天上掉下来.
计算机语言只是为了实现功能.封建教条啊,VC是神圣不可侵犯的?神还有缺点呢.
不是神(不使用VC)或者做个小神(使用VC不厉害的)就没有发言权?对MS太崇拜了吧?

"语言是有生命周期的.计算机语言尤其如此.ALGOL60几乎绝迹了,FORTRAN和COBOL的踪影也越来越少."
楼上没有一个人说VC6马上要淘汰(说的也是以后不知道多少年的事),老兄你太敏感了.要说带来的多,TC带来的还不少呢,你学VC要书吧,或者要老师教吧,写书的,老师们有哪个没有使用过TC?既然你反复强调的思维,那么就请不要死抓住一个工具说,以后要是真的没有了VC,你的思维就没有了?

18 楼

楼上的哥门,你是政治家么?如果不是对vc有一些偏见的话,你就不会发表上面的评论,你对ms的看法到底是什么呢?难道就没有一些嫉妒么,发表评论,就是说出自己的看法,既然你能发表初一楼的贴子,就说明你也是无所谓的看法,又何必要针锋相对呢?难道你在看太坦尼克号的时候就没有你说的想法,要是没有的话,你就不会到今天还记得那段情节,如果我问你别的情节的话,你还能记得么?你记得就是你最干兴趣的地方。我承认我对ms十分羡慕,但不是崇拜,人家有好的地方就要学习,没有100%纯净的东西,但是并不代表我不去追求,我用学习vc来了解c世界东西,难道有错么?总比像有些人东抓一下,西抓一下的好。你说的,写程序为了自己,找一个自己习惯的环境,适合明星的不一定适合你,有c已经足够了,干吗要去搞c++,难道你不知道世界在进化么?所以,你只能使想我说的当中的步人后尘的人,不明白道理的认真是可怜!

19 楼

对于我这菜鸟我只能用四个字来形容,,,,,,,,,,眼花缭乱~~~~~

但我还是会认真去看几位前辈的评论也好了解一下各种语言的优缺点。

20 楼

WX:
呵呵,我只是看不惯,VC的强人我也认识几个,他们从来没有说只有VC好的.一样很谦虚地看待别的工具.而你却把VC说到天上有,地下无.
一个是我的高中同学,他大学还没有毕业TENCENT就和他签约了,6000一个月,还包食宿.你说我有偏见,你自己看看所有的帖子吧,我没有敢说VC不好,我只是说别的也有有处,有很多地方还比VC的好.我发表看法是有错了?
而你在16楼说的却好象在说教,不让别人说一点点VC的不好.我还怀疑你是不是被MS收买了.

我来回复

您尚未登录,请登录后再回复。点此登录或注册