返回 登录
39

C++程序员学习发展方向分析和指导,学习参考!

我想,如果是打算走进C++编程的同志们,请好好看完这篇文章,或许,对你的发展有所启发。但是,不要企图在这里找到你自己发展的规划和指定好的发展航向和行程。看了这篇文章,能够收到启发,受到鼓舞,也就是本文的一个成功的地方了。如果能够切实的给你指导发展方向,那更是荣幸备至。但是,每个人的兴趣都不一样,所处的环境和条件也因人而异,所以,必定会有与你不完全符合的发展方向指导。正如马克思一样,本身是好的,但是如果不中国化,就指导不好实际工作。所以,务必自己化,根据文中的指导建议,结合自身的情况,总结一个可行适合自己发展的道路,然后坚持走下去,只要坚持走到最后,你就会成功的。至于成功的定义,我也曾经思考过,再此就不讨论,每个人心里都有自己的成功定义,希望每一位有志者能够达成心中的成功!
对于C++语言的选择,很多人也会在疑问,C++是否流行,是否有用,是否一直能够凭借这一门语言让自己顺风顺水,诸如此类。有些人是糊里糊涂的就学了,基本上就是学校开设的课程,就这样稀里糊涂的开始了,然后迷迷糊糊的结束了,最后都不知道C++有些什么,不过学校里学得C++也确实不能深入到地步。还有一些人是徘徊在学与不学之间,没有踏出这一步就再思考未来,是否有些太超前,导致什么都要评估一下,最后什么都学不踏实,也学不好,最后总结一个结论就是,学的东西没用。还有一些人就是,知道C++确实挺强大的,既能深入底层,又能方便开发高级软件,是因为C++是面向对象和面向过程的综合体,自然两者的优点都具备。然后就学了,学了基本语法,然后学了面向对象,然后学了点高级点的模板等,然后就觉得学完了,不知道再继续学什么了。
这些情况,多数人都经历过。作为使用C++作为主要开发语言的我,自然也经历了这些。也有很多朋友问我这些问题,到底如何发展,如何学习?我当然也是给予了一定的指导,也主要是结合我的经历和思考总结,给了一些基本的指导,能够帮助他们,让他们找到前进的方向,不再和我以前一样,走太多的弯路,受过太多的煎熬。感受到他们的笑容和随之的谢谢,我是多么的欣慰,因为我切切实实的帮助了一个志同道合的人,也正是因为他们,我才不觉得孤独,也慢慢发现,像我这样的经历的人很多,也有不少的正在朝着这个方向走来。我也不可能一个个的指导,简单几句话也说不清楚,因此就在本文中详细说说,希望能够给予那些急切需要指导的正在奋斗的朋友一些指导。
鉴于被咨询的众多朋友的情况,有在校的学生,甚至还有高中生(这个让我很惊讶,也很高兴,也有点惭愧,因为高中我也萌生对计算机的兴趣,但是没条件学习,惭愧的是,他们都已经开始接触和学习了编程,比我当年可是先进了好远。),还有研究生,还有没上过大学的,还有很低学历的。正因如此,我才感受到,指导的必须性。有些朋友,我也是因为很忙,也就没有仔细的去指导,虽然鼓励了也给出了一些基本的建议,其实我更希望能够掏心掏肺的把我能够指导建议的都告诉他们。如果你要问我为什么要这样做,我只想给一个理由,那就是,我走了太多的弯路,以至于一路那么艰辛,也一路那么孤独,所以,我尽量使他们不再重蹈覆辙,能够集中更多精力和得到更多的鼓舞,一道前行。
我始终相信一点,兴趣才是源源不断的驱动力,这个由我的经历已经见证了这一事实,我还会继续保持下去。那些咨询我的朋友,基本上也是因为兴趣而学习的,所以我更是觉得有必要指导。虽然我水平不够高,但也正是以一个初学者和入门者以及自学者的角度,才能让他们切切实实的得到清晰的方向。那下面就详细说说C++发展方向和学习指导,只是建议,更多结合自身的情况。
C语言和C++语言的关系,请参考《C语言和C++语言的关系对比分析》。下面针对如何学习C++做些分析和建议。C++的学习必须沉下心,这是我反复强调的,请务必记好,当你在犹豫时,请用这句话提醒自己。其实做人和C++一样,沉不下心是做不好的。
学习编程,与学历没有关系,与专业也没有关系,与性别年龄也没有关系,只要你想学,是真的感兴趣,就能够学好。当然,为了避免少走弯路,请多借鉴他人的经验和建议,比如看到本文,也是让自己少走弯路的一个明智的做法。还有,也有人问数学不好,编程能不能学好?这个问题其实和学历是同一类问题。大家这么问,其实就是对于编程了解的不够。只要你是正常人,有着正常的思维逻辑,都是可以学编程的。当然,如果是有兴趣,则会学得更好。如果再加上有人指导,那就更好了。
但是,事实并没有这么美好。但是,可以编程的最基本的条件,想必你一定满足吧,否则你也不会在着了看这么长的文章了。同时,能够看到文章这里,说明你确实对编程感兴趣,那么我就要恭喜你了,因为这几个条件你都满足了。我相信,你再沉下心,你一定能够成为优秀的程序员,同时,你的生活也会变得更加精彩。
为什么说有正常的思维逻辑就能够学编程了呢?当然,编程的基本语法,只要你找到一本合适的书,或者有一个好人指导你,这是不成问题的。当然,如果暂时都没有,网上这么多资源,这么多信息,你绝对能够找到你要的信息。很幸运的是,你再看到本文时,你已经找到了一个合适的指导你的有用的信息,或者是我这个指导你的人吧。我不敢谈什么编程的艺术,因为我自己还不够层次,但是我有我自己的思考,我有我自己的想法。
所谓编程,就是编写一个按照我们思维运行的程序。所以其核心就是,我们的思维。编程的逻辑就是我们的思维逻辑。编程不仅是要从生活中的思维中加以利用,再学习别人的经验时,你还会学到更多的思维,开阔自己的思维,更好的指导自己的生活。然后进一步优化自己的编程思维,循环往复。如果对生活经验喜欢总结抽象的人,总是能够比较快的找到解决问题的方法,因为解决问题就是解决生活中的问题,而这个编程逻辑也就来自于生活,所以,通过编程,有时会让我们更好的理解生活中的一些,从而得到更多的乐趣。
当然,这只是一个最基本的条件,光有这些思维,并不能让自己真的就能成为合格的程序员。否则,全世界的人都是程序员了。但是全世界的人都是有成为程序员的潜力,除非是植物人之类的,没有正常思维的人。下一步,我们就是要学好编程的工具。这样我们才能真正成为程序员。这个工具就是编程语言。至于什么语言,到了最后其实并不重要,但是为了长远的发展,我建议学习C++,特别适合在校学生。因为在校生可以利用充足的时间来学习基础。当然其他人只要花大量的时间来学,也是一样的,只不过是在工作之余,更辛苦些,但是,有兴趣,其实也不是很辛苦的。真正的辛苦其实是有一大堆疑问却无人可问的时候。如果怕辛苦,那就不要学编程了。
为什么我建议学习C++语言呢?当然不是因为我的一味的喜好。对于编程语言本身,要在工作和以后的发展中,你必须学会一些基本的东西。面向过程是所有语言的基础,面向对象是现在开发的必备基础,而模板和泛型编程,又是很多语言直接或间接实现的高级工具,Java也用容器,C++的STL中也有容器,其实本质就是一个,只不过,Java可能对其进行了封装,提供了更多的特性而已,但是思想和本质是一样的。同时,因为Java对其进行了封装,你要学会使用它是很容易的,但是要深入了解就不那么容易了,因为封装了,就变得复杂了。而C++则是直接的暴露,很原始的。只有学懂了容器,才能真正用好,而Java即使不懂也能用的很好,这也是前面说的Java上手快深入难,而C++则是上手难,深入简单。容器的本质都弄明白了,用法就再简单不过了,然后学其他深入的也变得很简单了。要是再去用Java的容器,直接秒掉。也真是因为C++提供了这么多的特性,作为长远的发展,一次性把这些全部学会,融汇贯通,语言就不是阻碍你前行的绊脚石了。再学其他东西,几乎就不费吹灰之力了。所以,对于语言,把C++的每个部分学好,就不要在语言级别上纠缠,那就是要发展到系统级别了。也只有在系统级别精通,那就是很优秀的程序员了。当然,在各个应用方面,也是成为优秀的人才的,但是,系统必须很精通,否则,总会欠火候。不管什么时候,你编写的程序,都是在系统运行的,你不可避免这个问题,当然在你脑子里运行的程序就不在此讨论范围了。
学习C++,如果是初学者,不管是在校学生,还是毕业了的,还是低学历的,或者没有读过书的,也不管是以前学过的,还是没学过的,或者以前学过C的,请都仔细学习一遍《C++ Primer Plus》这本书,这本书是针对初学者的,讲解很详细很全面,一步一步的解释,程序实例并不做枯燥的数学运算,而是生活的小例子,从而增加兴趣和降低难度。这本书七百多页,因为我C语言基础扎实,也学过了Java的面向对象的思想(当初学Java就是去学面向对象的思想的),然后花了一个月,把这本书仔细的学了,当然,面向过程部分就很多略过了,和C语言基本一样,只是参看不一样的地方。书中每一个字都看的很仔细,包括书后的习题都基本练习了,结果也正确。不过后面的高级部分,因为当时基础不够,所以就没有一个个做了,只是了解其思想。但是,如果没学过C语言,也不要紧,那就直接学习这本书吧。这本书学完后,如果要进阶,可以学习《高效C++》。然后你就知道语言部分你还需要学什么了。现在不要问,学完后你自然知道还需要学什么。
当然,学的时候,动手编程是必不可少的,不动手是学不好的,书上的练习,尽量都做出来,不要查答案,也不必对答案,你独立思考,解决问题了,符合要求,就是答案。编程中没有标准答案,千万不要束缚自己的思维。实在做不出来可以参考答案和提示,分析好后再根据思想,重新做,而不是默写代码,千万不要默写代码,而是根据答案中的思想去实现,这样才能真的学会动手编程,因为这问题是有朋友问过我的,他说自己对着书写的出来,不看书就写不出来,问题就出在这里,我当时没有仔细分析,因为没时间,希望他能看到这个吧。自己根据思想写出来了,你就真的掌握了思想的精髓,也就可以灵活的变通了,而不是像培训班里让学员默写代码,那是一种很可笑的做法。但是,要经常写代码,把这些思想用熟,让它成为自己的思想,这样就成功了。以后就不会没有思路了,因为思想已经转化为自己的了。
到这里,语言方面的学习问题都解释清楚了。下一部分的发展方向就是操作系统。对于操作系统,先不是编程的问题了,而是操作系统的原理问题。这是优秀的程序员必须掌握的知识。不要觉得这些原理枯燥,也不要觉得那些思想过时了,书中的思想是没有过时的,虽然简单,但是现在的系统都是基于这些基本思想的。如果这些基本思想都不了解,更别说去学习现在的系统了,那简直就是噩梦。理解了书中的理论还不够,必须同时转变自己的思维,以操作系统的运行逻辑来看操作系统,而不是依你的思维来看,因为它是已经存在的东西,即使不合理,它也存在,你必须接受,而不是你觉得应该怎么样,除非你自己去写一个操作系统,来制定它的规则。至于学习的书,可以参考汤子灜的《计算机操作系统》。这是所有操作系统的通用理论。然后你可以去学习《Windows程序设计》和《Windows核心编程》深入学习Windows编程知识,或者学习Linux系统等,当然,如果真心想深入研究,建议学习Linux系统,因为它是开源的,你能看到系统所有内核的代码,深入学习,而Windows是封闭的,你看不到。不过,如果你要在Windows平台上发展和找工作,那建议学习好,学好后还可以对比学习Linux系统,更好的理解它,从而更能提升操作系统的知识水平,而不限于哪一种操作系统。然后就是各种应用级别的,比如图形方面的,网络通信方面的,等等。但是系统是它们的基础,所以必须先学好,才能更好的学习它们,当然这是建议,可以根据自己的情况做调整。
文中列出的书,除基础理论的书《计算机操作系统》外的其他编程书籍,在我们网站都可以直接免费下载电子版本阅读。都是经典书籍,如果喜欢,可以支持作者,可以买正版书籍平时参考,而不是记住书中的所有东西。
然后就是最现实的问题。学完了首先是要找工作。当然,我们学习的目的不是找工作,千万也不要是找工作,如果只是为了找工作而学C++,那我请你三思。不是找不到工作的问题,也不是工资的问题,而是,C++是一门比较难的语言,不是一下子就能学好的,急于求成只会欲速则不达。但是,愿意花时间学好,当然也是能够找到工资不错的工作的。C++方面的工作不是没有,是公司找不到水平高的C++的人才。半桶水是搞不好C++的,所以要学好,工作是没问题的,不学好,也不要说C++没前途,只能说自己学的还不够。至于工资的高低,是跟技术水平成正比的,技术含量高的,工资自然高,需要投入的时间和精力就自然多,这个毋庸置疑。所以,不要怀疑C++找不到工作的问题,只要怀疑自己学好了没有的问题。同样也不要怀疑工资高低的问题,只要怀疑自己水平高低的问题。
当然,C++基础学好了,还是不够的。它只是一门语言而已,仅此而已,不要把它想得太神圣了。真正能够发挥最好的作用的,还是要与平台结合,还有学会其他的开发工具,比如框架,类库什么的。初学者一般都是从事Windows开发,当然也有准备从事Linux开发,对于服务器方面的开发,基本上是用Linux了。所以根据自己的发展方向,进行选择吧。不管是哪个系统平台,操作系统的基础理论必须学好,因为它是所有目前操作系统的通用理论。然后再分别深入学习。Linux方面的我水平不够,虽然学过了Linux系统,也在自己的电脑装过Windows/Linux双系统,但是也只是限于Linux系统的使用层面,开发层面不清楚。学习Linux系统的使用,可以参看《鸟哥的私房菜》,编程方面自己网上查阅。我主要说说Windows方面的,因为多数人还是从事Windows平台的开发。
语言不是问题了,但是在开发项目时,却是远远不够的。开发项目是要高效率解决实际问题的。因为公司是盈利的,并且还要最大化盈利,是不允许什么都从头做起,当然是有工具可以借鉴时是不允许这样的,但是没有时则还是要从头做起。鉴于Windows是微软的操作系统产品,因此,工具最好还是使用微软的。因为这样的话,可以和系统做到最高效的对接,提高程序的效率和兼容问题。在平常开发中,使用的开发工具则推荐使用Visual Studio 2010旗舰版(在我们网站可以下载),开发时使用MFC(微软基础类库)。MFC覆盖了编程中所有的方面。当然,在这之前,需要学习Windows编程,也就是API编程,因为MFC有些功能是API的简单封装,简单的意思就是把一个API函数放在MFC函数中,将API函数需要的句柄作为MFC类中的一个成员变量,从而减少了函数的一个参数。仅此而已。还有的功能,根本就没有MFC类或者类成员函数对应,因此就必须使用API函数来解决。同时MFC是一个类库,还是一个程序框架。
所谓的程序框架,就是将Windows程序的流程进行了封装,然后在MFC中可以轻松的编程而不用关注内部很多细节。有人会说MFC开发的程序效率很低,我之前也听信了他们的看法。其实,我现在倒不这么觉得。说它效率低是因为MFC是一个框架级别的,因此考虑问题都是很高很远的,自然,有些方面就要考虑到很全面,自然也就对程序添加了很多一般用不上的东西,导致程序效率变低。之前我也是这么认为了的,从而产生了对MFC的鄙视,相信从底层开发更能体现技术。但是这种想法是错误的。效率低不低,其实不关工具的问题,表面上看,确实如此,如果以默认向导配置生成了一个程序,自然会加入很多不必要的东西,程序效率自然变得低了,但是,如果是一个高手,很精通MFC,自然,每个部分是干什么的摸得一清二楚,试想,编出来的程序能低吗?我想,因为是跟操作系统同源,所以执行效率更高,因为很多东西可以直接是系统的内核的东西,而其他类库,因为Windows是封闭的,不能够做到深入内核的一些东西,因此就使用用户态的东西模拟内核的,因此效率也就变低了写。就像Java的虚拟机运行程序,如果能在Windows中的程序直接运行,免掉了中间的转换,自然效率就高了。这里的讨论是很模糊的,只是告诉大家,真正精通了,就不存在效率低的问题,如果是菜鸟,再好的宝剑也发挥不出功效。所以,从现在起,希望大家纠正一个思维,工具没好坏,只有开发者水平高低的问题,就想玩游戏的,没有不好的游戏角色,只有猪一样的玩家,道理是一样的。所以也请务必正确的看待这些开发工具。再实际的开发中,我们还必须学好用好一个或者多个工具,同时还要深入,要精通。
而在学习MFC之前,当然C++必然是要学好的,同时Windows API编程也必须学好。MFC只有C++才能使用的类库,有些初学者还不知道,我当初开始接触也不清楚。当然这都是建议,可以根据实际情况调整。当然,如果这两个不先学好,MFC想要学好就真难了,MFC就像C++一样,也是博大精深的。因为涵盖了C++、Windows,还有MFC本身的文档视图结构和一些其他的机制,直接学MFC,不可想象。Windows的学习,可以看《Windows程序设计》,MFC初学可以学《MFC Windows程序设计》。这些都是适合初学者的。MFC的深入可以学习侯捷的《深入浅出MFC》。这些都学好了,基本的开发都不成问题了。
要想进一步学习,就要学习更多具体领域的开发,就要学更多的东西了。再此先推荐学一下STL(C++的标准模板库)和Boost库,这些库在实际开发中经常使用。MFC中有容器库,比如CArray,它是先于STL出现的,有很久的历史了,也很好用,想Java的容器使用一样,很方便。但是真要学好容器,还是学习STL。STL是后来添加到C++的,是一个标准的模板库,当然容器也是标准的,不同的容器有不同的分类,而不是想MFC的容器库一样,一个容器类实现了各种容器,使用起来方便,可是理解起来就不是那么容易了。STL中vector和map是不同的容器,用法也不一样,所以,学会STL,你就能够很清楚容器的内部原理,使用起来就得心应手。容器的内部构造就是数据机构中的东西,比如树,链表等,正是这些结构,才使得容器可以很容易实现了动态增长,和各种特性。然后STL中的各种算法,当然是与容器分开的,通过适配器将容器和算法连接起来,使算法可以操作容器,这也就是泛型编程的思想的结果。算法中则是数据结构中的算法作为基础,STL强调效率第一,而这些算法都是世界顶级大师的杰作,效率上绝对是杠杠的。因为注重效率,因此在错误控制上就很少,所以使用时务必注意,否则出现的错误你都看不懂。而STL是基于模板的,因此,想要学好STL,C++的模板需要有深入的学习,还有数据结构的知识。当然,C++的其他基础知识也是必要的。数据结构学习的推荐书目是严蔚敏的《数据结构》。这本书比较难得理解,但是书中讲解的很精练,初学者要准备学不止一遍的心理准备,两遍三遍都是很必须的。即使有人指导,即使有老师讲解,真正的学会和领悟到精髓,还需要自己深入的理解和动手实践,而不是知道了链表如何添加一个节点那么简单。各种算法不是只是明白了就完事了,需要将其中的精髓吸收,简化到最简单,自己能够轻易的实现。或者自己最算法再加以改造,进一步提高效率。要知道,书中的算法都是人想出来的,千万不要相信权威,要挑战权威,说不定,下一版印刷,那个算法就是你的了。当然,STL只是初学者加深的一个选择,建议学好。即使暂时不学,把MFC中的容器类学会了,使用上是没有问题的,想要做到出神入化,得心应手,那就必须学习这些东西了。STL就说这么多,然后就是具体的领域的学习,数据库开发的学习,计算机图形(GDI)开发、网络开发(Socket编程)等等,这些就根据公司需要做什么就学什么。但是最好之前就有些基本的,而不是什么也不知道,这样对于自己在公司的发展是很不利的,至于为什么,大家以后自然会明白。
这些的学习,首先要学习基本的理论,比如,网络开发,TCP/IP协议都不知道,肯定不能开发一个好的程序的,知道了基础理论后,再学习相应的编程开发知识,用到什么学什么。此部分说的各个领域的可以先了解基础,然后再用到再学,但是,前面说的基础,必须是工作之前就要掌握,否则,工作中就有得你受了。不要简单的听信别人说什么不要等什么都学好的再去工作,但是我要告诉你,不要一点基础都没有就去工作,这是我的坎坷的经历告诉我的真理。请相信我这一句忠告吧。
至于C++程序员更远点发展方向,则不是初学者需要考虑的问题了。先把这些该学的东西学到了,以后自然也会明白自己想往哪方面走的。如果我有幸能够思考清楚这些问题,我会再给大家分享我的经验,那时不是指导,只是分享心得了,因为大家那时也都是高手了,大家彼此彼此。我会一直陪着大家,坚持走到最后,我希望,大家都有一个好的发展方向和成果。
最后,务必提醒一句,学习C++是长期的,必须沉下心,不浮躁,急功近利是学不好的,浮躁了请停下脚步,回归本真,然后重整灵魂,继续前进。祝愿大家每一个都会成为大神,也使国家贡献自己的一份强有力的贡献。
很佩服你能坚持看完,我想你也会有所收获,我相信你也会成功。如果还有疑问,请直接评论中提出,有不正确的或者不准确的地方,请指正,虚心求教。
欢迎学习c++的小伙伴,c++ 交流学习群 427887913 学习资料进群管理会给你们的!!!

评论