学C? 学C++?

学C还是学C++,是个不新鲜的问题

我写这篇,是因为我没有答案,所以非要有答案的话,不能在这里找,我只是把我的学习C,C++的真实经历尽量详细地描述一下。

-----------------------------------------------------------------------------------------------------------------

如果我有一个儿子。

如果我这个儿子他长大成人18岁了。

如果他要泡妞。

我会要求他多泡几个,多谈几段恋爱,多黄掉几段感情。

如果他不干,非要泡到第一个妞,就认定这是他这一生最好也最合适的女人。

那我会揍他。

其实,女人不在于好不好,婚姻也不在于合适不合适。

女人不在于好不好,在于你懂得她的好和不好。

一个女人无论她再么好,只要你不懂她的好和不好,那你们彼此就不会觉得合适。
----------------------------------------------------------------------------------------------------------------------------------------

这里面,女人就是一门语言,比如C++,而男人们,就是那些程序员。

才刚刚会用一门语言,就在谈她的好不好的程序员,是挺搞的,也挺可悲的。

永远只坚持一个女人很好特好就是好,那是幸福的;然而,永远只坚持一门语言很好特好就是好的程序员,基本上是一个杯具。

----------------------------------------------------------------------------------------------------------------------------------------

我在写一本C++的书,叫《白话C++》。

有一些内容,我放进书里,又把它挖掉了,最终这些内容没机会随书一起发表,就狠狠在扩写一番(虽然没有稿费,但一口气写得很长,似乎很爽),放在这里。

----------------------------------------------------------------------------------------------------------------------------------------

       我们学习新知识时,往往带着旧知识的经验;但从另一方面说,也往往带着对现有知识不足之处的深刻认识。这就是所谓的“带着问题学习”。


    在大学,我的语言课程是BASIC,Pascal 和 C 语言,快毕业时,我在地摊上买了本书,开始自学C++。


    毕业后一上岗,我就被要求使用C++。于是我开始“数万行代码如一行”地,“数年如一日”地,用我可能的C的知识,写着C++的代码——C++之父Bjarne Stroustrup曾经长叹:“教育、教育问题啊”——我此时要表示一下反对:)谁让我是自学。

    当我学习C++时,既不懂“面向对象”是什么,也不理解“面向过程”是什么。我不过是用我个人最直观或直接的办法,组织着我的代码。比如,我道听途说过“全局变量是坏蛋”,于是想尽办法把变量塞到各个类里。我的很多C++前辈同事在没有阅读过任何《设计模式》的情况下,“发明”了各种各样的“单例模式”,但我呢?从来没有达到过这个层次。


    工作约两年之后,我在一个程序里,塞进了近10万行以C风格写成的C++代码。终于有一天,程序岌岌可危,人也倒下了。我的C语言水平不够,我相信C语言可以解决我的问题,但我不相信自己的C编程能力可以达到那个水准。

         像那个年代的大多数年轻的程序员一样,我在学习编程的路上,其实满拼命。下了班就把台式机的主机抱走去挤班车,挤地铁。带回家里接上自己的显示器继续工作(不要嘲笑这一行为,那时候网络还是所谓上等人才用得起东西,U盘还没有发明,而我用的Borland C++是21张软盘……)。曾经就这样我三个通宵没睡,但一大早还能抱着主机奔跑在上班的路上。

        听起来,我的努力学习很有效果:我从在校开始,就抱着《Borland C++ Bible》(其实就是C函数库)狂读;后来它有些过时了,开始在电脑上拼命地读同样是C形式的Windows API(英文阅读能力获得了很大提高)。如若您不信,我举个例:我甚至知道哪个API函数,假设有个用户在电脑上开着画笔程序和你写的一个程序,现在要求在你的程序界面上,按一下“tab”键(而不是Alt + Tab),就直接将焦点跳到画笔上,不用复杂的勾子程序,就用一个API,如何实现? 类似这样有七没八的API,我知道一堆。

    (我若早一点拜读过白兄的《哪些是应该熟记的,哪些是可以查手册的,这个要弄清楚》就好了。但我似乎还虚长白兄点年纪,搞不定他那时学得比我还辛勤 :)

          一句话,我就像一位老农,没日没夜忙着,具备天生的,朴素的唯物主义思想,就像曾经有一段时间全民坚信“人多力量大”一样,坚信只要努力,只有一双手还长在自己身上,只要继续这样干下去,我就能在软件开发这行业做出成绩来。       

     我的编程人生中,从来没有去想过哲学问题,那太虚了嘛。“正方形是不是长方形?”这本应该是每个学习“面向对象”编程的人都必须回答的入门问题,我当年可怜,没听过这个问题!我曾经确有六个月左右时间在写一个电路板辅助设计工具,我愚笨的资质,使得我像工蚁一样堆砌了一堆图形类——我有幸被苹果砸中了,但我不具备牛顿的智慧,所以我不会问自己:“苹果为什么会落下”。

     “以一种极低层次的形式学习和使用着C/C++”,和这一点几乎是难兄难弟的另一件事,你猜得到的: 我一直在很蹩脚地重复发明着轮子。在资讯不发达,连STL都未被推广的年代,这确实还不算是太羞于与人讲的事。

         关键是“羞耻感”,一个近3年(算上在校最后半年)的时间,在一个泥潭里打滚地学习编程的人,一直没有以自己的这种状态为耻,反倒觉得自己了不起——为自己实现了一个链表?为自己实现了一个表达式计算程序,为自己今天又搞到了几个未公开的API函数的秘密……为自己在两年时间内没日没夜地搞了近十万行代码的程序,居然“看上去”没有什么BUG而得意洋洋?为自己心无二致,像宗教徒一样地信仰着一家公司,一门语言而自觉伟大然后看不起那些转投其它语言的旧日同学?

    人云知耻近乎勇。 所以,我的老天。曾经,我就是这样的人!——在学校时,我坚持用DOS,用Turbo C,然后用它去解析dbaseIII的数据库文件。有个同学的毕业设计课题是在windows 3.1下用FoxPro,被我鄙视了好久……我后来被逼用windows时,甚至排斥用鼠标……我用上曾经不可一世的 Borland C++ 3.1之后,就一直用到它死掉时的5.02版本。其间在用4.x的版本时,有同事劝我改用 Visual C++ 1.5 (1.0没赶上),也被我嗤之以鼻:丑陋的MFC,连多重继承都不支持(因为OWL支持)……

           就这样,作为一个新毕业生,我非常“坚持”地走了下去,结果也很快,才2年就走到“底”了,我不知该如何发展了,一切到了死胡同:

      C ? 我觉得语法很熟练啊,但让我纯用C,别说什么复杂的软件,连小公司的那点点需求,我都完成不了。

      C++? 噢,语法复杂了好多,但我差不多就当它是C with class 来使用的。毕业一年时(1997年底),曾经有个朋友去汉王应聘,对方问:“虚的析构函数代表什么?”。他回答不出,被扫地出门,回来我问,我一样一脸愕然。

      原因是什么呢?因为走投无路,所以我终于从电脑前挪开,开始寻求原因了。以当时的状态,估计也没能想出个所以然,只是被逼着重新换条道。若在现在想,我想原因是不言而喻的,并不是我那种喜欢一条路走到底的学习方法一定有错,而是因为:我不是天才!

           试想,如果我是天才,那么我完全可以连C++都不学,就用C。人家Linus不就骂过C++!他老人家用了一阵子C++就觉得忍无可忍无须再忍,又回到C,并且写了数十万代码的linux内核。可是我不是天才,纯C的代码(不是那种用C风格写的C++代码,是纯C)我维护到3万行时,必然口吐白沫(把脸从屏幕前移到镜子前,咦?这小伙子长得唇白齿红!)。

     再试想,如果我是天才,我又那么辛苦地钻研Windows操作系统的各个API,那么,我要么可以像王志东那样早早地懂得如何用几句汇编把TextOut函数给改了入口,搞出个中文之星或四通利方;要么,我也该写出《Undocument Windows API》,搞个一版二版来;要么我也该成为一个专门破坏windows的黑客或骇客……但看起来我什么都不是,我只是个在微软技术屁股后面气喘息息的过客:那个曾经让年轻的我得意小半个午后的AttachThreadInput函数,我这十几年一次也没用上, ;最可气的是,近十年的光阴里,我学了DDE,它就出了个OLE,我学了OLE,它就出了个COM,我学了COM,它又“点NET”了!

          还是试想,如果我是天才,那我才不怕别人骂我“重新发明轮子”。因为一个天才认为需要重新发明的轮子,必然是原有轮子不能满足天才的需求,所以需要重新发明。

    花了两到三年时间,发现并承认自己不是天才之后,我开始准备重新学习C++了! 因为一个人越是没有什么超能力,就越要懂得合理地挑选及利用工具。比如,有人家里从来不备瓶起子,因为他用一只筷子,甚至一张A4纸,都能开啤酒瓶;我们不行,那就安心地准备一个起子,必要时,甚至打印一份“瓶起子使用说明书”。再如,古龙小说中谁最利害?我感觉是小李飞刀啊,人家一把小刀,啥都能搞定:削铅笔来削果皮,开罐头来开酒瓶……我们不行,怎么办,买把瑞士军刀嘛。

    把C++比喻成瑞士军刀,我不是第一人(见《Imperfect C++ 中文版》刘未鹏序),也不会是最后一人。C和C++相比,这真是绝妙的比喻。C++乍一看,真真吓死人!C++他爸就直言过:C++是一门多范型的开发语言。就像我还年小时,看到一把瑞士军刀,感觉好复杂!许多东东甚至第一眼完全看不懂得它是做什么用的!而C语言,差不多是流行语言中,最最简洁的语言了。初一看简单得像一把小刀,但!上海滩的杜月笙在落魄时一把小刀削了多少颗梨,才把那一把小刀玩得出神入化!(你真的觉得学C比学C++容易吗?那要看你准备玩到什么层次)。

   上面这些话,都是我现在年纪大了点才说得出来的——听人说程序员的职业和妓女有得一比,那我现在奔四的人还在这行混,该算是“老鸨”了吧 :) ? 那可是管理层的人物了,所以说话难免偶尔会装逼一点(要是哪天我突然写篇《大学毕业生初入社会吾不得不说之二三事》,或《我对程序员新兵职业规划以及漫长人生计划的若干建议》之类,各位千万要镇定 :D )。

    当年其实很简单,买书,再学一遍C++就是。放下在C那里的一点经验,带上实践中的问题,开始重新学习C++。我那时还是不懂得C++之父是谁,但这第二次学习C++,我多少是和Bjarne Stroustrup 同志所说的“Speak C++ Like a Native”有点靠近了。

         这是主观情况,客观上,网络大行其是,我可以相对方便地接触到大量的国外C++交流站点,类如那些讨论群,我感觉难过的是,我英语水平还是很不够很不够。再者,国内出来的,特别是翻译的C++好书,包括10年就存在,我们却没机会遇上的经典,都可以方便地买到了。(这一点可以作为我的“不得不说的二三事”之一:别舍不得买纸质书!一边放着电脑,一边摆着书,永远是最好的学习方式。)


    从最初胡里胡涂的自学,到今天我在写教程书,10数年过去了。我的第二条经验是:“不经XXX之苦,不懂“YYY”之妙。”比如:不经“面向过程”之苦,不懂“面向对象”之妙。


    我拥抱其它在C++之后发展起来的语言,因为我同样在实践中,特别是团队开发,感受到了C++语言在某些方面那么明显的弱势。


    我的第三条经验是:“洞悉XXX的坏处,才能真正爱上XXX的长处”。对C++尤为如此,已经很长了,关于C++的不好,也早有人说过,这就不多说了。

    (第一条经验呢? 前面说过了: 如果你不是IT天才,那就更要认真挑选将要学习的东西!坊间是常有人简单而深沉地说什么:“任何语言都是一样”。这种话你信就信,不信就不信。就像有过来人对你说:“所有女人(此处略去三个字)都是一样的”,你说信好还是不信好?

-------------------------------------------------------------------------------------------------------------

         最后我们扣题一下, 学C好还是学C++好? 是不是学C++前,要先学一下C?要我来回答这问题话,太难了。我自己是学过C然后才学C++的。但要说C,一开始还把害了(当然,深层次追究,是我自己笨)。但因为被“害”了,反倒让我在后来的第二次学习中,理解了很多C++中的特性它为什么要这么设计,确实在知其然还知其所以然的过程中起到作用。

    又想起一事:约6年前,我做一个Arm的嵌入式开发,只能用C开发,我在用惯了C++之后再用C,我惊讶地发现,这回我只懂得用C++的方式使用C了:我费了半天劲,先在C里模拟那些C++固有的特性:什么构造、析构、拷贝构造等等机制;再然后是二话不说,写一个string类……这算是进步还是胡搞?我真的不知道……

   

        我对这两门语言的学习经历,或可供新朋友们一些参考作用。但也只能是参考。因为人与人不一样,时与时不一样。不过,有一样东西似乎没有多大变化: 那就是C和C++的差别。一者像小刀一者像瑞士军刀---比喻总是有不到位之处,但我说的意思你懂,应该懂,我写这么长呢! :(

如果您想与我交流,请点击如下链接成为我的好友:
http://student.csdn.net/invite.php?u=112600&c=f635b3cf130f350c

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 63
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南郁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值