Google Cloud Storage Software Engineer III 面经:四轮 onsite,metadata 设计

Google Cloud Storage Software Engineer III 面经:四轮 onsite,考了 version 时间戳查找、首尾相等的最大子数组、folder 树删除顺序、C++ vector/noexcept,以及 object storage metadata 层设计。

GoogleSoftware Engineer III, Google Cloud Storage更新于 2026年10月4日2 分钟阅读
English
分享

面经 | Backend / Infra | 🔥🔥🔥 | Google

2026(9月) Software Engineer III, Google Cloud Storage @ Google | Sunnyvale, CA · Onsite 四轮 | 😐 Neutral | Medium-Hard | Pending

四轮。团队是 GCS 的 metadata 那一块,所以后两轮明显往 storage 靠。

Round 1 — Coding

自我介绍很短,面试官说直接开始。

第一题当 warm-up。两个按时间升序的列表,versions(某个 object 每次写入的时间戳)和 queries(要读的时间点)。对每个 query,找 versions 里 >= 它的最小时间戳,找不到返回 -1。

确认了 versions 有没有重复、queries 是不是也有序,都是。双指针 O(p + q)。他问如果 versions 有几千万条、queries 只有几十个呢,改成每个 query 二分。

第二题是正题。数组 a[0..N-1],找 i <= j 且 a[i] == a[j],使 a[i] + ... + a[j] 最大,返回这个和。

想到 prefix sum + hashmap,map 存每个值第一次出现的位置。写完他问 i == j 算不算,算。再问有负数怎么办,卡了挺久,面试官提示了一次,才想到同一个值最早出现的位置不一定最好,map 得存 prefix 最小的那个。改完是 O(N)。剩下的时间问了他们 on-call 怎么排。

Round 2 — Coding + C++

简历上写了 C++,面试官说用 C++ 写。前半段 coding,剩下是 C++ 八股。

题目:一棵多叉树表示 bucket 里的 folder 结构,根是 bucket。每次只能删一个叶子节点,返回一个合法的删除顺序,最后整棵树删完。

后序 DFS 直接能出。写完他问 folder 嵌套很深会怎样,递归栈会爆,改成了迭代的后序。

follow-up 才是重点:不要一次性返回整个顺序,做成两个接口,nextDeletable() 每次给一个当前可删的节点,调用方真的删完才调 markDeleted(node)。

每个节点记还剩几个 child 没删,叶子先进 ready 队列;markDeleted 把 parent 的计数减一,到 0 就入队。

接口语义他没给标准。连着调两次 nextDeletable() 中间没 mark,第二次返回什么?我定的是发出去的节点不再发,markDeleted 只接受发出去过的,其它报错。他点头了。删除失败要不要放回 ready 集合,只口头提了一句,没写。

C++ 记得两个。vector 扩容时 move 还是 copy,跟 move constructor 有没有标 noexcept 有关。unordered_map rehash 之后什么会失效,我说迭代器、引用、指针都会,被纠正:引用和指针不失效,只有迭代器。还有几个,记不清了。

Round 3 — System Design

没有先画一圈组件的环节,题目一句话:设计 object storage 的 metadata 层。

key -> object 元信息(size、generation、blob 位置),要支持 get、put、delete、list(prefix)。规模他直接说按万亿级 object、百万级 QPS 想。

起手问 hash partition 还是 range partition。选了 range,因为 list(prefix) 要有序。他马上追:key 带时间戳前缀,写全落在最后一个 range 怎么办。按 load 切 hot range,client 缓存路由,过期了靠 redirect。

卡住的是 split 期间正在进行的写。只讲到老 range 在切分的瞬间拒绝写、client retry。他问有没有不拒绝的办法,没答上来。

监控问了怎么发现某个 range 出问题,说了 per-range 的 QPS 和 latency。alert 阈值怎么定,没给出具体的数,他也没再追。

最后几分钟他随口问 flat key 结构里 rename 一个 folder 的代价。要改所有带这个前缀的 key,可能跨 range,不是原子的。没展开就到时间了。

Round 4 — Googleyness

全是 BQ,是最短的一轮。印象比较深的是线上事故那题,讲了一个 batch job 把下游 DB 打满的事,追问谁先发现的、有没有 rollback。另外被问到系统设计有问题但已经上线怎么办,只有这一个问题,没追问。其它的记不清了,好像有一道是 ambiguity 相关。最后问了团队现在 metadata 这块在做什么。