C++学到什么程度可以面试工作?
大家好,我是唐唐!
昨天水知乎回答的时候,看到了这个问题:
这个问题很多读者也问过我,“invalid s”回答的这个问题,看完后很认同。分享给大家。
简单说,如果仅仅学 C/C++ 本身的话,学到什么程度你都找不到工作。
学习掌握某种编程语言的语法只是一个基础,一个起点。因为语言只是一种工具,学会语法特性仅仅是知道这种工具长什么样子、能拧能钻能铣能刨,如此而已。
想要找到工作,你需要能够使用这件工具创造价值——你不能仅仅知道钢锉能挫铁,还要学会看图纸、会在给你的料子上合理规划、挫出符合图纸要求的合格元件来。
链接:https://www.zhihu.com/question/400543720/answer/1275849097
简单说,如果分若干级别的话,可能如下:
1、了解 C++ 的常规语法,知道函数调用、类、虚函数、多态等的功能/原理;可以独立完成课后习题。
达到这个水平已经可以胜任很多职位了;但需要在工作中继续成长。幸好愿意招应届生的公司对新人的要求都不高,你有时间慢慢成长。
但要注意,这里的要求是“独立完成课后习题”,靠老师教、抄别人答案是不管用的。甚至抄完了死记硬背下来也是白搭。必须自己通过独立思考解决问题。面试者有的是办法试探出你有没有自己解决问题的能力。
如果课后题被“剧透”的太厉害的话,网上刷题也是条路子。还是那句话,别一味抄别人的代码,你起码要能独立解决其中一小半的问题,这才能证明你的确知道这件工具的用法。
2、能够活用自己掌握的 C++ 知识,独立实现一些小型项目
比如,写个沙雕小游戏逗女朋友开心,写个排课程序帮老师解忧,甚至写个简单的课程提醒程序提示你每天带哪些书,等等。真正把“实践任务”和“C++编程连起来”——现在很多公司其实干的就这活,没什么技术含量。
3、借助别人封装好的 API/库,实现看起来更强更厉害的功能
比如,借助算法库里的 MD5 算法和 OS 提供的目录遍历API,把系统所有要害文件(应用程序、DLL、注册表等)的大小、修改时间、数字摘要都算出来、储存到一个文件里。以后每隔几天遍历一次,检查它们的大小、修改时间,如果有变化就计算数字摘要——也可以强制计算所有的数字摘要——从而找出哪些要害文件被修改了、这些修改是系统自己打的补丁呢,还是不法程序(病毒木马流氓软件等)的非法修改。
这就是一个极为简陋、但效果还行的反病毒工具。它的缺点是,这是个白名单工具,只能检查到通过修改要害文件获得执行权的病毒/木马,同时会对系统更新产生误报。但仍然不失为一个效果不错的系统问题排查工具——因为 OS 要害文件经常是好些年不变的(现在你知道为何有时候有的杀毒软件会杀系统文件甚至杀自己了吧?)。
再比如,利用现成的深度学习库/语音识别库搞一些貌似高大上实则没什么技术含量的人脸识别/语音识别/声线识别程序——别紧张,你能行。
能折腾这些,你到公司基本上就可以算是个“能人”,可以跟风做一些听起来很帅但其实仍然没什么技术含量的工作了。
4、真正理解算法与数据结构,理解操作系统原理、计算机原理、数字电路原理以及编译原理、数据库原理、网络原理等等基础原理。
到了这个程度,你才算没辜负“科班出身”这个头衔,脱离了“码农”“调库专家”“新技术层出不穷怎么都跟不上学不完”的半外行状态,可以从事一些较为硬核的、探索性的工作,帮公司开拓新应用领域了。
5、你仍然可以继续深入。
比如图形图像压缩,比如加解密算法,比如网络协议栈等,每一个子领域都够很多专家投入一辈子的。不过这些领域经常返璞归真,C 反倒会成为更常用的语言;而且往往需要高等数学作为发动机。
比如著名的卡马克牛顿迭代法求平方根的倒数算法,其中用的魔幻数字就引出了好几篇论文。专家们用卷积找出了一个魔幻数字,但是效果不如卡马克数字。再后来有人暴力穷举,这才找出一个优于卡马克魔幻数的新数字来。
再比如,现在的 CNN 神经网络,有次我提到要理解它你得懂卷积;于是跳出来几个自以为很懂的出来杠我“我敢打赌,你是听到这个东西的名字里有个卷积于是胡乱脑补。其实这东西和卷积没半毛钱关系”……
他们不知道,CNN 里面的确没有卷积符号、也没有使用卷积计算公式;但它的实现思路就是卷积运算。只不过它的设计者把卷积算法化用进简单的连续矩阵计算中,在深度神经网络中实现了“特征抽象和特征空间变换”——这是矩阵和卷积全都学到出神入化、用出来让普通人看不懂、但内行一看就知道还是新瓶装旧酒的结果。
其实前面提到的数据结构与算法等基础知识,会玩的同样能玩到返璞归真。比如有人随随便便三两行代码就把一个数组变成了环形缓冲区,或者简简单单两行声明就搞定了一个递归算法。如果你积累不够深厚、头脑不够灵活,这个东西就很难看懂。
总之,这个领域是属于创造者的。能踏入这个领域,那就不是你找工作,而是工作找你了。
综上,如果仅仅是学 C++ 这门语言的话,学到什么程度你都不好找工作。
你需要学的,是用 C++ 这门语言去解决问题。能解决课后练习题是一个水平,能刷网上的算法题又是一个水平;能自己搞定简单的实用项目是一个水平,能充分利用操作系统以及第三方软件/库给你提供的抽象(意味着你能理解他们的设计思路)实现几乎所有东西又是一个水平;理解各种东西背后的原理是一个水平,把这些原理玩的出神入化又是一个水平;学会用数字认识这个世界是一个水平,能够化用高深的数学知识、信手解决没人说得清的难题又是一个水平……
一般来说,只要你能达到“用 C++ 解决简单问题”的水平,找工作就不成问题了;只是受限较多,只能从事一些较为初级的工作,极易陷入没日没夜机械的写代码的窘境,然后看着层出不穷的新技术欲哭无泪。
你往前赶的越多,你代码里的智慧和灵气就越多;此时你才可以尝试那些必须用巧力的工作,或者用巧力把繁重的工作变得简单、甚至促进你所在公司乃至全人类的开发效率。玩到这个程度,你才算真正踏入程序员的行列。