SDE面试编程代码出问题?曝科技公司Technical interview时的8个误区!

面试北美科技公司时总绕不过Technical interview。其中很多人却并非因为技术问题而落选!今天我们就由Technical interview练习平台录入的超20,000次的模拟面试为基础,概括出软件工程师在技术面试中易犯的8个常见错误,并且制定了避免、应对的建议。

(请注意,错误是按其发生率,而不是严重程度列出的。)

No.1 在提出解决方案之前就开始编写代码

出现率:20.66%

问题所在:

在彻底思考好解决方案之前,深入编写代码无疑是得不偿失的。没有完整的方案就开始编码,当你意识到你所做的事情太复杂或毫无意义时,时间已经所剩无几。

莽撞而匆忙的行为或许是因为紧张,或许是因为过度自信,切记悬崖勒马!一边编写代码一边找出解决方案其实并不可行,这会耗尽时间,匆忙编写代码的结果是“做得更多”而不是“做的更好”。

建议:

首先需要理清自己的思路,将整个问题分解成简单的小部分。当准备开始编写代码时,最好先写出伪代码来解析自己的方法。以举例的方式,来说明算法中的关键步骤。

Only after both you and your interviewer agree that you have a good solution, proceed to implementation.

在开始编写前,早些提及那些缺乏理性的,粗暴或天真的方案是必要的,这有以下三个原因:

首先,它可以避免尴尬的沉默时刻,让你有可以描述表达的观点;同时也有助于找出最佳的解决方案。

其次,不成熟的解决方法有时可以通过优化,成为最佳解决方案。

最后,作为一名软件工程师,主要职责是编写一个可行的解决方案。正确性优先于效率。

No.2 不重视计算机科学的基本原理

出现率:20.05%

问题所在:

不管喜不喜欢,而今大多数编码面试仍然围绕数据结构和算法(DS&A)的问题展开。无论是Dropbox,Airbnb,Uber&Palantir这样的拟上市初创公司,还是Google,Facebook, Amazon,Apple这样的巨头公司,都是如此。

You may be an exceptional practical programmer, but if your command of core DS&A is lacking, you’re unlikely to get the job that you want. Yes, this sucks, but that’s reality.

建议:

利用一些时间学习或复习数据结构和算法(DS&A)。这不仅可以帮助你度过编码面试,还可以让你成为更好的软件工程师。掌握基本的DS&A是每一位软件工程师的基本技能。

No.3 沉默

出现率:15.80%

问题所在:

面试官不是绝地武士,不会读心。你可能会因为思路不是十分清晰连贯而感到焦虑,但如果不能鼓起勇气说话,通过面试的希望便十分渺茫了。仅仅在面试开始时,解释解决问题的方法是不够的。即使在执行和测试算法期间,也最好和面试官保持全程交流。

建议:

夸大我们的想法,对于其他人来说,显而易见是一种常见的认知偏见,在过度交流方面更是如此。在面试时,向面试官展示你的步骤和推理过程。如果你感到焦虑,不能有效地表达你的想法,可以寻找一些让自己冷静下来的技巧。一边谈话一边编码对很多人来说并不十分习惯,一个专业的练习平台是必要的。

No.4 编程语言命令不佳

出现率:12.56%

问题所在:

你可能有很好的解决问题的能力和算法思维,但如果你不知道所选择的编程语言的核心结构,功能和语法,那么这将会造成一定的麻烦。

考官基本不会考察在稀有情况下使用的一些深奥数据的结构界面。但如果你不了解基础的知识点,例如C中的内存管理,Java中的继承,Python中的列表解析或者JavaScript中的闭包,那么再见,你的面试基本GG了。初学者一般容易犯下这个错误,但它也时时发生在拥有深厚理论知识但缺乏实践经验的学者身上。

建议:

如果可以选择,尽量用自己最熟悉的编程语言进行面试。面试官通常是灵活的,可以让你选择熟悉的编程语言。如果情况特殊,例如面试必须使用JavaScript的前端职位,那么就需要做好复习,提前掌握需要的编程语言技能。

Learning from books won’t cut it and you need to get your hands dirty. Program a few projects, contribute to open source, or better yet, do both.

边学边练习是真正掌握编程语言的唯一方法。如果你需要一个关于项目的想法,利用Google搜索查询将会得到很多信息。

No.5 不使用测试

出现率:10.33%

问题所在:

因为没有进行测试运行代码,与职位失之交臂。首先,代码在某些特定的测试中失败是很常见的事。经过测试,可以发现错误并尽快解决它们。此外,你可能会想出一个面试官没有想过的原创解决方案。通过举例说明,展示每一行代码中每个变量的变化,让面试官更容易理解这个解决方案是有效的。

Hiring engineering managers love test cases. In fact, for some of them not using tests is an outright deal breaker even if you reached to the right solution.

建议:

在面试中,建议分三次测试方案。

第一次是在面试官问过你编码问题之后,使用一个或两个例子来验证是否完全理解了这个问题(更多细节参见No. 06)。

第二次是在勾画出解决方案之后,使用测试用例,通过伪代码来引导并验证其正确性。

第三次是在完成了编写代码后,再次进行测试,以确保没有任何问题。

No.6 错误解读问题

出现率:9.11%

问题所在:

在所有的问题中,读题错误是最容易避免的。但依然有大约9%的面试者会马虎以至于误读问题。这里没有太多需要说明的地方。

If you misunderstood the interview question or made assumptions about the problem statement or input that you shouldn’t have, it’s likely that you’ll fail your interview.

建议:

在面试官解释完问题之后,第一件事就是用自己的话复述一遍,以证实是否正确地理解了问题。如果弄错了,面试官会告诉你的。这样简单的一步可以避免文不对题的尴尬。

在复述这个问题的同时,可以适当提出几个简单的输入示例,以确保预期结果的正确性。这会让面试官更容易知道你是否理解了这个问题。

另一项需要注意的是,可以适当做出某些假设。例如,你可以询问,输入是否排序,自己是否可以假设输入是有效的,或是在特定范围内的。也可以和面试官一起缕清需不需要针对时间或空间进行优化。

No.7 忽略边缘案例

出现率:8.31%

问题所在:

在所有的问题中,读题错误是最容易避免的。但依然有大约9%的面试者会马虎以至于误读问题。这里没有太多需要说明的地方。

If you misunderstood the interview question or made assumptions about the problem statement or input that you shouldn’t have, it’s likely that you’ll fail your interview.

建议:

在面试官解释完问题之后,第一件事就是用自己的话复述一遍,以证实是否正确地理解了问题。如果弄错了,面试官会告诉你的。这样简单的一步可以避免文不对题的尴尬。

在复述这个问题的同时,可以适当提出几个简单的输入示例,以确保预期结果的正确性。这会让面试官更容易知道你是否理解了这个问题。

另一项需要注意的是,可以适当做出某些假设。例如,你可以询问,输入是否排序,自己是否可以假设输入是有效的,或是在特定范围内的。也可以和面试官一起缕清需不需要针对时间或空间进行优化。

No.8 代码不易理解

出现率:7.69%

问题所在:

技术面试不仅仅关乎正确性和效率,也关乎面试者的代码风格。你的代码也许是有效率的,经得住推敲的,但如果只有你自己能够理解代码,那么面试结果,十之八九是惨烈的。

Hiring managers look for engineers whose code is legible, maintainable and idiomatic. Code that other team members can pick up from where you left off easily.

这个问题在初学者、语言切换者和编程竞赛参与者中很是普遍。以下是应该避免的一些造型错误:

一.给变量,函数等赋予随机的,非描述性名称。例如,对非索引变量使用单个字符名称,或者调用函数’func’。编程竞赛开发人员尤其需要小心,因为他们习惯于在其程序中使用短名称,以便更快地编写代码。这在面试中是非常不利的。

二. 代码风格不一致。每个人都有自己的编程风格,但混合随机编码标准并不是一个好主意。例如,使用不同的命名方式,或者同时在camp Richard和camp Winnie使用制表符。同样,如果您将大括号放在同一行上,不要在后面的编程时又放在新行中。

三. 使用保护性代码(例如NULL检查和许多特殊情况)而不考虑是否必要。这导致代码更复杂,更加难以理解和调试。

建议:

适当保持代码简短。按照常识在适用的地方给出描述性的名字,并在面试期间选择一种代码标准。最好使用惯用的代码。否则,面试官可能会怀疑你的编程语言运用的不够熟练。

阅读完全文,大家可能已经注意到,在技术面试中,面试者犯的大部分错误与技术技能无关。事实上,非技术性错误(No. 1,3,6)占所有错误的44%。这表明面试与编程有着根本的不同。许多经验丰富的软件工程师认为他们不需要准备面试。这是一个很大的错误。

软件工程师的技术面试不但要求技术上的优秀,同样要求软技能的优秀。


Hi,我们是直通硅谷!

我们专注于全球科技行业求职培训,心之所向,是壮大全球华人科技力量。凭借实战中积累的丰富经验,及由700+全球科技公司在职面试官组成的导师库,我们让求职这件事成为系统的科学,并变得越来越简单!

自2015年,直通硅谷独家春招计划已帮助5000+学员成功进入全球顶尖科技公司!


科技求职
你只需要一个
ALLinONE计划
已帮助5000+学员
进入全球顶级科技公司
1V1计划咨询

有哪些适合你的方向?
查看所有秋招计划