@程序员,如何在编程面试中脱颖而出?

原文链接: https://bss.csdn.net/m/topic/dev_survey2019?source_id=zx

如果能多了解一些面试的基本知识,可以帮助你在面试中对自身有更准确的定位,并且能提升你的面试技巧。

@程序员,如何在编程面试中脱颖而出?_第1张图片

作者 | edA‑qa mort‑ora‑y

译者 | 苏本如,责编 | 郭芮

出品 | CSDN(ID:CSDNnews)

以下为译文:

由于不知道面试官对面试者的衡量标准,许多我曾面试过的候选人在面试中表现得差强人意。虽然不同的面试官有自己不同的衡量标准,但这些标准间也存在一些共通之处。如果能多了解一些面试的基本知识,可以帮助你在面试中对自身有更准确的定位,并且能提升你的面试技巧。

我在interviewing.io(译者注:美国一个在线技术面试平台)上会根据三个方面来评价面试候选人的表现。我认为这三方面基本代表了各家公司对你的评价的依据。即便这三方面的能力没有在面试中直接被考察,它们也会影响面试官对你的总体评估。

  • 问题解决能力

  • 技术能力

  • 沟通能力

虽然我需要对以上每一种能力分别评分,但这三个方面的能力其实是紧密地联系在一起的。如果一个候选人缺乏其中的一项能力,他往往也会欠缺另外两方面的能力。让我们一起看看每种能力都有什么独有的特征。

 

640?wx_fmt=png

问题解决能力

 

问题解决能力是从代码编写中体现出的一种抽象的能力。我想了解你编写代码的整个过程,而非仅仅是一个结果。这就要求你知道问题是什么,以及对何种有效的解决方案会被我认可有着清晰的认识。解决问题的关键很大部分在于定义约束条件,找到模糊或不确定的地方,并加以解决。

不同问题设置的挑战也不尽相同。例如我的纸牌游戏问题2要求你编写一个小型的仿真游戏。我想看到的是你如何解决问题,我还想看到的是你会提出问题。例如“纸牌”到底是什么,你又会用什么代表它?“发牌”又具体是什么意思?

解决问题的关键在于接收到高层次的需求并将其转化为具体的步骤。如果你正在做一个项目,那么问题解决的阶段就是你编写用户故事和用户旅程的阶段。你不一定要在面试中很刻意地体现这个阶段,但我想知道你是否对要求有所了解。你得告诉我你的想法并写下其中的重点。

你需要展示出解决问题的时候你的输入和输出内容分别是什么。你需要说明你是在转换数据还是实施一个流程。你还需要描述你是如何将大问题分解为较小的问题的。就一个算法问题来说,你需要指出所应用的相关算法,并告诉我如何让它们适用这种新情况。

你要明确你识别出了哪些部分,以及它们与你之前所做的有何相似之处。如果有一块白板,请你在上面勾画出流程、数据集和你想到的任何其他内容。尤其当你遇到难题的时候,我想知道你是如何解决这一难题的,永远不要只是沉默而茫然地盯着我。我在这里是为了向你提供帮助,但是如果我无法理解你的思考过程,那么我将无法帮助你。

另外,绝对不要将解决问题视为一个阶段。我并不指望你在面试开始时就能提出完美的解决方案。但我想看到的是,你产生了一个想法并将其付诸实践,这其中可能会产生问题,需要纠正。我甚至会更改对你的提出的需求,或者批评你的方法,但我希望你能接受这些改变并适应它们。

 

640?wx_fmt=png

技术能力

 

我对应聘者的技术能力主要考量两个方面。第一是你在编码习惯用法和知识方面的经验,你是否知道什么是可能实现的,以及如何对其进行编码?第二是具体的语言能力,当你明白了你想做的事情后,你能用你使用的编程语言把它实现得多好。

第一方面是关于你的一般编码知识。你是否了解数据结构,程序流程以及编程语言能够执行的所有操作?这些知识就像是你的工具箱,会影响你解决问题的能力,而你的编程设计是否有效,则取决于这些工具是否可用。

我在这里会根据应聘者的犹豫程度或是否快速回应来评估他们。但我并不是在评价速度本身,而是会将速度作为候选人对自己工具的熟练程度的指标。我同样会听你的表达方式,看看你的声音是信心十足,还是带着疑问需要向我寻求肯定。

第二方面是考察你对具体编程语言的语法和语义的了解,这与第一方面联系极为紧密。因为我是主要通过观察你是如何在代码中表达自身想法,从而了解你对一般编码知识的掌握。如果你需要费尽心机才能编写出一个循环,那么我需要确认这是因为你不懂编程语言,还是你不确定循环应当如何应用于这个问题。

我会考量你是否有能力将你的想法顺畅地转化成代码。以我的纸牌游戏问题为例,有一个阶段是处理发牌,在这一阶段中你必须将纸牌分成两叠,每个玩家一叠。无论你是选择使用循环,还是高级拆分功能,你都应该能够顺畅地编写出这段代码。如果你编写了错误的代码、忘记了循环的工作原理,或是使用了错误的拆分语法,都会导致面试官对你产生负面的评价。

我不会因为一个人犯错而惩罚一个应聘者,因为错误总是会发生。但是,若是出现相似的错误,或重复出现同样的错误,会让我认为你缺乏相应的知识。如果我发现了一个错误,我可能会忽略它,也可能会就这一代码错误向你提问。如果你能够认出自己的错误,会让面试官对你的能力做出正面评价。

编程语言有很多特性,而我会考量你是否能够恰当的使用它们。例如你是否在使用枚举和常量?你是否能够创建一个结构来封装值?你是否通过值或引用正确地传递了变量?你是否使用了标准错误机制?

我不期望应聘者能够了解所有与编程相关的知识,但我希望他们可以了解所有的基本知识。对于自称对使用某编程语言有经验的应聘者,我会考察他们一些常用的习惯用法。例如,在Python语言中,我会考察他们对列表解析(list comprehension)和字典的使用。在C ++语言中,我会考察他们对智能指针和(可能)lambda函数的了解。如果一位应聘者的代码中没有任何常用的编程语言习惯用法,那么他很可能并没有使用该编程语言的经验。

 

640?wx_fmt=png

沟通能力

 

正确地把你的想法表达出来能确保我对你做出准确的评价。有的应聘者做不到这一点,他的表现就会劣于其他候选人。表达流畅能提升我对你的沟通能力的评价,同时也确保面试进行得更加顺利,并有助于你准时写完代码。

如果你在面试中写的代码中有些错误,良好的沟通也能为这种错误起到缓冲作用。如果你仅仅写完代码,那我就只能通过代码来衡量你的能力。如果你与我沟通自己是如何写这段代码的,即便这段代码写错了,我也能理解你的思路。

但你的沟通方式如果是仅仅把所写的代码念给我听,那将毫无裨益。我自己也能看代码。你应该把沟通的重点放在代码中无法体现出来的,编程者在代码背后的思考。有许多应聘者知道在面试时应该多沟通交流,但我觉得他们不知道应该说些什么。因此他们最终选择直接再念一遍自己所写的代码。你要学会和他人分享你写代码时的思路,但这需要多加练习。

注意使用编程术语。你应该知道如何使用行业术语来谈论软件。你的编程术语会透露出你的经验是否充足,也会表现出你对细节的关注程度。我想要听到具体的东西,比如实例变量、常量值和使用参数调用函数。我想听到你说“从堆栈中取出数据和枚举一个Map中的所有元素”,而不是听到“用这个东西做这个”之类的话。

我也不想听到你在面试中使用时髦术语。也不要使用一些你不懂的专业术语,或对一些专业术语不懂装懂。不诚实是面试中的一大危险信号,不要以为你能侥幸逃脱不被面试官看出来。我和那些在人力资源部门工作的大多数人以及做过大量招聘工作的许多程序员一样,都很擅长发现胡话连篇的人。

你不需要担心自己有很多不懂的东西。我会根据你的经验和水平来调整对你的预期。初级程序员没有接触过很多概念是很正常的。你需要保持开放的心态,做个诚实的人,并保有好奇之心。然而,我对一个有十年以上工作经验的面试者的心理预期会更高。

面试是一个互动过程,良好的沟通可以让我们处在同一频道上。不良的沟通往往会导致我对你解决问题的能力和编程能力产生误解。我越了解你的想法,就越能帮助你解决问题。

 

640?wx_fmt=png

结束语

 

一般来说,缺乏沟通技巧或解决问题的能力会导致应聘者的面试失败。我想不到有什么公司会想要雇佣一个缺乏这两种能力的人。当然在某些特定情形中,也许会聘用一些缺乏这两种能力但具备某些冷门技术的人。但即便如此,你也需要和其他候选人竞争。

还有一些人虽然可以编写基础代码,但是无法把已掌握的知识融会贯通地应用到新情况中。他们看上去掌握了一种新的方法,但其实并不理解这种方法背后的逻辑。我不能保证我在面试中根据观察到的情况从而对应聘者产生的印象都是正确的,所以应聘者在面试中充分地展示他们的能力是非常重要的。

你可能想知道如何在面试中展示自己的这些能力。显然,要提高其中任何一种能力都需要不断的练习和学习。但是要在面试中全部展示出来则需要平衡好。不要让你的脑子陷在代码中,要表达出你的想法,这是展示你的知识储备和问题解决能力的关键方法。不要担心会暴露你的知识的局限性,相反,要开诚布公,展示你是如何解决问题的。多和面试官交流。也可以利用白板来进行图示。

你要清醒地意识到自己被评估,从三个主要方面:解决问题能力、技术能力和沟通能力。

原文:https://dev.to/mortoray/how-i-evaluate-you-in-a-code-interview-42hh

本文为 CSDN 翻译,转载请注明来源出处。

你可能感兴趣的