面试 C++ 程序员,什么样的问题是好问题?
对于应届生:
- 标准库各容器的基本操作的复杂度。标准库算法的复杂度,例如 std::sort() 的平均复杂度、最坏复杂度(答 O(N^2) 和 O(N log N) 都算对),最坏情况什么时候出现。
- 标准库各容器(deque 除外)的数据结构(标准党勿喷,主流 STL 实现的数据结构都差不多),以及 vector 的容量增长方式。如果回答得特别好,还可以补充问为什么 vector::push_back() 的复杂度是分摊之后的 O(1),作为加分。
- 出一道使用 lower_bound / upper_bound 能轻松解决的简单算法题;或者实现 set_intersection() 或 set_union() 或 merge();或者实现 word count,统计每个单词出现的次数(最多十几行代码),如果有时间,输出时再按出现次数排序。
对于社招,补充问:
- 迭代器失效。(不要求记住所有的场景,但要有这个概念,其实知道数据结构的话不难推理。)
- 标准库的线程安全性。
- 自动化对象生命期管理,智能指针,循环引用,weak_ptr。
- list 的 insert()/erase() 与 vector 相比哪个快。(这个不是那么简单。)
关于什么是好的面试题,多说几句我的看法:
- 面试官向谁负责。通常应聘者会面试几轮,收集多个面试官的 feedback,交给 hire manager 或 hire committee 决定是否录用。也就是说面试官无权单独决定是否录用这个候选人。在此前提下,面试官的任务是收集足够多的有效信息(包括面试题、答案、答题过程等等),供 hire manager 或 hire committee 决断。因此,面试题要有说服力。应聘者答上了这道面试题,能说明什么,如果没答上来,又能说明什么。不符合这一要求的不是好题目。
- 难度与区分度。难度定位在“一个合格的 C++ 程序员应该掌握的基本知识”,是招能用 C++ 干活的人,不是招标准控或语言律师。所有人都能做出来和所有人都做不出来的题目,没有区分度,不是好题目。所有应聘者都能通过或者所有应聘者都被刷掉的面试官也不是好面试官。
- 公平性与可重复性。技术面试题应该有比较公认的正确答案,怎么样算答得好,不仅由面试官一个人做出判断,hire manager 和 hire committee 也能重复这一判断。一套好题目,能起到筛选多个面试者的作用,比如“眼前这个应聘者的回答与过去六个月里的应聘者相比,处于前 10 % 的位置”,这就是不错的客观标杆。
编辑于 2014-04-17 00:36