如何在面试中发现优秀程序员

原创
小哥 2年前 (2023-05-24) 阅读数 45 #大杂烩

转自:cnblogs

英文原文: Finding awesome developers in programming interviews

我曾经在一次面试中要求一位经验丰富的嵌入式软件开发人员编写一个反转字符串并将其输出到屏幕的程序。他在这个话题上挣扎了很长时间。这家伙是一个非常神奇的人。你给他一些无用的零件,他可以建造一个机器人并编程在房子里走来走去。他曾经参与过卫星的研制,这颗卫星现在在轨。他甚至比我更有能力,只有他的左脑。但是对于这个问题,他一直没有机会这样做:屏幕上显示什么。

有些人有这种在面试中提出正确问题并发现优秀程序员的技能。另一方面,有些人害怕提问,对问从互联网上复制的问题犹豫不决。他们没有独立意见,只听从其他面试官的意见。但面试是大多数开发人员的基本技能。一场失败的招聘会对一个组织产生严重的长期后果,因为水的员工可能会把其他水的人带入公司。另一方面,排除优秀申请人也可能对公司有害。

技术面试至少包括三个部分。第一部分,我们需要做的是检查申请人简历上写的信息是否与实际情况相符。在第二部分中,我们将评估候选人有多少实践经验。最后,我们需要用一些问答选项或编程问题来测试这些体验。

第 1 部分:测试简历的真实性

有一次我和一位同事面试了一个候选人。面试结束后,我觉得这个候选人还可以,但不是很出众。但我的同事似乎很不满意。他撒谎,他说他会XXX技术,但很明显,他从未做过这种技术。我们绝对不能有这样的人虽然这个XXX技术对我们公司来说不是很重要,“因为他惊慌失措,”我的同事继续说,“我不会相信他在简历上写的任何东西。

申请人应在简历中使用正面颜色来描述自己。但是,这种正面描述应该具有一定程度,超过该程度,表达方式就不正确了。在上面的例子中,我认为这件事没有我的同事那么严重,因为我事先假设过, 除非得到证实,否则简历上的任何内容都是假的。 如果简历上写着“精通XXX技术,那么我想这个候选人可能只知道XXX“技术”这个名字。如果简历上写着“在一个开发多线程股票交易系统的团队中工作”,那么我会假设候选人可能只是选择了系统的背景颜色。我的要求从来没有那么严格,除非我遇到一个有十年工作经验的人,他不再写代码。如果有人说他开发了它OpenOffice软件文本格式化工具,或者拥有哲学博士学位,那么我们可以很容易地假设他们有任何技能。 什么都不假设。一切都需要确认。

对于简历上的每一项相关描述,我都会先评估申请人的实际情况。然后,我通过下面的对话确认了。

  • 我开发了一个实时操作系统作为练习项目。
    您工作的团队有多大?15成员?哦,那么,你实际负责哪一部分?消息队列?非常好!请描述当高优先级任务向低优先级任务发送消息时会发生什么?
  • 我们自主开发了无线安全系统的音频传输协议。
    您的团队中有多少人?只有你?哦,你是怎么测试的?你为什么不使用它RTP呢?
  • 给XXX引擎修复Bug。
    您能否描述一下您之前发现的一个特别具有挑战性的问题bug,以及你是如何修复它的。

第 2 部分:发现实践经验

拥有更多的经验是优秀人才的良好指标。经验丰富的开发人员从犯错误中成熟。他们知道何时使用设计模式,何时不使用设计模式。他们有第六种感觉,知道需求的哪一部分需要修改,哪一部分需要保持原样。他们知道什么时候该偷懒,什么时候该一丝不苟。是的 真实体验 优秀开发者与平庸开发者之间的鸿沟无法弥合。

并非所有经验都是等效的。 对于某人来说,通过多年的工作,在许多任务中编写或重写无数代码,犯了许多错误,他们很有可能获得扎实的技能。另一方面,十年后,一个人只会修改一个项目中的一行代码,而不会学到任何新东西。

发现隐藏的时间

许多伟大的程序员在大学二年级就开始编程。当他们离开学校时,他们已经有几年的工作经验。此外,一些了不起的程序员从很小的时候就开始学习编程艺术。我还认识几个人在十几岁或更年轻的时候写了一些不太小的程序。你在简历上找不到这些信息,所以你需要在面试时把它引出来。

  • 您是如何进入软件开发行业的?
  • 你学过的第一门编程语言是什么?

经验密度

许多了不起的程序员只在工作时间编码。那太好了,工作生活非常平衡,没有理由不雇用这样的人。但是,在工作和学习之外做一些个人编程项目是优秀人才的良好指标。具有业余编程经验的申请人显然经验更丰富,更适合公司。没有个人项目?以下是在这方面也可以使用的其他几个指标:

  • 在小团队或小组中工作。
  • 我参加了各种项目。
  • 我对大型项目的各种抽象层次有详细的了解。
  • 作为项目团队中的主要开发人员。

第 3 部分:验证体验

在与候选人获得基本和真实水平的经验后,我们开始验证他们重要的实际编程经验。几分钟绝对不足以进行真正的测试,但仅此而已。我们可以通过在编程和开发的各个领域提出问题来了解申请人掌握这些知识的深度和广度。当然,根据您自己的经验水平,您对候选人技能水平的看法可能会有偏差。你不可能对你不熟悉的领域的答案做出正确的判断。所以我们通常同时有几个面试官。

不同的职位可能有不同的面试主题。但是,以下区域很常见:

  • 数据结构和算法
  • 多线程
  • 字节操作
  • 内存分配
  • 对象、继承、设计模式
  • 递归
  • 装配知识和程序操作原则

我选择的每个字段都有一个精心挑选的基本问题(“什么是信号?问题很基础,只要考生在这个领域做过一些工作,就可以回答这些问题。每个领域都有其他更深层次的问题。考生对这些问题的回答可以证明他们是否专业。例如,如果您询问经验丰富的嵌入式软件开发人员如何0x4c转换为二进制,他写了一个4×16+12这不太对。

编码问题

完成上述步骤后,我通常能够确定候选人是否可以通过测试。如果还有困难,编码问题将帮助我清除最后的障碍。这一点非常重要,即使在电话面试中,也不容错过。为了有效,在面试之前,您需要仔细考虑和计划要提出的编码问题。问错问题会使答案毫无意义。

首先,问题的选择必须基于候选人的工作经验。如果你还记得3D飞机,我想围绕它解决所有问题,所以会有很棒的问题。但你最好保存它。午餐时与同事交谈是可以的。如果招聘的工作与3D如果图形根本不重要,那么这个候选人肯定会被不公平地排除在外。

问题必须准确表达。“编写一个函数来移动一叠卡片”这个表达非常模糊。提供功能标题以避免经常发生的误解。如果你不小心,面试官可能会回答一个比你问的问题更难或更简单的问题,而不是你想问的问题。如果答案是一个更难的问题,那没关系,除非问题让他傻眼。如果答案是一个更简单的问题,它就没什么用了。为了防止浪费大量时间,请在他们回答问题几分钟后询问他们的答案大纲,看看他们的理解是否正确。

更进一步

上述指导 并非所有问题都能解决。 这些主要针对工作经验。你可能会错过一些经验不足但潜力巨大的优秀程序员。尤其是当面试官想通过一些非编码挑战来测试候选人解决问题的能力时。

这里提到的面试技巧都是基于一个假设、可能性和内在直觉。假设候选人是一名优秀的开发人员。优秀的开发人员应该具备哪些素质?您无法直接衡量这些品质,因此您需要思考:具有这些品质的优秀开发人员快速回答如此特定问题的可能性有多大?您不能与候选人进行面试100%正确的评估,但通过提出尽可能全面的问题,您将能够非常接近这个结果。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门