对于SQL和C#应用程序开发工作,面试官通常使用纯C和指针询问有关树,图形和链表遍历的问题。在工作的三年中,我从未真正需要
找到给定节点右侧第一个节点的路径,该路径是给定节点的倍数
例如
我看到这些技能可能用于需要编写编译器,驱动程序并在OS内核上工作的工作中。除此之外,还使用这些技能吗?
对于SQL和C#应用程序开发工作,面试官通常使用纯C和指针询问有关树,图形和链表遍历的问题。在工作的三年中,我从未真正需要
找到给定节点右侧第一个节点的路径,该路径是给定节点的倍数
例如
我看到这些技能可能用于需要编写编译器,驱动程序并在OS内核上工作的工作中。除此之外,还使用这些技能吗?
Answers:
阅读以下Joel的答案。
特别要注意像画家施密尔这样的东西。在工作中,您可能不必重写链表,但您当然应该了解其工作原理,从而可以避免使用Schmiel。
基本上,如果您要去看医生,您希望那个医生已经研究了解剖学。即使她只是给您开一些抗组胺药,医生也会在医学院里得知某些药物对患有“慢性股骨下股骨骨折”或其他疾病的人有害。在该专业中,这种对一切的深入了解有时会使生与死之间以及与信息技术相关的产品或工作之间有所不同。
http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html
http://www.joelonsoftware.com/articles/fog0000000319.html
“……至少要花一个学期靠近机器,否则您将永远无法使用高级语言创建高效的代码。……”
“ ...就我而言,您正在基于迷信进行编程:一位不了解基本解剖结构的医生,根据药店售货员所说的有效方法制定处方。”
他们不是。许多面试都是由不知道如何寻找熟练的开发人员,也不知道他们应该或不应该问什么问题的人完成的。
大多数面试官根本不问技术问题,而更专注于毫无意义但可衡量的事情,例如您参与的项目数量(对这些面试官来说越多越好)或大学学位(对他们来说越高越好) )。他们很乐意雇用一个在大学里浪费了五年时间却一无所获的人,然后花了十年的时间来创建数十个电子商务网站,但他们不会雇用一个在几年后放弃大学并从事一些工作的人大型技术难题项目。
至少提出理论问题总比不提出问题要好。这样做的好处是可以验证该人是否具有足够的理论知识,而不是一个可能有几年编程经验但实际上并不了解幕后情况的编码人员。缺乏这种理论知识的开发人员通常 ¹不知道列表,链接列表,查找或哈希集之间的区别,并且可以互换使用它们。
在面试期间,您可能会遇到从非常好到非常糟糕的问题:
(有害)“用该语言编写的最长的工作程序的行长是多少?”
这个问题显然是错误的。我已经在另一个答案中解释了原因。面试官提出此类问题的公司很有可能以月度LOC评估开发人员的生产力。如果我必须提供建议:您不需要这种工作。
此示例与我在回答开始时引用的无意义但可衡量的内容不同。在这里,面试官还表明,通过选择以有害为人熟知的指标,他甚至对这些指标甚至没有最基本的了解。
(坏)“谁是丹尼斯·里奇?”
至少拥有某种文化确实是非常有用的,但提出这些问题却忽略了重点。如果公司寻找能够处理软件开发项目和编写代码的有才华的开发人员,那么他们不知道创建C和Unix的人的名字这一事实就没有太大关系。
(良好)“。NET 4.5的新功能是什么?”
这个问题比有关丹尼斯·里奇的问题有趣得多。如果候选人不能谈论.NET 4.5中的新功能,为什么他称自己为C#开发人员?缺乏这样的知识:
表明该人可能对编程语言或.NET社区都没有真正的兴趣,
表示该人员可能不了解其他开发人员每天至少经常使用的C#/。NET功能的一些关键知识。
另请参阅杰里·科芬(Jerry Coffin)的答案,其中包含对此类问题的更详细分析。
(平均)“哪个更快,SSD还是RAM?”
这可能很有用,它可以显示该人员是否具有足够的硬件知识,但是仍然不能拒绝不能回答这个问题的候选人。
(平均)“如何实现堆栈和队列?”
这就是您所谈论的问题。它们是理论上的,甚至可能是理论上的,但是了解幕后发生的事情可能有助于编写更好的代码。
我不会拒绝不能回答这个问题的候选人,但是会更仔细地检查他是否真的知道这些东西,例如,通过提出一个相关但理论上较少的问题:
(良好)“如何不使用递归就穿过一棵树?”
如果候选人回答了这个问题,谈论了FILO / FIFO以及使用堆栈而不是递归进行树遍历的优缺点,那么他无法回答前面的问题并不重要。
提出这个问题也是一种很好的方法,可以用来检测花费了多年CS学位但没有现场经验的候选人。
kojiro的评论很有趣,应该得到更长的答案:
有时,您需要聘用某人的原因恰恰是因为他们应该比您更了解某个主题,因此根据定义,您没有资格参加面试。出于同样的原因,即使进行面试也无法可靠地获得帮助。您所能做的最好的就是尝试根据您的理解与问题领域的相交之处提出问题,并希望您能走运。
找到好的问题可能是具有挑战性的,特别是当您雇用第一个开发人员或雇用的开发人员比实际在公司工作的所有开发人员都要熟练时。
这里有三个提示可以帮助您:
找到您认为熟练的朋友/同事,并请他进行评论。这需要很多信任,但可以使您的公司受益良多。
寻找您认为熟练的顾问,并请他协助您或进行面试的技术部分。
在Google中输入“面试问题”。它运作良好,通常会解释可能的答案。例:
Python:这十个问题似乎很好。他们可能有点基础,但可以帮助过滤掉您不想雇用的95%候选人。
Dave Pinal编写的SQL,和往常一样出色。
C#:有点太基础了,但同样,他们会过滤95%的候选者,
JavaScript:问题更开放,对于技术性问题可能不是一件好事,如果您想缩短面试时间并留出更多时间解决开放性非技术性问题。该列表仍然有助于轻松过滤不了解JavaScript基本概念的候选人。
这种方法的缺点是候选人可能使用相同的技术来训练面试。如果他查看了在Google中找到的第一个网站的每个问题,那么他可能会获得很好的评分,而实际上并没有所需的技能。
¹有些开发人员无法解释B树是什么(除了它是“某种数据结构”之外),但仍然能够正确开发。
根据我在公司进行过多次采访的经验,很有可能采访的人不知道如何正确地做到这一点。因此,他们准备了一系列技术问题并计算出相应的分数,并将其作为您的简历。但是,这样做有很多缺点,由于以下原因,不应该这样做:
你问点知识。如果程序员碰巧从未在那方面做过任何事情,那么他/她仍然可能是一个出色的同事,但只是不知道具体的答案。相反,如果某人已准备好进行面试并在网上找到该特定问题的答案,那么您将获得正确的答案,但该人可能根本不了解实际话题。
人们在面试中都很紧张。大脑处于紧急状态时可以关闭许多更高级别的区域(例如逻辑),这是一个很棒的功能,这意味着:如果您感到紧张,那么您可能无法提供日常情况下所能提供的答案质量。有些人可以应对面试等压力大的情况,许多人则不能。
使用一个正确的答案,您可以测试该人找到该特定答案的技能。这是同事需要的许多技能之一,而不是唯一的一项。因此,这些问题中的一两个应该足以测试该知识领域,然后再查询其他技能。一次仅包含解决问题的访谈,一次又一次地测试相同的技能。
什么是好的编程任务问题?
那些著名的“您可以编写一个简短的程序”问题具有一个巨大的问题,即大多数程序员如果没有IDE的帮助就无法编写一行代码。但这在日常工作中根本没有问题,因为程序员总是有他的IDE来帮助他。因此,需要考虑“查找错误”,“编写50行代码...”或什至是简单问题之类的事情,以确保申请人没有可用的工具(IDE,Google)。
例如,如果有Google的帮助,我基本上可以在1分钟内回答您的任何问题,但是如果没有Internet连接,我似乎很无助。我将其称为外包内存,它不会妨碍我,反而可以帮助我专注于真正重要的事情-了解底层机制-因为可以查找其他所有内容。但是不要问我任何随机API的详细信息,因为我不知道这些,因此我有Google。
这就是说,一个良好的编程任务问题应该不是专注于会心的API,或特殊的编码技能,除非这对工作是绝对需要的。可以获取知识,因此最好是发现该人在获取知识方面有多好,而不是问他/她已经知道什么。
对于一个编程任务一个很好的问题要短,操作简单,能够在每一种语言,只有的几行代码编码,它-尤其是-应该告诉你尽可能多地了解如何在人的作品,并认定答案。例:
“用您选择的语言编写一个函数,该函数接受一个整数数组,并以第一个整数紧随其后的方式对它们重新排序,而所有其他整数都会相应地移位。”
此时,申请人首先要问的是:“抱歉……您能解释一下任务吗?”。因为没有程序员清楚地说明过要做什么。接下来是解释,即所讨论的代码应将数组的内容向左移,并在右边添加溢出。
这项任务非常简单,任何毕业于任何形式的编程水平的人都应该能够正确回答。这考虑到程序员必须在没有工具的情况下工作,而紧张会降低逻辑思考的能力。然而,它仍然告诉您人们如何仅通过表达问题的方式以及人们如何解决问题的方式来解决问题,仅因为左移违背了常见的“从左至右”的本能并迫使人们去思考一秒。
这个问题有很多可能的答案,因此,仔细研究代码的开发方式是重要的部分,而不是解决方案是否切实可行。申请人是否测试null?溢出如何存储?是否使用循环或内存集?申请人如何验证代码正确性?这个简单的问题告诉您有关此人工作方式的完整传记。
什么是良好的常识性问题?
好的问题很容易回答,可以提供大量答案(所谓的“开放式问题”),并且可以让您在短时间内尽可能多地了解申请人。
例子:
(向C ++程序员询问): “您知道C ++之外还有哪些其他语言?”
这是入门级的问题,如果申请人对所询问的话题一无所知,这将使申请人有机会在此时此刻获得纾困。在这一点上,“不”总比折磨他/她要回答的几个问题更好:“对不起,我对此一无所知。”
另外,它首先告诉您该人已知的其他哪种语言,此外,您还将了解该人对获得更广阔的编程世界视野感兴趣的程度,或者您是否只有某一种语言的人(以及功能/技术) )视图。
(接下来,让他说他懂Java): C ++和Java在您的观点中最重要的三个区别是什么?”
这是一个开放的问题,可以提供许多答案,因此申请人有很好的机会找到至少三个。要求(个人意见)前三名不仅限制了可能的答案,还迫使申请人根据优先级进行排序。仍然(或应该)很容易回答。
这是一个简单的问题,测试了许多有关不同编程语言的深入知识。这些主题的知识到底有多深?从这些答案中,您可以了解很多有关编程语言底层机制的知识和实际理解。该人花了多少钱处理这些肮脏的细节,或者他/她只是将各种API函数链接在一起的人,却没有真正的线索来了解这些细节。
入门级问题以及简单的深入知识问题的概念也可以用于大多数其他主题。始终处于此方案中:纾困问题,验证问题,深入问题。另一个示例(来自Java访谈):
这三个问题将比任何技术问题都给您更多的信息,而申请人对于这些主题的真正了解是什么,同时可以公平地回答考虑点知识和压力水平的问题。
因此,下次有人连续问您20个编码问题时,您知道他或她基本上不知道如何正确面试某人。;)
警告:这是对@MainMa答案的一种评论,但是1)太长了,无法放入评论中; 2)我认为它对构造性问题的观点有所不同,因此它本身就是一个真正的答案。
@MainMa在他的回答中分类为“ .NET 4.5的新功能是什么?” 作为一个“好”问题。
我不敢苟同。用他的话来说,这充其量是个平庸的问题。一个好的问题更像是:“您今天编写的代码与N年前编写的代码有何不同?” (对于某些N值小于简历中列出的工作年限,最好是3到5岁左右)。
用他的话来说,问题在于记忆。该候选人是否已完全记住功能列表?按权利,最准确地引用微软名单的人应该是赢家。
您应该关心的是他的编程。这如何影响他的代码?他真正使用哪些功能?更重要的是,他是否对何时使用哪些新功能以及何时使用较旧的功能就足够好表现出了很好的判断力?
仅仅说“ LINQ”就不会告诉您有关候选人的任何实用信息。可以这样说:“ LINQ帮助我的代码变得更加紧凑和易读,因为我可以清晰,直接地表达X,Y和Z概念,而以前我不得不跳过以下繁琐的步骤来完成这些工作。” (或类似内容)会告诉您有关应聘者的许多信息,他编写的代码类型,判断力,灵活性等等。它还为您提供了更多的机会来跟进有关此人如何思考问题,编写代码,思考代码等等的后续问题。最后,它使您更好地了解这是真正具有N年经验的候选人,还是具有一年经验(重复N次)的候选人。
简介:能够引用几年前的功能列表是没有用的,并且几乎没有告诉您有关候选人可能真正有用的信息。候选人作为一名程序员的发展可能会引起更大的兴趣,因此最好直接提出来。
现实情况是,大多数开发人员在其职业生涯中所做的大多数日常工作都是微不足道的。这意味着您在求职面试中遇到的一些问题可能实际上不会面对您,但这并不意味着提出这些问题是没有意义的。
假设您的公司有一个空缺职位,而您目前正在面试人员。您已经有20到30名开发人员在排队。那么,您将如何为该职位选择最佳候选人呢?可以说,他们在这项工作中要做的最具挑战性的任务是从文件系统中打开文件,逐行读取数据,稍加修改后将其放回原始文件中。
您要问他们如何打开文件吗?我敢打赌,答案之间看不出太大的区别。因此,您必须提出一种解决方案,以区分只知道如何打开文件的开发人员和那些可以开发糟糕的实时应用程序的开发人员。即使您不希望他们构建这样的应用程序,但您仍然希望雇用最合适的人选。
就像我们生活中的任何其他事情一样,您意识到有些点需要去学习更多。如果您不知道什么是链表,对我来说,这是一个程序员,从字面上看,这意味着您在职业生涯中还没有真正达到那种程度,感觉不到需要去学习特定的东西。为什么?仅仅因为您从未参与过一个足以要求您将技能提高到那个水平的大型项目。如果您是入门级人员,可以说我确实没有从事这项特定工作的工作经验,但是如果您知道这一点,则意味着您有足够的自我激励能力,可以使自己处于高于平均水平的水平至少。
完成这些任务所需的技能很少重要。重点是回答问题的方法和随后的对话中展示的技能。
当我采访开发人员时,我会寻找(a)精明(b)做好事(c)会适合。担任任何角色都需要基本的技术知识,这必须与学习和获得新知识的意愿相结合。技能。面试是关于选中这些框的。
我更喜欢阅读申请人编写的代码。我不喜欢面试的罐头问题,但是在没有代码的情况下,它们提供了一些要讨论的问题。我更喜欢问有关RAII或IOC或IDisposable的实现,而不是列表和集合,但是只要我们能使其足够技术,任何事情都会做。
面试官最担心的是雇用实际上对编码不太了解的人。您必须谈论工作经验以外的其他东西才能清除假货。
这些问题是为了筛选出无法编程的人。有时,那些不能编程但知道很多琐事的人申请开发工作,而让他们写出有用而又琐碎的东西对于面试来说太费时间了。
使用理论对象是为了方便起见,因为您应该知道平均树/图形/列表实现的含义,因此知道如何解决随机遍历问题,但是这些问题根本与理论对象无关。
他们将要能够使用抽象模型,了解抽象问题并使用任何一种算法来解决。这是纯粹的开发技能,因此必不可少。这就是为什么这些问题有意义的原因,而不是因为它们被认为是准确的现实生活情况。