我曾在一次面试中要求一个很有经验的嵌入式软件开发人员写出一个反转一段字符串并输出到屏幕上的程序。他在这个题目上挣扎了很久。这个家伙是个很神 奇的人。你给他一些没用的零件,他能建造一个机器人,并能用程序控制它在屋里走来走去。他曾经参与过研制卫星,并且这个卫星现在 正
在轨运行 。他只用左脑都比我能干。但是对于这个题目他却从来、从来没机会干过:在屏幕上显示什么东西。
有些人就有这种技能,能在面试中问出正确的问题,发现优秀的程序员。而有些人却害怕提问,畏首畏尾,问一些从网上拷贝下来的问题,自己没主见,只会 跟随其他面试官的意见。但面试对于大多数开发人员来说是一项很基本的技能。一次失败的招聘会给一个组织造成很严重的长期的后果,因为很水的雇员会把其他很 水的人也带进公司。另一方面,把优秀的应聘者拒之门外对公司也是一种伤害。
一场技术性的面试至少包括三个部分。在第一部分里,我们要做的是看应聘者的简历上写的是否符合实际情况。在第二部分里,我们要评估一下候选者究竟有多少
实际经验 。最后,我们要用一些问答选项或编程问题来测试这些经验。
第一部分:测试简历的真实性
有一次我跟一位同事面试一个候选人。当面试完之后,我觉得这个候选人还可以,但不是十分出色。可我的同事看起来很不满意。“他撒谎,他说他会XXX 技术,可很显然他根本没有做过这种技术。绝对不能要这种人。”虽然这XXX技术对我们公司并不是很重要,“因为他撒了这个慌,”我的同事继续说,“我就不 会相信他在简历上写的任何东西了。”
应聘人员应该在简历中用一种很积极的色彩来描绘自己。然而,这种积极的描绘应该有个度,过了这个度,就表达的不正确了。在上面的例子中,我并不和我的同事一样觉得这个事很严重,因为我事先就假设了,简历上的任何东西都是假的,除非被证明。 如 果简历上说,“擅长于XXX技术”,那么我就认为这个应聘者可能仅是知道XXX技术这个名字。如果简历上说,“在一个开发多线程股票交易系统的团队里工 作,”那我就会认为应聘者可能只是为这个系统挑选了一下背景的颜色。我的要求一向不严格,除非碰到了一位有十年工作经验、已经不再写代码的家伙。如果有人 说他开发了OpenOffice软件的文本格式化工具,或拥有哲学博士学位,那我们就很容易假设他们有什么技能了。假设一无所有。一切都要证实。
对于简历上每条相关的描述,我会首先估摸一下应聘者的实际情况。然后,我通过下面的交谈来证实。
△开发过一个实时操作系统作为练习项目。
你工作的团队有多大?15个成员?哦,那么,你实际上负责哪部分的?消息队列?很好!请描述一下一个高优先级的任务向一个低优先级的任务发送消息时会发生什么情况?
△完全自主开发了一套为无线安全系统使用的音频传输协议。
你的团队有多少人?只有你?哦,你是如何测试的?你为什么不使用RTP呢?
△给XXX引擎修复Bug。
请你描述一下你曾发现过的一个特别有挑战性的bug,以及你是如何修复它的。
第二部分:发现实际的经验
拥有更多的经验是一个优秀人才的很好的指标。有经验的开发人员都是从犯错误中成熟的。他们知道何时该,何时不该使用设计模式。他们有第六感,能感觉到需求的哪一部分需要修改,哪一部分要保持原样。他们知道何时该偷懒,何时该考究。是真实的经验 让优秀的开发者和平庸的开发者之间的差距大的无法跨越。
并非所有的经验都是等效的。 很有可能,对于某个人,他通过多年的工作,在很多的任务中写或重新无数的代码,犯了许多的错误,就能获得扎实的技能。而另一种情况,一个人会在十年的时间里只在一个项目里修改了一行代码,没有学到任何新的东西。
发现隐藏的时间
很多伟大的程序员都是在他们大学的第二年就开始编程了。当他们离开学校时,他们就已经有了几年的工作经验了。还有,有些很神奇的程序员在他们很小的 时候就开始学习编程的艺术了。我也认识好几个人在他们十几岁或更小时就写出来一些不算小的程序了。这些信息你是在简历上找不到的,需要你在面试中把它们引 诱出来。
你是怎么进入到软件开发这一行的?
你曾经学过的第一种编程语言是什么?
经验的密度
很多神奇的程序员只是在他们工作的时间里编码。这很好,工作生活很平衡,你没有理由不雇佣这样的人。然而,在工作和学习之余做一些个人的编程项目是 一个优秀的人才的很好的指标。有业余编程经验的应聘者很明显有更丰富的经验,更适合公司。没有个人项目?这里有其他几点也能做这方面的指标:
在很小的团队或小组里工作。
参与过很多各种各样的项目。
对一个大型项目的各个抽象层面上都有很详细的了解。
在一个项目组里作为主要开发者。
第三部分:验证经验
在对应聘者有了一个基本的真正经验水平的感觉后,就开始对他们进行重要的实际编程经验的验证了。几分钟的时间对于一个真正的测试肯定是很不充分的, 但也只有这样了。我们可以通过对编程开发的各个领域进行提问来认识应聘者对这些知识掌握的深度和广度。当然了,你对应聘者技能水平的看法会由于你自身的经 验水平而有所偏向。对于你不太熟悉的领域你不可能对答案做出正确的判断。所以我们一般同时会有好几个面试官。
工作职务的不同会有不同的面试主题。然而,下面几个领域是很常见的:
○数据结构和算法
○多线程
○字节操作
○内存分配
○对象,继承,设计模式
○递归
○汇编知识和程序运行原理
我选择的每个领域都有一个精心挑选的很基础的问题(“什么是一个信号?”)。问题很基础,只要应聘者在这个领域做过一些工作就能回答上这些问题。每个领域 都有一些其它的较深入的问题。候选人对这些问题的回答能证明他们到底是不是专业。例如,如果你问一个有经验的嵌入式软件开发人员如何把0×4c转化成二进 制,他写出一个4×16+12,这就不是很对了。
编码问题
在完成了上面的步骤后,我通常就已经能认定了这个候选人是否能过关,如果还有困难,那编码问题会帮我扫除最后的障碍。这个很重要,即使在电话面试里也不能漏过。为了行之有效,在面试之前,你要好好的思考和计划要提出的编码问题。问错误了,回答也就没意义了。
首先,问题的选择必须基于应聘者的工作经验之上。如果你想起来3D飞机,想把所有问题都围绕着它进行,这样会有很妙的问题。但你还是省省吧,吃午饭时跟同事说说还行。如果招聘的工作跟3D图形没一点关系,那这个候选人就肯定被不公平的排除掉了。
问题必须精确的表达出来。“写出一个用来移动一摞卡片的函数”,这个表述就十分的含混不清。要给出功能性标题,避免误解,这种事情经常发生。如果你不小 心,面试者有可能回答的是一个比你提出的问题更难或者更简单的问题,而不是你想要问的。如果回答的是更难的问题,那还好,除非难题让他目瞪口呆。如果回答 的是更简单的问题,那没有什么用处。为了防止浪费大量的时间,在他们答题的几分钟后问一下他们的答题纲要,看看他们的理解是否在正确的方向上。
更进一步
上面的指导
并不能解决所有问题。 这些主要是针对工作经验。你也许会错过一些没有多少经验但有非常大的潜力的优秀程序员。特别是当面试官想通过一些不用编码的难题来考察应聘者解决问题的能力的时候。
这里所说的这些面试技巧都是要基于一种假设、可能性、内部直觉。假设候选人是一个很出色的开发人员。那一个出色的开发人员应该具有哪些品质呢?你没法直接 的测量这些品质,所以你需要想:一个具有这些品质的优秀开发人员对这样一个特定问题进行快速回答的可能性是多少?你不可能通过面试对一个候选人进行 100%正确的评价,但通过尽量周全的提问,你会做到很接近这个结果。
译文来自: 外刊IT评论
- 大小: 4.3 KB
- 大小: 2.6 KB
分享到:
相关推荐
这本书可能涵盖了从基础数据结构到复杂算法的各种主题,旨在帮助读者提升在面试中的竞争力,并对实际工作中的问题解决提供理论支持。 在描述中提到的“July在西电的讲座”,这可能是指作者July在西安电子科技大学...
《程序员面试宝典》是一本深受广大编程爱好者和求职者欢迎的书籍,它全面覆盖了程序员面试中的核心知识点,旨在帮助读者提升技能,顺利通过面试。这本书不仅包含了基础的编程语言知识,如C语言和C++,还涵盖了数据...
在IT行业中,程序员面试简历是求职者向潜在雇主展示自身技能、经验和成就的重要工具。一个优秀的简历能够有效地吸引招聘经理的注意,增加获得面试机会的可能性。以下是对"IT程序员面试简历"这一主题的详细解析: 1....
Java程序员在面试中可能会遇到各种各样的问题,涵盖了语言基础、数据结构、并发编程等多个方面。下面我们将深入探讨这些知识点。 首先,对于Java语法规范,这是每个Java开发者的基础。这包括但不限于变量声明、数据...
在程序员的求职过程中,一份优秀的面试简历至关重要。它不仅是求职者个人能力的展现,更是吸引潜在雇主的关键。本文将深入探讨如何根据“程序员需要的面试简历模板”来创建一份高效且专业的简历,以便在众多竞争者中...
【程序员面试试题20套】是一份集合了多个知名企业的面试题目资源,旨在帮助程序员们更...通过复习和练习这些面试题,程序员可以全面提升自己的技术素养,不仅为面试做好准备,也能在日常工作中更好地应对各种技术挑战。
本篇将基于《java面试宝典》的主题,深入探讨Java程序员面试时应重点准备的知识点,旨在帮助初学者更好地理解和应用Java。 一、Java基础语法 1. 数据类型:Java分为原始数据类型(如int、char、float等)和引用数据...
通过这些算法的学习,读者能够解决复杂的问题,并在面试中展示出优秀的逻辑思维能力。 数据库知识也是面试中的重要环节,书中会涵盖SQL基础,如查询语句(SELECT)、数据操作(INSERT、UPDATE、DELETE)、索引、...
然而,很多程序员对于C语言的理解仅停留在表面,尤其是在面试过程中常常无法准确回答关于C语言的关键问题。本文旨在通过对给定材料的分析,提炼出C语言的核心知识点,并针对面试和笔试场景进行深入探讨。 #### 二、...
【程序员面试】是每个计算机科学或信息技术专业人员在求职过程中必须面对的重要环节。这个压缩包中的资料涵盖了C/C++编程语言以及部分公司的介绍,显然,它是一个为...记住,持续学习和实践是成为优秀程序员的关键。
同时,阅读这些书籍不仅仅是学习具体知识,更重要的是培养分析问题、解决问题的思维能力和良好的编程习惯,这些都是成为一名优秀程序员不可或缺的素质。在准备面试的过程中,不仅要理解理论知识,还要通过实际编写...
为了帮助程序员在激烈的职场竞争中脱颖而出,本书对Java程序员职位所需掌握的知识进行了系统全面的总结,并结合IT公司的面试真题进行分析,帮助读者全面准备面试。 书中还介绍了面试流程及求职准备,这对于求职者来...
在C++面试中,可能会讨论STL(标准模板库)、设计模式、智能指针、内存管理、RAII(资源获取即初始化)等主题。例如,理解模板的使用、如何实现工厂模式、以及何时使用shared_ptr和unique_ptr,都是C++面试的重要...
"程序员面试算法设计解析"这个主题深入探讨了在面试中可能遇到的各种算法问题及其解冑思路,旨在帮助应聘者更好地准备面试,提升解决问题的能力。下面我们将详细讨论算法设计的一些核心知识点。 1. **排序算法**:...
针对"Python-关于职位面试谈Offer程序员职场生涯等"这个主题,我们将深入探讨与Python相关的面试技巧、求职策略以及程序员的职业发展路径。 首先,面试是每个程序员步入职场的关键环节。对于Python开发者来说,掌握...
在程序员的求职过程中,面试是至关重要的一环。面试不仅仅是对技术知识的检验,更是对解决问题能力和思维方式的评估。本文将围绕“程序员面试技巧和编程技术知识”这一主题,深入探讨如何准备面试,以及如何理解并...
在这个压缩包文件中,我们可以找到一系列与编程相关的资源,尤其是针对Java程序员的。这些资源对于提升个人技能,准备面试,找工作,以及深入了解计算机科学的各个方面都极具价值。下面,我们将详细探讨每个主题: ...
以上知识点只是冰山一角,深入学习和实践每个主题都是成为优秀.NET开发者的关键。文档“面试题1.doc”和“面试题2.doc”将提供更具体的题目,帮助你更好地理解和准备这些知识点,为你的面试之路做好充分的准备。