置顶/星标公众号????,硬核文章第一时间送达!
链接 | https://www.zhihu/question/400543720
至少需要哪些知识?需要掌握到什么程度呢?
https://www.zhihu/question/400543720/answer/1275849097
简单说,如果仅仅学C/C++本身的话,学到什么程度你都找不到工作。
学习掌握某种编程语言的语法只是一个基础,一个起点。因为语言只是一种工具,学会语法特性仅仅是知道这种工具长什么样子、能拧能钻能铣能刨,如此而已。
想要找到工作,你需要能够使用这件工具创造价值——你不能仅仅知道钢锉能挫铁,还要学会看图纸、会在给你的料子上合理规划、挫出符合图纸要求的合格元件来。
简单说,如果分若干级别的话,可能如下:
1、了解C++的常规语法,知道函数调用、类、虚函数、多态等的功能/原理;可以独立完成课后习题。
达到这个水平已经可以胜任很多职位了;但需要在工作中继续成长。幸好愿意招应届生的公司对新人的要求都不高,你有时间慢慢成长。
但要注意,这里的要求是“独立完成课后习题”,靠老师教、抄别人答案是不管用的。甚至抄完了死记硬背下来也是白搭。必须自己通过独立思考解决问题。面试者有的是办法试探出你有没有自己解决问题的能力。
如果课后题被“剧透”的太厉害的话,网上刷题也是条路子。还是那句话,别一味抄别人的代码,你起码要能独立解决其中一小半的问题,这才能证明你的确知道这件工具的用法。
2、能够活用自己掌握的C++知识,独立实现一些小型项目
比如,写个沙雕小游戏逗女朋友开心,写个排课程序帮老师解忧,甚至写个简单的课程提醒程序提示你每天带哪些书,等等。真正把“实践任务”和“C++编程连起来”——现在很多公司其实干的就这活,没什么技术含量。
3、借助别人封装好的API/库,实现看起来更强更厉害的功能
比如,借助算法库里的MD5算法和OS提供的目录遍历API,把系统所有要害文件(应用程序、DLL、注册表等)的大小、修改时间、数字摘要都算出来、储存到一个文件里。以后每隔几天遍历一次,检查它们的大小、修改时间,如果有变化就计算数字摘要——也可以强制计算所有的数字摘要——从而找出哪些要害文件被修改了、这些修改是系统自己打的补丁呢,还是不法程序(病毒木马流氓软件等)的非法修改。
这就是一个极为简陋、但效果还行的反病毒工具。它的缺点是,这是个白名单工具,只能检查到通过修改要害文件获得执行权的病毒/木马,同时会对系统更新产生误报。但仍然不失为一个效果不错的系统问题排查工具——因为OS要害文件经常是好些年不变的(现在你知道为何有时候有的杀毒软件会杀系统文件甚至杀自己了吧?)。
再比如,利用现成的深度学习库/语音识别库搞一些貌似高大上实则没什么技术含量的人脸识别/语音识别/声线识别程序——别紧张,你能行。
能折腾这些,你到公司基本上就可以算是个“能人”,可以跟风做一些听起来很帅但其实仍然没什么技术含量的工作了。
4、真正理解算法与数据结构,理解操作系统原理、计算机原理、数字电路原理以及编译原理、数据库原理、网络原理等等基础原理
到了这个程度,你才算没辜负“科班出身”这个头衔,脱离了“码农”“调库专家”“新技术层出不穷怎么都跟不上学不完”的半外行状态,可以从事一些较为硬核的、探索性的工作,帮公司开拓新应用领域了。
5、你仍然可以继续深入。比如图形图像压缩,比如加解密算法,比如网络协议栈等,每一个子领域都够很多专家投入一辈子的。不过这些领域经常返璞归真,C反倒会成为更常用的语言;而且往往需要高等数学作为发动机。
比如著名的卡马克牛顿迭代法求平方根的倒数算法,其中用的魔幻数字就引出了好几篇论文。专家们用卷积找出了一个魔幻数字,但是效果不如卡马克数字。再后来有人暴力穷举,这才找出一个优于卡马克魔幻数的新数字来。
再比如,现在的CNN神经网络,有次我提到要理解它你得懂卷积;于是跳出来几个自以为很懂的出来杠我“我敢打赌,你是听到这个东西的名字里有个卷积于是胡乱脑补。其实这东西和卷积没半毛钱关系”……
他们不知道,CNN里面的确没有卷积符号、也没有使用卷积计算公式;但它的实现思路就是卷积运算。只不过它的设计者把卷积算法化用进简单的连续矩阵计算中,在深度神经网络中实现了“特征抽象和特征空间变换”——这是矩阵和卷积全都学到出神入化、用出来让普通人看不懂、但内行一看就知道还是新瓶装旧酒的结果。
其实前面提到的数据结构与算法等基础知识,会玩的同样能玩到返璞归真。比如有人随随便便三两行代码就把一个数组变成了环形缓冲区,或者简简单单两行声明就搞定了一个递归算法。如果你积累不够深厚、头脑不够灵活,这个东西就很难看懂。
总之,这个领域是属于创造者的。能踏入这个领域,那就不是你找工作,而是工作找你了。
综上,如果仅仅是学C++这门语言的话,学到什么程度你都不好找工作。
你需要学的,是用C++这门语言去解决问题。能解决课后练习题是一个水平,能刷网上的算法题又是一个水平;能自己搞定简单的实用项目是一个水平,能充分利用操作系统以及第三方软件/库给你提供的抽象(意味着你能理解他们的设计思路)实现几乎所有东西又是一个水平;理解各种东西背后的原理是一个水平,把这些原理玩的出神入化又是一个水平;学会用数字认识这个世界是一个水平,能够化用高深的数学知识、信手解决没人说得清的难题又是一个水平……
一般来说,只要你能达到“用C++解决简单问题”的水平,找工作就不成问题了;只是受限较多,只能从事一些较为初级的工作,极易陷入没日没夜机械的写代码的窘境,然后看着层出不穷的新技术欲哭无泪。
你往前赶的越多,你代码里的智慧和灵气就越多;此时你才可以尝试那些必须用巧力的工作,或者用巧力把繁重的工作变得简单、甚至促进你所在公司乃至全人类的开发效率。玩到这个程度,你才算真正踏入程序员的行列。
https://www.zhihu/question/400543720/answer/1723466994
应届毕业加入腾讯做游戏开发,用的就是windows C++!
先说下我应届加入腾讯的经历,供大家参考:
大三就制定了加入腾讯游戏的目标,同时锁定在图形图像开发,这意味着要好好学习C++。
因为大学前两年全荒废了,所以大三是冲击的一年。
要学好C++,先了解C语言,当年这是师兄告诉我的,今天回头看非常对!
谭浩强的《C语言程序设计》反复看,然后一行行在电脑上敲出来。
当时对计算机缺乏系统认识,最难理解的就是指针,书上说它是个变量地址,那么问题来了,什么是地址?一不小心,指针就让程序Crash了。直到读研的时候,看了大学教材:《计算机组成原理》这本书,我才明白指针背后的含义。
攻克完C语言之后,听师兄师姐说数据结构也是自学编程需要攻克的重难点。从数组到链表再到堆栈、二叉树、平衡二叉树、红黑树、B+/B-树,简直就像看天书。还记得二叉树的先序,中序,后序遍历就把我弄晕乎了。更别提后面的AVL树的删除以及B-树。
我应付看不懂的方式也很粗暴:做笔记,勾选出没看懂的部分,反复看。一遍不行看两遍三遍四遍,直到所有内容看懂为止,看懂后就上机,上到天昏地暗上到头晕脑胀。数据结构这本书,记得来来回回看了10多遍,上机100小时以上。
这之后开始系统的学习网络、C++、VC,还记得有一本非常厚的书:《C++ Primer》,可以说上面的每一个例子,都上机造过轮子。
随后开始啃《Effective C++》、《More Effective C++》、《C++程序设计原理》、《深度探索C++对象模型》、《STL源码剖析》、《计算机网络系统方法》、《TCP/IP详解》。
除了疯狂自学,毕业的压力也很重,但掌握的东西越多,你对未来就越笃定。
疯狂学习的过程是枯燥且伴随痛苦的,编译报各种不通过的时候让人无比抓狂,知识点学不会的时候会让你怀疑自己的智商。
曾经看过的一部分书籍:
成长的过程,润物细无声,极难察觉。但那段枯燥痛苦的学习和刷题岁月让我未来的道路受益匪浅。毕业后,我也如愿拿到腾讯游戏年薪近15万(多年前)的Offer,开启了职场生涯。
毕业后,担任过360技术委员会成员,在C++这条路上走得更远了,再给大家一些系统的建议:
一、C/C++入门阶段
这个阶段全力以赴的话,5个月时间差不多可以掌握。
刚入门的时候我们主要是学习培养编程思维和动手能力,深刻理解面向过程和面向对象的思想方法,这对以后的程序员之路非常重要!
所以学习语言更为重要:
面向对象编程思想;类的封装,构造和析构、静态成员、对象管理;类的构造(有参构造函数、无参构造、拷贝构造、默认构造函数)和析构;对象动态管理、友元函数、友元类、操作符重载;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等一些开发工具的常用设置和一些常见快捷键的使用。
这个阶段推荐以下两本书:
《Essential C++》 这是一本内容不多但很实用的C++入门书籍,强调快速上手与理解C++编程。本书主要围绕一系列逐渐复杂的程序问题,以及用以解决这些问题的语言特性展开讲解。你不只学到C++的函数和结构,也会学习到它们的设计目的和基本原理。
《C++ Primer》 本书对C++基本概念、技术、以及现代C++编程风格进行了全面而且权威的阐述,是C++初学者的最佳指南;本书可以帮助你编写实用的程序,而无需首先精通每个语言细节。对于中高级程序员,本书也是不可或缺的参考书。
二、C/C++开发进阶
这个阶段非常刻苦的话,需要半年以上时间。
在第二阶段学习的时候,就是比较重要的了,C++开发的进阶之路,更是一个让自己找份薪水比较体面的工作的筹码。
C++进阶之STL:
STL = Standard Template Library,即标准模板库。这是提高开发效率的极品工具。通过学习此阶段,应掌握泛型编程技巧,理解容器类在C++语言中的应用模式,以及熟练掌握全部STL类的使用方法。
C++进阶之设计模式:
决定一个项目成败最重要的因素是项目总体的设计,通过本阶段的学习,可掌握面向对象编程中重要的一环,是编码前建模的技巧所在。单例模式;工厂模式;代理模式;迭代模式等,这些都是你要掌握的哦。
C++进阶之数据结构基础:
这是所有编程语言中最应该学习的部分,程序组成的基础之一。顺序存储、链式存储、循环链表;
双向链表、栈(顺序和链式)、队列(顺序和链式);
栈的应用、树基本概念及遍历、二叉树;
排序算法、并归算法、选择、插入、快速、希尔。
这个阶段推荐以下几本书:
《Effective C++》和《More effective C++》 作者是Scott Meyers。你应该熟读它们,并清楚地理解每个项目。该书围绕55条准则,每一条都介绍了一个可让你写出更好的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++高手之路,任重道远!
C++进阶之QT开发:
掌握QT类库构架,图形界面开发模型;掌握QT开发技巧,消息机制,图形处理;掌握QT网络编程,UDP,TCP使用方式;掌握QT文件处理方式,序列化;掌握QT在windows,linux,ios,android不同平台下的移植技术
C++进阶之Windows/Linux网络服务器:
掌握Unix/Linux平台开发方式;熟练使用系统调用;熟练Unix/Linux内存管理,进程,线程调度;掌握MFC界面开发,网络编程;熟悉网络服务器开发方式,熟练编写TCP,UCP网络服务程序;掌握同步/异步IO模型在网络编程中的使用方式。
C++进阶之数据库开发:
掌握SQL语言的实用技巧。Oracle,MySQL数据库的使用方式。
如果你能熟练掌握以上列出的技能,具备解决复杂问题和技术难点的能力,而且你能独立开发一些比较复杂的功能模块,这个时候月薪过万都是小意思了!
这就是所谓的程序员大牛了,当下炙手可热的全栈开发工程师,既晓前端,又通后台。快速定位问题,解决问题对他们来说已是小菜一碟,就是人们常说的神秘大牛,只在公司技术攻关的时候才会才看到他们的身影。
这个阶段,在C++领域,你已经飞跃愚昧之巅跨越绝望之谷,进入开悟之破了。推荐以下书籍:
《The C++ standard library(C++标准程序库)》 这是标准模板库字典,你可以在本书中找到STL相关的一切知识。本书焦点放在标准模板库、检查容器、迭代器、函数对象和STL算法上。每一个元素都有深刻的呈现,包括其介绍、设计、运用实例、细节解说、陷阱、意想不到的危险,以及相关类别和函数等。
《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 类型的教程,比较通俗易懂和深入浅出。
推荐一下:
[中英字幕] C++_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili:https://www.bilibili/video/BV1Ay4y1i7Z6
另外翁凯老师无论是 C、C++、Java 的视频都讲得非常深入浅出,值得学习。
这是网易云课堂地址:
面向对象程序设计-C++ - 网易云课堂:https://study.163/course/introduction/271005.htm
作者:江东某人
https://www.zhihu/question/400543720/answer/1275079446
这个答案具体取决于方向,面试级别等等,但一个不争的事实是
C++是不可能精通的
想起了自己学习C++的血泪史/(ㄒoㄒ)/~~
学习了基本输入输出,条件语句,循环,函数,内心:这玩意也就比C多了函数重载、引用,还有个顶层const与底层const,分分钟搞定
学习了基本的OO部分,内心:emmm~~~,C++还是有两把刷子的,不过还行还行,开阔了思维
学习了闭包,泛型,STL,内心:好多要记的东西,好烦呀,感觉不行了
了解了模板元编程,多重继承,虚继承,多线程,Boost库,内心:
以后见人只敢说用过C++。。。。(C++还有Qt,opencv,opengl,甚至微软的等一堆东西
所以Life is short, you need Python
作者:匿名用户
https://www.zhihu/question/400543720/answer/1282930274
“C++学到什么程度可以面试工作?”是一个毫无意义的问题。
这个问题等价于“我锤子用到什么程度就能找到工作?”
锤子可以修汽车,可以盖楼房,可以做装修,但“锤子用到什么程度”这个语句毫无指向性。
锤子只是一个手段,而不是目的。
所以一个人的C++实力得结合具体的工作内容来谈。
目前市场上使用C++岗位不多,且要求都比其它岗位更高,所以题主如果有志于在C++相关的方向上发展,得做好在这个方向上长年累月去投入的准备。
C++有下面这些方向,下面我们一一介绍一下:
1. Web Backend
Web业务后台目前国内使用C++的公司不多,并且使用范围在逐渐缩小,业务后台开发需要的是快速的产品迭代和极高的开发效率,因此C++在web后台开发所使用的份额已经被JAVA和Go所吞噬的差不多了,强烈建议题主不要使用C++走这个Track,如果一定要走,那么要把OS, Networks等科班课程学精,熟读《Linux系统编程手册》《TCP/IP详解123》。这个方向对于C++本身的语法要求并不高,把C++ OOP和STL部分掌握熟练就行,Lambda以及Template了解即可。
2. HPC(High Performance Computing)/AI Infrastructure/ML System
HPC这个方向比较学术性,只会在BATTMD等大公司存在,小公司没有,因此就业比较窄,就业人数也很少,竞争不那么激烈。目前HPC开发更多的是作为AI Infrastructure的一环存在,着重解决的是DL的算力问题。若从事相关工作,需要学习的东西非常非常多,个人认为这个Track是整个CS工作中最累也最难的,需要学习的东西横跨软件,硬件,算法三个维度。首先得学习Computer Architecture等硬件课程,然后得阅读Tensorflow/Pytorch等某个深度学习框架的C++源码,详细了解主流神经网络的结构,最后还得熟悉CUDA编程,TVM/XLA以及编译原理等相关内容。这个方向对于C++语法的要求也比较高,需要深入理解C++11/20, C++函数式编程以及C++ Template,而不只局限于C with Class以及STL。本人认为这个方向很难走,若不是科班毕业并且有几年的积累,不建议走这个方向。
3. Database开发
Database开发,Database的学术性比较高,并且就业岗位比上面两个更多,属于C++中就业压力相对较小的,BAT等大公司才有能力根据自己的业务定制Database,因此相关岗位集中在大公司。Database所需要的技能栈和1比较相似,但对于OS以及Computer Architecture知识的能力要求高于1,需要深入理解Disk架构,对于C++的语法能力要求也高于1。记住,只要和业务性能瓶颈处相关的开发岗,对于C++的语法要求都很高。
4. Networks
Networks这个方向我不是很了解,在此不做过多的描述,此方向的就业岗位主要集中于思科,华为,中兴,诺基亚等公司,岗位较多,和3差不多。Computer Networks的相关的知识是核心,需要精读《TCP/IP详解》。
5. OS/驱动/Compiler
这三个方向的就业岗位相当少,国内也只在微软,华为等少数几个公司存在,严格来说这些方向上对C的能力要求要更多一些,所以把C++中C的部分以及C++以外C的部分学好就行,对于CS的Compiler,OS,Architecture三大件要熟练掌握。
6. Multimedia(图形/视频/语音处理)
严格来说, Multimedia其实属于算法方向,C++只是实现算法的一种手段而不是目的,走这个方向需要对相关音视频图像的处理算法有很透彻的理解,图像的话熟读《Digital Image Processing》,熟练使用FFmpeg/OpenCV等相关工具。这个方向对于C++的语法能力要求不高,把C with class搞明白就OK了。
7. 游戏引擎开发/游戏前后台开发
其实游戏引擎开发严格来说也是一个算法方向,从事这个方向数学要好,尤其是线性代数,熟读《Computer Graphics》,C++主要用来实现相关的图形学算法。游戏前后台开发答主没有经历过,不便做过多的描述,但我可以告知的是此方向就业岗位较多,并且很长一段时间内会非常稳定,题主若有兴趣,可自行搜索相关资料。
以上7个相关的岗位就是目前市场上使用C++最多的7个岗位,当然还有嵌入式,Windows软件开发等稍冷门的方向。题主若想从事C++相关的工作,绝非把C++的语法搞明白这么简单,而需要从技术上深刻理解C++上下游的环境依赖,也要结合具体业务在技术上有所思考。
往期推荐
☞ 专辑 | 趣味设计模式
☞ 专辑 | 音视频开发
☞ 专辑 | C++ 进阶
☞ 专辑 | 超硬核 Qt
☞ 专辑 | 玩转 Linux
☞ 专辑 | GitHub 开源推荐
☞ 专辑 | 程序人生
关注公众号「高效程序员」????,一起优秀!
回复“1024”,送你一份程序员大礼包。
更多推荐
C++ 学到什么程度可以找工作?
发布评论