我的C++之路

本文转载自一个同在杭州一起混vchelp的朋友.

世上本没有路,走的人多了,也便成了路.

我的C++之路

QBASE,我的第一门语言
    是高中计算机会考的语言,那个时候每周只有一堂计算机课,而且并不是只学编程的。那个时候,计算机当然不像现在那么普及,一台PC还是要万把块钱的,而那时候的钱可比现在值钱多了,反正我家是没有,而且计算机的用途也不像现在那么多。那是DOS的鼎盛年代,486(带数学协处理器的386,难以置信竟然要这么做,并以此为荣)加个CDROM就是当时最顶级的PC,所谓的多媒体电脑了,还有300MB的海量硬盘。那个时候,以486来称赞一个人的聪明(现在可能就是说你蠢了),8088当然就是骂人的了,真是一个古老的年代。还记得那个时候老师给我们讲,1KB是多大,1MB是多大,乃至1GB,我们为之惊叹;还说我们学校就有一块1GB的硬盘,我们感到无上的光荣和自豪,呵呵。当然,我的前辈们,经历了比我更古老的年代,曾经看见一台旧电脑主板上有8个内存槽,每个槽最大支持1MB,看那个主板的架势,应该是当时的终端机,天啊。
    应该说QBASE是很容易学的,没有现在的高级语言的那么多概念,这些概念绝不是初学编程的人可以在短时间内理解的,何况还有从没有摸过计算机的人;也不像汇编那么恐怖和复杂。应该说它非常符合人的思维理解,而不是计算机和软件的思维。那个时候,我们以用屏幕打印和IF-ELSE写RPG游戏为乐,包括一些女生,如果你看见有一款叫“混世魔王”的PC游戏,它的作者一定是我们之一的某个人。
    那个时候,我充分理解了计算机程序是怎么一回事,以后我再也没有看见过QBASE。很显然,我们也仅仅是接触了它的皮毛,或许它比现在的C++更加博大精深、纷繁复杂,但我第一次接触计算机程序,感到的是无比的快乐。你可以想象,你可以去控制机器的行为,它在你面前不再是个神秘的东西。
    就像凡人看破了世界的本质,那么他就成为了佛。程序会让你成为计算机的主宰者,我就是计算机的佛。

C,入门最佳选择
    我认为,无论你毕业后的工作是不是在IT领域,最终是不是以编程作为职业,或者是以其它的高级语言作为工具,又或者对你而言程序设计仅仅是一门必修课,无论何种情况,C语言都是作为计算机程序设计入门的最佳基点。汇编,我至今都不会这个东西,现在的程序员完全不需要懂得汇编,但是没有C的基础,就无法成为优秀的程序员。作为入门级的语言,汇编太接近物理的东西,不符合人类的思维,而且它又不是高级语言,除非你的工作是严格依赖于硬件环境的,如芯片设计,否则你完全没有必要学这个东西,而且先学C后学汇编,或许是更好的选择。PASSCAL,应该和C具有同等的地位,但是它现在的前景越来越暗淡,不利于以后向C++、Java、C#这些C语系的语言转型,还有那个著名的Delphi,那只会害了你。FORTRAN,它的数学背景太浓厚,而且它是弱类型检查的,其实它比C更危险,如果你不是数学专业,就没有必要学它,它现在的应用面很窄,甚至它根本就不是通用的程序语言。此外,C++、Java、C#、BASIC,这些现在主力的面向对象的通用程序语言,它们的起点太高了,给你一枚炮弹,你可以制造出火箭,但你永远也无法了解火药爆炸的秘密。如果你仅仅是暂时性地学习编程,或仅仅是作为一门过路的课程,那么学习它们还是相对比较轻松的,而且你也可以学到不少东西;但作为一整套计算机程序设计学习的路线,把它们放在最前面,绝对是错误的。其他的,如JSP、PHP、ASP之流,这些根本就不能算是真正的计算机语言,严格地讲,它们就不是程序语言。
    所以,只有C才是最适合初学者的,它是时至今日应用最广泛的通用程序语言,是C++、Java、C#的发源地,它存在于各种硬件环境和系统平台之中,它拥有各种五花八门的开发环境与编译工具,它是一代经典程序设计理论的代表,是面向过程向面向对象转变的实践者。它的最重要的部分,指针,围绕对指针学习的痛苦经历,使得C成为最难学习的编程语言之一,它的恐怖只有亲身经历过的人才能够体会,但它的快乐也只有亲身经历才能够体会,它可以让你对计算机为所欲为,它是所有编程高手的必经之路。除C之外,PASSCAL和FORTRAN也可以作为第二选择,但再没有第三种选择。

C,一点都不难
    高中时的基础让我对C的学习比较轻松,虽然经过了很多年才去学一门新的语言,并且其间都没有编过程,即便再让我用QBASE,我也不会了,但对一些概念的理解是不会忘记的,还有如IF-ELSE、WHILE、SWITCH这些条件控制语句,都还是有印象的,虽然不是完全一样,但都是雷同的,很容易理解的。再加上我对编程的兴趣(这的确是一件很好玩的事),整个C的学习过程,我都没有遇到什么困难,即便有偶尔理解不了的东西,思考并解决问题的过程是非常有乐趣的。我认为,学习编程语言的难点只在理解计算机的思维这一点上,除此之外,它真的可以算是最简单的课程之一。和英语数以万计的单词相比,它的关键字不会超过50个,而且具有最严格的语法逻辑,绝不会出现人类语言中的隐晦情况,还有“语感”这种不可理喻的东西。和“毛泽东思想”、“邓小平理论”这些课相比,它根本就不需要靠背,而且也没有东西可背,即便你是照书编程,要记忆的程序也不会超过20行。和数学、物理学相比,那就更容易了,学校教育的题型就那么几种,如排序算法就那么几种,运算符优先级也就那么几种,和吉米多维奇的习题集(经典数学分析习题集)相比,简直不在同一个数量级上,它的灵活性和多变性远没有数学那么丰富。
    它唯一的难点就在于你要理解它到底是个什么东西,仅仅依靠纸做的东西,无论是书本还是习题集,无论你是靠背还是靠算,那都是不可能学好编程的。其实,它的学习方法和数学一样,想想你是如何学习数学的,那就是靠做题,聪明的人少做点,笨的人多做点,我想不会有人傻到做题是为了去撞上同样的题目吧,所以数学的练习是为了培养数学的感觉与技巧,也就是数学思维方法,然后是用这样的思维去举一反三的。编程也是一样,看再多的书都没有用,就是靠编程,去积累经验和技巧,所以你最后获得的是经验和技巧,使用的也是经验和技巧,不编程是永远也不可能学得出的。
    它的难点的另一方面,就是在此之前你是没有任何基础的。数学、物理学、英语、哲学、文学、经济学,这些大学中的任何一门课程,都是以你以前的学习为基础的,如离散数学,是以高等代数为基础的,而高等代数又是以高中数学为基础,即便你学习法语、日语,也是有英语学习可以作为基础的,但程序设计是没有这些基础的,英语和数学都不是它的基础,因为你在此之前没有接触过作为计算机理论源头的那部分数学内容,也不可能在英语中学到语言文法的理论吧,而在此之前唯一的那门课,计算机应用基础,仅仅是扫盲课程而已。所以,这就好比让一个连小学数学都没学过的人去学习微积分,对于没有程序概念的人,就是这样的情况,那当然是很难的了。变量、表达式、输入输出、循环、选择、函数、内存、文件、地址、声明、定义、调用,等等,所有的概念,都是在一片空白中建立起来的;而且以前的知识还会对它产生混淆,如“函数”,绝对不是数学中的那个概念,还有数的体系,整数、浮点数,为什么-1会突然变成很大的数,为什么不可以直接判断两个浮点数相等,那绝对不是数学中的数的理论可以解释的。
    换句话说,程序设计就像是一个新的起点,以前的任何学习优势都将不复存在。

    我学的是数学专业,C语言也不是本专业开设的课程,而是全校理工科的必修课,本人属于懒人,没有看除了课本以外的书,没有编除了老师布置的作业以外的程序,但是课本是被我翻烂了,所有的作业都是我自己编的。唯一超过学校设置的,就是自己花钱在学校机房上过那么几小时的机,因为那个时候家里还没有买计算机,不过当时很多人都和我一样,自己花钱再上机,我算是少的了。
    我发现现在的人都很喜欢抱怨,抱怨课本不行,误人子弟,抱怨老师不行,没水平,抱怨学校体制,开的课没用。我认为这些人的想法都很幼稚,总在关注一些自己无法改变的事实,就算课本、老师不行,那你还有第二种选择吗?逃课后你真的会去自学吗?你自学就一定比正常上课的效果好吗?作为现在有经验的程序员,我承认,学校的书本的确存在一定的问题,甚至有错误的地方,老师的水平也是有高有低,有的老师在专业知识方面也存在一些欠缺,但我认为现在更不行的是学生,是学生的学习态度,即便学校的课本、老师再不行,但作为教育学生的资格,我认为还是绰绰有余的。以你现在的水平,还没有资格去评价一本书或一名教师的水平。
    我认为,程序设计就是一门具有崭新形式和学习模式的课程,除此之外,它就和普通的课程一样。就像数学、外语和政治理论,它们的学习方法是完全不同的,理科的内容需要大量地练习,也就是做题,外语需要听说读写四方面都下苦功,也就是记忆和使用的锻炼,政治理论就是靠背,记忆大量的文字内容,理清相互关系,而程序设计更像是做物理实验,课本知识不再是理论大纲,更像是使用说明书,而计算机就是仪器,它考察的实际是仪器的使用能力。所以,你整天抱着说明书就会编程了吗?围棋爱好者下棋的时候也没有拿着围棋规则说明的吧,你看电视的时候也不会拿着电视的说明书吧,当你编程不需要说明书的时候,才算是入门。

    也许是和很多其他人的区别,在我结束这门课的时候,并没有放下C语言,事实上,从此之后我整个大学期间都在使用C语言。但这也不是因为我的勤奋好学,而是因为我们以后一直都有需要编程的课程,数据结构、计算机图形学、数学实验、数学建模,还有一些以理论为主的课也会有编程作业,高等代数(矩阵的计算)、图论(图算法)、算法分析与设计。我估计这个量可能都超过计算机专业使用C语言的频度,应该是全校使用C最多的专业了。我不知道计算机专业的课程设计是怎么样,其实我们专业根本就没有开设属于本专业的其他程序设计课程,C是学校必修的,后来的C++居然是选修课,老师也不是本系的,而与此同时大量的理论学习附带相当量级的编程作业,也就是说,你有大量的编程作业,但你只会C语言,这看似不合理的设置,反而使得我们成为可能是全校编程基础仅次与计算机专业,甚至超过他们的专业,我的感觉就是这样的。
    当然,除此之外,我们在计算机方面的知识是十分匮乏和狭窄的,甚至对操作系统和软件工程都没有一个比较系统化地了解,还有数据库,当时我对SQL基本就和没学一样。

    我的C语言的确学的很好,96分,不敢说是第一,但肯定是当时系里编程最好的那么几个人之一。我能够很轻松地学好它,我想,首先是因为我对它有兴趣,即便遇到疑惑的问题,也是一种快乐的体验;其次,我能够理解计算机程序是怎么一回事,这个概念,我可以理解计算机的行为,可以理解其中包含的规律;第三,我做事态度端正,所有的作业都是自己认真去思考,并亲自独立编程完成的,而且一直保持着使用C编程的状态,这也和学校课程的设置有关;第四,因为我懒,编程就老老实实地编程,不愿意接受那些更“时髦”的语言的熏陶,也没有受到那些吹嘘的书的影响;最后,我并没有将编程作为一种很了不起的东西,也没有想过它会成为我的职业,那个时候,我仅仅将它作为一种工具,也就是,不要太在意它的存在和地位,不要太把它当回事了,计算机只是一种家用电器而已,学习不应该带着利益的目的去学习,不要考虑以后的工作和能赚多少钱,那会使你迷失方向,也会令你感到很累,学习应该本着自己的主观爱好,去体验其中的快乐,并要学会体验挫折中的快乐。所以,我能够在大学中打下比较好的编程基础。

C++,开始学的并不好
    C++只是我们专业的选修课,本着在C方面再提高的目的,我自然是选了。不过,事实有点令我失望,原来只是又增加了一些新的语法,而这些内容并不见得就比C好在哪里。当时,我已经能够很熟练地使用C语言,我认为C++最多也只能达到和C一样的功能,那么为什么还要去学习一种新的语法呢?因为我感到最我来说,C已经足够了,C++并不能给我带来什么新的东西,或者更方便。
    作为刚接触C++的我,当然不能够了解C++蕴涵的面向对象的巨大意义,而且由于我很自信自己的C基础,认为这仅仅是一种语法上的扩充,于是对C++的学习是一种轻慢的态度,几乎都不去上课,在其他课程需要编程的时候,也没有尝试去使用它。结果,真的很危险,我的C++差点没及格,但总算是混过去了,而我除了一些简单的语法,基本什么都没有学到。
    我没有想到自己对C和C++的学习会形成这么大反差,在我重新自我总结后,我认为是因为自己在C语言的优势,成为了在学习C++时骄傲的资本,骄傲使人落后,我的确在C++方面落后于其他人,后来我决心再重新学习这门语言。

    我最初去有意识地使用C++,是因为我发现能够在C的struct中加入函数,这是一个在函数归类上的优点,它有助于程序结构的清晰。于是我就逐渐地将属于一类struct的函数都写到它的定义体里面去。后来我又发现构造函数也是个好东西,它可以自动初始化结构参数,这在C语言中是一个必须强记的习惯。
    当你以一种更方便的C的思维去使用C++的时候,你会发现C++的确在减少C原来的代码量。
    然后是继承,最初的时候,仅仅是为了重复利用同一个结构的成员,在C语言里,想要这样,你还得重新定义个新的结构体。
    我逐渐地掌握了C++基本的特性,但我仍然是以更好用的C的眼光去使用C++的,我还没有形成面向对象的概念,事实证明这个思想需要更长时间的琢磨。

    之后,凡是我了解到C++有什么新的特性,我就会去做个实验,去体验它到底是怎么一回事。运算符的重载就是这样掌握的,那是C语言怎么也做不到的事情,这个时候我体会到了C++的灵活与强大。
    然后是模板,先是函数模板,我理解了它与宏定义的区别与优势。再是类模板,它解决了C语言中定义数据结构不知道成员类型的问题,在C中非常高级的技巧,在C++中变成了普通人都可以掌握的东西,而且表现地更好。有一段时间,对模板非常地痴迷,不停地在写模板数据结构,链表、数组、矩阵、图,这也是我面向对象体验的开始,我在不知不觉中,开始封装属于自己的类库,并以类的方式去解决问题。
    记得有一次,我在宿舍里编自己的程序,有室友的朋友来玩,走了后,他的朋友托他带来一句话,说我是个的高手,我觉得被人认可是很幸福的。

BC31,一代经典开发环境
    BC31,即Borland C++ 3.1,是我认为的DOS下最好的开发环境,它也应该是Trubo C系列的最高版本。相信现在很多学校还在以它作为教学工具吧,它的确是初学者很好的使用工具。我整个大学都以它作为工具,只在做毕业设计的时候才开始使用VC6,只是因为它调试不用输入变量名。
    VC6我认为仍然是现在WINDOWS下最好的C++开发环境,对C++程序员而言,VS2003和VS2005仅仅画蛇添足变得更慢更庞大而已。不过,作为初学者的使用工具,它们都不是最好的,因为它们的集成系统,那会误导很多人,很多人分不清C++、VC、TC的区别,就是它们造成的,而有的人能写出很复杂的界面,但语言基础却很差,也是它们造成的。凡是本着多快好省的目的去开发软件的商用开发环境,都不是适合初学者的好工具。
    所以,我还是强烈地推荐BC31。直到现在,我都不习惯VC6里的白底黑字,而非要将它改为黑底白字才看得舒服,就是因为在BC31里留下的后遗症,当然这样设置也更节能。

    这也使得我在毕业的时候,不知道Debug和Release的区别,不知道lib、dll、ocx怎么写,不知道如何去调用lib、dll、ocx里的方法,不知道WINDOWS API怎么用,甚至我都没有听说过这些东西。我拥有的,只有基本语言的基础。

C/C++,工作中的历练才是真正的历练
    刚开始工作的第一个星期,感觉自己就像个白痴,什么都不懂,什么都不会,完全不了解公司的技术和产品,甚至连VC6都不怎么熟悉。现在已经有近四年的工作经验,我的体会是,学校的编程和实际工作中的编程绝对是两回事,而且差距较大,但这种差距是可以在短时间内弥补的。经过老同事的指点,我很快就学会了那些我不知道的东西,并开始真正参与到实际工作中去。我现在也是这么认为的,在学校就是要打好语言基础,其它的东西,你在学校里是怎么也摸索不清楚的,但在工作中,经人指点一下,瞬间就可以都学会了,那些都是外围的东西,越是上层的东西就越是容易学。
    很多人说现在学校教育与实际工作需要脱节,我认为,是有点差距,但并没有到学校教的完全无用的地步。一些人不能很快适应实际工作,是因为两点原因,他们的学习能力差,不能很快地学习和适应新环境的需要;或者,他们在学校本身基础就学的不扎实,所以缺少后台知识的支持,不能很好地理解和学会工作中的内容;其他的,就有可能是性格上存在缺陷了,不能与人很好地合作与交流。
    我没有换过公司,一直都在做着后台产品基础性的工作,所有新产生的代码,我都使用C++编写,同时还维护着公司核心产品的一部分内容,是用C写的,所以我在两种语言方面都得到了很大提高。
    真正地会使用C++,是在实际工作中逐渐养成的,它需要大量代码的积累。在最初的时候,我其实也只是掌握C++基本的语法而已,我在工作中不断地向前辈高人求教,大约又花了2-3年的时间,才自认为充分理解了面向对象的奥义,期间伴随了有数十万行的代码,同是也成为了别人的前辈高人。面向对象就是一种思想,它和C++没有关系,我用C一样可以写出面向对象的程序,只是可能更罗嗦一些罢了。
    同时通过维护公司核心产品的代码,读懂了许多算法,同时C的水平也有了一个飞跃。对当时的我来讲,那就是前辈高人传承下来的经典,以我当时的水平,是怎么也写不出那样的代码的,我从中学到了很多东西。现在,这份代码已经基本上被我改得面目全飞了,可以说除了里面的骨骼,其他都是我的东西了。我在完全读懂算法的前提下,又将原来的算法做了改进,很多改进都产生了程序性能的质变。现在的我可以有自信写出比前人更好的代码了。
    有两本书对我的帮助很大,一是《C++高级编程技术》,是林锐博士写的,他主要介绍了程序风格的重要性。为此,我特地有意识地将自己的编程风格改变过来,那段时间大约有一个月,那时候我的编程速度明显下降,感到很不习惯,但是强制要求自己按照良好的风格来写,最后形成了我现在代码风格的雏形,以后的几年代码风格都仅仅是小的变化。二是《C专家编程》,是一位SUN的编译器程序员写的,他主要是介绍C语言编程中的隐患和技巧,你能够体会到大师所思考的、所考虑到的问题,就是和普通人不一样,他使我在思维上有很大进步,这本书会让你知道许多以前根本就想不到的问题,而且会令你更加敏锐。此后,同类的书籍就再也没有能够大面积地触动我的了。
    前段时间又用两个晚上看完了《编程之道》,那是另一种风格的编程书籍,它阐述的是编程的哲学,会引发你内心的许多思考。

    这么多年,我开发了许多类库,有图象处理的,有算法的,有数据库访问的,等等。要想成为高手,你就必须要有那么多的代码积累,这是怎么也逃不掉的,C++的语法可以速成,你可以近用一个星期就通过学校C++的考试,但要理解面向对象的思想,那就需要用年来计算的时间长度。C++最关键的就是面向对象的思想,而当你掌握这个东西的时候,你也可以同时掌握Java和C#。从面向对象的角度来看,我认为,还是C++的语法最能充分地表达面向对象的思想。我曾经用过几天的Java,由于我已经习惯了C++那种有些变态的类型转换,利用指针做强制类型转换是很方便的,但在Java里就不行,所以在项目结束后,我还是决定放弃Java。
    选择了C++就是选择了绝对的自由,它不会因为指针的危险,而将指针从类型表格中去掉,不会因为程序员会忘记释放,而增加一个垃圾回收器;你可以从到头尾都不使用指针,也可以自己去写各种各样的回收器,你可以明白程序是依赖于你的,而不是你依赖于程序,这是它与Java和C#最根本的区别。是人在创造程序的环境,而不是人在程序创造的环境中编程。它拥有无与伦比的速度,它拥有无所不能的能力,它是可以令你想到即能做到的实践家,如果你有足够承担其严重后果的勇气,如果你有充分驾御它的自信,如果你有可以将它发挥到极至的才智,那么请选择它吧,它会令你成为万人景仰的一代宗师。

最后,成为高手的条件
    我认为,成长为真正的C++高手,你需要具备或经历:
    对编程具有极大的热诚,不要认为它好赚钱,或是份体面的工作而去学习它,宁愿将它当做一件好玩的事情,然后将它当作一门艺术去雕琢与磨练。
    学好C语言,否则你永远也不可能真正地学好C++。
    端正的做事态度,学习时不要想去抄袭或作弊,工作时不要想去应付或图轻松,应该以最直接地解决问题和写出最好的程序为目的。
    一家适合自己的公司和一个适合自己的领域,切切实实地去做一些有意义的内容,而不是拖拖控件,或搭搭积木。
    前辈的指点,并且要以超越他为目标。
    可以作为范例的代码,可以学到很多东西,前提是它是一段好的程序,并且是适合你的。
    数十万计的代码和三年以上的时间。
    将重点放在数据结构、算法和设计模式上,而不是语言本身。
    自己写类库。
    了解操作系统。

(完)
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值