Uber 是为数不多 hc 相对较多、而且全程 virtual 的中大厂之一。电面前 5-10 分钟聊简历,interviewer 让你挑一个 most challenging 或 most proud 的 project。后面大约 50 分钟做一道题,偏 data structure + design——设计一个支持多种操作的 key-value store,需要支持 insert、get 以及带 TTL 的自动过期。先用 hashmap + heap 做了基本版本,然后 interviewer 开始 follow up:如果 QPS 很高怎么办,heap 会不会成为 bottleneck,分布式怎么做。最后稍微聊了一点类似 Redis 的实现思路。
VO Coding 1 和 phone screen 一样的节奏,也是先聊项目再做题。这轮题更偏 algorithm,类似给一组 intervals 返回重叠最多的时间段,先讲了 sweep line 思路然后写了 code。写完后 interviewer 开始加条件:intervals 是 streaming 的怎么办,如果要支持删除怎么办,慢慢就变成一个更像 real-world system 的问题。他们比较看你能不能把一个 LeetCode 题扩展成 production-level 设计。
VO Coding 2 是 Depth in Specialization,实际体验下来还是 coding + 一点设计。这轮题是 OOP 设计题,设计一个 ride dispatch system,支持 driver 和 rider 的匹配。先定义 core class(Driver、Rider、Trip),然后设计 matching service。面试官会不断问为什么这样设计——如果以后要支持 carpool 怎么扩展,surge pricing 应该放在哪一层。重点不是写特别多代码,而是看你的 abstraction 和 extensibility。
VO Architecture 考的是 Uber Eats home page feed design。先 clarify 需求:personalized feed 还是 generic feed,latency 要求,QPS 大概多少。然后给了一个经典的 backend feed 架构:client → API gateway → feed service,feed service 从多个 upstream service(restaurant service、promotion service、inventory service)拉数据,做 aggregation 和排序。
后面 interviewer 一直 deep dive:feed 是 pull-based 还是 push-based,如果用户很多会不会压力很大(讨论了 pre-compute + fanout-on-write 方案);caching 用 Redis 存 feed 如何做 invalidation(restaurant 下架、库存变化怎么更新);consistency 问题(用户看到的餐厅已经关门了怎么办,在 read path 做一次实时校验);scaling(multi-region deployment、低延迟、不同城市的数据隔离)。
BQ 轮主要围绕 collaboration 和 leadership。问有没有和 difficult teammate 合作的的经历,或者有没有带项目的经验。manager 对推荐系统挺感兴趣,又做了 technical deep dive,比如 offline metric 和 online metric 不一致的时候怎么处理。BQ 也不是完全 non-technical,还是要准备好随时切回技术细节。