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

Goz*_*Goz 22 c++

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

那么有人有任何建议吗?

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

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

Dan*_*nas 21

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

例如,第一个是关于按合同设计:看看他们是否知道什么是先决条件,后置条件和不变量.做一些小错误,比如永远不会初始化一个整数字段,但断言它在不变量中是> = 0,看看他们是否发现了它们.

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

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

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

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

  • 我不知道确保他们更喜欢std :: string而不是"char*"对于评估程序员的一般能力非常有帮助,无论他们使用C++的经验如何.不过,我喜欢让他们寻找编码错误的建议. (7认同)

h0b*_*0b0 14

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

  • 我不能成为唯一一个在提出这个问题的人会问面试官"我可以在内部使用std :: string,并且只通过访问者将名称公开为const char*" 产生的来源大约是初始错误答案的大小,并且不太可能比他最终解决的答案效率低得多. (8认同)
  • 实际上相当令人惊讶的是,声称具有3年C++经验的人会遇到问题.任何人都需要复制和交换成语作为任务(到了你可能想要开始考虑更强的异常保证的地方)?:) (2认同)

Art*_*ius 7

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

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

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

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

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

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

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

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

  • 我想到的更多的是那些*知道*看起来运行的代码可能存在逻辑错误的人,但仍依靠测试来删除所有"实现"错误.也就是说,由于您编写的代码而产生的错误并不反映您的程序的心理模型.就像意外使用错误的变量名一样.(与因为你的心理模型本身被破坏而产生的错误不同.) (2认同)

fni*_*eto 6

一些问题可以让您了解候选人:

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

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

  • Sry我可能有点苛刻,但你是在试图采访一位学者或程序员.应该在书中介绍的信息不值得问.编程是关于技能,经验和他们对问题的处理方法,而不仅仅是知识.通过您的问题接受的人可能仍会写错代码. (7认同)
  • 大多数C++开发人员都有超过3年的经验,无法正确回答这些问题,甚至是一些基本问题.这是一个很好的方式来了解如果候选人是一个积极主动的人如何阅读好书和明确的想法,或只是一个人做一个他不喜欢的工作.当然他们的技能很重要,请阅读我答案的最后一段. (2认同)

kri*_*ash 5

结帐Joel的Guerrilla面试指南.看起来很像你在寻找什么.


Lio*_*gan 5

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

这似乎是一个简单的问题。如果任意两条边的和大于第三条边,则认为输入有效。但是,一个好的程序员会遇到一些陷阱:

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

一个好的程序员必须面向细节。这个简单的练习将有助于检查他是否。