今年早些时候走完了 Snowflake L5 senior SWE 的面试流程。system design 这一轮是大家准备最少的,同时在这个级别权重也最高。分享一下我学到的。
我拿到的题大概是这样:"Design a query execution engine that can run analytical queries across hundreds of terabytes of data concurrently for thousands of tenants.(设计一个查询执行引擎,能让数千个租户并发在数百 TB 数据上运行分析查询。)"
对,就是很符合他们气质。
我观察到他们真正想看的点:
他们希望你概念上了解 Snowflake 的真实架构。 不是复读营销话术,而是核心理念:存储和计算分离,virtual warehouses 作为隔离的计算集群,cache 是按 warehouse 维度隔离的。如果你能用这些原则去落地你的设计,会显得你已经认真想过这个领域。
并发和隔离非常重要。 我花了不少时间讲 multi-tenancy:怎么防止一个重查询把另一个租户饿死。面试官在我提到资源排队和 auto-suspend 的时候明显很兴奋。
数据格式和压缩。 列式存储,为什么 Parquet/ORC 风格的格式有利于分析型工作负载,skip indexes。不需要深挖实现细节,但你要能说出这些概念,并解释为什么。
他们会追问规模。 题里出现了 "what breaks first(最先会坏掉的是什么?)"。我讲了当你有上百万个 micro-partitions 时的 metadata 开销,面试官确认这确实是他们在处理的真实问题。
我的准备:我读了 Snowflake whitepaper(2016 年的,但基础原理依然很相关),做了一些通用的分布式系统设计练习,然后专门花了一个下午思考 multi-tenant 的分析型数据库 vs. OLTP 系统。这个阶段,这可能比再刷更多 LeetCode 更值。
这一轮 60 分钟。大概 10 分钟澄清需求,35 分钟设计,15 分钟对某个组件深挖。进去要有结构化方法,但也要愿意根据面试官的兴趣点灵活转向。