原文:Coding Interview Prep for Big Tech (FAANG) – And How I Became A Google Engineer,作者:Zubin Pratap

当我成功从一名律师转行成为 Google 软件工程师的时候,我发表了帮助我成功转型的 10 个想法这篇文章,之后我收到许多提问:

  • 如何自学新技能
  • 我怎么知道 37 岁学代码“不晚”
  • 我是怎么准备大科技公司的面试
  • 我是如何分析和最小化转行的风险
  • 我是如何发现软件工程师这个职业适合我
  • 我专注于哪个语言
  • 成为 FANG/FAMGA(Facebook/Amazon/Netflix/Google/Microsoft/Apple)的软件工程师是否适合每一个人(提示:这些公司听上去很诱人,但事实证明并不适合一些人)

注意:我认为 “FAANG/FAMGA” 不足以概括所有好公司,所以我倾向于使用“大科技公司”,来指代包括这四五个令人着迷的公司在内的所有颇具盛名的公司。

我为什么写这篇文章

虽然时下流行“推特长度的建议”,但我认为上述的每一个问题都值得用一整篇文章来回答。有意义的技能可不是几百个字就能讲清楚并被读者吸收的。

所以在这篇文章中我将回答其中一个问题:

  1. 当 38 岁时,我从律师转行为软件工程师
  2. 以及 39 岁时,我准备大科技公司面试,仅有不到两年的相关经验

我所采用的方法。

如果你想要我详细回答其他问题,可以告诉我。我会在这篇文章中穿插我的联系方式,只有通读全文才能找到。😊 这样做也是为了鼓励你仔细阅读这篇文章,而不只是为了一些“小贴士”略读全文。

发现真正的目标

我持以下观点:获得面试机会比学习代码难;在面试中表现出色和获得面试机会一样难;如果你不具备竞争对手同样的扎实经验,对于你来说,行为面试很困难。

当我零基础转行时,以及当我将目标设定在大科技公司的时候,我知道我将和博士生、从青少年时期就开始写代码(通常写了 20 多年)以及在技术上有相当成就的人同台竞技,而当时的我只有一年的相关经验。

同时我不在美国,给挑战又增加了难度。

所以我制定了一个不仅仅是“学习写代码”的计划。

首先,让我详细介绍一下为什么我认为“学习写代码”是准备环节中最简单的部分。虽然从 2012 到 2018 年,我反复尝试失败了 4 次。

这个想法是 2018 年产生的。当时我的创业公司正在垂死挣扎,为此我损失了大量的资金,2 年没有任何收入。

但是我决定从我的信贷中取出 4 万多美元,为什么?去参加一个旧金山的训练营(bootcamp)。

我离开了家人,只身前往旧金山,本来要参加为期 14 周的课程,但是在加入这个顶级训练营的第一周我就放弃了,返回澳大利亚。

我曾十分期待这个训练营(也为贷款感到焦虑),但是对训练营的教学策略产生怀疑。我注意到老师和课程设置是帮助学员“学习写代码”而不是“成为一个程序员”。

根据我在 4 个国家以及其他 3 个行业的工作经验来判断,这种策略是一个错误。

学习写代码也是一种形式的“识字能力”,识字能力并不是技能。

我自己就是一个活生生的例子:这 4 次尝试中,每当我专注于“学习写代码”,我都会在一个非常小的领域里获得成功,要么是学会了 HTML 或者 Java,要么就是跟着书本编写了一个安卓应用,我总是能够学会读写一些基本的内容。但是我不知道怎么自己搭建一个有用的东西,当需要真正应用技能的时候我感觉绝望——我没有真正的“技能”。

在这个时代,我们并不因为我们知道什么而被雇佣,我们因为我们的技能被雇佣。

我马上列出代码训练营对于我来说是一个错误决定的原因。

这个昂贵的训练营可能会带给我一些基础的技能,甚至可以帮我找到“入门级别”的工作。但是我可以预见学习会变得非常仓促、标准化以及专注于“正确答案”。

我并不想在任务清单上“打勾”,我想要获得技能、竞争力和信心。

另外,训练营默认将每一位学员打造符合“初级程序员”的标准。

我当时已经 37 岁了,不满足于“入门级别工作”的思维方式。另外即便是行业新人,我不相信任何有三年以上工作经验的人是“初级”员工。

然后我发现训练营的一些老师和助教是没有找到工作的一些前学员。他们没有转行的经验,有一些甚至没有过“职业经历”,职业辅导员甚至从来没有过科技行业面试别人的经验。

我怎么从一些没有经验的人身上学习到我要的经验呢?

还有地理上的困难。本来就生活在旧金山的学员有本地优势,来自美国其他地区的学员没那么容易找到工作,并且在毕业后和拿到第一份工作前的这段时间很容易把钱花光。见鬼,我生活在澳大利亚,这可怎么办?

由此我得出清晰的目标。不是“学习写代码”——而是建立一个可以实现自我的职业。

另外,在研究训练营的时候,我看到了“兼职学习”的可能性。我可以找一份工作,然后在晚上和周末学习,这样做更容易坚持。两年没有收入之后,我必须有一点现金流来消除恐惧,才能专注成为一名专业的软件工程师。

正如传奇商人哈维·费尔斯通(Harvey Firestone)所言:

“据我所知,盈余是对商业判断的最大帮助。”

在学习期间有收入会让我有信心做出更好的判断。更好的判断对于需要通过长期努力来实现的职业很重要。

毫无疑问,如果我在训练营中学习 3-4 个月,我会“学习写代码”。

但是我学到的东西足以让一个优秀的团队买单吗?我不相信训练营和在线代码学习网站会帮助我实现这一目标。

学写代码不会让我走得太远。我必须足够优秀才能击败拥有相关学位、经验和人脉的竞争对手。我想在代码领域获得一份职业。

所以我离开了训练营,浪费了大约 9000 美元,回到澳大利亚。当然,我已经掌握了基本的代码知识,可以通过训练营的入学考试。但我远非能胜任工作。

如果你是职场新手,可能很难理解这里的分析。但你是否注意到许多人都玩音乐,但不是所有人都能胜任乐队成员的职位。正如我的导师所说:

"迈克尔·乔丹不想学打篮球,他想进入 NBA。这两者差异巨大。"

如何扬长避短

这一想法改变了一切。在 2019 年的 8 个月内,我获得了我申请的所有 4 个开发岗位的 offer。而在这个过程中,我仅遵从了我和我的教练(非技术)制定的发展计划。

不过不要被误导。我有意想不到的优势。使我受益的两个主要优势,一开始看上去是我的劣势。

这不是我的第一次转行,在曾经的职业生涯中我有近 10 年的招聘经验。今天我也做技术方面的招聘,这些招聘模式非常类似。

我最大的优势是我不以候选人的角度考虑招聘,而是从招聘经理的角度考虑招聘。这对我的计划产生了重大影响,我了解招聘经理的想法——他们的限制、优先级、价值观、业务需求、不喜欢的点、危险信号……

我的经验(年龄?)让我知道可以对团队和组织产生什么样的影响,我可以向哪些人学习,谁可以给我提供想法、指导、建议和引荐,劣势成了优势 – 转行的优势

关于优势,我想指出一些重要的事情。

“杀手级别”的优势显而易见,让人脱颖而出。耸耸肩说“当然——这就是他们成功的原因”很简单。但人们常常忽略非常引人注目且严重的缺点。

对我来说,我的“缺点”是:

  • 地理位置——我不住在美国或其他科技中心
  • 没有正式的计算机科学资格认证
  • 零技术基础
  • 抵押贷款和财务责任
  • 我的 “年龄” – 40 岁时学习新技能比 25 岁时更难
  • 来自文化和社会的期望、判断、消极情绪
  • 招聘人员和老板比我年轻,不确定如何与我打交道
  • 与其他候选人相比,人们认为转行非常,非常“有风险”
  • 软件工程的收入将低于做律师的收入

每天我都听说上述原因是人们转行的绊脚石。虽然我无法评论这些是否是真正的原因,但我确定,如果我们对自己的局限性喋喋不休,这些局限就会永远伴随着我们。

固守我们的劣势并不能帮助我们克服它们。

在我的教练的帮助下和大量的心态/心理培训,我挖掘出自己的劣势并将其中的一些(不是很多!)转化为主要优势。就在那时,我意识到我在面试、招聘和资源配置方面的经验对我制定策略有很大帮助。

优先事项一:职业转变

在学习写代码并将成为专业软件工程师设为目标时,我发现我习惯性使用短线思维,并且对第一份工作抱有不切实际的幻想。

我希望我的第一份工作是光鲜亮丽的、证明所有对我的批判都是错误的、给我挣一大笔钱,让我免于在余生中自我怀疑和挣扎。

我必须训练自己以不同的方式看待事物。我的第一份工作必须是让我收获学习和成长,为未来的成功做好准备。工资是市场水平,但如果团队很棒并且确定可以从中收获成长学习,我很乐意接受略低的薪水。它 不需要 是我梦寐以求的工作。

我非常明确地做出了权衡:

  • 团队比品牌更重要
  • 团队比金钱更重要
  • 品牌比金钱更重要(因为它会让我为未来的机会做好准备)
  • 金钱比股票更重要(这适用于第一份开发工作,因为这使我的学习计划可持续,尽管股票可能会在未来给我带来更多的财务收益)
  • 但是,学习比品牌或金钱更重要——因为学习可以节省更多时间,这比省钱更重要
  • 我不会在团队和学习之间进行权衡。我需要两者(但我更倾向于一个可靠的团队,而不是在工作中实际学到东西)

“搞定难题”或舒适不舒适不是首要任务。我的首要任务是成功地改变职业。

接受一份垃圾代码工作(这种工作有很多......)对我来说并不是一个“成功的”职业转变。但同样,我转行“成功”与否不取决于是否加入了大科技公司。成功的标准非常个人——对我来说,成功意味着热爱我所做的工作并从中学到很多东西。

我如何做定制化计划

在分析了我的优势和“可转换”的劣势之后,接下来我给自己定制了一个计划。一个为我量身定做的,我可以相信的。

我需要一个考虑我的具体情况的计划,包括我的脾性、经验、信仰、价值观、目标和技能。

请注意,我还没有谈到技术面试、算法和数据结构等等。在制定我的计划时,我必须关注有与我的代码技能或技术能力无关的部分。

计划还需要考虑到我的心理“跑道”——在我放弃、失去希望或改变主意之前,我准备投入多少时间来进行职业转变?如果不了解我需要多长时间来学习最低要求的技能,我无法回答这个问题。

为了回答这个问题,我需要研究和分析市场需要的最低技能有什么。

为了回答这个问题,我需要分析市场上的几十个软件工程领域,哪些适合我的脾性、兴趣、热情和优势。并找到我可以专注的领域。

我必须找到我的兴趣、我的能力和市场价值之间的重叠。

同样,我在招聘方面的经验给了我(小但重要的)优势。我知道纯粹的技术技能是不够的——这只是起点,“舞会的邀请”。

我也知道,优秀的团队不仅会为技术技能招聘,也会为非技术属性而招聘。这些属性是什么取决于技术领域、团队文化、团队组成等等。

或许你已经猜到了。定制化计划是多维的,把事情做对只会提供少许帮助,而做错会导致方向的巨大错误和时间的浪费。

由于我的职业生涯几乎走过了一半,我决心不再重复过去的错误。我将:

  • 目标非常具体。
  • 选择和行为目的性强。
  • 专注于我想要的,不关注我不想要的。
  • 愿意改变自己、我的习惯和消极信念,这样我就可以改变我周围的世界。
  • 准备好专注于建立一个有回报和有成就感的职业,而不仅仅是“获得下一份工作”。
  • 准备好专注于为我未来的团队创造价值,而不是“对我有什么好处”的心态。
  • 愿意打持久战——具备 5-10-25 年的视野,而只是接下来的几周。

我必须承认,坚持这些原则比我预期的要难得多。我失败了很多次,尤其是前三点。但既然我已经写下了定制计划,它就是我的行为指导和真理的唯一来源。

我的计划要求我专注于基本的编程技能,然后将其缩小到我认为与我的长期目标和技能相匹配的部分。对我来说,就是 web 开发。所以我要完全且无情地避免所有“光鲜亮丽的新玩意儿”,比如 Python 或 Java。

教程和没完没了的视频不会让我击败竞争对手。我计算出达成我所在城市开发岗位所需最低技能,需要 900-1100 小时专注学习代码,以正确的顺序练习正确的内容。

准备计划花费了数周时间。我不断地修改和强化它,不慌不忙。亚伯拉罕·林肯(另一位转行的律师!)给我很大启发,他曾经说过“给我六个小时砍一棵树,我会用前四个小时磨斧头”。

我很想直接进入我的计划并变得“忙碌”起来,但忙碌并不等同于高效。一旦在我的认知范围内,我确定计划完善了,我就转向全神贯注地执行该计划。

执行意味着很多牺牲,很多很多天的自我怀疑,与改计划的诱惑作斗争,学会管理精力。在此期间,我养成了一些惊人的习惯,但这是事后诸葛。在这6个月的执行中,我不断受到不确定性、恐惧和偶尔失去希望的打击。

后来,我在这个计划的基础上做了调整,为大型科技公司,尤其是 Google 制定了一个计划,花费了 500-600 小时的刻意学习,这与我成为开发人员的计划完全不同。稍后再谈。

早期成果,以及……Google 工程师

我从4年的试验、错误和失败中学到的另一个教训是,我容易在中途改变计划,转换资源、课程或重点。

这是一个非常严重的问题,因为每次我们切换焦点或计划时,我们都会放弃我们已经完成的辛勤工作,回到起点并……重新开始……全部……重新开始。

想象一下,如果你从 A 开车到 B 并不断掉头并返回并重新启动。你永远不会到达任何地方。

但我给自己做了一个承诺(信守一个承诺比信守一大堆更容易!):我要完成我的计划,然后再决定是否继续。这一次直到完成我的计划,我都不会停下来。

我不必喜欢做这些事情,我只需要喜欢这些事带来的可能性。

我的计划有一个特定的时间,即使我还没有准备好面试,我也会开始面试。但要达到那个阶段,我必须善于创造面试机会。

我过去在其他职业中的经历再一次帮助了我。我应用了我过去 18 年所学的知识,在几周内获得了 4 次面试机会,并获得了全部四份 offer,尽管有很多候选人比我拥有更多的经验、技能和资格。

这不是因为我更擅长写代码。怎么可能是呢?我只有几个月的经验。

我相信拿到四个 offer 是因为 在面试过程中在招聘官面前 我表现出了自己是更好的候选人的样子。这是展示自己极为重要的一种方法。

收到 offer 很棒,但我遇到了一个意想不到的问题。由于我的计划要求我对工作职位有清晰的认识,所以我相信这四个职位都是我新职业生涯的绝佳开始。我将如何选择?

是的,这是一个甜蜜的烦恼,但这个决定不容易做!

为了聪明地解决这个问题,我学会了问自己一个非常重要的问题:

我是知道这一点还是 我只是这么 ?

很多时候,我们根据完全未经检验的假设和信念做决定,我们将我们的意见或幻想误认为是现实。我们实际知道的远比我们未经验证的想法要少得多。

有意识地要求我专注于我所知道的,而不是我希望的,或者仅仅是想的。我必须要么找到证据来支持我的想法,要么根据我的了解无视一些想法。

这个框架培养了我的分析能力,并帮助我在 2019 年初正确地选择了第一份工作,那时我已经 39 岁了。

直到今天我还在使用 知道 vs 想 框架来思考日常决策,我发现它是分析复杂决策权衡取舍的绝佳框架。

回顾过去,我积累了很多关于如何坚持我的计划、重新审视我的目标、自我意识和练习 有目的性 的经验。

进入新岗位几个月后,很多律师开始联系我,问我是怎么做到的。奇怪的是,他们中的许多人曾经坚持认为我犯了一个巨大的错误,在人生这个阶段想要学习代码是不成熟和鲁莽的。

现在他们想要“学习写代码”,让人深思。

他们说“不可能”的时候,是 他们知道这一点还是 他们只是这么 ?

我的目标没有改变,对我来说,学习、成长和团队仍然比品牌或金钱更重要。但我快 40 岁了,我还想以一种我在职业生涯的前半段从未有过的勇气去探索生活。

所以我决定给自己设定一个新目标:我想了解在大科技公司做一名软件工程师是什么样的。我以前在大公司工作过,我知道这并不适合所有人——这就是我一开始决定进入初创公司和小公司的原因。

但是,被所在领域(从工程到产品和销售)“最佳”人的包围,我不会学到更多东西并收获更多成长吗?我是知道这点,还是我只是这么想的?

我进行了研究,发现一般来说人们对大型科技公司很满意。但我也发现大多数人并不像我那样目的性强。所以我把我的研究限制在那些对自己的职业非常有目标的人身上。他们(几乎普遍)表示,即使他们决定离开,他们也从大科技公司中成长了很多。离开大型科技公司也是有意为之,以追求他们的最终目标。

所以我决定申请在硅谷、纽约和西雅图的大型科技公司(包括 3 家 FAMGA 公司)和其他几家公司。我仍然在澳大利亚,所以这是一个巨大的挑战。

我重新设计了我的计划。有几个步骤是相同的​​,但必须对代码课程进行大调整。我还需要了解美国大型科技公司的招聘情况,并使自己值得被推荐。

大约 7 个月后,我开始接受面试。在这 7 个月里,我非常努力地证明自己值得被推荐,人们根据我的努力和被验证的决心给我推荐工作。

我被引荐到了 Meta(当时它被称为 Facebook),但我没有得到面试机会,因为我的技能不匹配。这对我来说是一个宝贵的经验,我一直认为自己小心翼翼地只申请与技能相匹配的职位——我错了。

我意识到,职位描述对招聘公司来说一件事,对 公司之外 的人来说是完全不同的另一件事。这是因为不同公司使用相同的语言来描述不同的职位。招聘方和应聘方可能都不知道这一点!

汇总这些经验之后,在 3 个月内,我收到了 2 家大型科技公司的 offer,还有一家没有通过终面,因为我不知道如何从头开始编写文件系统(我对 Linux 世界一点也不了解!)。

然后我收到了 Google 的 offer。

再一次,我面临着一个非常艰难的决定。Google 的名声响亮,我很难客观权衡,但我真的很想忠于我的目标、我的计划和我的意图。

当涉及到 Google 时,试图将我所知道的与我想的区分开来非常困难。但我十分确定:面试我的团队都是很棒的人。

这是我认为运气很重要的地方。无论人们如何强调技能、大脑、智慧等,运气和“魔法”在生活中都扮演着重要的角色。

我在Google遇到的面试官是友好、善良、开朗且高度专注的工程师。在面试中,他们不想证明我不行,而是帮助我证明我可以。他们热情地回答了我的问题,让我从一开始就感受到相互合作。

这是 Google 特有的吗?也许。但后来,当我在 Google 接受技术面试培训时,我见识到了多种多样的面试官/招聘经理的风格和信念,我看到技能高超的候选人控制不了情绪,沟通不了解答过程等等。所以我很感恩机遇在我找工作中起到的作用。

所以是的——我很幸运,我遇到我的面试官,并且在面试那天我碰巧知道如何回答那些代码题。

这也是我对 工作类型相关技能 的超专注准备得到回报的地方。 大科技公司有很多不适合我的职位(比如 Meta 的那个)。即使我之前有其他职业经验,我也不知道软件工程师的世界有多大,有多少种职业类型和偏好,区分它们有多难。

通过强迫自己有超强的目标感,而不是随机、盲目地申请大科技公司职位,我抓住了小但重要的机会。我深入挖掘了每个职位,并通过与业内朋友交谈来仔细研究它们(再次强调,我的年龄和经验是一项资产,因为我已经建立了超过 15 年的关系,从没想过它们以后会如此有用!)。

对于我得到的每一个 offer,我都进行了深入的研究,并为技术面试做好了充分的准备。在面试当天,就万事俱备,只欠东风。虽然我不认为我“完美搞定了”我的面试,但我做得很好,传达出我是 满足团队需求 的合适人选的信息。

这就来到下一个问题:我是如何为大科技公司的面试做准备的?

如何为大科技公司面试做准备

答:分两个阶段,我花了 500 多个小时执行。

第 1 阶段:了解现实和竞争格局

如果我想斩获另一个国家的大型科技公司的职位,而我拥有不到一年的行业经验,有15年以上不相关工作经验,没有计算机科学学位。我需要对现实有一个非常清晰的认识,尤其是竞争格局。

这意味着有准备的希望可能降临,但白日梦,天上掉馅饼这类事情不会发生。

艰难的道理(可以查看我的 YouTube 视频)、艰难的现实、艰难的工作。

我必须完全接受并且内化以下内容:

  • 写代码只是起点,不是终点。学习写代码是大难题的一小部分,是解密的第一步。换句话说,对于获得工程师工作是必要的,但还 不够(尤其是在大科技公司)。
  • 我最大的敌人是我自己的想法。要么是让我消沉的消极情绪,要么是对我信心的破坏和瓦解,我必须养成习惯培养自己的韧性。从挫折中恢复,而不是逃避它们。
  • 我的竞争对手可能不是转行人员,如果他们是,他们将来自密切相关的领域,如计算机工程、机械工程或电子工程。绝大多数人拥有技术资格,甚至可能拥有博士学位(事实证明这是真的!),以及数年的行业经验。
  • 作为一个“异常值”和“通配符”,最难的部分是获得面试机会。学习算法和数据结构更容易,“破解代码面试”(无论这意味着什么……)也会更容易。为什么?代码是确定性的——相同的代码通常会产生相同的结果。但生活不是确定的,是否能获得面试机会非常主观。在就业市场,相同的行为不会产生相同的结果。
  • 我需要把自己塑造成经验丰富的工程师愿意与之共事的 那种人
  • 我假设我的大多数竞争对手至少有 3-5 年的经验。我追不上他们,更别说 超过他们 了。相反,我需要在非技术技能上超越他们,并在技术方面有得比(如果不超越他们)。
  • 我必须比其他人更善于沟通。如果我不知道某事,我需要说出来,然后说明如果有合适的时间和机会,我将如何解决它。我还必须与面试官沟通,以表明我了解他们的 业务需求,而不仅仅是专注于我自私的梦想。
  • 这意味着我必须真正努力了解招聘团队看中的、正在寻找、想要和需要的东西。
  • 我无法控制我的竞争对手(他们的技能、他们的表现、他们知道多少等等),或者我的面试官在想什么、想要什么、他们看重什么,或者他们是否喜欢转行的候选人。我无法控制 大部分 事情。我只能优化我的努力、我的注意力、我的心态,以及我从每次经历有所收获,无论好坏。我只能控制自己的选择和行动。因此,专注于任何外部的事情都是对宝贵精力的浪费。
  • 我得意识到运气的存在。乔丹、坦都卡、费德勒——他们都有运气不好的时候。我也会的。或者,也许我会做得很好,但别人做得更好。其他人会更适合团队的需要,这时不要觉得伤心也不要嫉妒,我自己做面试官时也做过无数次艰难的决定,所以我知道这常常发生。
  • 如果我斩获超过一个 offer,我需要 预先 考虑并 预先 与自己达成一致,以决定我将使用哪些信号和因素来做决定(从我之前四个 offer 中学到的!)。
    如果你好奇我是这么做成的……其实我不知道。并不是一蹴而就的。这些都是事后总结。这些经验大部分都来自于“实时”应用第一原则思维。我的导师帮助我一起,缩小范围确定目标,这花了很多时间,我急不可耐地想“开始写代码”。但是……我知道亚伯拉罕·林肯会给我什么建议……

第 2 阶段:我如何选择学习资源

我知道每个人都期望有一份“灵丹妙药”。或许是一些博客、视频、资源、教程、播客、PDF清单……揭开代码的所有“秘密”,学习效果立竿见影。

没有。

直到入土,我都认为——信息是一种商品。

学习很困难,但由于免费信息太多,学习变得 更加困难

我们都陷入了这样的陷阱,认为自己了解的信息不够。其实没有。

为什么?因为无论你住在哪里,你说什么语言,你的眼睛、皮肤或头发是什么颜色,你的性别认同是什么——所有资源都会教给你“有用”的东西。在一个非常基本的层面上,它们都是“相同的”。

它们 必须 如此,因为这就是计算机的工作方式。

如果你和我用 JavaScript、Python 或 Java 编写相同的函数,我们将得到相同的结果。这就是计算机的工作方式——它们是确切的 算法

但是生活(和面试)绝对不是确切的。相同的努力、成绩、技能、智力不会产生相同的结果。

再次强调,我必须 自学 。我必须将注意力从资源/博客/网站/课程上转移开,放在建立坚实的思考模型、识别相关技能、深入研究概念而不是代码实现、以新的方式应用我已经知道的东西,锻炼推理、解决问题的能力, 在推理时沟通出来我的推理过程。

你会惊讶于我在准备 Google 和其他大科技公司面试时使用的资源。

是的,我使用过 LeetcodeAlgoexpertInterviewCakeJenny 的 CS 讲座可能还有一些其他的资源,但我没有完整完成一个资源。

这不是因为我突然转移了重点,我是故意的。我意识到他们都教同样的东西,只是风格和内容略有不同。所以我使用这些资源来学习概念,并根据我对面试 模式 的分析混合和搭配这些资源。

我的理由很简单。从招聘角度来看,候选人(在优秀公司)的质量每年都会提高。我个人认为专注于公司是一个巨大的错误——我们应该专注于团队、人和工作。

但世界有自己的运行规律,因此所有人都涌向大公司。竞争的增强使招聘经理更难评估候选人。

招聘经理处理这个问题的唯一方法是提高标准,候选人的处境就更难。候选人的总数不断增加,但被邀请参加面试的候选人“人才库”保持不变,依旧很狭小——通常是 2-10 人。不管有几百人申请,参与面试的人数永远这么多。

因此,没有收到回复或遭到拒绝的候选人就越来越多,尤其是在牛市中。

如果竞争越来越激烈,互联网上的资源也越来越多,但入围人数几乎保持不变,那么“多学”就不是解决办法。每个人都在“学习更多”,就相当于没有提高竞争力。

我还意识到大科技公司会有面试问题清单(这是“高效的”,因为面试— 非常 耗时,因此通过拥有一个面试官可以使用的问题库来节省时间是有意义的)。自然,如果这些问题被“泄露”,他们就不会使用这些问题——这会破坏面试过程。

因此,从逻辑上讲,招聘经理不会问 Leetcode 或 Algoexpert 或其他网站上提供的问题。这就产生了一种“军备竞赛”——公开的问题越多,题库中的问题就越多。这导致问题和招聘策略的更多创新和变化。

这让我只有一个选择。我必须学会使用思维模型和对问题的归类总结。我可能永远不会被要求对链表进行排序或实现戴克斯特拉的最短路径算法。相反,我需要知道如何将这些算法应用于“现实世界”的实际问题。

通常,现实世界的问题看起来、听起来或闻起来都不像我们研究的练习题。练习题和竞赛代码题往往被“整齐”地打包好,有明确的限制。

但作为一名面试官,我想知道候选人是如何思考、推理、分析、解释信息和合作的。解决问题的能力是一个亮点。候选人如果采用正确的解决方案,但时间不够用——但会提出很好的问题,并且清楚地知道如何解决问题。就仍然可以获得 offer。

后来,作为 Google 的一名工程师,我总能判断出有人是否 知道 如何解决问题,即使他们无法及时解决。同样,当应聘者不知道如何解决某事时(这没关系——我们都在学习),这一点也很明显。

通过采用我理解问题类型和解决方案,而不是特定代码实现的方法,我可以专注于学习推理而不是学习编写特定算法。

这种方法意味着我完成了不到 40% 的 Algoexpert(当时它的问题是现在的一半)。我还完成了 Leetcode 上大约 50-60 个问题,其中大多数都不是“难”的问题。

我认为“难”问题可能会出现在 45 分钟的面试中,大约有 20% 的时间出现,这意味着 80% 的时间它们会是简单问题或中等问题。所以优化 80% 更有意义,因为我还是个新人,专注于困难的问题会妨碍理解简单和中等的问题。

我使用这些资源来识别问题模式,而不仅仅是“做完”,并获得认证。这就是为什么我没有完成任何一个题库。我也没有使用 “Cracking the coding interview” 这本书。

在此过程中,我还开始了理解系统设计问题。并将此记录在了系统设计面试问题这个长博客中

我还决定专注于一种语言:JavaScript。这不是面试的最佳选择(经验丰富的工程师在 Quora 和其他地方不鼓励使用它),但我觉得不重要。面试的目的不是为了测试我对语言的选择——而是为了测试我抽象思考和解决复杂的计算机科学问题的能力。

语言只是一种工具(我持有的另一个核心信念)。事实上,使用像 JS 这样的无类型语言会让我有机会谈论它的局限性或优势,证明我理解如何权衡语言选择的利弊。这样,我就可以展示更广泛的知识和洞察力,而无需实际在代码中体现。

但是我从使用 Java 和 C++ 学习了很多资源。这些语言是 Google 的主要语言。因此,被迫阅读这些语言并理解背后的原则使我不要过多关注“写出代码”,而更多地关注代码背后的推理,使我能够真正写出来。

那是我的全部计划。实践、模式识别、思维模型/第一性原理思维、系统设计、做好更少的事,专注于获得面试机会,而不仅仅是学习更多的代码。

如何在面试中脱颖而出

正如我所提到的,我们都有优点和缺点。我们都认为我们的缺点是特殊的、巨大的,而我们的优点是普遍的、不起眼的,而且可能没有多大用处。

这不是真的。从逻辑上讲,如果我们都认为自己的缺点很严重,那么我们都应该屈服于它们。然而,有些人克服了它们。并发现其他人的情况更糟并克服了 这些缺点

专注于我们能做好的事情是更好的选择。对我来说,我真的相信我可以为团队带去更多价值。我不在乎自己是最聪明的还是最好的。但我期望成为一名优秀的学习者,不惜一切代价保持我的成长心态

所以我试着用它来尽可能地脱颖而出。我学会了向招聘人员、面试官和招聘经理提出非常好的问题。

但这有更深层次的原因。问好问题是我面试公司的方式。就像我说的,我不想重复我职业生涯前半段的错误。因此,提出真正好的问题对我来说很重要,以评估这家公司是否 适合 我。

因为我已经决定重视团队和学习,所以在招聘人员提出薪酬之前,我从未询问过。无论如何,这将低于我作为律师的收入!

相反,我非常专注于了解团队、它的动力、团队信念和价值观、经理如何解决问题(尤其是人的问题)、团队对什么感兴趣、公司部门对什么感兴趣、资产负债表如何,战略是什么,它的资源分配和预算是什么样的,等等。

所有这些都是我在其他行业学到的东西,作为个人贡献者、经理、高管、创始人等等。

所有这些事情也表明我的目的性很强。我对团队、公司、产品和未来真的很感兴趣。这不仅仅是我申请的另一份工作。这是主动的和个人的……而不是被动的和机会主义的。

我相信这帮助我脱颖而出。虽然不是我面试的所有职位,但大部分面试我都获得了 offer。

当我在招聘方面,我总是更喜欢那些真正对职位、人员、产品和公司感兴趣的候选人。那些只是为了“找到工作”的人并没有我想要的能量和动力。

面试计划和策略

我的路线图的最后一部分要求我深入了解不同类型的面试过程。

这包括技术和非技术面试、面试的形式、公司组织、运行、计划、配备、评估和权衡面试的方式。但这也要求我了解自己的长处和短处。

在美国寻找大科技公司时,我的目标是每月进行 2-3 次面试——这是一个巨大的挑战,因为我不在美国,而且时区比西海岸早 17 小时。

我必须在奇怪的时间计划和安排面试,这样我才能配合我作为开发人员的日常工作和学习时间。有的面试需要 6 个小时,有的需要 10 个小时或更多。有些是“一整天结对编程”类型的面试。

所有这一切都需要大量的计划和心理训练。我必须有足够的睡眠,足够的锻炼,保持我的心态和信心,完成我的日常工作,陪伴我的家人,学习并专注于我的目标。

为此,我必须对自己擅长的事情诚实。例如,我不是一个早起的人。但我可以忍受深夜。所以我相应地安排了面试、工作、睡眠甚至锻炼。

有一些面试在凌晨2点或更晚,我之前不会睡觉(因为我真的不擅长按时起床!)。因此,我会在凌晨1点锻炼以获取能量并集中注意力,然后进行面试,然后睡到上午 10 点,去上班并管理我的日程安排。

我也会小心地计划面试,这样我就不会背靠背地做两个,除非它们非常相似且有时间限制。例如,在同一周内进行带回家的测试和定时测试需要与带回家和实时代码面试不同的计划——同时还要管理工作和家庭。

为了适当地安排面试,我会与招聘人员密切合作,并对他们保持透明。这有两个好处:我在招聘人员中获得了协作和沟通的信誉和信任,他们还看到我还有其他机会,这增加了我的成果的机会。竞争是好事。

总结

我相信你们中的许多人都期待这篇文章提供“内幕”技巧和某种特定的语言,以及要学习的 DSA 问题。我相信我给了你更好的东西。授人以鱼不如授人以渔。

除了道德原因之外,内幕消息的价值本身有限,尤其是在大科技公司。在大型公司中,团队与团队、城市与城市的情况可能大不相同。你需要了解招聘和职业发展的原则,而不仅仅是特定的语言和算法。假设所有的面试都是一样的,是一个很大的错误。

至于我们对数据结构和算法的痴迷……管理你的职业生涯是终极算法。你的头脑是最终的数据结构。学习如何应付他们,尽管偶尔会失败,但你总是会做得很好。强大的想法并不宏大——它们是优雅的极简主义。

在阅读的过程中,您会注意到我链接的一些内容,可以通过这些链接找到我。 如果你想不仅仅只“学习代码”,想要学习如何打造 适合自己 的职业,你也可以订阅我的 webinars、小课程和邮件

也许我能给你留下的最重要的信息是,痴迷于大科技公司是错误的。是的,成为大公司的一员是一件美差,但如果相信他们这是唯一的选择,我们将错过所有其他令人惊叹的机会。

由于当今的文化趋势,大科技公司具有相当的魅力。当然,为大公司工作很好,但是很多伟大的组织并不为人所知。甲之蜜糖,乙之砒霜。

你的第一要务是快乐、充实并过上你想要的生活。这不是来自公司。这来自与您共度时光的人(尤其是同事)和您所做的工作。与其他任何公司一样,大科技公司也有糟糕的经理、队友和工作。

如果你培养技能,在正确的心态之上制定一个正确的计划,并训练自己设定正确的目标,无论有没有大科技公司,你都可以超越自己的梦想。

后记

如果你想要了解更多我从律师转行成为软件工程师的过程,可以收听播客 episode 53 来自 freeCodeCamp podcast 以及 Episode 207 来自 Lessons from a Quitter。这两期播客大概介绍了我的成长蓝图。

如果你对自学代码、转行和 成为自己的代码合伙人感兴趣,可以查阅这里。如果转行是你梦寐以求的事情,也可以查看我在 free webinar 上的转码文章