C++学到什么程度才能叫精通?

罗镇鸿


当你能自如的运用数据结构和算法、TCP/IP原理、编译原理、操作系统原理、数据库以及Win32API调用、构造自己的C++库(网络库、数学库、测试库、图形库)以及各种引擎,出去毕业应该能在短短半年时间里薪水至少有7000以上甚至上万吧(其实毕业生出去95%以上可能没达到这个水平)。  其实也不用说太多,你问你自己几个问题,如果你都能做到或者学习半到2个月就能做到,那肯定是达标了:  1、我能用C++做出2D的RPG游戏吗?(C++与api或框架的结合运用能力)  2、我能用C++通过3种以上的方法写出四则运算表达式分析器吗?(C++与数据结构、算法的结合能力)  3、我能用C++写出类似STL的简化版的库吗?(库与框架设计能力与C++高级语法运用能力的结合)  补充:  ①、你能这么问,说明你知道编程能力对IT行业高薪工作的重要性是至关重要的。  ②、你的目的性已较强(知道要深入下去),但是你也想有更加明确的目标,我可以给你讲一下怎么自己去寻找目标和路线以及怎样学习。  ③、计算机专业领域一共有几个大方向,十几个分支方向,而每个分支方向又有几十个小方向,每一个方向的深入学习与熟练到一定火候都不是一朝一夕,互相之间也不是完全没联系的,但是你现在就应该选择一个大方向并在其中的一个小方向内深入(为什么要这么早就选择具体的分支方向?后面说)。  ④、这里列出计算机的几个大方向(非编程开发类的我就不说了):  基本方向:  1、单片机、嵌入式方向  2、网络编程:涉及到服务器程序、客户端开发、脚本设计等。  3、系统编程:基础API开发、桌面开发、系统程序开发、服务程序  4、图形学:3D、2D、图像识别、人脸识别  5、音频:语音识别、音频解码、音频软件  6、编译原理:编译器设计、脚本解释器、虚拟机、非自然语言翻译系统  7、应用层开发:利用高层语言去开发表层应用  8、安全:反工程、病毒、反病毒、木马、反木马、软件破解、软件加壳  附加方向:  8、人工智能:遗传算法、神经网络、灰色系统等等  9、游戏设计:各种游戏引擎设计以及业务逻辑设计等  ⑤、基本方向是你一定要选的,附加方向只是基于基本方向的一些锦上添花,但是不管你怎么选,最开始某些东西一定要深入而不是只是懂就够(当然你对自己要求似乎不会很低),我把这个列出来:  数据结构:下面其他理论的基础。  操作系统原理:理解操作系统的架构和细节,你才能对以后关于多线程、文件管理、内存管理、指令优先级等有一个正确理解和运用。  编译原理:能够升华你对计算机编程语言的理解,对以后出现的各种编译、解释、兼容、移植、优化、并发与并行算法等有一个深入理解。  数据库系统原理:这个是进入公司都要会的,也是大型软件开发的基础。  软件工程:这个是你能够在经验不足还能保证大项目正常完成的理论基础。  网络技术:这个是必须学的,因为目前几乎没有一款装几率很高的软件或者平台跟网络无关。  数学的话,主要是:离散数学、线性代数、高等数学、计算机图形学、概率论  以上几个基础就是你成为一个融汇各个主要分支牛人必须学的(当然不是指理论,而是理论+实践编码能力)  ⑥以上都是大的基础,要一一攻破并深入学习,虽然网络时代计算机专业知识爆炸式的增长,但是以上几个基础掌握后,会发现,以后的什么新的理论和技术都是基于这些大基础,你就很容易理解了。  ⑦我为什么开头不讲你要具体学什么怎么顺序学呢?因为那些技术你要掌握的话,根本可以自己解决,但是如果你由于兴趣,沉迷于一些自己可见的小范围技术的话,那么毕业后虽然也能找到不错的工作,薪水也可能高,但是不能成为一个大牛。  现在才开始讲学习顺序,虽然你说不要推荐书,不过我还是要用书来做顺序。  C语言是可以写很多核心和高级的东西,而不只是小东西,但是从你代码来看,居然用到了goto,我不是说你那些程序用到GOTO有什么不好,而是一定要避免用GOTO,goto是错误之源,如果你有什么内容非要用到goto才能写到,说明你的编码技巧还有不少提高空间。  你的学习顺序应该是:  C:做一个超级马里奥出来,并能够读取文本脚本来更新关卡。  C++:写一个2D图形引擎,封装掉细节,实现面向对象设计和可复用设计,并且用到《设计模式》中提到的一些设计模式,这样才能算对C++有一个很好的掌握。  MFC:MFC技术虽然近期已经冷下来了,但是你能熟练掌握它,才能证明你的C++OO技术够纯熟,严格证明你掌握了MFC很简单,你只要用MFC做出一个杀毒引擎就差不多了。推荐的书有《深入浅出MFC》。  《Windows程序设计》:和MFC不同的是,用的是windows核心SDK,也就是API,这本书学完后,你才能从操作系统层面上算掌握了win32平台下的机理(其实win64和win32大部分机理类似)。  C#:C#里集合了当代和前沿计算机科学里最先进的一些语法(虽然执行效率一直被人质疑),但是你学完C#并深入后,至少能够算是对计算机语言有一个更加深刻的理解了。如何证明你C#学的不错了?也很简单,再次写一个随便什么游戏,比如俄罗斯方块。如果更加证明自己呢?用它写一个P2P网络对战游戏。  (如果你注意的话,会发现我说的学习顺序都是沿着语言和某些技术的,为什么呢?因为这些语言和技术涉及到特定的领域技术和计算机理论思想,比如【真正】学完了C#的话,就不单指学完了C#,而是把多种语言范式都学习了一遍,以及现代的程序开发思维(因为里面用到了很多让你一劳永逸的技术))  以上5个步骤都是基础大步骤,要解决的话要没1-2年应该不够。  与此同时,要尽快选出文中你感兴趣的方向作为3-5年的长期方向,不要担心过早选择分支方向会有什么损失,因为计算机很多分支是相通的,只有你把分支方向深入进去,才能真正理解很多理论的实践意义。并且一旦你在某个分支领域形成了较强的优势(比如,到公司里只有你这方面最强),那么你就是稀缺人才。  关于大方向的步骤就不说了,你主要就是要把我说的这几个基础步骤先解决,同时平时要注重大方向理论结合实际去编码和开发。  如果只是看了一本经典的C++教材,基本上也就只能做一个基于控制台的的“图书管理系统或者类似而的东西”,而真正需要的东西往往总是与一些其它东西结合的。  比如如果要做一个Windows程序员,首先肯定要会开发Windows下的GUI程序,这就涉及了两个常用工具――MFC和.netframework。关于MFC有两本经典的书,候俊杰的《深入浅出MFC》和孙鑫的另外一本,如果要学习.netframework,那么不妨顺便学习一下C#,经典书籍无疑是《C#入门经典》。顺便说一下,有了C++的基础,C#的语言部分基本上两三天就能熟悉了。  Windows程序员如果要对操作系统更加的熟悉,肯定还要了解Win32API。无论是MFC还是VB、.netframework其本质都是对API的封装,在对API的了解过程中,可以更深刻的理解Windows的运行机制。这里推荐的无疑是《Windows核心编程》  如果需要开发Windows平台下比较底层的程序,比如RamDisk、杀毒软件、防火墙等,那么就又有两个必学的课题了。一个是Win32汇编,一个是基于C/C++的驱动程序编写。Win32汇编的书无疑就是罗云彬的《琢石成器》,而驱动程序的书实在是太少了,将WDM的书可能还有一两本算是经典,WDF就是开玩笑了。  如果要用C++开发Windows下的游戏,那么DirectX无疑是一个必学项目。  如果要用C++开发嵌入式系统,那么当然要看看单片机和ARM的书籍了(顺便说一下,单片机程序基本上都用汇编或者C语言来写)  如果是编写用于Linux的GUI程序,那么就有必要了解几个流行的GUI库。QT、GTK+、wxWidgets是其中最优秀的几个。顺便说一下,QT还是跨平台的,一次编写,然后就可以编译到Linux、Windows、Mac不同的系统中。关于QT的书这里推荐《C++GUIQt4编程》,官方教材。  如果是编写涉及网络的程序,比如说类似eMule这样涉及应用层协议的东西,那么首先学习一下网络的基本知识是很必要的,这里推荐的是《计算机网络:自顶向下方法》  最后再加一些比较根本的东西:算法。算法始终是软件的灵魂,经典教材有《算法导论》和《具体数学》等  C++的高级技巧。一般的C++通用教材不会涉及的,而在实践中又会遇到的某些很别扭的、比较难回答的问题。这类涉及C++高级技巧的书,最经典的无疑是《EffectiveC++》,另外关于C语言的《C陷阱和缺陷》、《C专家编程》也不错。


甘肃农村小潘潘


C++语言学透是不可能学透的,这辈子不可能学透的,C又不会用,就只有学学C++,维持上班不忘记这样子。

每天晚上我都要学习C++,就只有网上找找女朋友,我才会不去看看C++这样子,可我找不到,学C++时候感觉各个知识点都好难,比找女朋友难多了,学C++时候又只有我一个人学,他们都组团一起去学java了,一个人孤单学习也找不到女朋友一起玩。

去学java之后感觉各个都很有趣,写的又简单,还很容易实现,超喜欢java的。

刚毕业一两年时候,还能天真无知说着自己,熟悉C++,甚至说精通C++,而工作为五六年,却发现自己都还不配说自己精通。这辈子都感觉不会精通C++了,毕竟C++在你学习时候也在悄然迭代,就跟社会一样,你猛地追赶,最后才发现你永远慢人一步,学会了放下。

越难得到的东西越忘不了,好比越渣的人越令人牵肠挂肚,所以放弃吧,你永远不可能精通C++,能做的就是熟练跟上这个磨人小妖精的步伐。

最新C++资源用起来吧。这些资源关注我私聊发送:“C”就可以获得啦,记得关注私聊哦。

C/C++详细图解

资源

轻松掌握C语言视频教程(会打字就能学会) 对应1、2、3、4知识点。

C++基础完整视频 对应1、2、3、7知识点

C语言数据结构 培养架构师思维 对应4、5、6知识点

C++核心编程_打造你的核心编程技能 对应1-9知识点

QT界面开发 对应1、2知识点

MFC 对应3知识点

linux系统编程 对应上面所有。

服务器开发之linux网络编程 对应所有。

最后的实战项目网上一搜一大把


这些资源关注我私聊发送:“C”就可以获得啦,记得关注私聊哦。


黑马程序员


很有意思的问题,作为一个主要使用C++做开发超过十年的老码农,来聊聊我个人的一点看法。


这么说吧,C++是一门极度复杂的语言,而且随着新标准的提出,这种复杂性还在不断的增加中,所以说什么程度算是精通C++语言,其实是一个无法给出明确答案的问题。比如就我来说,使用了十多年的C++,可以轻松的使用C++设计一个方案并实现,比如用它实现过图像处理SDK,也用它做过IDE开发,即使如此,我也不敢说自己已经精通C++。原因很简单,你对这门语言的理解越深,也就越能发现诸多的不足,既包括自己的不足,也包括语言本身的缺陷与不足。举个简单的例子,我最开始学习的标准是C++98,可是后来又出现了C++03、C++11、C++14,甚至还有C++17,对于这些新标准出提出的内容,说实话,有些听过,有些甚至都没有听说过,更别说在实际应用中使用了,以此来说很难算是精通C++了。


不过话又说回来,有很多使用了多年C++的程序员,有着和我类似的情况,他们可以轻松的使用C++开发一个应用程序,但是C++中依然有他们未曾触碰的领域。所以我认为C++语言变得越来越复杂,想要完全掌握除了编译器和C++语言专家,其他人是可望而不可及了,要不然就连Linux之父——Linus Torvalds也会炮轰C++,说它是一门糟糕(horrible)的语言。


综上,我认为想要给出一个明确的精通C++语言的标准,是一件费力不讨好的事情,学习任何语言都是为了解决实际问题,所以只要你能够使用C++语言开发出好的应用,你就是一个合格的C++程序员。下面是几条熟练使用C++的需要掌握的技能:

1、最基本的要求自然是熟练掌握C++的基本语言,包括常用的和不常用的;

2、因为C++是一种面向对象的语言,所以要掌握面向对象程序(OOP)设计思想;

3、能够使用C++描述常用的数据结构,并实现在这些数据结构上的各种操作;

4、理解C++对象模型,比如对象指针、虚函数表等内容,以及类的构造过程,以及在此过程中编译器会在背后做那些事情等等;

5、能够使用C++做程序设计,这里除了基本的OOP思想外,最重要的是熟练应用设计模式;

最后,再对C++发一点牢骚,虽然我还在使用C++做开发(部分任务已经使用其它语言),但是我认为C++是一门尴尬的语言。谈效率吧,它不如C语言简单直接;谈面向对象设计吧,它又不如C#、Java等纯粹;谈开发效率吧,它又不如Python高效……太多的功能如模板、智能指针、多重继承等让这门语言变的越来越复杂,所以我是越来越不喜欢C++,并且建议程序员不要将C++作为首选开发语言。


分享到:


相關文章: