ZDE

Zero-Deficit Engineering: Treat Trade-offs as Design Questions

July 30, 2026 · #SystemsEngineering · #DistributedSystems · #Architecture · #Engineering

The phrase “engineering trade-off” can end a design discussion before the evidence supports it.

More throughput must weaken ordering. Reliable data movement must require more infrastructure. Bounded memory must cause data loss or force an unbounded source stall.

Each statement can be true for a specific design. None is a universal law.

Compromise is sometimes necessary. The problem starts when a team presents a current design choice as an unavoidable constraint. The team then ends its search. A local limitation becomes an architectural rule, and the next system inherits it.

I developed Zero-Deficit Engineering as I built Remac, a high-performance transaction log processor. The work forced me to examine a pattern in software systems. We often accept a conflict between two valid objectives because the current architecture cannot satisfy both.

The architecture limits the current design. We then mistake that design limit for a limit of the problem.

Zero-Deficit Engineering starts before that mistake becomes permanent.

Zero-Deficit Engineering treats each claimed trade-off as a design question before it accepts the trade-off. It changes the architecture, data model, execution method, or resource use to remove avoidable deficits. It accepts physical limits. It rejects deficits caused only by inherited design.

This discipline does not promise a system with infinite speed, zero cost, and perfect behavior under every condition. It requires a precise account of what the system must do, what prevents it, and what evidence supports that limit.

Define the deficit first

A team cannot remove a deficit that it has not defined.

A deficit is a measurable or observable gap between a declared engineering objective and a design result. No verified hard constraint requires that gap.

The definition has four parts.

First, the team must declare the engineering objective. “Make it fast” is too vague. “Process at least 50,000 events per second on this machine” gives the team a testable boundary. “Preserve source commit order at each sink” states a separate correctness objective.

Second, the result must be observable. A benchmark can measure throughput. A fault test can verify recovery. A memory profile can show growth. A deployment record can count external processes and network hops.

Third, the gap must be clear. If the design reaches the throughput target but removes ordering, the loss of ordering is the deficit. If it preserves ordering but misses the throughput target, the throughput gap is the deficit.

Fourth, a verified hard constraint must not require the gap. This part separates Zero-Deficit Engineering from perfectionism. Some limits are real. The engineer must identify and verify them.

The word “declared” matters. Every system has many desirable properties, but a release cannot optimize an unlimited list. The team must state the objectives for that system and release. The team cannot omit a requirement that the product’s stated behavior or its users depend on.

Declared objectives can include correctness, latency, throughput, bounded memory, recovery time, deployment cost, operator work, or energy use. Different systems need different objectives.

A design has zero deficit only relative to its complete declared objectives and verified constraints.

Classify the claimed constraint

Trade-off discussions become confused when they treat every limit as the same type of fact.

Four classes help separate hard limits from current decisions.

Constraint class Examples What the claim can establish
Fundamental A mathematical impossibility, an established lower bound, or a physical relationship that does not depend on the selected deployment A result can be unavoidable when the system matches the proof’s assumptions
Resource The configured memory, CPU, storage, bandwidth, or power of the actual system The current system has a finite capacity, but the selected capacity is not universal
Boundary An external protocol, API, source, sink, or compatibility rule The integration has a current limit that a different integration can change
Decision Budget, deadline, regulation, or user policy A current business, legal, or user decision imposes a limit that circumstances can change

The first class gives the strongest basis for a claim of inevitability. Even then, the assumptions control the conclusion.

The Fischer, Lynch, and Paterson result gives one example. The original paper shows that no deterministic consensus protocol can guarantee termination in its fully asynchronous model when one process can fail. The result depends on the paper’s model and correctness conditions. It does not apply to every timing or failure model.

The proof and its scope are both important.

Resource limits need the same precision. Finite memory is a hard constraint. A decision to use one host with 16 GB of memory is a current capacity choice. The team can change the data structure, reduce retained state, spill to durable storage, add capacity, or reduce the workload.

An external API can also impose a real boundary. That boundary belongs to the selected integration. It does not prove that the function is impossible with a different protocol or destination.

Budget and deadline constraints are valid. Engineers work inside them every day. They support statements such as, “We will ship the serial path in this release.” They do not support, “Parallel correctness is impossible.”

The language must match the evidence.

Match the evidence to the claim

A trade-off can feel obvious and still be wrong. Familiarity is weak evidence.

Zero-Deficit Engineering uses evidence that matches the claim. No single evidence type answers every engineering question.

An established theorem or formal proof can establish an impossibility or lower bound inside a model that matches the system. It cannot establish measured throughput on a deployed system.

A direct resource calculation can establish a capacity limit. A 10 GB queue lasts about 100 seconds if its backlog grows by 100 MB each second. Scheduling can change the observed duration. It cannot make finite storage infinite.

A reproducible benchmark can support an observed result under stated conditions. It must identify the workload, environment, method, duration, repetitions, and variation. A comparative claim also needs a baseline. An objective test also needs a pass condition.

A failed design experiment shows that one design did not meet the objective under the test conditions. It does not prove that all designs must fail.

A cost model can support a decision when it states the prices, workload, labor assumptions, and period. A different price or deployment can change the result.

An external specification can establish the declared behavior of a source, sink, service, or protocol. It cannot establish a limit beyond that boundary.

This evidence standard changes common engineering language.

“We tried parallel writes and ordering broke” becomes, “The tested parallel-write design did not preserve order under the stated workload.”

“Correctness requires one worker” becomes, “This scheduler can prove order only in its one-worker configuration.”

“Recovery needs a full resynchronization” becomes, “The current checkpoint model cannot identify a safe restart position.”

The revised statements are longer. They are also useful. Each one identifies a design problem that the team can investigate.

A moved deficit still exists

Local optimization can improve one metric while the complete system misses another declared objective.

A pipeline can use an unbounded queue to increase its measured intake rate. The metric improves until memory fills.

An API can return faster if it acknowledges work before durable storage. Latency improves, but a restart exposes the recovery gap.

A service can remove a local process if it sends the work to a large external cluster. The local deployment becomes smaller. Infrastructure cost and operator work move elsewhere.

A data pipeline can preserve its input rate if it stores an unlimited backlog in the source database. The processor meets its local metrics. The source accumulates storage and recovery risk.

Zero-Deficit Engineering uses the complete system boundary. A design removes a deficit only if the original gap disappears without a new deficit elsewhere.

This rule does not require every resource metric to stay fixed. A design can use more memory, storage, or compute inside its declared limits. The team must show the full accounting.

The question is simple:

Which objective improved, which resource use increased, and did that increase create another deficit?

Serialize only the scope that requires it

This worked example draws on an ordering problem that we examined during early Remac development. It omits Remac-specific architecture and implementation details.

Consider a transaction log processor that applies independent changes concurrently. A table-wide operation such as TRUNCATE requires a wider coordination boundary. If it overlaps with row writes for the same table, the destination can reach the wrong final state.

Assume that each statement runs in a separate transaction. Each transaction commits before the next statement starts.

Consider this source commit order:

INSERT INTO accounts (id) VALUES (1);
TRUNCATE TABLE accounts;
INSERT INTO accounts (id) VALUES (2);

The correct final state contains row 2 and does not contain row 1.

With concurrent work, the last insert can finish before TRUNCATE. The later TRUNCATE then removes row 2. The processor can deliver every change and still produce the wrong final state.

One safe response is to serialize every change. That response preserves the table state, but it removes concurrency from ordinary row work. If the design ignores TRUNCATE, it creates a correctness deficit. If it declares the operation unsupported, it reduces the declared system behavior.

The design must identify the exact scope that requires exclusion.

An operation-scoped coordination rule can:

  1. Complete earlier affected work.
  2. Prevent later conflicting work.
  3. Apply the table-wide operation at its source position.
  4. Confirm the operation under the declared confirmation rule.
  5. Release the affected scope and resume concurrent processing.

The processor pauses work for the affected table while the rule is active. Unrelated work can continue only if the system proves independence and the destination permits it.

Coordination still has a cost. The system must track the barrier, bound queued work, and recover the same order after a failure. Those costs must remain inside the declared objectives.

The worked example removes an avoidable choice between full serialization and unsafe concurrency. It does not claim that every operation can run concurrently.

Verification must test the final state, forced interleavings, failure during coordination, and recovery. Each test must state its exact boundary. Evidence must never claim more than it proves.

Some limits remain

Zero-Deficit Engineering rejects avoidable deficits. It must also accept real limits.

A bounded backlog gives a clear example.

Assume a producer creates 100,000 work items each second. Its workers can complete 80,000 items each second. The backlog grows by 20,000 items each second while those rates remain unchanged.

If the buffer can store two million items, this constant rate difference fills it in 100 seconds. A detailed model can include rate variation, retries, item size, and work bursts. None of those details removes the sustained difference between production and service rates.

A durable queue can improve the design. It can move queued work out of memory, increase the outage window, and support controlled replay.

It still has finite capacity. The durable queue changes the size and location of the buffer. It does not make an endless rate mismatch disappear.

Eventually, one condition must change. The workers catch up. The producer slows. Capacity increases. Storage fills. A declared policy rejects work, drops work, or stops the system safely.

The backlog calculation above uses the difference between arrival and service rates. It does not use Little’s Law.

Little’s Law relates long-term averages when its stated stationarity and finite-mean conditions hold. A backlog that grows without limit has no stable steady state for that calculation.

A zero-deficit response defines the bound and the applicable policy:

If the operator selects a loss policy, that policy makes the loss explicit. If the declared objectives forbid loss, the system must apply backpressure, add capacity, or stop safely.

The limit remains. The ambiguity does not.

Know when to stop

A discipline that rejects trade-offs can become an excuse for endless redesign. That result would create its own delivery deficit.

Work can stop for a release when:

  1. Each objective has a testable pass condition.
  2. The evidence meets each condition.
  3. The change did not hide or transfer a deficit.
  4. Every remaining limit has a constraint class.
  5. Each resource, boundary, or decision constraint has an owner and a review trigger.
  6. Open work does not invalidate the declared release objectives.

This rule permits future work. It does not permit false completion claims.

A team can ship a serial implementation when it meets the declared release objectives. The design record must identify its remaining limit and review condition.

A team can choose a lower-cost architecture for an early release. The cost limit remains a decision constraint. It must not become a permanent technical law through repetition.

The release rule protects both sides of the discipline. It prevents premature compromise, and it prevents endless optimization.

This work has close relatives

Several established methods address related problems.

Of the established methods reviewed for this article, TRIZ most closely matches the central idea. TRIZ is commonly translated as the Theory of Inventive Problem Solving. Genrich Altshuller described a technical contradiction as a condition where an attempted improvement makes another part of a system worse. TRIZ provides methods to resolve these contradictions. The official G. S. Altshuller Foundation material starts its analysis with the desired result and the factors that prevent it.

Axiomatic Design addresses coupled functional requirements. Its Independence Axiom directs designers to maintain the independence of functional requirements.

The systems engineering trade-study process compares candidate designs against explicit criteria. It helps teams select among alternatives in a defined design space. Zero-Deficit Engineering first asks whether the stated conflict must exist.

Multi-objective optimization uses a Pareto frontier inside a defined design space. A Pareto-optimal solution cannot improve one objective unless another objective becomes worse.

Each idea is relevant. Zero-Deficit Engineering adds a specific discipline for software and systems work:

It also challenges the boundary of a current Pareto frontier. The frontier can move when the team changes the architecture, data model, execution method, or use of hardware.

The originality claim must remain precise. Engineers have challenged compromises for a long time. Zero-Deficit Engineering organizes that challenge around explicit deficits, evidence, system-wide accounting, and release decisions.

Results must establish the value of the discipline.

Use the method

The method starts with a sentence:

We want objective A and objective B, but design D creates deficit X because of claimed constraint C.

Write each part before you propose another component.

1. Declare the objectives

Use conditions that a test, measurement, or review can evaluate.

Weak:

The pipeline must be fast and correct.

Useful:

The processor must preserve source commit order at each sink. It must also process proven-independent work concurrently.

2. Locate the deficit

Name the observed gap.

The tested design can apply a table-wide operation concurrently with row writes for the same table.

3. Classify the constraint

Ask whether the claimed constraint belongs to one of the four classes:

If no class explains the conflict, inspect the current architecture. An architectural limitation is a design problem, not proof of inevitability.

4. Test the claim

Build the smallest test that can reject the assumption. Record the initial result and the failure condition. Use a baseline when the test compares alternatives.

If one experiment fails, record the scope:

This design failed under these conditions.

Do not replace it with:

The objective is impossible.

5. Change the design space

Consider changes to:

The worked design changes the coordination scope. It applies exclusion only to work affected by the table-wide operation.

6. Account for the full system

Measure changes in memory use, compute use, storage, network traffic, recovery risk, and operator work.

The best local result can still be a system deficit.

7. Record the remaining limit

State:

This record ensures that a temporary decision does not become an inherited law.

Trade-off is the start of the question

Some trade-offs survive investigation. Their constraints are real, their assumptions match the system, and the evidence holds.

Others disappear when the design space changes.

The engineer’s task is to tell the difference.

Before a team accepts a loss, it should identify the deficit and name the constraint. It should then test the assumption and check the whole system.

If the evidence verifies the constraint, accept it with precision. Otherwise, change the design.

← All posts