Google Cloud Storage Software Engineer III Onsite Interview Experience

Google Cloud Storage SWE III onsite in four rounds: equal-endpoint max subarray, folder-tree deletion order, C++ noexcept, and an object-store metadata design.

GoogleSoftware Engineer III, Google Cloud StorageUpdated Oct 4, 20262 min read

Interview Experience | Backend / Infra | πŸ”₯πŸ”₯πŸ”₯ | Google

2026 (Sep) Software Engineer III, Google Cloud Storage @ Google β€” Sunnyvale, CA β€” Onsite (4 rounds) | 😐 Neutral | Medium-Hard | Pending

Four rounds. The team works on GCS metadata, so the last two rounds leaned clearly toward storage.

Round 1 β€” Coding

The self-intro was short; the interviewer said to just start.

First question was a warm-up. Two lists sorted by time: versions (the timestamp of each write to an object) and queries (the points in time to read at). For each query, find the smallest timestamp in versions that is >= it, or -1 if there is none.

I checked whether versions could have duplicates and whether queries was also sorted. Both were fine. Two pointers, O(p + q). He asked what if versions has tens of millions of entries and queries only a few dozen, so I switched to a binary search per query.

The second one was the main question. Given an array a[0..N-1], find i <= j with a[i] == a[j] such that a[i] + ... + a[j] is maximal, and return that sum.

I went with prefix sum + hashmap, the map storing the first position of each value. After I wrote it he asked whether i == j counts. It does. Then he asked what about negative numbers. I was stuck for quite a while; the interviewer gave one hint, and only then did I realize the earliest occurrence of a value isn't necessarily the best one, the map has to keep the smallest prefix. After the fix it was O(N). With the time left I asked how their on-call rotation works.

Round 2 β€” Coding + C++

My resume lists C++, so the interviewer said to write in C++. Coding came first, the rest was C++ fundamentals.

The problem: a multi-way tree represents the folder structure of a bucket, with the bucket as the root. You can delete only one leaf at a time. Return a valid deletion order so the whole tree ends up deleted.

Post-order DFS gives it directly. After I wrote it he asked what happens if folders are nested very deeply; the recursion stack can blow up, so I changed it to an iterative post-order.

The follow-up was the real point: instead of returning the whole order at once, build two interfaces. nextDeletable() returns one currently deletable node each time, and the caller calls markDeleted(node) only after actually deleting it.

Each node tracks how many children are still undeleted. Leaves go into a ready queue first; markDeleted decrements the parent's count and enqueues the parent when it hits 0.

He gave no reference semantics for the interface. If nextDeletable() is called twice with no mark in between, what does the second call return? I decided a node already handed out is never handed out again, and markDeleted only accepts nodes that were handed out and errors otherwise. He nodded. Whether a failed deletion should put the node back into the ready set I only mentioned verbally, did not write it.

I remember two of the C++ questions. When vector reallocates, move vs copy depends on whether the move constructor is marked noexcept. And what gets invalidated after an unordered_map rehash: I said iterators, references and pointers all do, and he corrected me, references and pointers stay valid, only iterators are invalidated. There were a few more I don't remember.

Round 3 β€” System Design

No warm-up of drawing a bunch of components. The prompt was one sentence: design the metadata layer of an object storage system.

key -> object metadata (size, generation, blob location), supporting get, put, delete and list(prefix). For scale he said to think trillions of objects and millions of QPS.

He opened with hash partition or range partition. I picked range, because list(prefix) needs ordering. He immediately pushed: what if keys carry a timestamp prefix and all writes land in the last range. Split hot ranges by load, clients cache the routing and get corrected by redirects when it's stale.

Where I got stuck was writes in flight during a split. I only got as far as the old range rejecting writes at the moment of the split and the client retrying. He asked whether there's a way without rejecting, and I couldn't answer.

On monitoring he asked how you'd find out a particular range has a problem; I said per-range QPS and latency. How to set alert thresholds, I gave no concrete numbers, and he didn't push.

In the last few minutes he casually asked what it costs to rename a folder in a flat key structure. You have to change every key with that prefix, possibly across ranges, and it is not atomic. We ran out of time before going further.

Round 4 β€” Googleyness

All BQ, the shortest round. What I remember best is the production incident question: I told a story about a batch job that saturated a downstream DB, and the follow-ups were who noticed first and whether there was a rollback. I was also asked what to do when a system has design problems but is already live, just that one question with no follow-up. The rest I don't remember well, I think one was about ambiguity. At the end I asked what the team is working on in metadata right now.