C++ 后台开发面试时一般考察什么?

个人见解。

抛开算法的话。

OOP三大项,封装继承多态。v func是怎么实现的,一般考到v table还能挺住的人不多。以前面pure storage被给了多重继承虚函数指针问在内存里是什么样的。这么用心艹的不多见,但v func有太多可以问的

把所有const static的各种情况都看一遍。虽然有点可笑,但还是有很多人分不清const pointer和pointer to const以及两者合体的区别的。static放在不同的地方不是一回事。

内存泄漏肯定是会被问的。rule of three是基础。exception safe是难点。解决方法其实都很简单,在工业界,smart pointer就完,没那么多花样。工业界基本见不到裸指针。别小看exception safe,很耗时间学的。

然后就是stl,大多数自诩懂的C++的人,包括曾经的我,基本都讲不明白allocator是怎么回事。

RAII,至少要听过。

其他的想考你的太多了,但我觉得仅仅是应用C++的话,这些应该差不多重点了。

OS作为考OS来说,那多深都有可能。如果问C++的话,取决于公司。大公司进去就是螺丝钉,框架都是好的,用而已。

小公司会怎么考,无法预测。但os还是要好好看的,熟悉了你可以秒杀一切所谓系统设计的题,真的。现在大多数玩意其实都是六七十年代那帮大牛玩剩下的。

OS学校出来的人基本会集中在两个知识点上,进程管理和文件系统。前者对非infra的开发类很重要,infra类两者都重要。基本知道进程是什么玩意,什么是context switch,现实中你干什么会触发它且cost是什么。virtual mem和physiccal mem分别是什么。理论上就好,这东西面试时面试官也只能用嘴问。当然你要是写过nachos或者mit那个累UnixV6这都是小case。

分布式我不觉得本科会涉及,但说真的不难,当年我凭着GPU并行计算的一点功底和OS的知识也从来没倒在过这类问题上。总归talk is cheap嘛~

后端的话,好好看看SOA和REST,你做后端逃不出这俩。以及js 的single page application的原理(很多应用需要这个理念去减小延迟),以及C++如何实现async。你对node和engine x多少要有点基础了解。

看看MVC,所谓后端,就是M,前段无非是个C。

Design Pattern初学者说能看懂比较难,大致扫扫知道点名词。

弄明白进程,stack和heap。我给你个简单的程序,你能在内存里给我画出来从头到尾的经过。

concurrent programming一般不会考到。也最需要实际经验成长。简单的例子最好能写出来。race condition有些很复杂的你看不出来但简单的要能说明白。

明白cpu cache是怎么运作的。为什么很多数据结构或算法明明很好却很慢。Locality。

如果你很好的明白concurrent,那instruction pipeline要是能讲明白就更好了。

敏捷式开发你要明白是怎么回事。code review,测试流程多少要有个概念。

template平时没用过太野性的方法,都是中规中矩。metaprogramming多少要明白好处在哪。这东西玩好了好厉害,美国在火星上那小车里面几乎都是metaprogramming。

忘了讲了,static linking,dynamic linking,优缺点。

你是老牌公司后段很可能会遇到sun的机子,sun的unix的linking只走一遍,就是说你的程序里一定要避免环形dependency。非有环的话,除了手动加,你怎么解决?其实这是算法层面的东西。

我给你几个文件组成的程序,你要能给我讲明白从compile 到likning到最后每一阶段所做的事。如果你是用宇宙studio编程的,这点要重点复习。

同样,如何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++11不需要过度的在意,先看好基础,大多数工业界的人自己也还在学习阶段,而且除了fancy的新项目,成熟的项目一般不会跟风追新。

但smart poibter一定要看好。一般C++做出点样的公司,内部都有自己的C++标准,很早就基本都是处在一个03和11之间的一个状态,主要就是smart pointer。

你能会自然是好,但一般不会强求。和metaprogramming一样,面你的人在这方面很可能还停留在理论帝的水平呢。太多东西都是私下玩,很多东西工作中不一定总能碰到。

若有时间,scott meyers的四本effective绝对经典。

如果你能上youtube,搜jon kalb在cppcon上的exception safe,讲得非常好,当年cppcon最佳talk。他在今年九月的cppcon做chair。

再补充:

等编译的时候写的答案想不到得到大家这么多谬赞,万分感谢。

关于是否针对应届生这件事,我个人建议应届生最好别把自己当应届生。首先应届生里名校导致能力超强的,学校c++很强导致这一门特别强的,以及有些五年本科其中算在课程里强制两年去实习的,这些都大有人在,这些人的实力远超于大家眼里应届生的标准,而你要和他们竞争。

其次面试官一般不会指望应届生能回答出所有的问题,但会倾尽所能地去问,这样虽然没几个人能全回答上来,但可以对这一批candidates得到一个很清晰的层次,谁强谁弱。面试没有硬分数线,谁做的更好,谁就能脱引而出。另外如果某一点能打开话题,可以了解到他在学校时非课堂上的技术爱好,同时可以了解到他与人交流的能力。强者留下,弱者离开,不会因为应届生就放水什么的,更何况大家都是应届生。而且不是说全问,聊天嘛,在某个知识点顺势就切进去了。


experienced有experienced的面法,一般会更偏重去深入到领域层面看其是否和组里做的东西契合。Experienced很少有普招的,都是组里自己面。

一定要动手。亲手做过的东西,你永远不会忘。就算一时想不起来,几个关键词一提点,马上就全回来了。

最后,不要忽略数据结构和算法的份量。


//======

大多数公司是不会用Boost的,因为它们自己就是Boost++。

想起以前我们公司一个C++的超级大牛聊天时曾提到九十年代有一个词叫contract programming。就是说我给你一切先决条件,只要你满足了这些条件,那么我的code保证一定肯定绝对work as expected。不是万能,而是发觉一切缺点要么解决要么设先决条件,用设立一个和用户间的contract来保证一定肯定绝对的正确性。

而boost满足不了这一点。官网FAQ都自问自答,这个library保证一定work吗?不,我们不敢保证。应该不是实力问题,而是社区软件不会那么push自己?我也不清楚。但大多数公司在11之前都会自己造轮子。而且负责任的公司不会出了事寄希望于一个社区。还是自己写靠谱。

仅仅是觉得有趣的事情补充一下而已。同样只是一家之言,boost的缺点还很多比如去看看它的bug list。boost是超强的思维发散地,但实现方面很多人不是很喜欢。看Boost的优先级一定在看C++11之后。

编辑于 2015-11-24 09:51

Published

Category

Zhihu

Tags