在我参加的上一次面试中,我被要求解决一个难题,即在给定两个容量分别为blah和blah liter的容量的情况下,我应该精确地测量blah liters的水。我无法在给定的时间(约5分钟)内解决难题。
面试官有些失望,他说程序员必须具备“这些”技能。我没明白他在说什么技能。
我一直对编程工作面试中通常会遇到的这类难题感到陌生。我根本不理解这类难题与编程之间的联系,如果有的话。面试官打算用这些难题来评估哪些技能?
#1 楼
有人问他们,以评估您解决问题的能力和方法。就我个人而言,我认为此类难题不能提供准确的指标。在“现实世界”中,您有超过五分钟的时间来确定您是在处理垃圾箱还是背包问题。最初,有时很容易误解眼前的问题,直到您陷入应用错误的解决方案的中间。拥有1、5、10甚至20年经验的人都会遇到这种情况。最好的面试“难题”是您坐在电脑前解决领域中的问题的难题。您声称拥有专业知识。我还不喜欢“嗯,程序员应该能够……”的想法,因为它没有考虑到人们在已经很紧张的环境中被意外击中时会感到焦虑。当然,如果您有时间考虑一下,您可以解决。.如果您意识到如果不这样做,您的生活将会结束,那么也许可以更快地解决它。如果您不能在五分钟内解决问题,您是否想在生活将结束的地方工作?如果不能的话,你会被解雇吗?
所有伟大的程序员都应该成为数独的冠军吗?我敢肯定,这是足够的,但是这不像某种能力的先决条件。并根据其专业领域邀请申请人提供的“最佳”奖项。考虑到制片人花了不少钱来使场景正确,证明您像布鲁斯·威利斯(Bruce Willis)所描绘的角色一样聪明,似乎毫无意义。
换句话说,如果您发现自己被一个对您的实际工作几乎一无所知的人面试,请您自己去洗手间,再也不会回来。
评论
这是所有面试官都需要具备的观点。解决您域中的问题,您对压力和意想不到的问题的评论都差不多!
–克里斯
2011年4月14日在16:41
在“现实世界”中,您需要花费五分钟多的时间来+1,这是一个不错的答案!
–蚂蚁的
2011年4月17日在12:26
我也喜欢这样的事实,即他们通常像面试官提出问题并自己解决一样出现:)
– RyBolt
2012年8月24日20:06
我会很努力地原谅自己去洗手间,再也不会回来!
–弗洛里安人造黄油
2012年12月29日在21:55
是的,我总是尽力使求职者感到舒适,因此我实际上可以尝试找出那个人对工作的满意程度。要求“您的长处”而不是“您喜欢什么?”和愚蠢的难题而不是编码哲学不会给我任何有关该人做这份工作的能力的迹象。
– winkbrace
13年6月4日在8:44
#2 楼
Microsoft在1980年代初开始使用这些问题。随着Microsoft的显着成功,其他公司也开始复制它们,但是在翻译中却失去了一些关键点。 :技术作家,测试人员,电话支持人员等等。这些在当时并不常见,而且很难找到在这些领域有实际经验的人。作为替代方案,Microsoft认为他们可以雇用真正聪明,聪明,灵活的人员,并对其进行培训。由于这些人没有编程背景,因此在面试中向他们询问编程问题毫无意义。选择这些谜语是为了找出那些聪明且具有出色分析能力的人。程序员通常会遇到白板编程问题,尽管有时他们会在午餐或晚餐时被问到谜语。它们旨在成为有关如何解决问题以及如何思考从未见过的问题的对话的开始。唯一“失败”的方法是拒绝尝试解决问题。当时这是一种新颖的策略,您不能只在Google上查找问题。编辑:
写完这个答案后的某个时候,我读了《计算机男孩接手》,这是1950年代和1960年代机构计算的历史。显然,要求脑筋急转弯和候选人之谜进行编程工作的做法可以追溯到1950年代。美国试图将其防空系统计算机化,IBM估计他们将需要数千名程序员来完成这项工作。回应令人震惊和震惊:全世界只有几十个“专业程序员”。尝试了几种方法:抽象编程能力测试,招募数学家作为程序员,招募下棋者和填字游戏,解谜器以及用谜语和脑筋急转弯筛选申请人。
他们最终确实成功招募了足够的程序员来完成该项目,但结论是,没有任何一种甄选方法比找到那些继续以程序员的身份成功的新兵更好。
#3 楼
它们有用吗?不,不是。它们曾经在Microsoft非常普遍,甚至被称为“ Microsoft问题”,并且有关于它们的书,实际上,这是一本不错的书。.它们有两个问题。首先,如果申请人进行了研究(并阅读了书),他们无论如何都会知道它们,其次,即使他们能够解决问题,这如何表明这将是一个好的开发人员/测试人员/项目管理人员。
由于这些原因,Microsoft不再要求他们了。提出编码问题或不需要“技巧”答案的问题解决问题要好得多。换句话说,您需要提出一些问题,以使他们在尝试解决问题时探索申请人的技能和行为-作为面试官,我希望他们提出问题,提出解决方案,然后在他们找出答案时回头一个问题,也许甚至没有在他们拥有的时间里找到解决方案,但至少以明智的方式去解决。这反映了现实生活中的工作。我从来没有用2个水桶和一只鸡来测量3品脱(或其他问题)。
那是我被问到一些棘手的问题,现在我开始考虑自己作为在小船上运输鸡和狐狸并计算生活在火车上的苍蝇的寿命的专家。我从来没有使用过这些信息,但是谁知道呢,也许有一天....
#4 楼
您可能需要阅读《如何移动富士山?》一书。进入推理的原因是,许多人在面试中都使用了谜语,而我的看法是,这是一种冒昧的行为(“微软这样做了,如果我们想像他们一样成功,那么我们最好做他们做的”和博爱恐吓(“天哪!我必须回答那些问题,您最好相信下一个家伙将必须回答他们!”)。这些问题作为采访活动的历史始于1950年代的William Shockley。这是面试官提出的一个相当常见的硅谷面试问题,因为其他面试官正在这么做(也许他们知道此面试官不知道的某些内容?)。肖克利打算将它们作为智力测验,而这两个水桶的问题是1916年最初的斯坦福Binet IQ测验中的一个。您会寻找答案,因此它们将无法计算问题,例如您的城市中有多少个气泵。这些问题就是费米问题。杰夫(Jeff)撰写了两篇有趣的博客文章,这是有史以来最艰苦的面试难题
和您的估算师有多好?第三部分。个人而言,我对这类问题持较低的看法,因为通常采访者不知道自己在做什么,也不知道如何寻找开发人员。除非您要为制作难题/谜语的公司工作,否则它们会与“什么是您最大的弱点”(答案是事实并以一种不好的方式结束面试)一起属于历史尘土堆是圆形的沙井盖”(并非全部都是)。
评论
+1,完全同意最后一段!
–missingfaktor
2011年4月14日在17:10
费米问题链接+1:看看有人是否能够在合理的误差范围内进行估算,这很有趣。您同样可以要求对“有多少个国家?”置信范围。但是,我认为了解这种方式虽然令人钦佩和有用,但对开发并不是真正必要的。有点像是开发人员了解微积分或统计信息:这很好,但是要说的是他们的背景,而不是他们是否会胜任这项工作。
–池
2011年9月9日上午7:30
#5 楼
其他人提供了我必须提出的答案。我写另一个答案的原因是,我想说的内容可能不会放在评论中,并且因为必须要说一番关于好的编程工作面试的感觉。我记得很好的采访,我们聊了很多,并不着急。首先,一个小时,通过电话,讨论了面向对象的设计以及在C ++中实现它的利弊。然后,在现场,我和几个人谈了他们的软件开发实践,集成,测试,版本控制和配置管理,团队和职责,技术和设计。这是一整天的采访,其中包括与采访我的人共进午餐。事后看来,这完全取决于我是否可以有效地适应他们已经在做的事情。从那以后,良好的访谈一直是关于软件开发的漫长的,一到两个小时的对话。没有解决问题的问题,没有困惑,也没有编码挑战。
如果我今天要面试某人从事编程工作,我会喜欢的。我希望就广泛的主题发表意见,而请不要赘述:
您对编程语言的偏好是什么?为什么?
如何进行异常处理?
分层设计的好处不是神话吗?
持续集成不是效率的负担吗?
Whomever写道:代码应该拥有它,对吗?
如何进入“流程”。
报告的缺陷应如何包含在项目计划中?
... />这些问题的答案不只一个,而且都是关于软件开发人员应有充分见解的主题。我完全同意提及以前作为对话主题(而不是问题)遇到的实际问题的答案。
自Peopleware以来,有关有效软件开发的更多科学研究表明,最好的程序员是即使不具有最高的IQ也会了解软件开发动态的人。我宁愿选择一个渴望学习的菜鸟,也不愿拥有一个具有
n
年经验的人,而将其归结为1
年的经验重复了n
次。我个人偏向于倾向于在框框之外思考,同时又知道如何适应当前(我)框框的候选人。评论
极好的答案。题外话:您的示例问题3使我感到好奇。我有兴趣进一步了解您对分层设计的看法。
–missingfaktor
2011-4-17 13:46
如前所述,@ missingfaktor#3是一个技巧问题,可以引发关于快速完成的事情与正确完成的事情的对话。 #4和#5相同。 #7可能是最难的,而且仅适合担任领导角色。
–阿巴拉拉
2011-04-17 14:20
@missingfaktor我再次回答了另一个问题。这篇Wikipedia文章,相关文章和外部链接提供了大量信息,说明为什么关注点分离对于复杂系统的设计和构建至关重要:en.wikipedia.org/wiki/Modularity
–阿巴拉拉
2011年4月17日下午14:30
说得通。非常感谢! :-)同样,很好的答案。提出许多其他答案未在此处提及的优点。
–missingfaktor
2011年4月17日下午14:41
就个人而言,我还会添加有关工具的问题。关心他们使用的工具的人往往是更好的程序员。作为Emacs用户,我更喜欢vim用户,而不是只是耸耸肩而不在乎的人。
–单身
2014年1月28日23:10
#6 楼
它们在评估解决问题的技能方面很有用,这当然是编程的关键方面之一。作为多年来许多人的面试官,我通常不会问棘手类型的问题就像您似乎要描述的那样,但是我可能会问一些问题,并问“您将如何解决...”。您还将尝试收集哪些其他数据?您将如何检验假设等。
评论
在采访无数人时,我做过同样的事情。问题的重点是观察他们如何实现解决方案,而不一定是如果他们获得正确答案。您只需观察此过程即可很快找到优秀的程序员。
–戴夫·怀斯
2011年4月14日14:43在
@戴夫,尝试我。解决此类难题时,我通常会拿一张纸,画一个图形或表格,或者代表参与者的交叉图形,或者写一些与解决问题的方式有关的数字。我完全沉默地做这些事情,有时被难以区分的抱怨打断。那么,我是一个好的程序员吗?
–P切碎
2011年4月14日15:58
海森堡不赞成。一个人也许能够提出一个解决问题的好方法,但是不善于交流他们使用的内部过程。要求他们这样做不仅会在通常无法工作的情况下测试他们的能力,而且最终会因他们无法或无法向他人解释其思维过程的能力而产生偏见。他们甚至可能不知道它是如何工作的。
–詹森
2011年4月14日在17:54
有人认为,仅仅因为他们性格外向,每个人都应该是性格外向。我目前的团队是一群内向的人,这是迄今为止我有幸与之合作的最好的团队。
–扣篮
2011年4月14日在19:25
@Charles我的意思是,内向的人通常需要先思考问题,然后才能提出让他们满意的解决方案,然后才可以向其他人解释。这与“无法通信”完全不同。性格外向的人通常需要通过解决问题来交流。原始的海报显然希望有一种外向的风格来解决问题。
–扣篮
2011年4月15日19:10
#7 楼
这些只是巫毒教徒的雇用方式。其他人问这些问题,使他们觉得自己应该这样做。他们知道不回答问题是“不好”,回答是“好”,但是他们无法告诉您为什么除了诸如“开发人员需要这些技能”之类的非回答之外。这是浪费时间,并且表明访问者不是合格的访问者。#8 楼
那就是您必须具备基本逻辑技能的老派推理。其他任何东西都可以教。但这并非完全正确。读取布尔逻辑,条件和循环与解决逻辑难题不同。在程序语言时代,可以解决这些问题的人可能是对的。具有更高的倾向,能够解决开关方面的任何问题。但是在我看来,面向对象/函数式编程需要一种工程思维方式,这是完全不同的(尽管并不矛盾)。
就我个人而言,我不确定我是否想在一家仍在工作的公司工作思想逻辑比实际编程技能更重要。
免责声明:我非常擅长逻辑难题,如果没有这个基本原理,我可能就不会从事这一工作。
#9 楼
面试官一定是在提到解决问题和逻辑技能,这是程序员日常工作的一部分。当遇到问题时,您需要能够使用最优化的方法进行分析,细分和编写解决方案。您可以争论这样一个难题如何很好地代表您的能力去做这个。我看不到问一个难题问题,而不仅仅是问一个现实的编程问题的优点。
#10 楼
编程与编写代码行无关,而与解决其他人(客户,用户等)的问题有关。碰巧对于程序员来说,解决方案采用程序的形式。 />
话虽如此,我不确定解决棘手的难题是否是评估某人的最佳方法。
#11 楼
访谈中的难题分为两类:“逻辑难题”(就像您被问到的那样)和“不同思维”。换种思考的类别(我不确定它们也称为横向拼图)通常是这种类型的:那棵树上有多少片叶子?或您的城市中有多少名裁缝?我对“逻辑难题”感到满意,因为他们最多只有一个或两个解决方案,并且可以通过简单的逻辑得出。而且我认为逻辑难题在某种程度上是好的,因为解决难题的过程非常类似于程序员在现实生活中的思考方式。因为它们迫使您进行假设,然后根据这些假设进行一些计算。简而言之,如果您的面试官同意您的逻辑,但不同意您的假设,反之亦然,那么您就迷路了。面试官有太多的空间不同意您的解决方案。
当我接受面试时,我不会问逻辑难题。原因:即使我要求3-4年的经验,大多数候选人在我要求他们编写诸如斐波那契数列或回文之类的简单教科书问题时都失败或放弃。
难题的问题,无论哪种方式,都是不太优秀的程序员知道,只要在网上查找此类常见难题的解决方案,他们就能打动面试官。很少有人会诚实地说出他们已经知道解决方案。
评论
通过回文,您是否表示要在线性时间内在输入字符串中找到最长的回文子字符串的难题? :-)
–b_jonas
2012年12月30日在18:15
#12 楼
两点:编程与拼图求解主要不同。史蒂夫·麦康奈尔(Steve McConnell)在“代码完成”中对它进行了详尽的解释:什么?您不必超级智能吗?
不,您不需要。没有人真的足够聪明来编程计算机。全面理解一个普通程序需要几乎无限的能力来吸收细节,并且具有相同的能力来同时理解它们。
如第5章所述,在1972年的图灵奖演讲中,埃德斯·迪克斯特拉(Edsger Dijkstra)发表了题为“谦虚的程序员”的论文。他认为,大多数编程都是为了弥补我们头骨的有限尺寸。最擅长编程的人是意识到大脑很小的人。他们很谦虚。编程能力最差的人是拒绝接受大脑不等于任务的事实的人。他们的自负使他们无法成为优秀的程序员。您学会补偿自己的小脑子的知识越多,您将成为一名更好的程序员。您越谦虚,就会越快进步。 >但在我看来,理想情况下,难题应该更复杂并且与编程相关(例如2小时的小型项目)。
问题在于,面试官是人,没有完美的“面试技巧”。 >
评论
如果您投票为-1,请问我的答案有什么问题。
–klm123
2013年11月30日19:50
+1,因为这是一个很好的答案。我本来会投票反对,只是为了取消无法解释的投票。
–missingfaktor
2013年11月30日19:57
#13 楼
有两种不同的方法可以检查此类问题:了解先前的解决方案。在电影中……《复仇者联盟》……向我解释一下……?是了解blah分别为4,3和5的情况的解决方案的示例。某些人将能够快速利用过去解决方案的内部知识,并在需要时进行调整。我通常认为这是面试官所希望的,但这可能不是一个好主意。
创造性的即兴技巧。如果您不知道先前的解决方案,或者甚至不认为该问题是可以作为Diophantine方程建模的问题,那就会是这种情况。因此,问题是您能多快地使用给出的内容并以创造性的方式找到问题的解决方案,并解释为什么拥有的东西才是问题的有效解决方案。
可以以令人满意的方式解决问题,尽管在每种情况下都需要对自己的沟通技巧进行一些测试,因为也可以尝试回答:“这真的与我申请的职位相关吗?这些技能上次使用?”如果访调员公开他们确切希望看到的是哪种替代方法在这里可能更有效,那么这可能会导致有趣的对话。
#14 楼
这不是一个特别棘手的问题。仅需要三个步骤,并且每个步骤只有两个选择。如果我的任何同事都无法在很短的时间内解决这个问题,我会感到惊讶。我们不会在面试中提出此类问题,但我认为提出此类问题是合理的。它们肯定比有关语法或库的详细问题有用。OTOH,我认为编程问题更有用。
#15 楼
您必须记住,没有绝对的方法可以确定某人将擅长工作。尤其是CS职位,因为无法预测该职位可能面临的许多挑战。,因此,潜在的雇主必须猜测您的未来表现。
意见,建议,并且可以通过时间/精力和社会工程来获得GPA,可以修饰和/或虚假的工作经验,坦率地说标准化的测试过于基础,以至于不能过度地表明能力。因此,履历表可能会显示出您历史上的努力/承诺水平,但这些都无法说明您解决计算机科学领域难题的实际能力。除了几个好的逻辑/数学/ CSy谜题,我想不出一种更好的方法来预测这种能力。
记住这是一个猜谜游戏,现实是万物都等于我们宁愿雇用一个能够解决这些难题的人,也不愿雇用一个不能解决这些难题的人。只要您不记住难题及其解决方案,也许自己研究难题就可以像任何真正的教育一样以一种真正的方式使您变得更聪明。
评论
我不了解您,但是在面试时,我更喜欢描述公司最近在世界范围内遇到的一个实际难题,并了解受访者将如何应对。有趣的是,我们最近没有客户邀请我们使用两个水桶来测量水量。通常,我们所做的涉及计算机编程。
– Carson63000
2011年4月14日在21:31
@ Carson63000并不是说您的公司遇到的实际问题不是一个好主意,但是由于现实世界中的问题和解决方案的实现而常常会浪费时间。这就是为什么涉及水桶的谜题之所以伟大的原因,是因为进入的成本如此之小,而且直接进入有趣的环节。
– 8steve8
2011年4月16日在20:57
我想您可以看到存储桶问题与例如编写软件以在使用最少数量的光盘搜寻或http请求的情况下完成任务之间的类比。
– 8steve8
2011年4月16日在22:25
评论
看起来像3D困难拼图youtube.com/watch?v=lZ64IR2bz5o此类问题的一个大问题是,它们经常衡量申请人是否曾经看过该问题,而“看过很多逻辑难题”并不是真正的良好招聘标准。
这些只是巫毒教徒的雇用方式。其他人问这些问题,使他们觉得自己应该这样做。他们知道不回答问题是“不好”,回答是“好”,但是他们无法告诉您为什么除了诸如“开发人员需要这些技能”之类的非回答之外。这是浪费时间,并且表明访问者不是合格的访问者。
是的,这些测试不是很好。但是,当程序员对这些难题至少有一点点兴趣时,这是很好的。我的建议是:研究难题,通过面试,然后决定是否要加入。
我会在面试中问这个问题,希望能找到问“ WTF与编程有关?”的候选人。并在他们离开停车场之前向他们报价。