当要求面试候选人在白板上编写程序时,您是否希望该候选人编写语法上正确的代码?
我有两个候选人,其中一个编写了在语法上正确的程序,但是逻辑不符合要求,另一个候选人的逻辑编写得更好,但是语法很糟糕。
我赞成第一位候选人。
当要求面试候选人在白板上编写程序时,您是否希望该候选人编写语法上正确的代码?
我有两个候选人,其中一个编写了在语法上正确的程序,但是逻辑不符合要求,另一个候选人的逻辑编写得更好,但是语法很糟糕。
我赞成第一位候选人。
Answers:
我希望能够推理出问题的人,想出一个好的解决方案,然后向我解释他们的解决方案。即使他们的逻辑不是100%,如果他们处在正确的轨道上并通过问题进行推理,提出正确的问题并走正确的道路,那也将是我的赢家。
在开发工作中的代码时,您有许多工具-IDE,编译器,静态分析,单元测试,集成测试和验收测试过程-查找语法和逻辑错误。如果您在白板上书写,则没有这些工具,并且肯定会在语法上犯错误(忘记方法名,分号,花括号),我可以原谅。
我唯一的问题是:为什么要让候选人在白板上写实际的代码,而不是专注于算法,设计策略和逻辑思维?编程语言不断变化,解决问题却没有。
我希望第二位候选人。逻辑是很难(很辛苦,有时),以获得准确的权利。当IDE和编译器以及其他各种工具提供帮助时,语法很容易正确。
第一个候选者可能永远不会触发编译器错误,但是如果他的代码在各种奇怪的(且不太奇怪的)边界情况下经常失败,那么他知道在何处放置分号就不那么值得了。
根据实际的语法错误,我想我会选择第二个候选者,因为检查语法通常最好交给机器。
诸如缺少分号,忘记括号,忘记参数列表中的逗号等错误,甚至是非语法错误,例如在调用函数时切换参数顺序通常也被语法荧光笔,编译器或第一次运行代码时捕获,所有通常使用的东西,但在白板上不可用。
但是,存在一些错误,尽管从技术上讲仅是语法错误,但显示出更深的误解。
作为说明问题的一个人为的例子:考虑一个Python程序员,他用$前缀所有变量,或将for循环写为for list as item
。从技术上讲,两者都是语法错误,但是即使只有限地接触python,也应该知道合法字符和for循环。很好的猜测是候选人知道php(或perl?)并试图虚张声势了解自己的python技能
我已经写SQL和CSS(我所知道的最简单和最基本的语言)已近13年了,我一直都不记得语法。
我的朋友(也是一名开发人员)在一家对冲基金工作,他永远不记得插入语句的语法。
我们俩最终都进入了W3CSchools,我想我们应该为此感到尴尬(他拥有学位,并且拥有博士学位)。
但是,老实说,我认为我们有正确的优先事项。语法不是一项重要技能。
面试总是很尴尬的情况-您可以说出来,因为当您走出去时,您会立即想到应该说的所有内容,或者对问题的正确答案以及想问他们但忘记了的事情。因此,鉴于此,期望没有语法错误的完美编写的代码是不现实的。
另外,您对完美代码的期望(在白板上!)可能与面试官不符-例如,在我参加的一次面试中,我被要求写一堂课,我这样做是为了让面试官不让我投入在复制构造函数中。所以我写了一个,除了设置a = b之外什么也没做,但这足以让他满意。我对问题的期望不需要复制ctor,因此我把它排除在解决问题之外-我没想到必须编写完全合规的编译代码(按照他的隐藏编码标准),只是显示我对解决方案的理解。(同一位面试官也不喜欢我的解决方案,这也不是他会怎么做的,所以很显然我错了,叹了口气)。
如果要从受访者处获得工作代码,请给他们一个编译器。然后,当他们为您开具发票时不要抱怨:)
因此,去找一个知道自己在做什么的人,而不是一个会模仿单词但不理解含义的人。
好吧,有些人想要伟大的Java开发人员,伟大的C#开发人员,伟大的C ++开发人员,等等。我会担心的是,如果他们不能推理解决问题,您如何期望他们推理和解决您的业务问题?
其他人只想要优秀的开发人员,他们可以使用任何需要的语言进行工作。他们考虑/建模问题,然后以任何语言实施。如果您突然决定.NET很烂并切换到Java,反之亦然,那么这些开发人员就不会跳槽或拒绝学习。另外,如果您获得某种类型的具有专有语言的自动化程序包/计算程序包,并且您需要一些自动化的任务,那么这些类型的开发人员就可以做到这一点。现实生活中的示例...我需要找出一种用于地图软件包的自定义专有脚本语言,以便为老雇主提取自定义绘制区域的邮政编码。另一个例子...我的现任雇主拥有专有的财产管理系统,其中包含用于编写报告的自定义语言...无论如何,
此外,白板上还有额外的压力/紧张感,因此没有人处于最佳状态。另外,我非常怀疑在编写代码时每次都能做到完美。我怀疑您编译或只是运行并发现一些错误。另外,它取决于语言。C足够小,您可能可以记住大多数语言/核心库(尽管我不需要它)。Java / C#具有如此庞大的库(经常更改),因此记住该库是不可能的。
同样,了解多种语言也会对您不利。C#和Java彼此干扰。但是,了解多种语言也可以拓宽您的视野,特别是如果您除了C#/ Java之外还知道脚本语言和功能语言时,尤其如此。
如果两个候选人都用正确的逻辑解决问题,那么语法正确的人可能会有优势。如果一个人解决了问题而一个人解决不了,那么就我个人而言,我会选择可以解决问题的人。
如果有人声称自己是Java方面的专家,并且无法声明使用if语句或while循环的数组,那么他们可能在撒谎。但是我可能会理解,如果有人是Java的专家,但是最近接触了很多C#并尝试做Map之类的事情……。另外,如果您了解该库的详细信息,还是有人做了myArray.length而不是myArray .Length或string.length()/ string.Length / string.length而不是string.length()...我会原谅的小事。或者,如果他们忘记了某些库调用的参数顺序。或这里或那里的错字/半冒号...
我不会带任何一个。
如果程序员不擅长解决问题,那么好的语法是没有用的。对于给定语言而言,较差的语法意味着候选人可能对这种特定语言不满意,也许是因为缺乏直接的经验。
无论如何,逻辑远比语法重要。
这肯定取决于面试的职位,也可能取决于语言。
在C ++上工作,让一个人口吃语法简直令人恐惧。C ++充满了黑暗的角落,陷阱无处不在。语法上的断断续续意味着对语言的理解不佳,并且C ++初学者会犯很多错误(并不是说其他人有时会犯错)。
要回答您的问题,然后:
只有一个警告:人们承认自己缺乏经验。理想情况下,人们应该使用自己选择的语言编写代码,或者,如果他们愿意,则使用伪代码(例如学生)。
逻辑上不能满足答案的人不合格。我们行业中有太多的人在生产垃圾代码,这些代码合规但实际上并未执行应做的事情或处理错误或极端情况。
根据错误的类型和数量以及您希望他们写的内容的难度,第二人称可能会或可能不会不合格。用SQL术语(我写的语言)来说,那些不记得显式联接语法的人没有资格从事要求您查询数据库的工作,没有例外。谁不记得如何进行追溯性CTE(但知道它们的存在并尝试使用一种)的人就不会了。换句话说,我希望该语法对于您始终编写的基本代码更正确,但对于仅偶尔执行的操作而不是复杂语法而言,不会更正确。
如果我考虑一个我认识的人,在相关领域具有出色的资格,但是对我的特定语言只有很少的了解,那么我可能也会宽恕语法错误。我宁愿雇用一位出色的Oracle开发人员,而不是一位普通的SQl Server开发人员来从事SQL Server工作(当然,一位出色的SQL Server人员将是最好的选择),并且不希望该人员知道SQL Server语法,如果他们可以向我展示如何在Oracle中完成。对于Java和C#而言,具有同样出色的解决问题能力的人胜过具有出色的语言能力的人,但是每次都胜出的人(有时很难找到)。