一家之言,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的前景,我在本贴中提出了自己不乐观的看法。诸位兄弟姐妹想必会有更多的观点,我希望大家能多多讨论一下,这不是孰优孰劣的问题,而是如何把握技术发展趋势,然后根据发展趋势来选择自己的突破口的问题。如果有多方面的观点,对大家想必都是一种启发。 期待更多的发言
中国程序员你的名字绝不该是“浅薄”
我认为有些人的观点错了。错得一塌糊涂。
我的基本观点是:任何实践都是理论的载体或表现形式。而理论也是由实践上升而来的。两者是辨证的。今天,我们只关注它的前一部分:任何实践都是理论的载体和表现形式。
我不是想故弄玄虚,但真理的外表看上去往往就是这么奇形怪状、难以理解。让我来给你解释一下吧。
比如:战争是军事理论的实践,也是它的表现形式。战争的胜负取决于指挥者军事理论的掌握程度(别给我举赵括这类“纸上谈兵”的反例,他们根本算不上掌握了军事理论,充其量只算是“背”下了军事理论。“掌握”和“倒背如流”这是两个概念。)
1、VC、VB、Delphi …… ,你该学哪个?
具体到编程而言,我要告诉你:任何一种计算机语言,都是计算机科学理论的载体或表现形式。C++很神吗?Java很酷吗?它们差距很远吗?是的。但从理论的层面上讲,它们没有区别,都是“面向对象”理论的一个具体形式而已。
现在的程序员们被发行编译软件(通常我们将其称为“系统软件”)的商家不断推出的产品搞得眼花缭乱,头痛欲裂。不断地跟在新语言后面跑,这条路还没跑到头,那边的“新路”又鸣锣开张了,于是再跟着跑……渐渐地有些人开始感叹:学海无涯、学无止境,或什么“程序员是青春饭,过了三十别想干”……
在此我不得不叹息:中国的教育真是一种“形而上学”的教育。早在高中时代我们就学过“辨证唯物主义”的基本理论:做事情要抓主要矛盾。这一条恐怕谁都知道,却鲜见谁能在实践中把这一理论运用得“炉火纯青”的。把这一理论运用到编程上来讲就是: 理论是主要矛盾,语言是次要矛盾,学会了理论,再具体到学一种语言时,你只不过是在进行某种消遣而已。
现在学VC的普遍看不起学VB的或学Delphi的。但如果一个用Delphi的人,在需要写web程序时,用TCP/IP做了一个构架,嵌入到应用程序中;而另一个用VC的人却只会把一个又一个的组件拖来拉去的做些个“例子程序”的翻版。你说他们两个谁历害?Delphi和VC谁历害?
真应了这样一段话,问:纽约好还是上海好?答:有钱哪儿都好,没钱哪儿都不好。上海的富人并不比纽约的富人少多少的优越感,而纽约的乞丐也不比上海的乞丐多多少幸福感。
现在你还会说学VC的人就一定比学Delphi的人水平高、“钱景”好吗?
2、“浅薄”绝不该是中国程序员的性格特征!!!
想问一句:中国程序员这么多,你们真地把基础理论学好了吗?别用你现有的编程经历告诉我:编程不需要数学,不需要数据结构,不需要编译原理…… ……说话得负责任,您知道吗?我之所以发表这篇文章,就是因为再也看不下去这种在中国编程界漫延的歪理邪说了!邪教害死的是人的个体,你们害死的是中国软件业的未来!如果再让这种理论继续毒害编程新手的思想,中国将在计算机领域失去民族的尊严!!!
请问,操作系统、编译软件、数据库系统…… 这些被称为“系统软件”的东东,中国有几样拿得出手的产品?也许是我孤陋寡闻,据我所知:我们国家一件像样的也没有。
不错,我们是有一些网站的股票在西方上市了,我们是有一些人被国外公司请去做高级职员了,我们也有一些人把西方的官方网站给黑了……但是,我们用的编译工具是谁的产品?我们微机里装得是谁做出的操作系统?我们的程序跑在谁的芯片上?
爱之深,恨之切。我爱的是中国,但我痛恨不是中国,而是在中国编程界普遍流行的“浅薄”和“自以为是”,这是我们民族软件业的一颗毒瘤!
是的,现在编程方面快速入门的书满天飞,让程序员的门槛越来越低。我这个外行就得益于这个“低门槛”,跑了进来。但进来后,我们就不能再这样浅薄下去了--我的兄弟们!
用他国提供的工具做几个网站,写几个应用程序,弄出几个病毒…… 是振兴不了民族软件业的。顺便说一句:我尊敬求伯君,但我不认为金山公司和其系列产品配得上被称为“民族软件业”的大旗,相对这个称号,它差得太远了。
…… ……
写flash软件的人会认为用flash做动画的人比他历害吗?Adobe公司真的认为考取Adobe证书的人是“人才”吗?MSCE、MSCD…… 通过这类考试得到微软徽章的人,在微软眼里是“人才”还是“义务推销员”?持这类证书以及其他一些大软件公司认证的人,你们还在以为自己是“中国软件业的精英”而感叹“怀才不遇”、工资太少吗?
醒醒吧,朋友。别再用编程不需要理论的话来自欺欺人了,别再用自己的浅薄来教导别人像自己一样浅薄了。我想问问那些称数学、数据结构等基础课程对编程没用的人:
请你们搞清一个概念:是这些理论“没用”,还是你们“没用到”;是你们“没用到”,还是你们的水平根本“用不到”;是你们“不需要用”,还是你们根本“不会用”?
举个例子,操作系统中的工作调度,若工作优先权相同,用什么方法进行调度?当然是“先到先做”--这就是数据结构中“队列”的应用。你们说“用不到”,只怕是因为到目前为止还没机会接触这类“高端编程”的挑战吧?这样的话,那就算了,挣你的钱去,但别再来这里误人子弟,吹嘘什么优秀的程序员不需要理论。
是谁说系统软件发展的黄金时代已经过去了?Linux不就是在MS操作系统雄霸多年的情况下一举成名的吗?中国难道就找不到这样一个机会? 不,如果我们的程序员克服了现在的浮燥与急功近利,我们一样可以在“系统软件”这一软件业的“高端”树立自己的品牌!所以请看下面--
3、年轻人应该有宏伟的志向。
用别人的产品做自己的东西,你永远只是个“高级客户”,成不了真正的开发者。不管你用他国的系统软件开发出多少好的产品,挣了多少钱,只要人家一升级、或一推出新产品,你口袋里的银子连同最后一条小裤叉也会被剥夺得一干二净。你,只不过是一个高级打工仔。
我希望打算进入编程界的朋友们,特别是现在还很年轻的朋友,能有一个比较高的志向。更希望已经进到这行的朋友们能有以“振兴民族软件业”为己任,力争成为中国软件业的“旗手”。
我不赞同方东兴把微软骂得一无是处。更不赞同年轻人学他那样,一赌气而拒绝用微软的产品,拒绝Windows、拒绝VC 、拒绝IE ……
我认为方东兴只是个狭隘的民族主义者。他看到了中国软件业民族的一面,却不愿承认我们落后的一面。毫无根据的“自尊”等于自取灭亡。清朝末年,我们的科技并不落后于西方多少,但我们过分“自尊”的“大国思想”却使我们失去了向其他国家学习的机会。当我们嘲笑西方人的蓝眼睛、大鼻子的时候,他们的坚船利炮,却把我们“央央大国”的皇帝、太后打得满世界逃难。慈禧太后被打得满地找牙的时候,不得不说出“量中华之物力,博与国之欢欣”的龌龊话,此时,她“大国皇太后”的自尊何在呢?前面自尊过了头,事后必遭报应。这报应一持续,就是几百年,直到现在。难道我们还要继续闭门造车,再走老路吗?
我们现在承认微软比我们强,向微软学习,并不等于我们永远要跟在他后面跑!在我们低下头的时候,我们就应该想到,何时能再抬起这颗高贵的头颅!!!而且是“一定”!!!!!自尊不是错,错是错在“太盲目”--妄自尊大,你就要和慈禧一样被打得满地找牙。做为一个大国,一个明智的民族,我们不能讳疾忌医。
年轻人,志当存高远。相信我,当你以民族振兴为己任的时候,封王称帝、富贵荣华,都只不过是千秋伟业的一个副产品。在这个尊重知识、崇尚科学的年代,志向高远的人,永远不必担心自己的“钱途”。
不必讳言,我承认我当初进入编程领域不完全出于兴趣,也有“钱途”方面的考虑。但就好像当年参加八路的战士当中,有些只是报着能吃上军粮或打鬼子报家仇的思想入伍的,但后来却学习了马列,提高了觉悟,转为以兴国救民为目标一样,当我一步步深入到这行以后,当我决定考研并慢慢提高了认识以后,我的目的变了。我觉得应该有个更高的人生目标,更高志向和追求来支持我的行动。这个目标就是:为民族软件业尽一把自己的力。
真心希望你与我同行。
4、几点建议:
建议大家耐下心来先学好理论,然后再选择具体的工具或语言。不过,在所有这一切开始以前,先打好C语言和汇编基础。
能不能得道,就看你在见到别人做出一些花里胡哨的东西时,是不是能坚定信心、耐住寂寞、抵御诱惑了。
一个和我一起学习C语言的人,学完就直接开始玩VC,而我则潜下心来学了些C++和理论方面的东西。早早地,他就能仿照书上用VC做些界面似的东西在我面前炫耀,可后来,当我基础理论的学习告一段落,做个图书管理程序卖了800大洋时,他还只是停留在做“例子程序”的水平上。现在我们谈论起编程,深度早已不可同日而语了。他起跑领先,却落在了后面。
我不敢自以为是,只是想用这个亲身经历告诉大家:学编程,决不可心浮气燥。
5、结束语
我的话触到许多人的痛处,而且由于写时心中气愤难平,有些出言不逊,可能要遭人骂了。不过,既然写了,就不怕骂。因为:以上所言全是忠告,识不识货,就看您的眼光了。