对VC的批判,我要打击大家学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的前景,我在本贴中提出了自己不乐观的看法。诸位兄弟姐妹想必会有更多的观点,我希望大家能多多讨论一下,这不是孰优孰劣的问题,而是如何把握技术发展趋势,然后根据发展趋势来选择自己的突破口的问题。如果有多方面的观点,对大家想必都是一种启发。 期待更多的发言