微信号:hackerline

介绍:精选Hacker News内容.

Amazon公司软件工程师招聘流程剖析

2016-07-12 08:02 Hacker时间

我最近刚刚与一位Amazon公司的技术招聘人员取得联系。该公司正在组织一场软件工程师面试,旨在为其柏林办事处补充新鲜血液。

从开始接触到最终签订合约的整个过程持续了两个月。在这里,我希望与大家分享我的见闻,包括如何一步步完成考查以及怎样才能顺利完成这些测试。

如果文章中不慎漏掉了某些重要的内容,请大家在评论栏中留下您的意见,我会尽可能在更新中将其补上。

4月27日:第一次接触

我是通过领英与招聘者取得联系的。她告诉我,他们正在为柏林办事处的一支团队特色合适的人选,并表示如果对此抱有兴趣,不妨发一份简历给她。我一直在持续更新自己的简历,所以第二天一封带有简历附件的邮件就被发送出去。

她回应了关于职能角色与面试流程的一些基本信息。第一步是通过Hackerrank网站(https://www.hackerrank.com/)接受技术测试,当天我就收到了指定测试内容的对应链接。

整个测试过程耗时120分钟,这位招聘人员要求我在5月5号之前完成。由于时间还比较充裕,我决定慢慢来——也就是等到周末再着手进行。

5月1日:预审

Hackerrank网站有自己的一套面试平台,名为Hackerrank for Work。我点击邮件中的链接后即被转向至该工具。其内置一套计时器、一款包含某种Java自动补全功能的Web编辑器、问题描述以及一系列作为测试项目的待解决题目。

在开始考试之前,我根本不清楚测试内容对可使用的语言类型做出怎样的限定。最终我面对的是C、C++以及Java等几种编程语言,因为其中并不包括我最擅长的Go或者PHP,所以我的选择是较为折衷的Java。

整套测试包括三道问题,纯粹是考验技术水平而并不要求以特定顺序进行解答。

问题

第一道问题与面向对象设计相关。系统为我提供了几个类及其方法定义,要求我通过最具效率的方式加以解决,同时保证代码的简洁与可读性。

第二道问题与算法相关。这里我向大家分享一点小小的个人心得:在开始思考合适的数据结构以及解决特定问题的算法之前,请首先手动解答并绘制方案示意图——这能帮助大家获得更为宏观的视角。我在纸上进行了演算,并意识到问题本身其实非常简单,最后才把解决办法转化为代码形式。

不过在这里我犯了个错误:我尝试对其加以进一步优化并让代码尽可能更优雅。事实上,我应该先把后面的问题解决完,再用余下的时间处理这项工作。优先级规划很不科学,应当引以为戒。

第三道也就是最后一道题目是对上一题中解决方案的复杂度进行分析。我本来可以立足于自身思考方式进行详细说明的,但由于之前浪费了太多时间,所以这部分回答做得不是太好。

5月4日:电话筛选

前一天我接到了招聘人员打来的电话,祝贺我通过了技术测试。她询问我本周是否有时间接受电话面试,并希望能够通过现场面试进一步审查我的技术水平。我们最终将时间约定在5月4号。

认真梳理

这意味着我只有两天时间来梳理关于算法及数据结构的各项基本知识。在此期间,我将关注重点集中在以下几个方面:

  • 排序:冒泡排序、快速排序、归并排序

  • 搜索:线性搜索、二分搜索数据

  • 结构:链表、哈希表、数组、树、二叉搜索树、栈、队列

当然,大家还需要为算法复杂性以及数据结构方面的常用操作做好复习。我个人推荐使用维基百科来夯实各项基础理论。

电话面试

在整个通话过程中,招聘人员一直表现得非常友好:我们首先谈论了一些与工作本身并无关联的内容,包括天气与城市生活等等,而后才逐渐转向技术层面。除了之前提到的内容之外,我们还谈到了几个关于动态编程以及递归的问题。我有好几次都不得不尝试转换术语与表达来帮助对方理解我的意思。一般来讲,招聘人员对于技术话题往往并不太熟悉,但她一直保持着开放性的心态,而且乐于同我讨论为何我会使用不同的表述方式。

最终,我们还谈到了几个问题情境。我之前没有做过准备,因此这里提醒大家为以上各个问题提前设计好相对应的场景。

她随后对我的技能给出的积极的评价,最终通话结束。看起来一切顺利,我马不停蹄地买了几本关于面试技巧的书籍(详见文末的参考书目部分)。顺带一提,我就是在Amazon上买的~

6月2日:现场面试

不久之后,这位招聘人员又向我发送两封邮件:其一包含部分面试准备技巧与相关资源,其二则是一份申请表,用于了解我的当前生活状况、Amazon会对生活地点迁移给出哪些帮忙(如果需要)、工资与福利以及进行现场面试的具体时间。

我填好了表格并将其发回,四天后现场面试的日期与时间被最终敲定。这一次我面对的是来自柏林办事处的另一位招聘人员。一周之后,她向我发来一份详尽的日程规划,外加面试官的姓名与头衔。不容偷懒,我马上到领英上找到了对应面试人员并思考如何更好地与之交流。

准备工作

我一共拿出了接近一个月时间来准备这场面试。很明显,紧张的时间让我没办法完全按照书籍上的指导进行准备,所以我决定每章挑出三项实践作为练习。我将整个思维过程以及解决方案的迭代方式记录在纸上,最后与书后的参考答案加以比对。黑色笔迹为我自己的解决方案,红色笔迹则用于标记错误。当时我的想法很简单,要让红笔部分越来越少。

在此期间,我还发现了另一个理想的编码技能练习办法,就是LeetCode网站。巧合的是,我有位朋友也决定对自己的技能进行归纳,因此我们每周四晚会拿出两个小时在LeetCode上共同解题。

在面试日期前的两处礼拜,我开始针对行为层面进行准备。大多数人会误以为技术决定一切,但实际上面试官也希望了解我们这个人,包括我们会以怎样的状态加入到团队当中。我发现利用STAR格式编写这样的故事能够带来很好的效果(即状态、任务、行动与结果)。我主要偏重于以下几种状态,包括挑战难题、错误与故障,处理冲突外加表现领导能力。至于建议嘛,大家最好能牢牢将自己作为故事的中心,而非整个合作团队。这样一来,此类故事就能帮助面试官更加正确而全面地评估我们的贡献。

大家应该明确自己为什么想要为Amazon公司工作。如果还不太清楚,不妨认真思考其到底适不适合自己。面试官们可不傻,他们会轻松识破我们的谎言~所以硬要参加面试只是在浪费双方的时间。说到底,宝贵的生命还是要用在正确的地方才好。

另外,确保我们为自我介绍准备了充分的谈资。具体来讲,背景介绍中要包含两部分内容,其一为教育背景、工作动机以及专业经历中的亮点,其二为个人的优势与弱项。大家可能还需要针对自己打算效力的公司或者是团队做点预习工作。

面试当天

参加面试时,我们需要提前十分钟到场以在接待处完成登记。对方要求我带上护照并签署了保密协议。完成之后,一位员工对我表达了欢迎之意并引导我来到会见室。

整个过程包括四场每场50分钟的面试,各分段之间设有10分钟休息时间。另外,最后一场前的休息时间延长为15分钟。每场面试中有40分钟用于解题,另外10分钟则是自我陈述时间。

在首段面试中,我需要解决一道面向对象的设计问题。面试官要求我构建一套接口,以供客户端开发人员借此构建库。问题的切入点简单而直观,但接下来,面试官会提出更多要求与问题。而后是行为陈述,我面对的问题是如果未能在规定周期内完成,该如何处理相关后果。

在这里我要向大家提出一条重要建议——除非充分理解问题,否则千万不要急于解答。大家应当将面试过程视为一场脑力风暴活动——与面试官们积极交流,向他们提出问题,决定解决方案,而后判断自己的思路到底是否正确,最终立足于正确方向做出进一步补充。

另外一项重要建议是,如果大家没有什么好想法,请用积极的心态需求帮助。最糟糕的情况就是因为问题太困难而陷入沉默,这样面试官们很尴尬、我们自己也不知道该如何推进。

第二段面试中,我需要解决一个以产品为中心的算法问题。我必须找到正确的方法,判断合适的数据结构与算法,并编写代码以解决整个问题。在最后10分钟内,我们谈到了自身判断与同事发生冲突时该如何解决。

第三段面试要求我构建一套面向多种产品用例的系统设计方案。我在白板上绘制了各系统组件,解释了各组件的具体作用及其如何实现彼此通信。在末段陈述中,面试官询问我会如何在上司不具备相关专业知识的情况下,说服其接受我的判断与选择。

最后一段面试则是纯技术形式,即解决算法问题。问题本身相对简单,因此我开始询问自己应该给出最基本的解决方案,还是更进一步做出针对性优化。面试官要求我首先从基本方案入手,而后再来谈谈优化思路。我们在时间用尽之前对方案者了数次迭代。这位面试官随后要求我给出另一种与原本思路不同的解决办法。

在面试完成之后,大家可能会觉得自己完全搞砸了……因为我们在解决任何问题时,都不可能得到面试官给出的明确而积极的回应。事实上,“太棒了!你这套解决方案真的非常完美!”这种说法根本不会出现。但别担心,实际情况可能非常顺利。大家可能没有注意到,其实面试官提出的问题经过了精心设计,意味着其无法在40分钟内获得完美的解法。相反,对方想要考察的是我们在这段有限的时间里能够做到哪一步,整个思维过程又是怎样的。

6月16日:录取通知

Amazon公司花了八天时间来做出决定。最终,来自柏林办事处的一位招聘人员在周五晚上发来一封邮件,告诉我已经顺利获得入职资格。我们在次周周一进行了细节讨论,并在三天之后——也就是6月16号——正式发出录取通知。

在接下来的几天中,我们又针对细节交换了意见,我也表示自己需要一段时间办理离职手续。不久之后,我这位新任Amazon员工正式走马上任。

本文翻译自:http://sobit.me/2016/07/08/amazon-software-engineer-interview/

对『Hacker时间』感兴趣的同学可以扫码进群一起来讨论。

 
Hacker时间 更多文章 编辑器之战: Vim的复仇 HTTP\/2使移动端媒体加载速度提升3-15倍 我们为什么不用SSH登录一切呢? Docker浅析——如何从Vagrant转向Docker Google的QUIC协议:从TCP到UDP
猜您喜欢 Web App版权保护迎来曙光,APICloud提出平台级解决方案! Dockerfile: ADD vs COPY 从李彦宏的洗脚店大数据论断到阿里影业副总裁的 IP 创新论 两行代码里的玄机