译者 | 郑丽媛
出品 | CSDN(ID:CSDNnews)
(资料图片)
我叫 Kevin,从未做过软件工程师或项目经理,也没有写过或测试过任何一行代码——而我技术生涯的起点,始于招聘工作。
开始招聘工作后,我进入职业指导和薪酬谈判阶段,直到现在的工作:为工程师创建内容。与大多数工程师相比,我掌握的领域知识很少,但也顺利通过了谷歌的系统设计面试。
想必很多人对此感到好奇,我可以告诉你:我之所以能通过面试,是因为在参加这次面试之前,我学习了很多关于系统设计面试的理论知识。通过这场面试,我还学到了一些技巧,下面我将逐一分享给你们,希望你们也能顺利通过心仪公司的面试。
非程序员,如何学到很多关于系统设计面试的知识?
我在匿名模拟面试平台 interviewing.io 工作,工作内容之一是与应聘者讨论面试过程。其中,许多人都抱怨系统设计面试,他们不知道该如何应对,也不知道要如何处理模棱两可的问题。曾有一位用户做出如下评价:
“系统设计面试非常可怕。如果你已经工作了 5+ 年,那么你就应该有出色的可扩展系统经验,可如果你没在面试中表现出来,你将受到惩罚,即要么拿不到 Offer,要么薪资大打折扣。打一个比方,可能对方只是要求你抬起和移动重物,但你必须要让一头大象飞起来才行。”
当时,最流行的系统设计资源非常相似,它们都没有很好的解决方案来处理或揭开系统设计面试中的神秘面纱。因此,我们团队决定尝试制作世界上最好的系统设计指南,并由我负责领导这个项目。
首先,我采访了一些评价最高的系统设计面试官,然后基于采访内容开始编写指南,期间我主要负责推进、倾听、项目管理、撰写、编辑,并不断重复这些工作。
经过几个月的努力,我们终于在 2023 年 3 月 2 日出版了《高级工程师系统设计面试指南》。很高兴的是,它在 Hacker News 上的点击率很高,如果你在谷歌上搜索“系统设计面试”,第一个搜索结果也是它。
为什么我决定自己尝试参加一次系统设计面试?
这份指南发布后,我见到了不少撰稿人,其中一位突然跟我说:“我打赌,你一定能通过系统设计面试。”除了他,另外两个人也很认同。于是我接受了这个挑战,并决定不另外学习,仅凭我在编写指南时学到的知识去参加面试。
为此,我在 interviewing.io 上找到了一位来自谷歌的面试官,并预约了某周五上午的模拟系统设计面试。对方不知道我是谁,只知道我的工作年限是 4 年,并以为我即将去谷歌面试,所以需要提前模拟一下以作准备。
我在这场系统设计面试中,值得参考的精选片段
我将带领大家回顾面试中的几个片段,这些片段涵盖了我面试中的三个关键方面:一个非传统的想法,一件我失败得很彻底的事情,以及一个我引以为豪的时刻。
(1)一个非常规的想法
去年,我参加了哈佛大学法学院的高级谈判讲习班。他们花了很多时间深入探讨了谈判的具体细节,即谈判的输赢往往就在于最初和最后的 3 分钟。于是在这次系统设计面试中,我一直牢记这一点,心想我必须迅速(最好在前 3 分钟内)在面试官心中获得一些认可和社交证明。
通过了解在 FAANG 面试的不成文规定,我学会了一个不那么显而易见的社交证明方法:要在“谁更不在乎”的竞争中获胜。也就是说,你要在面试过程中找到“我不在乎”的态度,不要在乎对方到底在不在乎你所说的话,保持你的节奏。
(2)一件我失败得很彻底的事情
这件事简而言之,就是我忘了可以在用户设备上缓存数据。更重要的是,他们还问了我关于缓存的问题,但我却耿耿于怀,我忽略了他们的追问,同时也忽略了他们的暗示。
我不知道他们追问的答案,但我也不敢说“我不知道”,我觉得如果我这么回答了,他们可能就要换人了。所以我没有这么做,导致他们以为我真的知道,并继续追问。
如果我能回到过去,我会像系统设计指南中所说的那样:在你不确定但有想法的时候,直接说“不知道”:
告诉面试官:“我不知道,面试结束后我肯定会马上查一下,但如果让我给出最佳猜测,我会说…[x],以下是原因[解释/思考过程]。”
(3)一个我引以为豪的时刻
我真正自豪的时刻,是在面试官说了一些吓人的话时保持冷静。害怕的面试者看起来就像是局外人,所以让自己看起来像个局内人,就要保持冷静。
有一个常见的系统设计面试问题是“设计 Gmail”,这个问题有很多不同的维度,但没有人能在面试时设计出 Gmail,这是不可能的。所以每当别人问“如何设计 Gmail”时,那就是在吓唬你。——前谷歌工程师
面试过程中,有关规模的话题出现了:面试官说,这个系统应该能够支持 8 亿活跃用户。当时我的脑子里突然浮现出那位谷歌工程师说的话,于是我装作很随意的语气,模棱两可地回答了一句“好吧”。从用词和表达方式来看,这个回答意味着“我不害怕这个提问”,但同时我的脑海里在疯狂暗示自己“不要在乎对方在不在乎”,以此来保持镇定自若。
面对管对这场面试的反馈
你会让这个人晋级下一轮面试吗?回答:会的。
我从系统设计面试中,学到了什么?
如果没有坚实的基础,魔术就失去了魔力。你可以拥有世界上所有的技巧,但如果你不了解原理那也是白搭。话虽如此,仅仅了解原理也是不够的,你还要管理好自己的心理。大多数人主要的心理障碍,都是对“不知道”的不适感。
与工程问题不同,有关设计问题大多都出于“不知道”。没有最佳解决方案,进展无法量化,也没有预先确定的结果。如果只是用模棱两可的方式糊弄过去是不够的,因为这些问题更多考验的是你茁壮成长的能力,好在这个能力可以通过实践慢慢掌握。这是一种思考、沟通和解决问题的方式,因此你所学到的技能是可以迁移的,甚至还可以从看似毫不相干的实践中迁移。
练习说“不知道”的三种方法
这三种方式,分别是:“未知”游戏、即兴表演和冥想。试试其中一种,为期 10 天,如果之后你的系统设计面试技巧没有提高,那我请你喝可乐。
第一种方式:“未知”游戏
这个游戏的方法是,注意谁知道你不知道的事情,然后跟着这条线索走。对我来说,那就是艺术,于是我把它提出来并到处打听。如果有人提到了我不知道的东西,那就得一分;如果他们解释了我不知道的事情,那就得两分;如果你认为某人身上能得到足够的分数:那就像对待老朋友一样对待他们,看看接下来会发生什么。
例如有一天,我和一个陌生人在咖啡馆开始聊天。半小时后,我在他家看到了但丁《神圣三部曲》的原版,其中讲述了地狱、炼狱和天堂的故事。这本书已经有几百年的历史了,篇幅之长令人惊讶。而在这次充满 “未知”的经历——即兴拜访陌生人的家之前,我甚至都没听说过这件极其罕见的艺术品,但我却有幸翻开了它的书页(而且不是在博物馆里!!)。
第二种方式:即兴表演
如果你认为上面这种没有组织的谈话对你而言就像地狱,那你可能更喜欢参加即兴表演,比如扮小丑。小丑分两种:地位高的(“知道”的)和地位低的(“不知道”的)。其中地位低的小丑会做一些不合逻辑的事情,例如让他们坐下但他们却跳起来,某种程度上属于破坏规则的笨蛋跟班。所以在扮演小丑时,你要告诉自己,你根本不知道发生了什么,并尝试接受这一点。
第三种方法:冥想
如果你觉得和陌生人交谈和扮小丑都很可怕,那就试试冥想吧。禅宗公案是一种特别令人费解的冥想方式,一个是,“一只手鼓掌的声音是什么?”,另一个问题是,“在你父母出生之前,你的本来面目是什么?”整体来说,禅宗公案充满了悖论和不连贯的问题,无法用正常理性的日常思维方式来解决,但它可以教会你如何在模棱两可中茁壮成长,非常适合很内向的人。
结论
要想在系统设计面试中取得好成绩,你需要做两件事:首先,你需要学习理论知识;其次,你需要练习说“不知道”,以便更好地处理模棱两可的情况。
有了在模棱两可中茁壮成长的能力,生活中就没有什么是不可能的了。
原文链接:https://interviewing.io/blog/never-written-code-but-passed-google-system-design
▶三天召集 2200+ 名黑客,齐向 AI “投毒”:“50 分钟内骗过 AI,第一名可获英伟达高端 GPU!”
▶前华为天才少年稚晖君创业6个月造出人形机器人,百亿参数大模型加持、目标成本20万元以内
▶字节首个大模型独立App亮相;Nature发文:LK99不是室温超导体;Debian诞生30周年 | 极客头条