Interview questions
What changes at a boundary
1Why does the deciding question change from 'what is fastest?' to 'what can both sides agree on?' when data crosses a boundary between systems?
Because the producer and the consumer cannot be updated at the same moment, and the producer may no longer exist. How many parties can take part without negotiating matters more than speed.
Read moreWhat changes at a boundary
2What two variables organize interfaces between systems, and which three families do they produce?
The time gap between writer and reader, and whether the reader can talk back to the writer. They give file formats (unbounded gap, no channel back), access protocols (short gap, a full channel back) and integration patterns (an indefinite gap, where the channel back must also remember where it got to).
Read moreTime gap and back-channel
3Who usually ends up paying the cost of a boundary between two parties?
The party with less power to refuse. Power, not efficiency, predicts which side does the work.
File formats
4What is the parse tax, and who pays it?
The work between the bytes and the values: parsing characters, guessing types, decoding. The reader pays it on every read, forever.
Read moreThe parse tax
5What is splittability, and is 'gzip is not splittable' correct?
Splittability is whether a reader starting at an arbitrary byte can find the next record boundary, so that many workers can share one file. It is a property of the framing, not of the compression codec. One big gzip stream cannot be entered in the middle, but formats that cut the file into independent blocks stay splittable under any codec.
Read moreSplittability
6Why is CSV with quoted newlines not reliably splittable, and what fixes it?
A quoted field may contain a newline, so a worker that jumps into the middle and looks for the next newline may start inside a field. Newline-delimited JSON (NDJSON) fixes it with the rule "one record, one line".
Read moreText formatsNDJSON: framing is worth more than encoding
8Where can a schema live, and what does each choice cost?
- Nowhere: the reader infers it, paying the parse tax and the risk of guessing wrong.
- In the bytes: overhead in every file, which sets a minimum sensible file size.
- In a registry: tiny messages, but the registry is on the critical path, and losing it makes the data undecodable.
Read moreWhere does the agreed schema sit?
9Name six ways two systems can both parse the data correctly yet disagree on what it means.
Character encoding; decimal versus float; null versus empty versus absent; timestamps and time zones; integer width; and collation (sorting rules). A "not null" check does not catch them, because the data is valid and simply means two things.
Read moreThe interop hazards
Access protocols
10Why can a client never be sure whether a failed remote request happened?
If the reply is lost, the sender sees the same silence whether the request failed before, during or after the action. This never goes away, so the receiver must be able to handle the same request twice (idempotency).
11Why do SQL dialects differ between engines?
Mostly because engines have different capabilities, not because vendors are careless. A declarative interface lets the engine decide how to execute, so each engine exposes what it can do.
Read moreDialects, not vendor sloppiness
12Why is a JDBC or ODBC cursor bad for one huge result, and what are the three ways a large result can leave an engine?
The cursor is row-oriented, stateful and synchronous, so a slow client holds the server's session. The three ways out are the cursor, columnar RPC, and unload (write files to shared storage and hand over a pointer). Only unload has a cost that does not depend on the client's speed.
Read moreWhat they force: the cursorResult egress: only three ways out
13What does statelessness give REST, and what does it cost?
Any server can answer any request, so servers can be added and removed freely. The price is context re-sent on every request, and often several round trips per answer.
14What does GraphQL gain and lose, and what do mature GraphQL services add?
It gains one round trip for any need, and loses a predictable cost per request. Mature services add depth limits, complexity budgets, cost estimation and allow-listed queries, which fix the set of query shapes again.
15What is the difference between protocol compatibility and semantic compatibility?
Protocol compatibility means clients can connect and exchange bytes, as with the Postgres wire protocol. Semantic compatibility means the same isolation, types, transactions and functions. The first is cheap; the second is not.
Read moreThe Postgres wire protocol
16What four things do webhooks force on you?
Duplicates, so the receiver must be idempotent; retry storms, so backoff, retry budgets and a dead-letter path; no guaranteed order; and the receiver's availability becoming part of the producer's pipeline.
Read moreWebhooks and callbacks
17How do you estimate the cost of changing a public interface?
Cost = time both versions run × number of callers. With 400 integrations and a 12-month sunset, that is 4,800 integration-months.
Read moreVersioning and deprecation
Integration patterns
18When can a data source be resumed from where a sync left off?
Only when its position is total (any two positions can be compared) and monotonic (it only increases). A log offset qualifies. A timestamp high-watermark does not, if writes arrive out of order or share a millisecond.
19ETL or ELT: what actually decides?
Reprocessability. ELT keeps the raw data, so after a bug you recompute inside the destination. ETL shields the destination from schema drift at the source, but forces you to extract again. The industry moved because storage became cheap and compute elastic, an economic fact that could flip back.
Read moreELT versus ETLWhy the industry moved
20What decides whether federated queries across systems perform well?
How selective the part that can be pushed down to the source is. With 10⁹ rows of 100 bytes and a filter keeping 0.1%, pushing the filter down moves 100 MB, and not pushing it moves 100 GB: a 1,000× difference from a mismatch in capability.
Read moreFederation and query pass-through
21Why is offset pagination wrong, not just slow?
Under concurrent inserts or deletes, rows shift between pages, so a client sees a row twice or never sees it, with no error. Keyset pagination anchors to a value instead, but needs a unique, stable, ordered key.
22Why is a file that never arrived the one failure that needs a clock to detect?
Every other failure produces a signal, such as an error or a wrong value. A missing file produces nothing, so it can only be noticed by expecting it on a schedule.
Read moreFile drop and partner exchange