指针,多态(虚函数表、内存layout),作用域,内存的管理
算法与数据结构,数据结构上由掌握哈希、优先级队列,算法上有字符串处理,简单的DFS、BFS、动态规划
系统的知识,进程、线程、协程、锁的使用,消息队列、共享内存、还有网络协议,epoll,select等。问题有,通过哈希来划分,通过队列来序列化操作。会结合你实际做过的项目来提问,写过web server,key-val数据库,度过redis源码,可以结合系统知识考察,确认是不是真的理解这些东西,是不是真的吸收了;
--------------------------
from zhihu chencw2ly
c++的知识,c++特性,多态,虚函数,vector和list实现的原理
多线程相关的,比如高并发,通信,然后还有和锁有关的东西;
数据库方面主要有,常用的sql语句,怎么提高数据库的性能,mysql和oracle的特性。
网络通信方面:主要就是tcp/ip和http,tcp/ip的几次握手,简单的客户端服务端的实现,http主要是http协议中的东西,比如http的格式,重要的有get/post的区别
linux会问一些常用的命令,比如查看进程,产看网络,修改权限,gcc相关的东西,
答的不好的话,就会进行白板编程。
建议:应届生,多刷题目,笔试成绩好的话,就好办。
---------------------------------
OOP三大项目:封装、继承、多态,v func是怎么实现的,v table是啥?前面的pure storagexx多重继承虚函数指针在内存中是什么样子的?
把所有的const static 各种情况都熟悉一遍,const pointer和pointer to const以及两者合体的区别?static 放在不同的地方不是一回事。
内存泄露肯定是会被问的,rule of three是基础,exception safe是难点。解决方法很简单,在工业界smart pointer就完了,没有那么多花样,工业界基本看不到裸指针。别小看exception safe,很耗时间去学的。
然后就是stl,大多数自诩懂c++的人,基本都将不明白 allocator是怎么回事。
RAII是啥玩意?至少听过。
os操作系统还是要好好看的。os学校出来的人基本都会集中在两个知识点上,进程管理和文件系统;进程管理堆非infra的开发类很重要,infra类两者都很重要。基本上知道进程是什么玩意,什么事context switch,现实中你干什么会触发它且cost什么。virtual mem和physical mem分别是什么?
分布式;
后端的话,好好看看和REST。以及js的single page application的原理(很多应用需要这个原理去减少延迟),以及c++是如何实现的,你对node和engin x多少需要点基础了解的。
看看mvc
设计模式
明白进程,stack和heap,给一个简单的程序,你能够在内存中给我画出来从头到尾的经过。
concurrent programming一般不会考到,也是最需要实际经验成长的。简单的例子最好能写出来,race conditon有些很复杂你看不出但简单的要能够说明白。
明白cpu cache是怎么运作的,为什么很多数据结构或算法明明很耗却很慢。Locality,局部性原理
如果你很好的明白concurrent,那instructions pipeline要是能够将明白更好了。
敏捷开发你要明白是真么一回事,code review,测试流程多少要有个概念。
template平时没有用过太过野性的方法,都是中规中矩。metaprogramming多少要明白好处在哪里?这玩意玩好了很厉害,美国在火星上那小车里面几乎都是metaprogramming。
static linking, dynamic linking优缺点。
怎么避免环形依赖。
从compile到linking到最后每一阶段所做的事情。
同样,如何manage 大型的c++ code,怎么分成模块,合理的继承。最最重要的就是怎么分模块进行测试。
让你现场写程序记得能加const就加const,小程序全部inline,能穿ref就别copy。开头一定要有哨兵,就是#ifndef #define #endif
出手就是namespace,告诉别人你是干过活的。
去看google c++规范,c++是不同代码风格能写成截然不同的语言。
能用stl绝对不要自己写,tranform那些要会用。要会自己写comparator,尤其是传给set/map的。
一定要有进程的概念,比如如果只有一台机子,你自己弄个in mem cache肯定比redis块。
讲到smart pointer一定要提到一个思想,就是谁拥有这个指针。
大多数人看书只看第一章,所以用宏做计算的风险很可能会被考到,scott meyers effective c++第二章。
补充:
c++11不需要过度的在意,先看好继承,大多数工业界的人自己还在学习阶段,而且除了fancy的新项目,成熟的项目一般不会跟风追新。
但是smart pointer一定要看好,一般c++做出点样子的公司,内部都有自己的c++标准,很早就基本处于03和11之间的状态,主要就是smart pointer。
你能会自然就好,但是一般不会强求。和metaprogramming一样,面你的人在这方面可能还是停留在理论帝的水平,太多东西都是私下玩,很多东西工作中不一定总能碰到。
如果有时间,scott meyers的四本effectvie 绝对经典。
如果你能够上youtube,搜jon kalb在cppcon上的exception safe,讲的非常好,当年cppcon最佳talk。
最后心态:面试官一般不会指望应届生能够回答出所有的问题,但会倾尽所能地去问,这样虽然没几个人能全部回答上来,但是可以对这一批candiates得到一个很清晰都的层次,谁强谁弱。面试没有硬性分数线,谁做的更好,谁就能够脱颖而出。
还要注意打开话题,可以了解在学校时的非课堂技术爱好,了解到与人交流的能力。
强者留下,弱者离开,不会因为是应届生就放水什么的,何况大家都是应届生。
experienced有experienced的面法,一般会偏向做深入到领域层面看其是否和组里做的东西锲合。experienced很少有普招的,都是组里自己面。
一定要自己动手做,亲手做的东西,永远不会忘记;就算忘记了,几个关键字,就能想起来了。
最后一定不要忘记数据结构和算法的分量。
--