Interview prompt. Tell me about a pattern you removed from a system, what you replaced it with, and how you knew it was safe. If you cannot think of one, tell me what that says.
Show the full answer Hide the answer
What the interviewer is testing
Whether you can subtract. Senior candidates can argue for patterns fluently; the rarer skill is removing one and being able to show it was safe. The question also tests whether you measure: "we removed it and nothing broke" is an anecdote, while "we removed it after showing that 3 of its 4 jobs had no callers and the fourth was handled by the framework" is evidence.
The sting in the tail is deliberate. A candidate who has never removed anything has either never owned a system long enough to see a pattern stop paying, or has not been looking.
The clarifying structure a strong answer follows
What the pattern was buying, originally. Patterns are rarely added for no reason. Name the constraint that justified it — a dependency that was unreliable, a team that needed independence, a scaling limit.
What changed. The dependency became reliable, the team merged, the volume fell, the platform started providing the capability. A pattern becomes overhead when its justifying condition expires, and nothing in the codebase announces that.
The evidence that removal was safe. This is the part that separates answers. Traffic measurements showing the path unused, a shadow run comparing behaviour with and without, a staged rollout with a defined abort signal, a comparison of outcomes over a full business cycle.
What you replaced it with, including "nothing". Removing a cache and accepting a 12 ms increase is a legitimate answer if the cache was costing a consistency bug a month.
A worked example worth knowing
Dropbox's rewrite of its sync engine, Nucleus (described publicly in 2020), is the best-documented case of replacing accumulated mechanism with one property. The old engine had grown many coordination paths and special cases; the rewrite was organised around determinism and testability — a design where the same inputs always produce the same outcome, so conflict handling could be exhaustively tested rather than reasoned about case by case.
What makes it a useful reference is what justified the risk: sync bugs are unverifiable in the field, because the user's files are the evidence and you cannot ask for them. When a defect class cannot be diagnosed after the fact, buying testability is worth a rewrite. That is a decision rule, not a preference, and it is the thing to transfer.
Common weak answers
- "We removed microservices and went back to a monolith." Often true and usually told without the deciding measurement. Which cost was dominant — operational surface, cross-service latency, coordination overhead? Without that, it is a trend, not a decision.
- "We deleted the service mesh because it was complex." Complexity is not a finding. What specifically did it cost, what provided the capability afterwards, and what did you accept losing?
- "We never remove anything, we only add." The honest version of this is a strong answer if you follow it with why: a regulated environment where removal needs re-certification, for instance. Said flatly, it is the answer the question is designed to catch.
What a strong answer adds
The organisational layer. Removal is harder than addition because nobody is promoted for it and because the person who added the pattern is often in the room. A strong answer describes how the case was made: evidence first, the pattern's original justification acknowledged rather than ridiculed, and a reversible first step — delete the unused half, keep the rest for a quarter, then delete the rest.
It also names the stopping condition. The right amount of removal is the amount that leaves the system able to absorb the next known change, not the minimum that passes today's tests.