C ++访谈 - 测试潜在候选人

时间:2009-09-09 08:59:24

标签: c++

我必须在接下来的几周内采访一些C ++候选人,作为公司最资深的程序员,我希望能够弄清楚这些人是否知道他们在做什么。

有人有任何建议吗?

就我个人而言,我讨厌被留在一个房间来填写一些C ++问题所以我宁愿做一个更复杂的测试,我可以和受访者谈谈他们的方法等等。也就是说他们是否得到了正确答案并不重要,因为他们如何处理我感兴趣的问题。我不在乎他们是否理解语言的模糊特征,但我确实关心他们对指针的理解,以及理解指针和引用之间的差异。我也很想知道他们如何处理给定问题的优化,因为在我看来,坚固的快速代码是必须的。

因此,我们将非常感谢您对这些方面的任何建议!

17 个答案:

答案 0 :(得分:20)

我不会让他们写代码。相反,我会给他们一些代码片段进行审核。

例如,第一个是关于按合同设计:看看他们是否知道前提条件,后置条件和不变量。做一些小错误,例如从不初始化一个整数字段,但断言它在不变量中是> = 0,并看看它们是否发现它们。

第二个是给他们bool contains(char * inString, char c)。用一个简单的循环实现它。然后问是否有任何错误。当然,这里的代码不会在输入参数inString检查null (即使之前的问题涉及前置条件!)。此外,循环在字符0处结束。当然,候选人应该发现可能的问题,并坚持使用std::string而不是此char *废话。这很重要,因为如果他们抱怨,您就会知道他们不会将自己的char *添加到新代码中。

解决 STL容器的替代方案:给他们一个std::vector<int>和代码,搜索素数或计算奇数或其他东西。犯一些小错误。看看他们是否发现任何问题并且他们理解代码。询问std::set哪种情况会更好(当你要系统地搜索元素时,原始的入口顺序无关紧要。)。

讨论一切,让他们想几分钟。捕捉他们所说的精髓。不要专注于“覆盖”(他们发现了多少东西),因为有些人可能会感到压力。听听他们实际说的话,看看它是否有意义。

我不同意在采访中编写代码。我永远不会要求任何人编写代码。我知道我的手写代码可能会在这种情况下吮吸。实际上,我很少被要求这样做,但是当我有,我没有被雇用。

答案 1 :(得分:14)

This one是一项非常复杂的任务,即使它看起来非常无害。

答案 2 :(得分:7)

我相信C ++程序员需要的不仅仅是通用编程技能,因为......

  
    

在C ++中,你很难用脚射击自己,但是当你这样做时,你会把你的整条腿吹掉。

  

编写无错误,可维护的C ++代码对大多数语言的一些区域提出了更高的要求。

有一件事我称之为“迂腐”。你知道有些人一眼就能发现拼写错误吗? C ++程序员需要能够在读取或编写代码时发现简单的错误(无论代码是否属于自己)。依赖于“编译和测试”技术来摆脱简单错误的程序员与C ++语言不兼容,因为这些错误并不总是导致C ++中的立即失败。

C ++程序员还需要熟悉低级别的东西。指针,内存分配器,阻塞,死锁。和“细节”C ++问题,如多重继承和方法隐藏等,特别是如果他们需要维护其他人的代码。

最后,C ++程序员需要能够编写易于其他人使用的代码。他们能很好地设计好东西吗?

前两个方面的一个很好的测试是“这是我从互联网上下载的一些C ++代码。找到错误,找出不必要的位。” (互联网上有许多非常糟糕的C ++代码,由于对如何在C ++中“安全”的错误理解,程序员经常做不必要的事情。)

您可以使用更通用的面试问题来测试最后一个区域。

答案 3 :(得分:6)

一些问题可以让你对候选人了解很多:

  • 指针和引用之间的差异,您何时使用它们?
  • 为什么要将析构函数设为虚拟?
  • 定义了类属性的构造顺序在哪里?
  • 复制构造函数和operator =。你什么时候实施它们?你什么时候把它们变成私人的?
  • 你什么时候使用智能指针?你会考虑哪些事情来决定哪个?
  • 你还在哪里见过RAII成语?
  • 你什么时候制作参数const?当一个方法?
  • 你什么时候会让属性变得可变?
  • 什么是虚拟继承?
  • 什么是模板专业化?
  • 什么是特质?
  • 什么是政策?
  • 什么是SFINAE?
  • 您对C ++ Ox标准了解多少?
  • 您使用了哪些增强库?
  • 你读过哪些C ++书? (Sutter?Alexandrescu?)

关于STL容器,内存管理,切片等的一些简短练习(不超过10分钟)也很有用。我允许他在有环境的电脑上做这件事。观察敏捷性非常重要。

答案 4 :(得分:5)

结帐Joel Guerrilla guide to interviewing。看起来很像你正在寻找的东西。

答案 5 :(得分:4)

不要忘记也测试代码偏执。我知道我不希望任何为我工作或与我一起工作的人,他们对编程语言的态度,以及解决问题的方法都不是一个灵活而实用的程序员。

  • 否认任何类型的先入之见
  • 了解的价值 任何最佳实践中的例外
  • 有能力长期拒绝 如果习惯支持别的东西 需要出现

这些是我所熟悉的特征。如果面试时间不长或不涉及提交代码,那么对这些进行测试的方式并不理想。但是,在提供用例场景并向候选人询问他们对解决方案的看法时,使用有意义的有争议技术显示代码片段是一种方式。

答案 6 :(得分:4)

“编写一个接收3个整数的程序,范围为0..2 ^ 32-1,并验证它们是否代表三角形的有效边缘。”

这似乎是一个简单的问题。如果任何两个边的总和大于第三个边,则认为该输入有效。然而,有一些陷阱,一个优秀的程序员将处理:

  • 使用的正确类型应为unsigned long。许多“程序员”都会在这里失败。
  • 零值应视为无效。
  • 应避免溢出:“if(a + b <= c)返回false”是有问题的,因为a + b可能会导致溢出。
  • if(a&lt; = c-b)也是坏解,因为c-b可能是负的。对于无符号类型而言,这不是一件好事。
  • if(c> b){if(a&lt; = c-b)返回false; } else {if(a&lt; = b-c)返回false;这看起来好多了,但如果(a&gt; = b + c)它将无法正常工作。

优秀的程序员必须注重细节。这个简单的练习将有助于检查他是否。

答案 7 :(得分:3)

无论您使用何种语言,

This article都会提供一些相关的一般性提示。

答案 8 :(得分:3)

不要只测试C ++和整体技术技能!这些当然很重要,但如果人们不听,不妥善回答或不履行他们的承诺,那就没有了。

最多检查清楚沟通的能力。如果人们不能在几分钟内告诉你他们以前在工作中做了什么,他们也无法在你的地方报告他们的工作等。

在最近的一家公司,我们邀请人们一起约3人一组进行面试。他们很惊讶,但没有人对此感到愤怒。这非常有趣,因为人们不仅要与我们沟通,还要与同一位置的其他人沟通。如果我们对此感兴趣,我们安排了第二次面试。

答案 9 :(得分:3)

根据您的组织的预筛选情况,假设该人对C ++一无所知,并且刚刚提交了他们的简历,因为这使他们看起来超级技术。认真。从简单的东西开始,比如反转一个字符串。我有候选人甚至不能写这个功能原型!!

答案 10 :(得分:2)

Here is my answer针对C#的类似问题,但请注意我的答案与语言无关。我的面试问题实际上是在C.我很少采访一个人,目的是找出他们是否可以编程。我想知道他们是否能够思考,解决问题,协作,沟通,理解新事物等等。与此同时,我围绕着软件工程的大局,试图看看他们是否“得到它”。我使用编程问题,因为这是一个常见的基础和简单的诡计。

答案 11 :(得分:2)

您可以选择可能存在问题的任务,并了解他们如何处理它。让他们写一个智能指针,例如,你会看到他们是否一步一步理解指针,参考和模板:)通常他们会有压力所以他们会犯错误,这些错误可能会帮助你找出他们解决问题的能力有多好是,他们用什么路径来解决错误等等。这种方法的唯一问题是,有时受访者对任务一无所知,你必须快速找出更容易的东西。如果他们做了完美的代码,你可以讨论他们的选择,但是当没有什么可看的时候,对你们两个人来说都是令人沮丧的。

答案 12 :(得分:2)

获取Codility.com以屏蔽non-programming programmers,这将为您提供数量有限的大多数可接受的候选人。与他们每个人坐一个小时,并尝试一起构建一些东西(微型Web服务器,处理一些数据的脚本,一个简单的GUI)。注意沟通技巧,即理解候选人需要多少努力。请求候选人推荐与该主题相关的书籍(在您的案例中为C ++软件开发)。关注Guerilla Guide to Interviewing,即诚实地回答自己,如果这个人聪明并且完成任务。祝你好运。

答案 13 :(得分:1)

通过Tests4Geeks检查10 C++ Interview Questions

这是他们在面试前C++ test的补充,它确实有用。很多人一直在研究这些面试问题,所以它非常平衡,没有棘手或语法问题。

想法非常简单 - 首先你使用测试淘汰了不称职的候选人,然后在真实的访谈中使用文章问题。

答案 14 :(得分:0)

无论你做什么,配对都是个好主意。想出一个好的程序并与那个人配对并努力解决问题。恕我直言,这是一个非常好的主意

答案 15 :(得分:0)

  
    

有人有任何建议吗?

  

我建议您获取此副本:

http://www.amazon.co.uk/Programming-Interviews-Exposed-Secrets-Programmer/dp/047012167X/ref=sr_1_1?ie=UTF8&s=books&qid=1252499175&sr=8-1

  
    

即他们是否得到了正确的答案并不关心他们如何解决我感兴趣的问题

  

您可以要求候选人针对常见问题提出UML设计。如果他们向您展示设计模式,那么您可以通过模式的优缺点进行讨论。然后,您可以要求他们为其中一个类生成一些代码。

这有助于您确定他们的技术知识水平和沟通能力。

  
    

我确实关心他们对指针有很好的理解,并理解指针和参考文献之间的差异

  

链接列表问题有助于确定候选人是否掌握了指针。

对于引用,您可以向他们展示一些不正确使用引用的代码,并要求他们描述问题。

例如,向他们展示一个包含引用成员变量的类定义,以及缺少引用初始化的构造函数的实现。

  
    

我也很想知道他们如何处理给定问题的优化问题,因为在我看来,固体快速代码是必须的。

  

我开始简单......

向他们展示一个代码示例,通过值将字符串传递给函数。 (不应在函数中修改字符串)。您应该检查它们是否更正了代码以通过const引用传递字符串。

在此之后,您可以显示使用赋值而不是初始化(对象)的构造函数。请他们改进它。

最后,向他们询问有关数据结构选择的简单问题。

e.g。当他们应该使用列表而不是向量时。

如果您认为他们掌握了基础知识,您可以询问他们如何处理优化问题(讨论分析器等),或者让他们优化不那么明显的东西。

答案 16 :(得分:0)

看看这个C++ test。他们根据需要对指针和引用之间的差异提出了疑问。

以下是完整的主题列表:

  • 基础知识:参考文献&amp;指针,Const正确,明确
  • 标准图书馆
  • 班级设计,重载
  • 虚函数,多态,继承
  • 内存管理,异常安全
  • 杂项:完美转发,自动,流量控制,宏

这些家伙对他们的问题非常认真,他们也提出了很好的C ++面试问题清单,你可能会问你的候选人: https://tests4geeks.com/cpp-interview-questions/