作者 | zhiachong
责编 | Aholiab
头图 | CSDN 下载自视觉中国
出品 | CSDN(ID:CSDNnews)
外国小哥zhia是个有面试绝技的人,他只有三年的编程经验,并且没有任何名牌大学的光环,两年多以前,他同时获得了Facebook、谷歌、亚马逊、微软等众多「硅谷豪门」的offer。不久前他以如何获得Twitter的offer为例,讲解了他从准备到面试的全部经过。
对于那些想要获得大厂offer的开发者来说,他的经历和入职前的一些列准备、心理活动,都十分具有参考价值。
接下来我们就一起来看看他的经历吧(以下为原文)。
深夜,在这个每月租金600美元的地下室里,回荡着我手指「啪啪啪」猛敲键盘的声音。我从电脑屏幕上抬起头,瞥了一眼墙上的挂钟——凌晨2点。你或许会以为我熬到这么晚一定是在写软件或者处理重要工作。
但其实并没有。我是准备即将到来的技术编程面试。
在Twitter指定的技术测试网站leetcode上,我发现自己无法完成“简单”级别下的一个题:反转链表,一股挫败感随之而来。题目是这样的,感兴趣的小伙伴也可以自己尝试一下:
那么我是如何得到这次面试机会的?我又是如何准备的?本篇文章就来一一告诉你。
3年全栈,得到Twitter面试机会
在这次面试之前,我曾在一家初创公司做了3年的全栈工程师,主要负责在AWS堆栈上构建微服务和API开发,侧重于PHP、NodeJS、作为消息队列的AWS SQS、用于数据库的Postgres以及用于长期存储的AWS S3。
在此之前,我没有任何的工作经验或实习经历,这家初创公司的工作是我第一份真正意义上的软件工程师职位。
我本科就读于华盛顿州一所小型私立大学,4年的本科获得了计算机科学学士学位。现在回想起来,我觉得当时在大学的学习时光是一段非常宝贵的经历,也学到了很多。我想说的是,我不建议想学技术的人去参加短期的编程训练营,如果再来一次的话,我还是会选择接受正规教育,而不是参加编程训练营。
在投Twiter之前,我申请了30多家公司,面试了15家,收到了6个offer,包括Facebook、谷歌、亚马逊、微软等,并最终选择了Twitter。下面我就从Twitter的例子,讲讲我是如何获得这个offer的。
面试内容
起先我收到了一封Twitter 招聘人员发来的邮件,问我是否愿意和他们的工程师安排一次电话筛选。收到邮件后我既兴奋又紧张,因为几年前我曾经申请过Twitter的一个软件工程职位,但没能成功。
招聘人员发了一张非常全面的准备表给我,上面有可供练习编程和算法技能的链接。其中就有leetcode(一个编程挑战网站)的测试,所以为了准备接下来的技术面试,我在leetcode上花好了几个小时。
准备技术面试并非易事。对于我这样一个已经毕业很长时间的人来说,要想通过技术编程面试的话,需要花大量的时间来复习相关技能和基础知识。招聘人员曾明确强调,面试将侧重于技术基础,比如map、二叉树、链表、二叉搜索树、图表等等。
面试准备
面试前的准备,简单来说就是多做练习。把自己沉浸在解决具体的技术问题上面。
我把大部分时间都花在了leetcode和一本名为《编程面试宝典》(Elements of Programming Interviews)的书上。我还花了约10%的时间在Youtube上浏览了一些关于系统设计面试的视频。此外,我常用的另一个网站是DailyCodingProblem,它每天都会给我发一个编程相关的问题,这样我就能一直接触到新的问题。
我花了大约一个月的时间进行持续练习。注意,一定要制定不间断的持续计划。我过去常常间歇性发奋图强:花3个小时硬核编码,然后休息一周。结果发现这完全是在做无用功,我也为此付出了沉重的代价,即这次做过的练习,下次经常接不上。
整体而言,工作日我每天花约3个小时进行准备,周末一般花4 - 6个小时。在这一个月里,我每周准备约20个小时。
这里还有一个大家非常关心的问题,即我是如何申请Twitter职位的?我是通过Twitter的“职业生涯”页面递交申请的。不过事后看来,直接从LinkedIn上找推荐人或招聘人员可能会更好一些,因为这样大概率会加快申请过程。
申请的过程并不复杂,提交简历和基本信息即可。但简历一定要优秀。特别是对于通过线上求职页面进行申请的求职者来说,如果简历不够亮眼,那么很大可能是无法得到面试机会的。
投完简历等待的过程,大约是几周的时间。我的入职过程是从2月持续到6月的,从2月投简历到多轮面试,6月正式入职。具体时间线如下:
2月 — 招聘人员主动安排TPS
3月— 初次TPS
4月初— 二次TPS
4月中— 现场面试
5月初 — 收到offer
5月底— Twitter确认
6月 — 正式入职
面试过程
前两次电话面试主要涉及对共享在线文档(例如Google Docs)进行编码的问题。我们探讨了几种不同的方法,光实施阶段就讨论了半个多小时。
两轮之后,我进入了下一轮现场面试。
招聘人员给我发了一个在线编码存储库的链接,让我进行代码审查,提出改进建议,并在面试现场与面试官进行讨论。
我花了约一天的时间来检查代码:把它打印在纸上(10pt字体,约5页),并且在纸上记下需要改进的地方。事实证明,这一步非常有用。
现场面试
现场面试总共进行了3轮,中间吃了一顿午餐:
一轮(广度),75 分钟
二轮(深度),75 分钟
午餐
三轮(顶级评级),90 分钟, 可选
需要注意的是,Twitter的现场面试每轮都是2名面试官。刚开始的时候感觉有点吓人:被两名面试官盯着,自己的一举一动都被尽收眼底。但实际上,最终体验还不错,因为这种形式让我感觉更有团队感,大家可以互相交流想法。
第一轮:系统设计
第一轮面试内容较为广泛,主要是了解你对“从零开始设计系统”知道多少。这样做是为了看看应聘者的知识广度极限在哪里。
核心问题是:从设置UI到通过HTTP API进行通信,再到构建后端服务,你是否能够构建一个停机时间合适的可靠系统?
这些都是可能会被问到的题目类型。因为我总是喜欢鼓捣各种不同的技术,所以我还挺喜欢这次谈话的。如果你喜欢构建东西的话,应该也会喜欢这一轮。面试官非常友善,一直礼貌地引导我进行回答。
最后,我们以一个编码问题结束了这场面试。老实说,我已经记不清问题具体是什么了,但应该也没什么特别的,没有超纲。
第二轮:个人履历
第二轮面试更多地关注于我过去曾参与过的项目和专业知识。说实话,这轮面试会更激烈和更具挑战性,因为面试官会深入了解我曾参与构建的项目的各方面问题,并对设计提出质疑。包括:你最近做了什么项目?为什么做这个项目?考虑过哪些备选方案?最终成功了吗?
鉴于我初创公司的工作背景,有很多东西都是需要我从零开始进行构建的,比如创建AWS集群,设置用于处理任务的SQS等。
尽管我对这些项目都非常熟悉,但这一轮还是让我有些筋疲力尽。我必须回顾过往经验,然后从自己的角度来讲述这个故事——为什么我们要用这种特定的方式来设计,我们有没有想过更好/更坏的方法。
这一轮没有任何编码问题。
第三轮:文化
第三轮,也是最后一轮,是和HR经理以及高层领导进行的90分钟面试。
我后来才发现,如果能成功进入这一轮,就表示你在技术上已经做得不错了,而他们是在寻找双方的文化契合度——你能否能融入他们的企业文化,以及他们是否有适合你的工作机会。
这一轮也没有编码问题。
回顾
Twitter的面试主要侧重于计算机科学领域内的基础知识,所以要确保自己从上到下、从左到右全方位了解数据结构,以及你在CS课上学过的基本算法。
此外,还要理解如何权衡时间复杂度和空间复杂度。如果能掌握一种语言的话会非常有帮助。我建议是像Python、Java或C++这样非常实用的语言。我个人更喜欢用Python,因为它易于阅读,易于解释,并且还有一堆内置的数据结构。
一定要回顾一下自己简历上列出的那些项目。要理解自己负责的端到端软件的整个设计,了解系统中所做的权衡,能够解释为什么要以这种方式构建系统以及有什么替代方案。
在准备阶段要严格要求自己。提前找出自己的不足,并制定练习计划。坚持不懈、不间断练习非常重要。我一开始就做错了,真希望之前能早点意识到,这样就不用把时间浪费在错误的事情上了。
想想你每天与之交互的系统。弄明白权衡取舍、替代方案、利弊,以及如何构建更好的系统。这一技能将助你在软件工程这条路上走得更远。
推荐阅读
你点的每个“在看”,我都认真当成了AI