年后跳槽,一直都是大多数人的选择,新的一年迎来一个新的开始,那么,如何在面试中大获全胜呢?以编程为例,其他同理。
面试
从提交申请到正式入职,通常我们会经历3-5次面试。首先是HR经理的电话面试,接着还有几场技术面试。
一位求职人员在一家公司的面试中花费的时间平均为8个小时左右。面试的目的是为某个职位寻找合适的技术人员,并从他们身上获取高于薪资的价值。
根据形式不同,一场面试通常需要45分钟~1个半小时。我的一位经理曾说:“你必须搞清楚面前这个人是否值一辆兰博基尼,因为公司每年在这个人身上投入的资金超过了一辆兰博基尼,即20万~30万美金(包括办公室租金+各项福利)。”
HR透过求职者身上的哪些特质判断出他将有长期的良好表现?
哪些因素有助于取得面试成功?
在我看来,最有利的因素有三个:
- 良好的人品;
- 适合的技术经验;
- 解决难题的能力。
简历
作为面试官,一般我都会在面试前仔细阅读两遍简历。作为面试者,我很讨厌那些根本不看我简历,却占用我的时间的面试官。通常,在简历中写:“努力工作,注重结果”之类的言辞,基本没什么用。为了突出自己,你必须更具体:“我参与了项目X,在其中负责工作Y,最后取得了结果Z。”
如果求职者在简历中写明GitHub链接,我就会去看他们的GitHub,看看他们都构建了哪些产品。即便他们不是编程高手,但至少证明他们能够写代码,而且能够与其他人合作,完成工作。
推荐
如果你信得过某个人,那么他的话在你这里一定很有分量。尤其是当你给某人写推荐信时,一定要说清楚:“你是否曾经与这个人共事,你觉得他能够胜任这项工作吗?”而作为面试官,我也会打电话给推荐人,问问他们:“他的表现如何?你愿意再次和他合作吗?”
以上是面试之前需要做好的准备,下面我们来看一看实际的面试。
编程面试
根据经验,面试中能否给出正确答案与在工作中是否有良好的表现,二者之间的联系并不大。然而我发现,面试者找到解决方案的方式之间有一些共同点。
举个例子:编写一个函数,将整数(比如100)转换成“one hundread”。我发现,是否掌握了处理复杂数据结构的编程技巧,与实际工作中的长期表现之间几乎没有联系。通常在日常工作中,你只需要完成基本的工作。
技巧1:澄清问题
绝大多数的实际问题都是模棱两可的,深入挖掘基础的问题,澄清范围,这一点非常关键。
例如:
面试者是否注意到了问题的范围?
这个数字有多大,是否可以为负数?
如果是动态语言,则“只考虑数字的情况吗?
小数和分数呢?”
技巧2:讨论各种可行的方式,总结出大致计划
优秀的面试者不会上来就直接编写代码,他们会解释自己的方法和思维模型。这意味着他们愿意在动手编写代码之前,与他人合作,探讨可行的方式。这个时候,你可以利用白板,或者在纸上画出来也可以。
大多数的实际问题都需要团队达成一致。能够与他人交流你的想法,说明每种方式的优缺点,这一点非常重要。
很多大问题都没有正确答案,你需要权衡利弊。能够统一取舍很重要。
技巧3:使用自己熟悉的环境
绝大多数工程师都有自己的IDE:vscode、sublime、vim等。使用自己熟悉的环境,他们的表现往往会更出色。当然,这个环境依然是面试专用的环境,他们仍然有时间的压力,但是这更接近实际的工作。
一项A/B测试,针对同一个问题,使用他们的电脑,共享屏幕,然后分别使用coderpad.io和sandbox.io。结果发现,在前端开发的问题中,使用sandbox.io的面试者的表现更好,因为阻碍他们尽快开始编程的问题更少。
面试者使用自己电脑,共享屏幕,克隆代码库,这也是一个很好的技巧。coderpad.io能做的事情很少。通过让面试者克隆代码库,可以看出面试者是否能够快速适应一个不熟悉的代码库。
在Google的面试中,他们让我在Google文档中编写代码。这种做法一点都不好。根据我的经验,Stripe的面试过程不错。在面试中,你可以将GitHub代码库checkout出来,然后在自己的电脑上,用自己最喜欢的IDE打开代码。
技巧4:写代码 -> 运行 ->调试
编写完一段小代码后,运行试着一下,看看能否得出正确的结果。
面试者可以通过这个迭代找出小错误,从而在面试中有更好的表现。
有的面试者一直在写代码,从来都不运行,直到面试结束。结果,最后运行的时候,代码编译不过去或出错。
表格测试也是一个很不错的技巧。你可以编写一个数组:[[输入,输出],[输入,输出],[输入,输出],...],然后传递给一个简单的测试函数。看到测试用例和代码复杂度的变化,面试官也会很高兴。
总结——目光长远
我们必须通过编程问题和接近实际的工作环境来测试候选人。更加重视自己之前的经验。有时候我们需要花费一两年的时间,才能深入理解整个代码库,因此我们必须将眼光放长远。