刚结束 BofA 的 system design 一轮,面的是 senior software engineer 职位(相当于其他地方说的 L5 或 E5)。趁还热乎,赶紧写一下。
题目大概是:设计一个支付通知服务。客户的卡被扣款时,实时提醒。听起来简单,但一点也不。
他们实际在考什么,至少在我这轮: 你怎么处理大规模 fan-out(很多用户、很多渠道:push、SMS、email) 可靠性和幂等性。银行场景下他们很在意「what if a notification fires twice?(如果一条通知触发了两次怎么办?)」。他们明确问了我怎么防止重复提醒。 失败模式。如果下游通知供应商(Twilio 等)挂了怎么办?重试逻辑、dead-letter queue、circuit breaker。 延迟 vs 一致性的取舍。我被直接问:「would you sacrifice a second of latency to guarantee delivery?(你愿意牺牲 1 秒延迟来保证送达吗?)」没有标准答案,他们想听你的推理。
我可能处理得不好的地方:我在没搞清楚规模需求之前就直接开始画 schema。面试官打断我问:「how many transactions per second are we talking?(我们说的 TPS 大概是多少?)」教训:先做容量估算,再跳到设计细节。
这一轮 60 分钟。前 10 分钟澄清需求,我应该更深入一点。接下来 30 分钟在共享的 Miro 板上做白板设计。最后 20 分钟他们主要在挑漏洞。
Level 方面:recruiter 说 senior 意味着你要能 end-to-end 拿下设计,并且主动抛出 trade-off。如果等他们问你 trade-off 才讲,大概率在 senior level 过不了。
对我有用的准备:我看了 distributed systems design primer,也做了几个支付领域的设计练习。银行场景里 compliance 和 audit logging 经常会作为约束冒出来。