<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KVGHS6G" height="0" width="0" style="display:none;visibility:hidden"></iframe>
Google求职:谷歌技术经理告诉你该如何准备System Design的面试?
Google求职:谷歌技术经理告诉你该如何准备System Design的面试?
篱笆资讯
Google求职:谷歌技术经理告诉你该如何准备System Design的面试?
作为谷歌的技术经理,我十分理解系统设计在面试中会让面试者有多头疼。 因为系统设计相关的问题通常是开放式的,所以没有标准答案。你在和面试官思想的交流碰撞中会慢慢优化自己的系统设计方案。理论上来说,系统设计面试也是和面试官一起一步一步改进原有系统设计方案的过程。

系统设计题往往也非常能考察出面试者的综合能力,回答好的话,很容易就能在面试中脱颖而出。不论是对于参加社招还是校招的小伙伴,都很有必要重视起来。

迄今为止,我也已经作为面试官在谷歌参加过大大小小几十场面试啦,接下来,我会带着小伙伴们从我的角度出发来谈谈:如何准备面试中的系统设计部分。 希望能对要参加面试的小伙伴们有所帮助!
 
为什么要考察系统设计的问题?

首先非常有必要跟大家去解释一下为什么大公司或独角兽公司都喜欢考察系统设计的问题。

在真实工作中,你会发现,启动一个新的产品或功能的开发后,往往会花大部分时间与不同的组讨论requirement,需要考虑站在customer的角度来看产品功能是不是符合实际需求,这里的customer不仅是传统意义上购买你产品的一些用户,他也可以是在组里边或者其他组里面用你的这个工具或者service的同事。另外整个系统的performance是不是很好,latency是不是比较低?scalibility是不是比较强?是否利于维护和debug等等? 这些都是很重要的考量点。

系统设计有问题就会对外部客户产生经济损失,比如外卖平台宕机,电商平台丢失订单等等,都是几百万甚至上千万的损失。从内部客户的角度来看,公司中没有人愿意去维护一个不成熟的系统,这会花费很多精力,也很可能推倒重来。因此面试中考察系统设计就成为了一种非常高效的做法,来看你解决实际工程问题的能力。

除了面向计算机科班的同学,在文章结尾我也会给非计算机课班的同学,提供一些准备的思路,希望对大家有帮助。

系统设计考什么?
1.交流沟通和理解能力 :跟面试官充分交流理解所设计系统的目标,方便做设计中的tradeoff,在厂里干过的就知道日常工作中这个非常重要。
2.设计和架构能力:很多我见过的面试者都只注重在这块而忽略了其他,很可惜。
3.扩展性 (Scalability),容错性,延迟要求 : 跟Operation相关的要求,如今Dev和Ops不分家,希望面试者了解系统今后能如何扩展,易于maintain。
4.资源需求 :对于我们所要求的QPS和latency,需要多少台机器,其中CPU, 内存,硬盘等资源都是如何配置。

接下来,我会分别介绍这四个考点的应对方式。

交流沟通和理解能力
询问系统的商业目的 - 建这个系统是为了解决什么问题。相关的问题比如这个服务的受众有什么特点,是商业用户还是个人用户。很多时候问不问这个问题就能看出Senior的程度。

询问功能性需求 (functional requirement) - 包含哪些子功能。

确定非功能性需求 (non-functional requirement) - 我们要总结说我们在面试结束前我们的设计要达到什么QPS,latency或者availability指标。写下来并跟面试官确认。如果这里牵涉到一些ballpark calculation,跟面试官确认是不是需要算。

整场面试过程中跟着面试官的引导走- 有的同学看到准备过的题就很兴奋,文思泉涌面试官都拉不住,会让人觉得理解能力不足。

设计和架构能力
这是正常面试的核心部分,非常重要,是面试通过的基础,其中deep dive非常考验真实水平。讨论过程中记住要保证设计的完整性,正确性以及取舍的充分沟通。答题点主要分成以下五大块。

High-level diagram数据结构与存储核心子服务设计接口设计专题 deep dive

扩展性,容错性,延迟要求
确认系统在以上三点 Scalability, Fault Tolerance, Latency Requirement是否符合先前定下的需求。
根据需求进行改进(推荐在第一轮设计中先不考虑这里的三点,先拿下设计和架构能力的分数,再做改进)

Log,monitor and alert on key metric (系统投入使用前,把非功能性需求和它的leading indicator确定下来并且做好监控)

资源估算(optional)
估算非功能性需求,计算需要多少台机器,需要多少内存,硬盘,带宽和CPU的能力,量级正确即可(back of envelope calculation)。

抓住这4个考点,层层击破的话,相信你的系统设计面试就不成问题啦!

给非计算机课班同学:
一.扫盲基础知识篇:
首先,作为非计算机课班的同学你需要先掌握一些基础的知识。可以从我在下面罗列的部分入手。
1.操作系统基础知识:文件系统,虚拟内存,存储器分页,指令执行周期等知识。
2.网络基础知识:TCP,IP, Internet,HTTP request, 客户端与服务端的工作基础。
3.并发基础知识:线程,进程,各种锁,互斥锁等。
4.数据库基础知识:数据库的类型(SQL与无SQL等),哈希和索引,基于EAV的数据库,数据库的sharding,数据库caching,主从服务器等。
5.一些基本架构的思想:例如负载均衡器,读写分离、异步代理,服务器,数据库服务器,缓存服务器,预计算,logging等。
 
二.理解并熟记系统设计的性能指标
你需要熟记响应时间,并发数,QPS和TPS,吞吐量,系统活跃度等等。
只有熟练应用这些系统指标,你在设计中才会考虑到如何提升系统的设计。
 
三.不断来练习系统设计的case
这里给大家推荐一下“4S分析法”的框架,百试不爽的。4S是指,Scenario,Service, Storage和 Scale。
 
Scenario就是要去向面试官了解清楚你在设计什么样一个产品,这个产品大概有哪些主要的功能?它需要支持多大的用户群体,QPS,memory,storage等等,一定要搞清楚这些问题再开始设计。Service环节就是搭架子,对系统进行组件的设计,这时候建议大家要用白板进行画图,把系统需要的功能用block的形式画出来,并且把相似的功能合并成大的service。Storage是对每个service去选择合适的存储结构,最好能够去把数据的schema写出来。用画图的方式去展现清楚你的数据存储和读取的流程。Scale则有很多常见问题,例如:
如何防止单点失效:数据库sharding和replication
是否需要部署在多台机器然后进行负载均衡呢?
数据量是否大到需要分库分表?
 
以上就是我为大家提供的一些关于系统设计的准备思路。系统设计的知识非常庞杂,但是绝对是勤能补拙的面试环节
coffee 直连行业大牛导师,1v1模拟面试与求职指导
mentors
airplay 实战与求职精品课程
数据科学
软件工程
人工智能
金融商科
产品经理
产品设计
bookmark 2000+名企面试真题
amazon google tiktok microsoft meta