Reviewing API, Schema & Query Compatibility

The most expensive review miss isn't a bug — it's a breaking change that ships to a hundred consumers you didn't know about.

In a large system, interfaces are contracts, and a diff that changes a contract can break producers and consumers that the author never sees. This question tests whether you review schema and API changes with the whole ecosystem in mind: who reads this field, who writes it, what happens during the window when old and new code both run. For an events-infra engineer this is bread and butter — Thrift/protobuf/Avro schemas flow through pipelines and land in tables that dozens of teams query, so a careless field change is a silent data-corruption or outage event, not a local bug.

Flow of reviewing API and schema compatibility: additive vs breaking, wire-format rules, defaults, schema evolution, deprecation path, downstream consumers, query semantics, data correctness
Read every interface change as a contract: additive vs breaking, wire-format field rules, defaults, forward/backward schema evolution, a real deprecation path, the full set of downstream consumers, query semantics, and long-term data correctness.

What this question is really testing

Whether you think in terms of rollout windows and independent deployment. The core insight is that producers and consumers are never upgraded atomically, so every change must be safe when old and new versions coexist. The tell is that you reach for “additive and backward-compatible” by default, know the concrete wire-format rules that make a change safe or breaking, and always ask “who are the consumers?” before approving.

How to answer What the interviewer is looking for

The classic wire-format catch — a protobuf change that looks harmless and silently corrupts every consumer:

// WRONG: reused tag 2 and changed a type -- old readers misparse the bytes
message AdEvent {
  string ad_id = 1;
  int32  region_id = 2;   // was: string campaign_id = 2;  BREAKING
}

// RIGHT: reserve the old tag/name, add the new field with a fresh tag
message AdEvent {
  reserved 2;                 // never recycle tag 2
  reserved "campaign_id";
  string ad_id = 1;
  int32  region_id = 3;       // additive: new tag, optional, defaulted
}

Common follow-ups

You can't find any consumers of a field. Safe to delete?

How to answer

How do you review an API versioning strategy?

How to answer

Schema unchanged, but the diff changes what a field means. Your call?

How to answer

What's specific about Avro/schema-registry compatibility?

How to answer
Where to get your data (Meta)