C++ 学到什么程度可以找工作?
共 9797字,需浏览 20分钟
·
2021-07-27 14:24
置顶/星标公众号👇,硬核文章第一时间送达!
链接 | https://www.zhihu.com/question/400543720
至少需要哪些知识?需要掌握到什么程度呢?
学习掌握某种编程语言的语法只是一个基础,一个起点。因为语言只是一种工具,学会语法特性仅仅是知道这种工具长什么样子、能拧能钻能铣能刨,如此而已。
想要找到工作,你需要能够使用这件工具创造价值——你不能仅仅知道钢锉能挫铁,还要学会看图纸、会在给你的料子上合理规划、挫出符合图纸要求的合格元件来。
简单说,如果分若干级别的话,可能如下:
1、了解C++的常规语法,知道函数调用、类、虚函数、多态等的功能/原理;可以独立完成课后习题。
2、能够活用自己掌握的C++知识,独立实现一些小型项目
3、借助别人封装好的API/库,实现看起来更强更厉害的功能
这就是一个极为简陋、但效果还行的反病毒工具。它的缺点是,这是个白名单工具,只能检查到通过修改要害文件获得执行权的病毒/木马,同时会对系统更新产生误报。但仍然不失为一个效果不错的系统问题排查工具——因为OS要害文件经常是好些年不变的(现在你知道为何有时候有的杀毒软件会杀系统文件甚至杀自己了吧?)。
再比如,利用现成的深度学习库/语音识别库搞一些貌似高大上实则没什么技术含量的人脸识别/语音识别/声线识别程序——别紧张,你能行。
能折腾这些,你到公司基本上就可以算是个“能人”,可以跟风做一些听起来很帅但其实仍然没什么技术含量的工作了。
4、真正理解算法与数据结构,理解操作系统原理、计算机原理、数字电路原理以及编译原理、数据库原理、网络原理等等基础原理
5、你仍然可以继续深入。比如图形图像压缩,比如加解密算法,比如网络协议栈等,每一个子领域都够很多专家投入一辈子的。不过这些领域经常返璞归真,C反倒会成为更常用的语言;而且往往需要高等数学作为发动机。
再比如,现在的CNN神经网络,有次我提到要理解它你得懂卷积;于是跳出来几个自以为很懂的出来杠我“我敢打赌,你是听到这个东西的名字里有个卷积于是胡乱脑补。其实这东西和卷积没半毛钱关系”……
他们不知道,CNN里面的确没有卷积符号、也没有使用卷积计算公式;但它的实现思路就是卷积运算。只不过它的设计者把卷积算法化用进简单的连续矩阵计算中,在深度神经网络中实现了“特征抽象和特征空间变换”——这是矩阵和卷积全都学到出神入化、用出来让普通人看不懂、但内行一看就知道还是新瓶装旧酒的结果。
其实前面提到的数据结构与算法等基础知识,会玩的同样能玩到返璞归真。比如有人随随便便三两行代码就把一个数组变成了环形缓冲区,或者简简单单两行声明就搞定了一个递归算法。如果你积累不够深厚、头脑不够灵活,这个东西就很难看懂。
总之,这个领域是属于创造者的。能踏入这个领域,那就不是你找工作,而是工作找你了。
你需要学的,是用C++这门语言去解决问题。能解决课后练习题是一个水平,能刷网上的算法题又是一个水平;能自己搞定简单的实用项目是一个水平,能充分利用操作系统以及第三方软件/库给你提供的抽象(意味着你能理解他们的设计思路)实现几乎所有东西又是一个水平;理解各种东西背后的原理是一个水平,把这些原理玩的出神入化又是一个水平;学会用数字认识这个世界是一个水平,能够化用高深的数学知识、信手解决没人说得清的难题又是一个水平……
一般来说,只要你能达到“用C++解决简单问题”的水平,找工作就不成问题了;只是受限较多,只能从事一些较为初级的工作,极易陷入没日没夜机械的写代码的窘境,然后看着层出不穷的新技术欲哭无泪。
你往前赶的越多,你代码里的智慧和灵气就越多;此时你才可以尝试那些必须用巧力的工作,或者用巧力把繁重的工作变得简单、甚至促进你所在公司乃至全人类的开发效率。玩到这个程度,你才算真正踏入程序员的行列。
谭浩强的《C语言程序设计》反复看,然后一行行在电脑上敲出来。
攻克完C语言之后,听师兄师姐说数据结构也是自学编程需要攻克的重难点。从数组到链表再到堆栈、二叉树、平衡二叉树、红黑树、B+/B-树,简直就像看天书。还记得二叉树的先序,中序,后序遍历就把我弄晕乎了。更别提后面的AVL树的删除以及B-树。
我应付看不懂的方式也很粗暴:做笔记,勾选出没看懂的部分,反复看。一遍不行看两遍三遍四遍,直到所有内容看懂为止,看懂后就上机,上到天昏地暗上到头晕脑胀。数据结构这本书,记得来来回回看了10多遍,上机100小时以上。
这之后开始系统的学习网络、C++、VC,还记得有一本非常厚的书:《C++ Primer》,可以说上面的每一个例子,都上机造过轮子。
随后开始啃《Effective C++》、《More Effective C++》、《C++程序设计原理》、《深度探索C++对象模型》、《STL源码剖析》、《计算机网络系统方法》、《TCP/IP详解》。
除了疯狂自学,毕业的压力也很重,但掌握的东西越多,你对未来就越笃定。
疯狂学习的过程是枯燥且伴随痛苦的,编译报各种不通过的时候让人无比抓狂,知识点学不会的时候会让你怀疑自己的智商。
曾经看过的一部分书籍:
毕业后,担任过360技术委员会成员,在C++这条路上走得更远了,再给大家一些系统的建议:
一、C/C++入门阶段
面向对象编程思想;类的封装,构造和析构、静态成员、对象管理;类的构造(有参构造函数、无参构造、拷贝构造、默认构造函数)和析构;对象动态管理、友元函数、友元类、操作符重载;C++编译器对象管理模型分析;类对象的动态管理(new/delete);友元函数和友元类;运算符重载(一元运算符、二元运算符、运算符重载难点、项目开发中的运算符重载);类的继承、多继承及其二义性、虚继承;多态(概念、意义、原理剖析、多态案例);虚函数、纯虚函数、抽象类(面向抽象类编程思想案例);函数模板、类模板,模板的继承。
C++类型转换;C++输入输出流(标准I/O 文件I/O 字符流I/O);C++异常处理(异常机制、异常类型、异常变量、异常层次结构、标准异常库);利用一些IDE开发工具:诸如Windows平台VC系列:VC++6.0(比较古老) ;Visual Studio2013, Visual Studio2015,Visual Studio2017,Visual Studio2019;Mac平台的XCode系列,还有CodeBlock,另附一些高级编辑器Notepad++, EditPlus,UE等一些开发工具的常用设置和一些常见快捷键的使用。
这个阶段推荐以下两本书:
《C++ Primer》 本书对C++基本概念、技术、以及现代C++编程风格进行了全面而且权威的阐述,是C++初学者的最佳指南;本书可以帮助你编写实用的程序,而无需首先精通每个语言细节。对于中高级程序员,本书也是不可或缺的参考书。
二、C/C++开发进阶
C++进阶之STL:
C++进阶之设计模式:
C++进阶之数据结构基础:
这个阶段推荐以下几本书:
《Exceptional C++(C++编程剖析)》和《More exceptional C++》 这两本书中都包含了40个C++编程问题,这些问题会让你磨练自己的技能,最终成为优秀的C++程序员。这些问题是Herb Sutter精心挑选,与ISO/ANSI C++官方标准相一致,帮助程序员在设计、架构和编码过程中保持良好的风格,从而使编写的C++软件更健壮、更高效。
《Inside the C++ object model(深度探索C++对象模型)》 本书专注于C++面向对象程序设计的底层机制,包括结构式语意、临时性对象的生成、封装、继承,以及虚拟——虚拟函数和虚拟继承,帮助你理解程序的底层实现,以便写出更高效的代码。
《The design and evolution of C++(C++语言的设计与演化)》 本书作者也是C++语言的设计者Bjarne Stroustrup,作者在书中综合性地介绍了C++的发展历史,C++中各种重要机制的本质意义和设计背景,这些机制的基本用途和使用方法,讨论了C++所适合的应用领域及其未来的发展前景,既没有忽略关键性的详情,又没有过多地陷入技术细节。
三、C++开发高级
C++进阶之QT开发:
C++进阶之Windows/Linux网络服务器:
C++进阶之数据库开发:
这个阶段,在C++领域,你已经飞跃愚昧之巅跨越绝望之谷,进入开悟之破了。推荐以下书籍:
《Effective STL》 这是Scott Meyers的第三本C++专著,也是学习STL最权威的书籍。作者对书中的50个指导方针都作了详尽的分析,并配以示例。通过这些规则,C++开发者可以最大限度地使用STL。
《Generic programming and the STL(泛型编程与STL)》 本书阐述了泛型程序设计的核心理念:concepts(概念)、modeling(模型)和refinement(改善),并为你展示这些观念如何导出STL的基础概念:iterators(迭代器)、containers(容器)和function objects(函数对象)。按照本书所述,你可以把STL想象成一个由concepts组成的library,你将学习到STL正式结构并理解其强大的优势。
《Exceptional C++ style》 作者为Herb Sutter。本书同样提出了40个C++风格相关的问题,对一些至关重要的C++细节和相互关系提出了新的见解,为当今的关键C++编程技术(如泛型编程、STL、异常安全等)提供了新的策略,帮助开发者在开销与功能之间、优雅与可维护性之间、灵活性与过分灵活之间寻找完美的平衡点。
《C++ template》 这是一本关于C++模板的完整的参考手册和教程,它强调模板的使用实践,包含了现实世界中的例子。每个C++程序员都应该好好读一读这本书。
《Modern C++ design(现代C++设计)》 作者Andrei Alexandrescu为C++程序员打开了一个新的局面。本书提供了一些针对软件设计的前沿方法,如联合设计模式、泛型编程,使程序员可以编写有表现力的、灵活的、高度可重用的代码。
《Thinking in C++(C++编程思想)》 C++ 领域权威著作,介绍了C++实用的编程技术和最佳的实践方法。
以上是用一年时间应对面试学习C++的建议。
还有一个我最近发现的一个非常赞的视频,是一个国外 C++ 游戏引擎开发工程师录制的一套偏向 talk 类型的教程,比较通俗易懂和深入浅出。
这是网易云课堂地址:
https://www.zhihu.com/question/400543720/answer/1275079446
C++是不可能精通的
想起了自己学习C++的血泪史/(ㄒoㄒ)/~~
学习了基本输入输出,条件语句,循环,函数,内心:这玩意也就比C多了函数重载、引用,还有个顶层const与底层const,分分钟搞定 学习了基本的OO部分,内心:emmm~~~,C++还是有两把刷子的,不过还行还行,开阔了思维 学习了闭包,泛型,STL,内心:好多要记的东西,好烦呀,感觉不行了 了解了模板元编程,多重继承,虚继承,多线程,Boost库,内心:
以后见人只敢说用过C++。。。。(C++还有Qt,opencv,opengl,甚至微软的.net等一堆东西
https://www.zhihu.com/question/400543720/answer/1282930274
C++有下面这些方向,下面我们一一介绍一下:
2. HPC(High Performance Computing)/AI Infrastructure/ML System
3. Database开发
4. Networks
5. OS/驱动/Compiler
6. Multimedia(图形/视频/语音处理)
7. 游戏引擎开发/游戏前后台开发
以上7个相关的岗位就是目前市场上使用C++最多的7个岗位,当然还有嵌入式,Windows软件开发等稍冷门的方向。题主若想从事C++相关的工作,绝非把C++的语法搞明白这么简单,而需要从技术上深刻理解C++上下游的环境依赖,也要结合具体业务在技术上有所思考。
关注公众号「高效程序员」👇,一起优秀!