作者认为虽然系统设计面试会覆盖很广的问题,但是依旧有一些主线和规律可循,下面是他的经验分享:
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 正在革新整个大数据世界。这是一个我不能错过的机会,所以几天后我就开始面试了。
这个门槛很高,过程很长,包括一份预先筛选的问卷,一个电话面试,一个编程任务,还有一个完整的终面。我成功到了最后的现场终面环节,并参观了他们在旧金山市中心的办公室,那里可以看到金银岛。
我的面试官既聪明又谦虚。在面试中,我经常觉得自己被推到了极限。前面本来进行的还算顺利,直到一个现在想到还觉得像灾难一样的环节:我完全搞砸了,因为我没有足够的技能和准备,结果完全失败了…虽然面试结束了,但我真的很喜欢跟他聊天。
几天后我就收到了拒信。这是意料之中的事,但我还是感到沮丧了几天。虽然我错过了在那里工作的机会,但我衷心希望他们能继续发挥更大的影响力和成就。
经历完这些后的思考