原文: A Career Switcher’s Guide to Landing Your Dream Tech Job
在这篇文章中,我将探讨一些能够帮助你在你的目标公司的面试中取得好成绩并最大限度地获得工作机会的专业建议。
自我介绍 — 从华尔街到谷歌总部
2019年3月31日,我被一家初创对冲基金公司裁员了。在过去的10多年里,我一直是金融行业的一名量化软件开发人员,但我不想再做一份同样的工作。我开始追寻自己热切想去做的事,在人工智能/机器学习/深度学习(AI/ML/DL)领域寻找我的下一份工作。
在接下来的六个月里,我为了这个目标付出了非常大的努力。到2019年9月时,我已经有了多个与机器学习相关的现场面试和offer,包括来自谷歌和Facebook的offer。
这篇文章讲述了我是如何做到这件事的,希望它能鼓励和帮助其他潜在的想要换工作的人完成这种转变。通过这种转变,你可能会获得能力上和经济上的双重回报。
Googleplex:谷歌的全球总部
文章概览
如果你时间不够,这里有一个对我很有效的五大秘诀:
- 展示: 做一个你感兴趣的项目,并在网上展示出来
- 学习: 集中练习算法与数据结构的程序设计问题和系统设计问题的解答方法
- 应用: 利用多种渠道获得面试机会
- 面试: 在电话面试和现场面试中保持冷静
- 谈判: 在工作机会谈判与匹配团队时,知道自己想要什么
如你所见,这是一个非常常见的五步秘诀,然而完成每一步都需要付出很多努力。如果想了解更多细节的话,就继续读下去吧。
关于我
这里有一些关于我的介绍,因为我认为这个指南对和我有相似背景的人最有帮助。也就是说,我是一名非科技行业经验丰富的软件工程师/开发人员,希望跳槽到西海岸(湾区或西雅图)的一家顶级科技公司。如果你没有软件工程的工作经验,上面的方法应该仍然适用于你,你只需要比那些有编程经验的人更加努力。
我毕业于加拿大滑铁卢大学,是一名计算机工程师。在我早期的职业生涯中,我曾在微软和甲骨文担任软件工程师。MBA毕业后,我进入了量化金融行业。
在过去的10多年里,我曾在美国银行、瑞银集团、Citadel和一些较小的公司担任量化软件开发人员/量化分析师。但当我在2016年第一次偶然发现机器学习/深度学习时,我就爱上了它。我知道我最终想要在AI/ML领域找到一份工作。
2019年4月,我开始为转行做全职准备。下周我将搬到旧金山湾区加入谷歌,它是人工智能和机器学习领域的领导者之一。
https://www.linkedin.com/in/dctian
迈向成功的五个简单步骤
第一步,展示: 做一个你感兴趣的项目,并在网上展示出来
2019年2月,我最好的朋友Igor鼓励我创造一个很酷的项目并写些东西记录它。那时候我没有任何好的想法,同时我从未在网上发表过任何东西,也不知道怎么开始做这些事。
但是在四月初,当我在墨西哥和我的家庭一起度假时,某天晚上我突然有一个“我想造一辆自动驾驶汽车”的想法。考虑到我之前没有机器人技术或电子技术方面的经验,我决定先开始建造一辆可以在我的客厅里跑的深度学习/自动驾驶机器人汽车,DeepPiCar。
一个月后,当我成功造出来了这辆自动驾驶汽车时,我开始在“Towards Data Science”上写一篇一共六个部分的博文来教其他人如何造一辆这样的车。我的博文在几周的时间内获得了超过10000次的阅读量,世界各地的读者对这篇文章的回应非常热烈。我感觉我两周的努力(一周用来造车,一周用来写博文)都是值得的。
在我的客厅里跑的DeepPiCar
然而,直到我参加面试和获得团队匹配的要求前,我一直没有意识到这件事对我的职业生涯产生了全面的影响。当面试官问我:“你为什么想从目前的行业转行?”时,我已经准备好了回答这个问题的话题!
我不仅能够告诉他们我对AI/ML的热情,而且当我从背包里拿出我的车(是的,真正的机器人车)并把它放在面试官手中时,我可以从他们的眼睛里看到兴奋!他们中的许多人甚至说,他们很想和自己的孩子一起造一辆这样的车。然后我告诉他们,我已经在网上发布了完整的步骤说明和源代码(我的简历中有链接),供他们参考。我很确定他们不会把我的简历扔进回收箱。: -)
我的一些朋友们想让我推荐一些可以开展的好的项目,这是我给出的一些建议:
- 如果你想转职去做前端开发,那就用流行的开源框架(例如React、Angular或Vue.js等)搭建一个炫酷的网站。
- 如果你对服务端开发感兴趣,尝试使用分布式服务技术创建网络爬虫或搜索引擎,如Cassandra, ZooKeeper, Memcached,和Elastic search等。
- 如果你想做移动端开发,尝试创建并发布一个苹果/安卓应用。请注意,在苹果的App Store上发布应用比在谷歌的Play Store上发布应用要花费更长的时间。
- 如果你对人工智能/机器学习感兴趣,尝试使用现有的计算机视觉或自然语言处理深度学习模型之一,并尝试从中制作产品。例如,我使用了一个预训练的目标检测模型,SSD,并将其改编为我的DeepPiCar的交通标志检测器。如果您是AI / ML新手,请务必阅读DeepPiCar的第一部分,在那里我列出了几个ML课程和资源,以帮助您开始学习。
- 如果你对机器人技术感兴趣,试着用树莓派或英伟达Jetson Nano制造一些很酷的机器人。一定要使用新的Raspberry Pi 4或Jetson Nano。树莓派更被制造商广泛使用,因此具有更好的技术支持,而Jetson Nano自带GPU,因此可能更适合深度学习项目。
- 如果你没有任何有关项目的想法,不要绝望。如果你对人工智能/机器学习感兴趣,你可以为上面提到的开源项目之一做出贡献,也可以为TensorFlow或PyTorch做出贡献。你可能认为您需要成为一名专家才能为这些知名的开源项目做出贡献,但实际上并不需要。每个开源项目中都有相当多的小特性和简单的错误修复是专门为新手准备的,让新手可以先动手做。这样,你就可以在处理更复杂的问题之前熟悉代码库和提交流程。
顶尖的开源项目
一旦你完成了你的项目,你一定要让全世界都知道这件事!你以为只是在GitHub上发布完成的代码就足够了吗?不!因为大多数人更喜欢先阅读博客来了解代码的功能。
优秀的、精心设计的博文对于你的项目,更进一步来讲对于你来说,是一份很好的营销材料。是的,用漂亮的图片和图表写精致的博客需要很长时间。我花了整整一个五月写了6篇文章。我估计我总共花费了200个小时或每篇文章花费了大约30个小时。如果你是全职工作,也许可以写一篇写得很好的博文作为你项目的概述。
DeepPiCar的博客系列
有一件事你需要牢记:你必须享受你正在做的事情,而不是仅仅为了找到一份工作而做这个项目。如果你真的对自己所做的事情充满激情,那么当你和面试官交谈时,这件事情就会成为一个亮点。
第二步:聪明并努力地学习
算法与数据结构
如果你需要掌握一项技术面试技能,那就是算法和数据结构(A&DS)编码技能。无论你面试的是大公司还是小公司,他们都会详细询问你的编程技能,尽管大多数公司并不关心你使用哪种编程语言。
我最喜欢的编程语言是C++和Python,但对于编码面试,我推荐Python。C++是非常冗长的,而与C++相比它是如此简洁,你可以用这么少的行做这么多的事情。有很多资源可以让你为算法和数据结构(A&DS)做准备。我使用了以下资源:
Cracking the Coding Interview Book (CtCI): 这本书大约有700页,并且只卖30美元。如果你需要复习A&DS的概念,这是一个很好的起点。除了概念之外,它还提供了一系列简单到中等水平的练习题和完整的答案。我花了2 - 3周的时间,花了1-2天的时间在每个A&DS相关章节上。我跳过了关于数学/脑筋急转弯/OOD/C++/Java/SQL的章节,因为它们与A&DS无关。
LeetCode.com:我也大量使用LeetCode (LC),因为我觉得CtCI没有给我足够的练习。Leetcode可能是最全面和有组织的编程面试问题在线数据库,有1000多个简单,中等和困难的问题。每个问题都有一个唯一的数字(例如,LC#1是TwoSum)。许多网上帖子只是简单地把他们的面试问题称为LC# xxx,而不是把整个问题打出来。
我强烈建议每月花30美元注册LeetCode高级版,因为它可以让你访问所有的LC问题和解决方案。我觉得这很有帮助,我以99美元的价格注册了年度会员,因为我认为这是“我大脑的健身房会员费”。
我完成了100多个LeetCode问题(35个简单,60个中等,14个困难)。我实际面试中90%的问题,或者它们的细微变化,都可以在LeetCode上找到。在大多数情况下,我直到事后才知道它们来自Leetcode。但是由于我练习了足够多的LC中等难度的问题,所以我能够解决相同难度的问题。最后,我觉得我永远不能做足够的LC中等难度的问题,因为直到今天,我仍然与一些LC中等难度的问题斗争。
Tushar Roy’s LeetCode Hard Solutions: Tushar实际上是苹果公司的工程师经理。他做这些视频的时候还是个软件工程师。我想说,看他的视频不仅教会了我这些算法,还教会了我如何清晰地呈现复杂的想法/算法。当我在现场面试时用白板写代码时,这给了我很大的帮助。
请注意,大多数面试官会给LC中等水平的问题,因为要求某人在20-30分钟内解决中等水平的问题是相当公平的。我建议你在第一次电话面试前至少做20个简单的问题和30个中等的LC问题。我第一次电话面试是在我写完CtCI的书之后,在我开始写LC之前的时候,而我很快就被淘汰了。
我也会在每次做练习题的时候计时,就好像我在面试一样。但是我使用的是带有自动补全和调试器的IDE。你不会在实际的面试中得到这些,所以我在练习时通常会把时间限制得更紧,每道题大约30分钟,而不是45分钟。你可以选择只使用常规的文本编辑器,甚至是白板来模拟真实的考试环境。这取决于你的个人喜好。
系统设计
你需要掌握的第二最重要的技能是系统设计。通常来说,一个现场面试环节会让你设计一个大型分布式系统,比如Netflix视频服务系统,或者WhatsApp即时通讯系统,或者Instagram故事等等。
这是一项同时测试你的硬实力与软实力的技能测试。对于硬实力的部分,你需要了解许多常用的分布式系统组件,例如分布式数据库、分布式内存缓存、分布式配置管理器、分布式文件存储和分布式搜索引擎等,以及何时使用它们是正确的。而对于软实力的部分,你需要能够画出清晰的图表来说明你的设计,并口头讨论和维护你的设计。有人告诉我,如果你通过了现场面试,系统设计面试会严重影响你获得的职级评定结果(也就是说,它可能决定你得到的是4级还是5级工程职位)。
下面是我在准备这一部分的过程中使用的一些资料:
- Cracking the Coding Interview Book(CtCI): 书中有一章讨论了系统设计,但这只包括了系统设计中最基础的部分。
- Gaurav Sen 的系统设计 YouTube 频道: 在阅读了CtCI的系统设计章节后,我不满足于其中包含的知识。然后我偶然发现了 Gaurav Sen 的YouTube频道,里面有22个视频。我把他所有的视频都下载到我的笔记本电脑上,以便在长途飞机上观看。哦我的老天爷呐,这个兄弟的视频真的很棒,其中对于系统设计知识的讲解非常清楚!这些视频中大约有10个视频是对单个分布式系统组件的深入描述,其余的是关于如何构建NetFlix, Tinder或Facebook系统等的实际用例讨论。
- Tushar Roy 的系统设计视频: 虽然Tushar非常擅长LeetCode上的难题,但他也有5个很棒的系统设计视频。我建议在Gaurav的视频之后再看这些视频,因为Gaurav为你提供了系统设计的坚实基础,而Tushar的视频则提供了一些进阶知识。
就我个人而言,由于我之前从事过相当多的分布式系统,所以即使我没有使用上面视频中提到的一些新技术,我也能够很快地掌握总体思想。在看了足够多的视频后,我能够将大多数分布式系统概括为以下几层:
- 客户端(PC端/移动端应用程序,浏览器)。
- 一个用来处理客户端请求的分布式负载均衡器。
- 基于位置的内容分发网络(CDN)或内存缓存,快速交付大型和相对静态的内容(视频和图像)到地理上更接近CDN/缓存的客户端。
- 一系列微服务来处理各种业务逻辑,如认证、服务/保存用户内容、在用户之间传递消息。微服务之间的通信是通过分布式消息系统发送的。
- 用于保存用户内容和消息的分布式数据库。你可以选择在数据库之前添加分布式缓存层,以提高读/写吞吐量。
行为型问题
我认为行为型问题是面试中最简单的部分。不幸的是,它们在面试评估中所占的比重也是最小的。科技公司当然知道,在行为面试中“表现得很好”和“说正确的话”是很容易的,但要训练自己成为一个优秀的程序员却要困难得多。
对于一个跨行找工作的人来说,最重要的问题当然是“你为什么想换行业?”希望你在步骤1中完成的项目可以帮助你通过展示你的项目和你对新行业以及你申请的公司的热情来完美回答这个问题。
以下是一些其他需要准备的行为型问题:
- 你为什么想为我的公司/我的团队工作?
- 举一个你达到目标的例子,并告诉我你是如何实现的。
- 举一个你未能达到目标的例子,并告诉我你是如何处理的。
- 描述一个你在工作中遇到的压力情况,以及你是如何处理的。
- 你是否曾遇到过没有足够工作可做的情况?
- 你是否曾犯过错误?你是如何处理的?
- 描述一个你与同事/老板/下属有分歧的情况,以及你是如何处理的?
所有回答行为型问题的关键是以积极的态度结束。例如,即使你被问到与同事发生分歧或职业生涯中的失败,也要如实描述发生了什么,但更重要的是提到你从中学到了什么。谈谈当类似情况再次出现时,它如何帮助你成为一个更有效的团队成员/工程师。
第三步:通过多个渠道申请
我在六月初(在我发布DeepPiCar博客之后的那段时间)开始密切关注湾区的机器学习工程师职位市场。同时,我开始了一个月的全职高强度编码准备(总计约200小时)。
到六月底,尽管我感觉自己还没完全准备好,但我开始向公司投递简历。原因是从我递交简历到电话面试之间需要有1-2周的准备时间。通过多个渠道,我联系了超过20家公司,并进行了超过30次电话面试。有时同一家公司会进行多次电话面试。
简历 —— 把相关的内容放在前面
我不会详细讨论简历写作,因为已经有很多优秀的文章讨论过这个话题。我的重点是从跨行找工作的人的角度出发,这样招聘人员才能快速识别你是否适合新的行业/职位。
记住,我是从金融领域的量化开发人员转到科技领域的机器学习工程师——这是一个天大的困难,因为这个跨度既有角色的转变也有行业的转变。再次强调,我的项目帮了我大忙。我把它们作为“个人项目”列在我的工作经历的顶部。尽管它们不完全是“工作”,但它们是我的工作,并且与我想要的下一份工作高度相关。
你应该知道,大多数招聘人员不会阅读超过一页的简历。如果他们在10-20秒内找不到他们想要的关键词,你的简历就会被抛到一边。我还在简历的第一页上半部分列出了与新工作相关的技能(以及所有关键词)。见下图。
LinkedIn —— 让他们来找你!
最好的工作申请是不需要你主动发出的。在我在LinkedIn上发布DeepPiCar博客文章后,我很高兴收到许多招聘人员的消息和电话,其中包括一些大型自动驾驶公司,问我是否对他们的机器学习工程师职位感兴趣。
我对Medium博客和LinkedIn帖子带来的影响力感到惊讶。但请确保在LinkedIn隐私设置中标记自己为“在找工作”,这样招聘人员可以轻松找到你。当招聘人员联系我时,我几乎总能得到电话面试。
内部推荐 —— 有一个强有力的推荐人
我认为第二好的工作申请是通过内部推荐提交的。我在Facebook和Google都有内部推荐。我第一次在Facebook的面试表现很差,但由于我的推荐人给了我强烈推荐,Facebook允许我再试一次。幸运的是,一个月后我通过了第二次电话面试。
在Google的情况更加令人惊讶。尽管我是远程候选人(顺便说一下,我住在芝加哥),他们直接跳过了电话面试,安排了现场面试,其中一部分是因为我有很棒的推荐人,一部分是因为我告诉他们我有其他现场面试。
所以我建议你找到在你想加入的科技公司工作的家庭成员/朋友/同学。如果他们没有在那工作,也许他们认识在那里工作的人。请你的朋友介绍你们认识,并让他们通过内部推荐提交你的简历。这样你获得电话面试的机会会高很多。
另一种方法是明智地使用你的LinkedIn网络。你可以搜索在特定公司工作的人,并请你的共同朋友介绍你们认识。如果没有,给那个人发送LinkedIn Mail。
注意,如果你发送很多LinkedIn Mail,你需要LinkedIn Premium。我订阅了大约3个月的LinkedIn Premium(大约每月30美元),并能直接与更多的人联系。有些联系导致了面试。附带的好处是,我收到的招聘人员信息比以前多得多,因为我相信LinkedIn的推荐算法将我排在了非付费用户之前。
第三方招聘机构
总体而言,我觉得大多数第三方招聘机构在这次求职过程中并没有起到很大作用。作为参考,以前我寻找金融工作时,主要依赖高管猎头公司,并且这样做的效果非常好。但大多数科技巨头并不使用第三方招聘机构。对我来说,唯一有效的机构是 TripleByte 和 DeepLearning.ai,我将在下面详细介绍。
TripleByte — 免去电话面试
TripleByte 是一家独特的招聘机构。它对候选人的吸引力在于,一旦候选人通过了 TripleByte 综合的2小时现场技术筛选测试,就可以直接进入多家公司的现场面试。对公司来说,它的吸引力在于 TripleByte 为他们筛选掉了大多数不合格的候选人,节省了工程师大量的电话筛选时间。
当我通过 TripleByte 的测试后,可以选择约200家公司。这些公司主要是小型初创公司,但也有不少大公司,如 Apple、Adobe、American Express 等。我最终与 Apple Siri 团队(大公司)、Zoox(中型公司)和 Determined.ai(小公司)进行了现场面试。所有这些公司都在令人惊叹的工程中工作。
我强烈推荐通过 TripleByte 的流程,因为它识别到了我薄弱的地方,并为我节省了许多电话筛选和相关的麻烦。点击这里参加 TripleByte 的在线测试。
DeepLearning.ai 和 Workera.ai — 数据科学家/机器学习工程师的福音
如果你是一个有志成为数据科学家或机器学习工程师的人,你一定听说过或参加过 Andrew Ng 在 Coursera/Deep Learning.ai 上提供的机器学习/深度学习课程。
实际上,DeepLearning.ai 有两部分:一部分广为流传的是教育板块;另一部分相对较少人知道的是招聘板块,即 Workera.ai。这是因为 Workera.ai 在2019年中期创立,成立时间很短。他们没有像 TripleByte 那样多的合作公司,但我相信他们正在迅速扩展这方面的努力。他们也会让你参加一个测试。
Workera.ai 的测试与 TripleByte 的测试有两点不同。首先,它是为数据科学家(DS)/机器学习工程师(ML)设计的测试,而 TripleByte 有为通用软件工程师以及 ML 工程师设计的测试——ML 工程师测试是全新的。
其次,Workera.ai 的测试是非约束性的,这意味着通过测试并不能让你直接进入现场面试。相反,Workera.ai 会将你推荐给其少数合作公司的 DS/ML 团队,并基本上让你排在前列。但你仍然需要经过完整的电话/现场面试过程。
我认为这仍然非常有价值,因为 Andrew Ng 在深度学习领域及其在湾区的网络非常广泛。我最终与 Pinterest 和 Scale.ai 的 ML 团队进行了面试。如果我只是直接申请,我不认为我会得到这两家公司的面试机会。点击这里申请 Workera.ai 的高级工程师 AI 项目。
在线招聘平台——不要过于依赖它们
为了扩大我的求职范围,我在一些在线招聘平台上设置了职位搜索提醒,例如 LinkedIn、GlassDoor、Indeed 和 ZipRecruiter,这样它们会在有符合我搜索条件的新职位发布时通知我。随着时间的推移,我在申请后确实收到了一些电话面试。
总体而言,我发现信噪比有点低,也就是说,我每天会收到很多邮件,但来自顶尖公司的好职位却很少。不过,不要完全忽视这个渠道。你需要在一开始就广撒网,或许你会通过这个渠道捕捉到一些机会。
直接申请——效果并不好
过去,人们会附上一封漂亮的求职信和简历寄给公司,期待着人力资源部门的回复。但这次,这种方法对我来说完全不起作用!
我找了大约10家公司(主要是自动驾驶公司),并在它们的官网上的招聘页面直接申请了职位。让我惊讶的是,我没有收到任何一家的回复,连拒绝邮件都没有!
幸运的是,在线申请每家公司并没有花费太多时间。我认为,还是要申请你感兴趣的公司,但不要指望一定会收到回复。
分阶段申请工作
尝试在第一阶段申请一些你不太感兴趣或者你认为更容易进入的公司。然后在后续阶段申请你的梦想工作/公司。你可以利用第一阶段来练习和提高,如果得到Offer,还可以用这些Offer来争取更好的梦想公司的Offer。
这似乎是种非常“功利”的方法,听起来可能有些争议,但想一想:许多人会先在一家不那么知名的公司工作,计划积累经验后再跳槽到更知名的公司。而且谁知道结果会怎么样呢,如果你没有得到梦想工作,至少你在第一阶段的公司中有一些选择。
将信息组织起来:持续更新一个日志本
通过这么多渠道申请工作后,你很难跟踪你申请了哪些公司,以及对于每个公司你目前位于哪个阶段。
为了帮助解决这个问题,我维护了一个详细的面试日志本。它按面试阶段(已申请、面试中、已录取、被拒绝等)和公司进行分类。每家公司本质上是一页包含背景信息和按时间顺序排列的事件列表(例如电话和面试)的日志。这样,我可以看到我申请和面试过的公司,以便进行适当的跟进。
第四步:面试
4.1 电话面试
初步与HR电话交流
你与公司的第一次接触通常是通过与招聘人员的邮件往来。招聘人员会询问你的时间进而安排何时进行初步电话交流,这通常是一次“适配”电话,你们在电话中会讨论你的兴趣、背景以及为什么你适合这个职位。不必过于担心各种细节,这通电话通常很短,招聘人员会希望把你推进到下一个阶段,即技术电话面试。
技术电话面试前
在技术电话面试前的一两天,请务必在 Glassdoor 和 Leetcode 上查阅该公司以前的面试题目。对于谷歌和Facebook这样的大公司,这样做效果可能不会很好,因为有成百上千的面试题目。
但对于较小的公司,这种方法还是比较有效的。我会浏览Glassdoor上的许多帖子,记录下具体的技术问题,然后尝试解决所有这些问题。在电话面试中,遇到与网上发布的题目完全相同的情况非常少见,但做这些公司的过去问题能更好地为该公司的电话面试做好准备。
这类似于在参加同一教授的期末考试之前练习往年的期末题目——问题可能会有所不同,但问题的风格和类型会相似。
技术电话面试
技术电话面试是展示实力的关键阶段。这个阶段的目的是区分有能力的候选人和能力较弱的候选人。据说只有大约10%至20%的候选人能够通过顶级科技公司的技术电话面试。
评价的标准只有一个编码测试,而不是你的口才、当前工作的经验、掌握的编程语言数量,甚至不是你的个人项目。大多数面试官只想让你在你最熟悉的编程语言中完成一个编码练习。
个人而言,我并不认为这是发现最佳工程师的最佳方式。例如,我与许多非常有经验的软件工程师合作过。有些是GUI/应用开发专家,有些是C++专家,还有些是低级Linux专家,但他们中的许多人告诉我,他们会在限时的算法和数据结构(A&DS)编码测试中表现得很差。
但既然这是唯一的途径,想要进入科技行业,你必须“破解编码面试”……
编码练习通常通过共享在线记事本进行,例如CoderPad或Google Docs,面试官和你可以同时在共享文档中进行输入。
虽然一些公司(比如Google和Facebook)只要求你写出正确的算法,不要求你运行代码,但许多公司期望你在45-60分钟的时间内完成可以正确运行的代码。
除了共享记事本,大多数公司采用语音通话进行面试,而一些公司则通过Zoom/Skype视频通话进行。
对我来说,电话面试是面试过程中最困难的部分。作为参考,我大约只有50%的技术电话面试通过率。它们困难的原因包括:
- 45-60分钟的时间窗口通常对我来说很紧张,因为我打字速度不快。(无论你是否相信,我在白板编码时更快,原因将在现场面试部分讨论。)
- 你需要在整个通话过程中与面试官保持交流的同时编写代码。大多数人更喜欢先讨论设计/方法,然后在安静中编写代码和调试,包括我自己。但如果在实现阶段你有20-30分钟不说话,会显得很尴尬。
- 在线记事本是基于文本的,不是白板。因此很难画图或图解代码工作流程。
- 在线记事本不是集成开发环境(IDE)。虽然大多数在线记事本,如CoderPad,可以做不错的语法高亮和缩进,但它们不是全功能的IDE。例如,它们不能做自动补全,也不能在你输入时高亮明显的语法错误,更不能支持逐行调试。所以很多时候,我不得不依靠“老实可靠”的print语句进行调试,这非常慢且笨拙。
- 语音通话是非视觉的。当我试图在电话中解释我的方法时,我不能画图,也不能通过面试官的面部表情或肢体语言来判断我的表述是否正确。
为了应对上述困难,我采取了以下措施:
- 使用一个好的电话耳机。这是显而易见的,因为你需要解放双手来编码!所以买一个好的蓝牙耳机,并确保在电话面试前充满电。
- 把闲聊时间降到最低。在我的前几次面试中,我会试图给面试官留下好印象。所以我会花大约5-7分钟谈论我的背景、经验,然后是我的自动驾驶汽车。有时面试官会问我一些问题,这可能会拖延到前10分钟!我很快发现所有这些闲聊时间都占用了面试分配的45分钟,这意味着我有更少的时间来处理编码问题。事实上,大多数面试官只想评估你的编码技能,你的强大工作经验此时对他们来说并不重要。所以我学会了在开始时将闲聊时间缩短到2分钟以内,并将我的问题留到面试结束。如果我成功完成了编码问题,面试官通常更愿意和我多聊一会儿。相反,如果你在编码面试中表现不佳,聊天也不会改变面试结果。同样的建议也适用于现场面试。
- 使用两个显示器。一个显示器用于共享记事本,另一个显示器用于搜索和IDE等。现在大多数笔记本电脑都有外接显示器的端口。确保在编写代码时将笔记本电脑连接到至少一个外接显示器,这样你就不必在窗口之间来回切换。
- 使用外接鼠标。如果你使用笔记本电脑,务必购买一个外接鼠标。对我来说,使用外接鼠标显著提高了选择、复制和粘贴代码的能力。
- 使用IDE。尽管你在共享记事本中编写代码,有时为了排除故障,最好将代码复制粘贴到IDE中,修复语法错误和错误,然后将可以正常运行的代码复制回共享记事本。大多数面试官不会介意,只要你能在规定时间内完成代码。他们也希望看到你成功!在电话面试前,确保设置一个空项目,方便快速粘贴代码并运行。你不想在宝贵的面试时间内创建项目和设置运行参数。打开IDE还意味着你可以在面试结束时直接粘贴代码,这样你可以保存问题和解决方案以供进一步分析。
- 使用节省打字的编程语言。这里的大多数技巧都是为了帮助你节省打字时间,以便你可以花更多时间思考解决方案。因此,尝试选择一种打字量少的语言。我的最佳语言是C++和Python。除非面试官特别要求C++,否则我在所有面试中都选择Python,因为与C++相比,它更加简洁。
- 善用Google。这是电话面试相对于现场面试的一个优势,因为你可以搜索。如果你不太熟悉某个函数的API或某种语言的语法,随时可以搜索。大家都理解你可以在电话面试中使用Google。如果你的面试官懒得从LeetCode上直接拿问题,那么恭喜你!;-)
- 在开始实现前与面试官彻底讨论你的方法。在我的前几次面试中,我会在大致了解该做什么后开始编码,想着可以在编码时细化细节。这不是一个好主意。尝试在与你的面试官的初步讨论中尽量细化细节。这实际上可以为你节省很多后续实施时间。面试官当然非常熟悉这个问题的所有优缺点。如果你提出一个次优或不正确的方法,他们可能会引导你走向更优的方向,并可能指出你忘记考虑的错误/角落案例。这可以为你节省大量的实现时间。但务必尽可能多地涵盖角落案例,因为如果面试官必须指出缺少的角落案例,你会被扣分。
- 解决问题比不解决问题更好。当你在寻找最优解决方案时,这一点可能不太明显。有时,如果我无法想到最优解决方案,我会提出并完成一个次优解决方案。无论如何,提出某个工作方案(尽管次优)能给面试官提供一个不错的比较数据点。在某些情况下,面试官在事后告诉我,我认为可能的“最优”解决方案实际上并不存在!根据我的失败经验,如果没有提出工作方案,面试肯定会失败。
记住,在这个阶段,你不应该专注于系统设计问题,因为这些问题只会在现场面试中提问,因为它需要白板来画图。
在线编程能力测试
我很少遇到还给在线编码测试(如 HackerRank 或 Codility)的科技公司,虽然很多金融公司仍然会给这些测试。这些测试的目的是节省招聘公司的人工成本。
通常,你会从公司的招聘人员那里收到一个在线测试的链接。在线测试通常有 3-5 道编码题,你需要在 2-3 小时内完成。在收到招聘人员的邮件后的 7-10 天内,你可以随时完成这个测试。在你进行测试时,没有人监视你,你需要通过大部分测试用例才能通过这一阶段。
以下是一些关于在线编码测试的建议:
- 使用 IDE: 你可以在你喜欢的 IDE 中完全编写和测试你的代码,然后将其粘贴到在线测试页面以运行正式的测试用例。
- 在开始之前阅读所有问题: 有些在线测试的设计是让大多数人在规定时间内无法完成所有问题。因此,在开始做题之前,一定要先阅读所有问题,先从简单的问题开始,这样你可以尽可能多地完成问题。
- 首先让代码运行起来: 对于大多数在线测试来说,时间是一种稀缺资源。所以目标是尽可能通过更多的测试用例,而不是所有的测试用例。如果你有一个可行的解决方案,它应该能通过大部分测试用例。如果你的解决方案不是时间优化最好的,你可能会在一些测试用例上超时,这没关系。继续解决下一个问题,如果有时间再回来。(注意:编写生产级别代码时不要这样做。对于生产级别代码,一定要花时间把算法搞对、整理干净,并添加足够的文档,以便你和其他人将来能维护你的代码。)
- 保存问题和你的解决方案的副本 以便日后分析。不管是电话面试、在线面试还是现场面试的题目,都应养成保存所有面试题目的习惯。
居家项目
一些公司在技术电话面试之前或代替技术电话面试给求职者布置居家项目。我有两家公司给我布置了居家项目,这两个项目都是与机器学习相关的。我发现这些项目比技术电话面试更有趣,也更贴近我申请的职位。因此我希望更多公司能用居家项目代替技术电话面试。
但我也理解这样做可能不是那么有效或公平,因为
- 公司不知道是你还是你的机器学习专家朋友完成了这个项目,
- 即使是你自己完成的,公司也不知道你花了多长时间。
由于居家项目通常需要花费大量时间,请确保你在明智地使用你的时间。
对于你非常感兴趣的公司,居家项目确实需要花8-10小时好好编写代码并记录你的方法和设计决策。例如,我为 Scale.ai 的项目花了至少10小时,尽管说明中让我只花大约2-3小时。我这样做是因为我觉得很有趣,并且通过探索不同的机器学习方法学到了很多。
对于你不太感兴趣的公司,不要花费太多时间,把时间留给更多的 LeetCode 问题,这样你可以更好地准备编码面试。
面试安排
当你完成了几次电话面试后,你应该会收到一些现场面试的邀请。在电话面试的初期阶段,你的成功率可能会比较低。我在前4-5次电话面试中都失败了。后来我意识到需要更多地练习动态规划和递归算法。
你的经历可能不同,但在面试过程中收到拒绝邮件时不要气馁。向招聘人员请求反馈并继续学习,还有很多公司等着你去尝试。
以下是一些面试安排的建议:
- 保持详细的面试日志: 这与第2步提到的日志相同。现在是时候开始记录每次面试的时间和讨论内容。
- 将所有面试放入日历并设置提醒/警报。你不想因为忘记面试而错过任何一个面试。此外,确保确认面试的时区,为简便起见,我总是按招聘人员所在的时区(通常是太平洋时间)与他们沟通。
- 安排某一时段的多场电话面试时至少间隔30分钟。这是因为有些面试官可能会晚打5-10分钟电话,有些面试官可能会允许面试超时5-10分钟。如果你把两个电话面试安排得太近,可能会不得不缩短一个或错过另一个。此外,你还需要5-10分钟的时间来清理思绪并记下面试笔记。
- 请求第二次机会。这可能是一个鲜为人知的事实。如果你第一次电话面试失败,很多公司会允许你有第二次机会。大多数公司不会自动提供第二次机会,但如果你礼貌地请求,它们通常会同意。因此你每次都要尝试请求它们再给一次机会,但将它安排在第一次面试后的几周,这样你有足够的时间学习。除非你等6个月,否则通常不会有第三次机会。
- 错开你的面试。我将面试分阶段进行。把认为较容易通过的公司安排在早期阶段,把较难通过且更知名的公司安排在2-3周后的后期阶段。这样,如果你发现自己在某些主题上较弱,还有2-3周的时间来学习。
- 集中安排你的现场面试。因为我面试的大多数公司都在湾区,我尝试在1-2周内安排所有的现场面试,这样我只需要飞一次就能完成所有的现场面试。例如,我的湾区现场面试持续了整整两周,其间我面试了6家公司,每周3次面试。如果公司知道你会在城里进行其他面试,他们更愿意安排你进行现场面试。此外,他们不需要支付你的机票。不同公司支付了一些酒店费用,剩下的酒店费用由我自己承担。这样对我来说没问题,因为它为我节省了很多时间,我能够集中安排所有的现场面试,这样可以在同一时间段内收到所有的面试结果。
4.2 现场面试
在现场面试前的2-3周,你需要开始专注于系统设计问题。许多公司允许你在通过电话面试后安排4-6周内的现场面试,这应该能给你足够的时间准备算法与数据结构(A&DS)和系统设计问题。
通常每个公司的现场面试包含4-5个45分钟的面试环节——上午2个,午餐时间,然后下午2-3个。面试内容一般包括1个系统设计面试,1个行为面试和2-3个算法与数据结构(A&DS)编码面试。很少有公司会问到数学或脑筋急转弯问题,所以我不会花太多时间准备这些。
系统设计面试
Gaurav Sen 正在设计 WhatsApp
这一阶段被包含在第二步(面试准备)中。如果你看了所有我推荐的所有系统设计YouTube视频,并能够将其概括为一个类似于我所概述的框架,说明你掌握得非常好。
明确需求规范
在系统设计问题中,一个重要的技巧就是及早明确系统的功能和特点。你需要定义一组既不太简单也不太复杂的功能,以便在45分钟的时间内完成。
例如,在被要求设计一个即时通讯应用时,请确保提及以下基本功能:
- 用户认证(这是大多数系统中应有的)
- 一对一消息
- 群组消息
- 用户在线状态
- 离线消息(如果有时间)
对于一个45分钟的面试,我不会提及以下非基本功能:
- 语音通话
- 视频通话
- 多人通话
- 个人时间线(如Facebook Stories)
当然,如果你被要求设计Skype,你必须设计语音和视频通话,但我不会在设计的功能中包括共享计算机桌面,这样做是为了将已有功能限制在可管控的范围内。
注意意外事件
在面试中,你需要注意面试官提出的一些奇怪的问题,并能做出聪明的回应。
例如,在Facebook的面试中,我被要求设计一个简化版的Google搜索。我在白板上画了一个相当不错的高层设计。然后面试官抛出一个意外的问题:
面试官:“你认为需要多少台服务器?”
我:“嗯,这取决于有多少人在使用它以及服务器的性能如何……”
面试官:“你为什么需要知道服务器的性能?”
我:“我的想法是,实际使用情况就像分子,服务器硬件的能力就像分母,所需的服务器数量取决于这两个数字。”
面试官:“不,服务器的硬件规格是无关紧要的。”
我:“硬件规格当然很重要,如果我可以用10台高性能服务器托管一个服务,我可能需要100台笔记本电脑来托管相同的服务。”
面试官:“硬件规格无关紧要。”
此时,我感到困惑,因为我觉得他有点不讲理。在长时间的尴尬停顿后,我几乎要放弃了。
我:“所以你的意思是硬件规格不重要?”
面试官:“假装你不知道服务器的硬件规格,你怎么确定需要多少台服务器?”
哦,他的意思是这样!!他不是说硬件规格无关紧要,而是说我们不知道确切的硬件规格。
我:“哦,在这种情况下,我需要基准测试服务器的吞吐量,所需的服务器数量大致是最大使用量除以单台服务器的吞吐量。我这样说对吗?”
我看到他微微点头。
我讲这个故事的意思是,在面试中进行补充说明从而明确面试官的问题/陈述有多么重要。你可以通过用自己的话复述问题/陈述来做到这一点。如果你真的卡住了,问他们刚才说的是什么意思。也许他们会以不同的方式重述问题/陈述,以便你理解并继续。
记住,许多面试官不是母语为英语的人,所以他们说的和他们想说的可能不完全一致。同样,许多面试者(包括我在内)也不是母语为英语的人,所以他们听到的和他们以为听到的也可能不完全一致。
让面试官以不同的方式重复同样的话,可能会大大帮助面试者理解面试官的真正意思。
在白板上进行的算法和数据结构编码面试
Tushar Roy 讲解 Trie 数据结构
现场面试中的算法和数据结构(A&DS)问题几乎都是在白板上完成的。包括我自己在内,许多人最初都对白板编码感到害怕,因为在实际工作环境中,谁会在白板上写详细的代码呢?
但在经历了所有这些现场面试之后,我发现白板编码在某种程度上比电话面试更容易。我将在下面介绍一些专门针对白板编码的技巧。
用图表/表格来说明你的算法。有句老话说,“一张图胜过千行代码”,或者类似的说法。在写代码之前,尝试用图表/表格来说明你的代码如何工作。这会给面试官一个你代码可能是什么样子的路线图,并允许他们指出他们看到的任何潜在问题。
一旦你写完代码,尝试逐行检查代码,并在旁边放上图表,这样你就可以向面试官展示你的实现与你的意图是一致的。一定要观看Tushar Roy的LeetCode高难度解决方案的YouTube视频,学习如何在白板上展示想法。
将白板分成几个部分。出于前一条提示提到的原因,我建议将白板至少分成2-3个垂直部分。一部分用于图表,其他部分用于代码。这样,你可以在编写代码的整个过程中随时参考图表。
不要纠结于语法细节。如果允许你使用任何编程语言(这是常态),那么面试官不应该对你的代码语法太挑剔。例如,如果你漏掉了C++/Java中的分号,或Python中的冒号,只要你的缩进正确,就没关系。或者如果你拼错或缩短了内置函数的名称,只要面试官理解你的意图,也没关系。相反,在电话面试中你没有这样奢侈的宽容度。
使用简化的变量/函数名称。因为用记号笔写长名称需要很长时间和很多空间,告诉面试官变量的全名和含义,然后在代码中使用简化的名称。这会节省你很多宝贵的时间和白板空间。
不断寻求反馈。这是现场面试的一个重要好处,因为你可以很容易地判断面试官的反馈。当我展示我的设计或方法时,我会定期检查面试官的面部表情,并随口问,“我这样做是正确的吗?”或“看起来怎么样?”通常,面试官都很乐于提供一些反馈,或者至少点头或皱眉。在你偏离正确答案太远的时候,如果你问的话他们肯定会告诉你。
正如我几次惨痛的经历告诉我的那样,当我不寻求反馈时,一些面试官会先让我完成整个实现,然后在最后指出一些重大缺陷。结果,我惨败了所有那些面试。所以尽量在编码前尽量细化你的设计并寻求反馈。
其他的在线面试技巧
其中一些非技术技巧可能是常识,但我将它们列出来作为提醒。
在结尾提出好的问题。在每次面试结束时,你可能没有太多的时间来提问。所以这些问题要简短而有影响力。面试是一个双向的过程——公司在评估过程中试图从你身上提取信息,你也需要对这些公司做同样的事情,这样当你得到工作机会时,你就可以做出最明智的决定。
以下是我喜欢问的经典问题:
- 你能告诉我你的工作背景和你现在的工作吗?
- 你能告诉我贵集团/公司的技术栈和开发方式吗?一旦面试官提到一些编程语言或工具,你可以回应说你也使用过这些技术。
- 谁是贵集团/公司的理想人选?一旦面试官提到了理想候选人的一些特征,你可以回应说你也有这些特征,并给出一个快速的例子来支持它。
- 推销一下自己。这可能并不适用于所有人。我还利用面试结束时的“提问”时间,向面试官展示了我的自动驾驶机器人汽车和几段关于这辆汽车的YouTube视频。我觉得效果出奇的好,因为我看到大多数面试官在拿着车的时候都非常惊喜。
保持充足的水分. 在面试过程中你会说很多话,你会(无意识地)出汗很多,所以你总是想要随时补充水分。这意味着每次面试结束后都要把杯子重新斟满,不在白板上写字的时候就喝一小口。我发现咖啡因(咖啡/茶/可乐)在让我保持最佳状态方面非常有效。
记笔记. 我总是详细记录我的面试。因为大多数面试都是连续进行的,所以你唯一能做笔记的时间就是上厕所的时候。带上你的手机,快速记下一些面试时收到的提问和你的解决方法,这样你就可以在完成一天的面试后让自己回想起来这些。这应该不超过1分钟。
吃一顿清淡的午餐. 午餐时不吃得过多是很难的,因为许多顶级科技公司都有很棒的免费食物!Facebook甚至还有免费的冰淇淋!虽然你很想在那里品尝所有的免费食物,但你需要记住,你去那里不是只为了吃一次很棒的免费午餐,而是去面试,然后得到这份工作,这样你就可以每天都在那里吃饭了。
不要暴饮暴食的两个原因:第一,你需要在下午的会议上保持清醒,而不是感到昏昏欲睡。第二,你需要花大部分时间和你的午餐伙伴聊天。虽然在一些公司(谷歌/Facebook),你的午餐伙伴的反馈不是决定offer的一部分,但很多时候,他们是公司的高层,所以他们的意见可能很重要,而你需要给他们留下好印象。
上厕所。每次面试结束后,一定要去一下洗手间。不幸的是,这些45-60分钟的面试通常是连续的,中间没有休息时间。所以你一定要在下次面试开始前去一趟卫生间。你想要能够走路和伸展一下你的腿,更重要的是,洗干净你的手和脸,这样你就可以神清气爽地去参加下一次面试。不要休息太久,因为休息时间会占用你接下来的45分钟。
带些零食
与上一点相反,在我参加的一些现场面试中,不管是有意安排还是因为时间冲突,午餐时间有时会被安排在下午1:30-2:00,有时甚至会被直接跳过!那时我会饿到几乎撑不住了,所以我学会了随身带一根麦片棒和几块巧克力,这样可以在面试间隙快速吃几口。
带几份简历
虽然大多数面试官确实会带上一份你的简历,但偶尔我会遇到没带简历的面试官,所以我会递给他们一份。对于技术面试,这可能并不是特别重要,但这是一个贴心的举动。
事后分析
当天的面试结束后不要马上放松,你需要在回到酒店或家里后,趁着记忆还比较新,立刻尽可能详细地记录面试情况,包括面试官的姓名/背景、所有提问、你的应对方法、面试官对你提问的回答等。用电子方式记录(而不是纸质笔记),这样以后更容易搜索和存档。
之后,你需要再次回顾所有的面试问题,找到优化的解决方案,并思考如何在下次面试中提升自己的表现。如果在LeetCode上找到相应的面试问题,务必将问题标注上公司名称,以便其他人从你的经验中受益。
以上只是一些小技巧,可以稍微增加你的胜算。你仍然需要大量练习算法和数据结构问题,学习快速识别每个问题的解决方法。
例如,了解在树/图中何时使用BFS或DFS,何时使用递归与迭代算法,何时在处理数据之前进行排序或建立索引等。并且一定要熟知你使用的算法的时间和空间复杂度。我从5月底开始准备面试,6月底进行了第一次电话面试,8月底完成了最后的现场面试——这是我生命中最紧张的三个月。
如果你们中有人问我遇到的具体面试问题,很遗憾,我不能在这里透露。但我已经在LeetCode上将所有相关的面试问题标注了公司名称,作为对在线社区的匿名回馈。我希望你们在面试后也能这样做。
Step 5. Offer谈判和团队匹配
5.1 Offer谈判
如果你在阅读这部分,说明你可能已经收到至少一个 offer 了。哇,恭喜!(如果你还没有收到任何邀请,立即停止阅读,回去继续做更多的LeetCode练习和面试吧!😜)
Offer薪酬包的组成部分
来源: levels.fyi
以下是科技公司Offer薪酬包的典型组成部分。我将举一个通常有3-5年的工作经验(YoE)的中级软件工程师(SWE)的例子。
- 签约奖金: 这是你开始工作后立即得到的钱,而不是在你签署聘用合同时。例如,一次性支付$30,000。
- 基本工资: 这是每个月进入你银行账户的钱。例如,每年$150,000。
- 年度奖金: 这是你基本工资的一个百分比,通常为10-30%,每年发放一次。例如,20%,对于$150,000的基本工资来说就是$30,000。
- 股票期权或股票奖励: 大公司倾向于给予股票(称为受限制股票单位,RSUs),在授予时有一定价值。初创公司倾向于给予股票期权,在授予时价值较低但有很大潜力。例如,价值$300,000的股票奖励,分四年归属,每年归属$75,000。
- 搬迁补助(如果你需要搬迁): 通常包括:
- 几周的公司住房供你和你的家庭使用
- 搬运你所有的物品
- 帮助买卖房屋,并且可选地
- 一些现金以帮助其他搬迁相关的费用。搬迁补助取决于你的家庭构成、位置和级别。通常是不可协商的。
- 年度总薪酬(TC): 这是使所有Offer薪酬包可以进行对比的一个数字。
TC = 基本工资 + 年度奖金 + 年度股票奖励 + 分摊的签约奖金(假设你将签约奖金在3年内分摊)
我们中级SWE的TC = $150k + $30K + $75K + $30K / 3 = $265,000
注意,搬迁补助不被视为TC计算的一部分,因为在预期情况下你大概会花掉大部分(如果不是全部)搬迁补助。
知道你的技术水平所对应的等级
即使你知道自己的求职目标,公司也可能会根据公司的具体情况对你进行面试。例如,一个4级工程师可能会选择谷歌的L3或L4级、Facebook的E3或E4级或者微软的59-62级的面试。
询问招聘人员你面试的是哪个级别的岗位,但这可能不是你得到这份工作的水平。例如,你可能在Facebook的E4面试,最终,招聘委员会可能会认为你的表现不足以达到E4,但足以获得E3的offer。 所以再次询问招聘人员你的工作offer是什么级别。通过这一层,你可以找到TC的期望值和范围。(见下文)
知道你自己在市场上的价值
如果你不知道你的市场价值,你就无法有效和目标公司进行谈判。多年来,公司一直对薪酬信息保密,因此候选人在信息方面处于巨大的劣势。
幸运的是,近年来薪酬信息已经逐渐透明化,许多网站从许多候选人中收集到必要的信息,然后按级别、工作职能和地点呈现匿名的薪酬数据。一个著名的网站是levels.fyi。
3-5年SWE工作经验的最高薪酬。来源:levels.fyi
5年以上SWE工作经验的最高薪酬。来源:levels.fyi
正如你在上面看到的,所有高薪工作都在旧金山湾区(Bay Area)。拥有3-5年工作经验的SWEs可以获得高达29万美元的TC,拥有5年以上工作经验的SWEs可以获得超过40万美元的TC。
对于任何非湾区的工程师来说,30万至40万美元的总薪酬可能令人瞠目结舌。但请记住,湾区是美国房价最高的区,因为很多人的工资要高得多。加州帕洛阿尔托的房价中位数为280万美元(资料来源:Zillow.com),旧金山都会区(资料来源:censusreporter.com)为110万美元。
相比之下,纽约曼哈顿的房价中位数为120万美元(数据来源:Zillow.com),而纽约/新泽西都会区的房价中位数仅为44万美元。(来源:[censusreporter.com] 42)
结合在levels.fyi上筛选出你的水平(从上一步获得)和公司名称,你可以清楚地看到offer的平均TC及其范围。例如,对于旧金山湾区的谷歌L4 SWE,offer的平均TC约为26万美元,范围从20万美元到32万美元。所以,如果你收到了只有20万美元的谷歌L4的offer,那么你就知道你还有讨价还价的空间。
初创公司
Levels.fyi 是一个很好的用来比较更成熟公司的offer(无论是上市公司还是私营公司)的工具,因为这些公司的薪酬中的股票部分可以更有把握地用美元来评估。
但是对于早期的初创公司,你在 Levels.fyi 上通常找不到可靠的数据,这往往是因为以下两种情况:
- 一定比例的公司股票,或者
- 一定数量的股票期权。公司招聘人员或CEO可能会告诉你,虽然你现在的股权价值很低,但如果公司在3-5年内上市,它的价值可能会增长20-50倍。
实际上,这些股权成分很难评估,极其缺乏流动性,多年来没有任何货币价值,实际上当90%的初创公司失败时(来源:福布斯),它们的价值确实会归零。
我收到了一些来自早期初创公司的offer,他们大多存在典型的薪酬包现金部分较少(即基本工资和奖金较低),而股权部分较重(很多期权,潜在回报巨大……或者一无所有)的特点。这很符合常理,因为大多数早期初创公司并不盈利,他们支付的任何现金工资/奖金都会消耗他们手头的现金,或者用风险投资(VC)的术语来说,烧光他们的资金。
虽然我收到的这些初创公司offer确实做着令人兴奋的工作,前景看起来非常有希望——其中一个公司还有谷歌风投的支持——但最终我选择了谷歌,因为我需要大公司的确定性和稳定性。毕竟,我的孩子即将上大学。我不能承担加入初创公司几年后看到它失败而我的股权部分被抹去的风险。
然而,如果我年轻且没有孩子,我肯定会去初创公司工作,尝试一鸣惊人。如果我失败了,我不会有养家的压力,还有足够的时间重新开始。如果我的妻子赚的钱足以支付我们全家的开销,那么我也可以去初创公司工作,追求其潜在的上升空间。在金融术语中,这称为多元化——通过将风险较高的股票与较安全的股票或债券结合起来,你实际上可以实现更高的风险调整后收益。
不要在第一次电话联系中接受Offer
当你第一次通过面试被发放Offer时,招聘人员通常会通过电话告诉你 Offer 的详细信息(基本工资、奖金、股权奖励等)。这被称为“口头 Offer”。你在第一次电话中需要做的是感谢招聘人员,记下这个 Offer 所有的详细信息,重复一遍以确认,并请他们通过电子邮件发送这些详细信息。然后挂断电话。
记住,不要当场接受工作。(如果这是你的梦想工作,可以在挂断电话后跳起来庆祝。)有时候,招聘人员会拒绝以书面或电子邮件形式发送给你。如果是这样,那么请你将刚刚写下的 Offer 详细信息发送给他们,并询问你所听到的是否正确。他们通常会确认。
这很重要,因为一旦有书面记录,招聘人员就不容易收回他们在电话中告诉你的内容。
很多时候,招聘人员会催促你立即在电话中口头接受 Offer,或者给你一个 24 小时的接受期限。不要上钩!你应该总是尝试争取更好的 Offer。
Offer 谈判——当你有多个Offer的时候
Offer 谈判就像玩高赌注的扑克——毕竟,我们谈的是成千上万的美元——这既令人兴奋又有压力。对于像我这样的人来说,这也可能很让人害怕。不过有了 levels.fyi 的信息后,如果那个 Offer 太低的话,你可以揭穿招聘人员的虚张声势。
在 Offer 谈判过程中,有一个强有力的 Offer 或者说一副强有力的底牌是有帮助的。很多招聘人员很愿意尝试匹配竞争对手的 Offer。他们可以将竞争对手的 Offer 呈递给招聘/薪酬委员会,作为提出更好 Offer 的强有力理由。
在这种情况下,你可以尝试让这些公司竞标你的薪酬。竞标每天都在我们身边发生,比如在股票市场、eBay 和 Google Ads 中,当某种商品有需求时,这很正常。竞标过程确保商品以公平的市场价格展示它的价值。
Offer 谈判——当你只有一个Offer
即使你没有底牌——即只有一个 Offer 或者仅有比这个 Offer 更低的 Offer——你也可以告诉招聘人员你对这家公司非常感兴趣,但你的薪资期望实际上是 $XYZ。招聘人员可能会要求你证明这个数字,你可以说这是基于 levels.fyi 的数据,或者是你朋友/同事的相似年资和他们的总薪资是 $XYZ。
如果你表现得专业,很有可能最初的 Offer 会有所提高。公司很不可能因为你试图谈判就收回其原始 Offer。毕竟,公司投入了大量精力寻找合格的候选人,所以他们不想因为小幅增加而失去好候选人。所以你礼貌地要求更多薪酬是没有任何损失的。
Offer 谈判——可以不只是谈钱
记住,不仅仅是薪酬可以谈判。公司可以提供的任何东西都在谈判桌上。
例如,你可以要求在不同的组工作(比如核心组而不是支持组)、不同的职称(比如高级软件工程师而不是软件工程师)、不同的工作职能(比如研究工程师而不是软件工程师)、更多的带薪休假天数、灵活的在家办公时间,或更好的搬迁打包。
当然,这在不同公司之间差异很大。大公司可能不那么灵活,但较小的公司可能无法匹配大公司的货币补偿,可能更愿意考虑这些替代要求。再次强调,如果你礼貌地提出要求,是没有坏处的。
Offer 谈判——不要太贪心
经过几轮与招聘人员的来回交谈后,如果你感觉没有太多空间可以谈判了,就停止要求更多。大公司中的招聘人员每天都会见到这种情况,可能不会太介意。但对于较小的公司,招聘人员可能直接与你的招聘经理甚至是老板/创始人合作。如果你讨价还价太激烈,可能会被认为太贪婪。因此,即使他们雇用你,他们可能会对你产生负面看法。知道何时收手。
Offer 拖延策略
如果在谈判后你对任何 Offer 都不太满意,你应该尝试推迟接受这些 Offer。这可能发生在某些 Offer 的工作职能非常有吸引力,但薪酬太低,而其他 Offer 的薪酬很好,但你不喜欢工作职能的情况下。
推迟一个 Offer 可以让你有更多时间进行面试,获得那个完美的 Offer。但这确实有风险,因为职位可能随时被填满。但对于大科技公司,这种风险很小,因为他们总是在招聘。如果你需要推迟一个 Offer,以下是一些策略。(免责声明:我没有尝试过所有这些策略,有些是别人建议的。)
- 与团队/同事见面:请求一次通话、一起喝咖啡或共进晚餐,以了解团队其他成员或同事的更多信息。这不仅是展示兴趣的好方法,也是了解公司/团队文化的有力信号。
- 请求产品演示:请求对方进行产品演示是展示兴趣的另一种好方法。这也是评估技术挑战、产品路线图以及公司产品导向程度的好方法。你通常可以将此与团队共进午餐结合起来。
- 询问各种股票/期权相关问题,例如公司的当前估值、最近的融资轮次、公司的退出计划/策略以及期权行权计划等。
这些策略对大多数公司都很有效。对于一些大科技公司,一旦他们决定给你 Offer,通常这个 Offer 至少会有效几个月,因为你达到了他们的技术门槛,他们会随时愿意雇佣一个优秀的软件工程师。你的招聘人员可能不愿意告诉你这一点,因为他们希望尽快敲定你,但你可以通过其他渠道了解,例如 Google 搜索和 Blind App。
最后,记住所有招聘人员都希望你被公司录用。能够敲定一个候选人(即将合格的候选人转化为员工)是他们的绩效指标之一,与招聘人员的绩效奖金挂钩。所以把你的招聘人员视为你的支持者,而不是对手。
5.2 团队匹配/选择
不要仅仅因为一份工作现在支付最高工资就选择它。 虽然在你决定是否接受offer的过程中薪酬是一个重要因素,但更重要的可能是这份工作对你职业生涯的影响。我将在下面讨论如何选择一家公司/团队,以最大化你职业生涯的潜力。
团队匹配过程
对于许多公司(包括苹果、微软和许多其他公司),你将与几个特定的团队进行面试。当你获得这份工作时,你将只会参与其中一个团队的工作。
然而,对于一些公司,如谷歌和Facebook,他们会将大多数候选人作为通用的软件工程师(SWE)进行面试,并且只有在决定向该候选人发放offer后才尝试将其匹配到一个团队。由于我只经历过这两家公司的团队匹配过程,下面我将谈一谈我的经验。
Facebook会先发出一个正式的书面offer,然后再将你匹配到一个团队。团队匹配可以在你加入之前进行,例如你与招聘经理通话时,或者在你加入后,在前4-6周的培训/入职阶段进行。这一过程的优点是候选人知道他们的offer是确定的。缺点是你可能会面临在入职培训期间找不到喜欢的团队的风险。不过我在Facebook的朋友告诉我,这种情况极不可能发生。
谷歌的做法则非常不同。他们不像Facebook那样进行长时间的培训/入职流程。他们首先会给你一个口头offer,然后要求你在发出正式的书面offer之前匹配到一个团队。即使在你被匹配到一个团队之后,这个offer也可能会被招聘委员会拒绝或修改,甚至是最终的薪酬,也可能由薪酬委员会在最初的口头offer基础上进行调整。
我从许多帖子中了解到,这个过程既漫长又艰难。就我个人经历来看,团队匹配过程花了我1.5个月,这确实漫长且令人沮丧。有时候我真的认为我无法完成团队匹配过程,并想加入另一家公司。
如果谷歌像Facebook那样先给我一个正式的书面offer,这会为我减少很多压力,因为我会明确知道自己将要为谷歌工作,只需找到一个团队即可。幸运的是,事情最终对我来说很顺利,我终于与一个自己选择的小组匹配,之后不久offer也被各个委员会批准了。
如何选择一个团队
这里有一些我在面试期间或录用阶段问自己的一些问题。你不需要问面试官这些问题,但你需要从你的面试中,或者从与公司和团体的对话中提取出这些问题的答案。
- 我将加入哪个组? 我想加入公司的一个“核心”小组——公司为这个小组大量投入资源,这样的小组通常是它的旗舰产品集团或高增长集团。在这些团队中工作可以得到稳定性和成长。
- 我将为公司或小组做什么类型的工作? 我寻找的是能在我以后的职业生涯中应用的工作经验。我更喜欢使用公开可用的工具和技术,而不是使用公司的专有技术。举个例子,如果我在做一个广告推荐机器学习系统,我相信我很容易就能找到另一家想要改进其广告/产品推荐系统的公司。但是,我对使用公司专有的脚本语言自动化一些内部流程不太感兴趣。
- 我能在这家公司/小组里学到什么? 工作是双向选择,能为双方都带来价值的。我希望能够为我的公司做出很大贡献,与此同时,我想从工作中学到很多东西,这样当我找下一份工作的时候,我掌握的技能就能让我很受欢迎。我相信AI/ML、计算机视觉、云计算、自动驾驶汽车和AR/VR技能在未来会有很大的需求,所以我想在下一份工作中学习这些技能。
- 我对这份工作有热情和激情吗? 如果你对自己的工作没有激情,那么不管这份工作给你多少薪水,你都不会快乐,也不会投入120%的精力。我对量化金融充满热情,因为看到数学和技术改变整个行业是很酷的。但在10多年后,我现在对AI/ML充满热情。你不需要告诉电脑该怎么做,这真是太棒了,太神奇了。你所要做的就是给它提供数据,它会找出比别人用代码做得更好的方法。
- 我喜欢我的领导和同事吗?他们喜欢我吗? 想要一个欣赏你并在新工作中支持你的领导。你也想享受和队友在一起的时光,因为你每天和他们在一起的时间超过8个小时,甚至比和家人在一起的时间还要长!
很多时候并不是所有这些问题都能得到让你满意的答案,然后你必须权衡利弊。但如果以上任何一项给了你一个危险的信号,我会认真考虑放弃那个职位。
我最终选择了谷歌Pixel Phone的相机组,因为它提供了我非常感兴趣的三样东西:计算机视觉、机器学习和硬件,这正是我的机器人自动驾驶汽车项目的全部内容!此外据我所知,谷歌现在正致力于其硬件和智能家居战略,Pixel手机将成为该生态系统的核心部分。
结语
感谢你读到这里。在过去的6个月里,我经历了一段漫长的旅程。通过我的个人项目和密集的面试准备,我相信我现在是一个更好的工程师(或者至少是一个更好的面试者 ;-)。在这篇文章中,我讲述了自己的经验和教训。
我发现数据结构和算法是任何科技面试的核心,除了练习更多的LeetCode上的问题外,没有捷径可以做得更好。一旦你对数据结构与算法和系统设计问题有了良好的了解,我在这篇文章中提出的建议应该会帮助你做些更有利于你的事情。
我建议你把这篇文章收藏起来,因为在接下来的2-6个月里,随着你找工作的进展,你会需要回顾这篇文章。在你真正进入某一阶段之前,那之后的阶段中所需要的一些技巧并没有多大意义。例如,你可能需要进行几次电话面试来理解第四步中提出的建议,在你得到任何offer之前,你当然不应该考虑第五步的offer谈判。
如果你正在参加面试,请在下面留言,让我知道我的建议哪些有效,哪些不太有效,这样其他人也会受益。也欢迎在评论中提出新的建议,谢谢!
一些使用到的资源
以下是我在求职过程中使用过的资源的附录(按字母顺序排列)。希望你也会发现它们对你有帮助。
Blind: 这是一个允许不同公司(主要是科技公司)的员工匿名发布问题和答案的应用程序。人们通常会讨论职业决策、公司文化、面试和薪酬等问题。
我发现这个平台有好有坏。好的地方是你会得到更坦诚的回答/回应,有时还会得到内幕消息。坏的地方是有些人会因为匿名而写下冒犯性的回复,这样的环境有时可能是有害的。我已经警告过你了。
Coursera: 学习你感兴趣的科目。它是免费的,或者只收取象征性的费用。我在那里学了ML和DL课程。
DeepLearning.ai and Workera.ai
- 如果你对计算机视觉(CV)或自然语言处理(NLP)中的深度学习技术感兴趣,参加5门课程的深度学习系列课程。
- 通过筛选测试,被推荐给顶尖科技公司ML团队的招聘经理
Elements of Programming Interviews Book: 这是另一本优秀的面试准备书,类似于CtCI书。但它更适合有经验的工程师,而CtCI可以被没有多少算法背景的初学者阅读。
GeeksForGeeks: 这是另一个与LeetCode类似的有非常全面的A&DS问题和解决方案的网站。这个网站是免费的,有时会包含在LeetCode中找不到的面试问题。
- 查看公司的员工评价
- 找到之前的面试问题
- 设置工作提醒以接收新的工作更新
Google Search: 生活中任何问题的起点。我还需要多说吗?
[Internal Employees:] 总是试着联系你的朋友或者朋友的朋友,如果他们在你想申请的公司工作。他们将是你最有效的线人和支持者。如果你适合这份工作,在领英上联系我, 我很乐意把你推荐给谷歌,或者我在其他顶尖科技公司工作的朋友。
- 练习A&DS问题
- 使用LeetCode高级版(35美元/月或99美元/年带优惠券)查找给定公司过去的面试问题。我建议你付年费。就把它想象成你的编程大脑的健身房会员吧。
Level.fyi: 这个网站按公司、资历级别、地点和工作职能列出了众包工资信息,这样你就知道你是否从公司得到了一个公平的报价。当然,这只适用于大公司,因为大公司往往有更多的数据来源。
- 查找人员的专业和教育背景
- 打开“Open to new opportunities”设置,这样招聘人员就能找到你。
- 使用领英高级连接到谁感兴趣的人你
- 设置职位提醒以接收新的职位更新
- 阅读教程和操作指南来帮助你的个人项目
- 在媒体或其他地方写博客,展示你自己的个人项目
TripleByte: 如果你通过了他们的技术筛选,你就可以跳过电话面试,直接去现场面试。详情请参阅上面的详细说明。
- 当你在做个人项目时,观看教程和操作指南
- 观看系统设计和算法视频
- 警告:不要在准备面试期间分心,看几个小时的视频摸鱼取乐!
就是这些,这是一项艰巨的任务,但只要你付出时间和努力,你就能做到。