本文来自微信公众号“将门创投”(ID:thejiangmen),来源:Medium,作者:Xiaohan Zeng
故事的开始是由于笔者觉得目前的工作成长空间有限,同时不想继续呆在芝加哥想到湾区去寻求一些机会。人生苦短,想到就做!结果在五天内疯狂面试了硅谷的五个科技巨头——LinkedIn、Salesforce、Google、Airbnb 和 Facebook,并斩获了所有的 offer!希望他的准备和面试经历能让正在找工作或者想要寻求新机会的你看到不同公司的共性和特点,并有所启发和思考。Enjoy~
准备阶段
作者面试并获得 Offer 的五家公司分别是 LinkedIn,Google,Facebook,Salesforce 以及 Airbnb,面试岗位分别是机器学习工程师、软件工程师和数据工程师,由于岗位的领域和要求不同所以作者在编程、机器学习和系统设计三个领域进行了准备。
编程
虽然编程面试不能完全反应一个人的综合能力,但是我们也必须承认没有更好的方法在短时间内判断一个开发人员的能力了,所以对于编程需要进行一些必要的练习。
作者主要使用了 Leetcode 和 Geekforgeeks 来进行练习,但也推荐了 Hackerrank 和 Lintcode 两个练习资源。作者进行了几个星期的数据结合和算法练习,主要集中于自己不熟悉的方面,同时做了一些较为常见的题目,一般每天练习两道编程题。
下面是作者的心得:
1. 练习,不断练习,关于编程的技能没有捷径;
2. 作者并没有把网站上的题目全部做一遍,而是挑出了其中的 70 题来进行练习,作者认为如果真的弄懂了 70 题的解题思路和完整的方法就足够了,不在多在精!
3. 先从最难的题目开始,那么后面的都会越来越简单;
4. 如果卡在一题上太久,那就果断的参考答案的解决方法,更多的时间并不会获得更多的回报;
5. 在解决问题后,要参考答案的解决方法对照自己的方法,很多时候你会为别人的方法拍案叫绝!
6. 使用一种你最熟悉同时大家都常用的语言,方便与人沟通交流。
系统设计
这一部分与作者原先的工作比较接近,作者介绍了在这类面试中经常会问道的问题包括:系统架构、面向对象的设计、数据机制设计、分布式系统设计、大规模运算等等;
在网络上有很多资源可以帮助我们进性这方面的准备,作者主要阅读了系统设计面试、大规模系统架构、案例学习等方面的文章,下面是一些推荐的资源:
http://blog.gainlo.co
http://horicky.blogspot.com
https://www.hiredintech.com/classrooms/system-design/lesson/52
http://www.lecloud.net/tagged/scalability
http://tutorials.jenkov.com/software-architecture/index.html
http://highscalability.com/
作者认为虽然系统设计面试会覆盖很广的问题,但是依旧有一些主线和规律可循,下面是他的经验分享:
1. 首先要明确需求,随后进行顶层设计,再进一步进入实施的细节。不要再一开始就不顾需求的一头扎入技术细节中去;
2. 世界上没有完美的系统,实际的系统都是在各方面的要求权衡后得出的。
但对于系统设计来说,最好的方式还是实际的设计一个系统。例如在日常工作中除了完成工作外,对于你所使用的工具、架构和库进行更深入的了解。如果你在使用 HBase,那么不要仅仅是利用客户端运行一些简单的命令,而是尝试去理解它的整体架构,包括读写流的表达、如何确保连续性,最小最大压缩是如何进行的、系统中如何使用 LRU 缓存和 Bloom 滤波器。你甚至可以对 HBase 和 Cassandra 进行一些比较,看看他们之间架构的相似和差异。这样当面试官让你设计一个分布式的关键存储时,你就可以从容的面对。
很多博客是不错的学习资源,包括 Hacker Noon 和一些工作的工程师博客,同时也不要忘了开源工具的开发文档。但最重要的事情,是保持一颗谦虚但好奇的心,像海绵一样学习吸收你周围的知识!
机器学习
机器学习的面试可以分为理论和产品设计两个部分。
除非你是机器学习专业的同学,那么详细学习机器学习方面的教材和参考书是十分必要的,例如经典的《Elements of Statistical Learning and Pattern Recognition and Machine Learning 》,如果你对其中一些问题感兴趣的话,可以进行深入的阅读。
机器学习方面你需要确保对于一些基本概念熟练掌握,包括偏差-方差的权衡、过拟合、梯度下降、L1/L2 正则化、贝叶斯理论、boost 方法、协方差、降维等等。同时也要熟悉一系列公式,包括贝叶斯理论和支持向量机这类比较普遍的模型,并自己尝试着练习实现一些模型,例如决策树、K均值聚类等。如果在简历中写入了什么模型,你一定要对这个模型了然于心。
对于机器学习的产品设计,你需要了解通常的产品开发流程:
1. 找出产品开发的目标:预测、推荐还是聚类、搜索?
2. 挑选一种合适的算法:监督或者非监督、分类还是回归?线性模型/决策树/还是神经网络等等,要能拿出选择的理由;
3. 对数据进行特征工程;
4. 对于模型表现进行度量和评价;
5. 在产品层面对模型进行进一步优化。
作者再一次强调了学习的好奇心以及连续性的重要性,不要仅仅是调用一下各个机器学习的 API,而是真正的去理解后面的原理是什么,去了解为什么随机梯度下降适合于分布式训练、XGBoost 与传统的 GBDT 有何不同,在比如损失函数的特征是什么,为什们需要进行二阶微分等等。
面试过程
作者先是在领英上与 HR 通信,了解各个公司的需求,随后进行了几个月的准备工作。随后到湾区进行了一个星期的面试,面了 30 多家顶级的科技公司,并最终拿到了其中的五家 Offer。
每家公司的电话面试都是标准的流程、唯一不同的地方就是持续时间的长短。在电话面试中,对于专业技能的熟练程度十分重要,因为时间有限,而且很多时候只有一次机会。你要非常迅速的识别出问题的类型并给出高质量的答案。同时需要告诉面试官你的想法和思路,毕竟面试中沟通和交流是最重要的。记住,不要去背答案,面试官一眼就会看穿你的。对于机器学习的公司来说,在面试中你需要向他们展示出你的机器学习技能。
同时需要把握好你的时间,作者在一天下午安排了三场电话面试,但是这有利有弊,可能你可以在先前的面试中得到更多的自行,但也有可能被先前的不顺利所影响,所以这种方式因人而异。同时面试多家公司的好处在于可以在有限的时间内尽可能多的参与面试,甚至可以跳过某些公司的第二论电话面试,直接进入终面。最令人意外的是谷歌,他们在知道作者这一周有其它四场面试的时候甚至省略了所有的电话面试,直接进入现场面试!作者欣然接受,虽然很累,但是谁也不会拒绝 Google 的邀请吧!
现场面试(Onsite)
这是我第一个到他们 Sunnyvale 办公室现场的面试。办公室很整洁,人们看起来也很专业。
每个面试的时长是一个小时。编程问题是都是比较常规的,但 ML 的问题可能会有点棘手。在这之前,我收到了一封来自 HR 的邮件,里面包含了一些非常有用的准备材料,所以有了思想准备面试也就平稳飘过。我早就听说 LinkedIn 拥有硅谷最好的伙食,实际也是数一数二。
微软的收购似乎已经解决了 LinkedIn 的财务负担,并把他们解放出来去做真正酷的事情。视频和专业广告等新功能是令人兴奋的。作为一家专注于专业发展的公司,LinkedIn 把自己员工的成长摆在了优先考虑的位置。许多团队,如广告相关性和新闻流排序组都正在招兵买马中,所以如果你想加入的话,赶紧行动起来。
Salesforce Einstein AI 计划
“摇滚”明星团队的摇明星项目。这个团队很新,感觉很像一个创业公司。该产品构建在 Scala 堆栈上,所以类型安全是一个真实的东西!我在他们的 Palo Alto 办公室面试过。团队有凝聚力的文化,工作生活的平衡非常好。每个人都对自己正在做的事情充满激情,而且真的很享受。与其他 Onsite 相比,四次会议的时间相对短一些,我感觉都没有呆够。面试结束后,Matthew Tovbin 还带我去了惠普的车库散步 :)
绝对的行业领导者,这是毋庸置疑的。但真的去了之后,还是由衷感慨道,它是真的,真的很大。我花了 20 分钟骑自行车去见我的朋友。永远是开发人员的好地方。我在山景城(Mountain View)的那片楼区的许多建筑之一里接受的 Onsite,我甚至不知道到底是哪一幢,因为它太大了。
我的面试官看起来都很聪明,但一旦他们开始说话,就更聪明了。和这些人一起工作将会很愉快。我对谷歌的采访感到特别的一点是,对算法复杂性的分析是非常重要的。确保你真的明白什么是大O符号的意思!
Airbnb
快速扩张的独角兽拥有独特的文化,可以说是硅谷最美丽的办公室。新产品如体验、餐厅预订、高端小众的市场,以及向中国的扩张都为它光明的前景做出了贡献。如果你能承受风险,希望快速成长,那么 Airbnb 一定是你的不二选择。
Airbnb 的编码面试有点独特,因为你将在 IDE 而不是白板上编程,所以你的代码需要编译并给出正确的答案。有些问题真的很难解决。
他们还准备了独一无二的跨职能面试。这就是 Airbnb 认真对待文化的方式,在技术上很优秀并不能确保一定拿到工作机会。对我来说,这两个跨职能面试真的很有趣。我和面试官进行了轻松随性的交谈,我们在会议结束时都感到很高兴。
总的来说,我认为 Airbnb 的网站是最难的,因为问题的难度、更长的持续时间,以及独特的跨功能面试。如果你感兴趣,一定要了解他们的文化和核心价值观。
另一个仍在快速增长的巨人,比谷歌更小更快。随着它的产品线在社交网络市场上占据主导地位,在人工智能和 VR 领域的巨大投资,我看到的都是未来 Facebook 有更多的增长潜力。如果你对机器学习很感兴趣的话,那是一个完美的地方,就像 Yann LeCun 和 Yangqing Jia 一样。
我的 Onsite 被安排在了 20 号楼,那是一个有屋顶花园和海景的地方,也是小扎办公室所在的地方。我不确定面试官是否得到了指示,但我没有清楚的表明我的解决方案是否正确,尽管我相信他们是正确的。
前四天的高强度面试开始出现问题,中午我感到头特别痛。我坚持完成了下午的面试部分,但感觉自己做得不好。所以当我得知我也得到了他们的 offer,还是有些小惊讶的。
总的来说,我觉得那里的人相信公司的愿景,并为他们正在建设的东西感到自豪。作为一个拥有 5000 亿市值和增长的公司,Facebook 是你发展事业的理想之地。
在与这些公司交流的过程中,我总结了一些谈判重要的小技巧,希望对你们有帮助:
做事说话要有专业的态度
清楚自己的优势
对团队和项目是真正感兴趣
保持你的耐心和信心
可以有主见有坚持但不失礼貌
永远不要撒谎
Databricks 的失败经历
所有成功都始于失败,包括面试。在我开始面试这些公司之前,其实五月份的 Databricks 面试我是失败了。
今年 4 月的时候,Xiangrui 通过 LinkedIn 联系了我,询问我是否对 Spark MLlib 团队的职位感兴趣。我非常激动,一个是因为我一直在用 Spark 非常喜欢 Scala,二来 Databricks 工程师是一流的,三是 Spark 正在革新整个大数据世界。这是一个我不能错过的机会,所以几天后我就开始面试了。
这个门槛很高,过程很长,包括一份预先筛选的问卷,一个电话面试,一个编程任务,还有一个完整的终面。我成功到了最后的现场终面环节,并参观了他们在旧金山市中心的办公室,那里可以看到金银岛。
我的面试官既聪明又谦虚。在面试中,我经常觉得自己被推到了极限。前面本来进行的还算顺利,直到一个现在想到还觉得像灾难一样的环节:我完全搞砸了,因为我没有足够的技能和准备,结果完全失败了…虽然面试结束了,但我真的很喜欢跟他聊天。
几天后我就收到了拒信。这是意料之中的事,但我还是感到沮丧了几天。虽然我错过了在那里工作的机会,但我衷心希望他们能继续发挥更大的影响力和成就。
经历完这些后的思考
生命是短暂的,职业生涯则更短,所以要在正确的时间做正确的事。
面试不只是面试,这是认识新朋友建立社交圈的最佳时机。
永远保持好奇心和学习的热情。
谈判技巧对你的面试工作满意度很重要。
获得工作机会只意味着你符合了他们的最低要求,没有最好,只有更好。
从 5 月的第一次面试到最终接受 9 月底的工作,我的第一次职业生涯的改变真的是道阻且长。我很难做好十足的准备,因为我需要在目前的工作中保持良好的表现。几个星期以来,我经常为准备面试到凌晨 1 点,第二天早上 8 点半起床,全身心地投入到工作中。5 天内面试五家公司的压力很大,而且风险很大,除非你的日程安排很紧,否则我不建议你这样做。但在交流中,如果你能获得多个 offer,的确会让你处在一个比较主动的位置并且受益匪浅。