دفتر سليمان

Article

Zero Is Not the Same as Missing

A system becomes unreliable when it treats “nothing,” “unknown,” “not measured,” and “zero” as the same thing. This article explores why small distinctions in data design can shape software behavior, reporting quality, and the decisions people make from both.

A surprisingly large number of software problems begin with a tiny assumption. A field is empty. So we treat it as zero. The shortcut feels harmless. Sometimes it even makes the screen look cleaner. But the moment we do that, we may have changed the meaning of the data. Because zero is not the same as missing. Zero is information. Missing is the absence of information. Those two states can lead to completely different decisions. This distinction looks technical at first, but it reaches far beyond databases. It affects reports, dashboards, medical systems, financial calculations, surveys, operational tools, and even the way we think about uncertainty. A small data decision can quietly become a decision-making problem.

Zero Says Something

Suppose a system records the number of incidents reported today. A value of: 0 means something specific. It means we know the number, and the number is zero. Now imagine the field is blank. That might mean: the number has not yet been entered, the source system did not respond, the data was never collected, the value is not applicable, or someone simply forgot to provide it. Those are very different situations. If the system converts all of them to zero, it creates certainty where none existed. The report may say:

But the actual situation may be:

That is not a formatting problem. It is a truth problem.

Missingness Has Meaning

Data systems often treat missing values as an inconvenience to be cleaned up. But sometimes missingness is part of the information. Imagine a household survey. A family reports that they have no functioning water source. That could legitimately be represented as zero functioning sources. Another household was never asked the question because the interview ended early. That answer is missing. A third household cannot answer because they do not know the status of the shared system. That is unknown. A fourth household is in a situation where the question does not apply. That is not applicable. If all four are stored as 0, the dataset becomes neat. It also becomes wrong. This is one of the strange tensions in data work: clean-looking data can sometimes be less truthful than messy-looking data.

The Interface Often Hides the Problem

Many mistakes begin in the user interface. Imagine a numeric field. The application wants to avoid null values, so it automatically initializes the field to zero. The user opens the form. They do not know the answer. They leave the field untouched. The form is saved. The system now contains a zero. Later, an analyst sees the record and reasonably assumes that someone intentionally entered zero. The interface has converted silence into a statement. This is why default values deserve more attention than they usually receive. A default is not merely a convenience. It can be a claim. If the system automatically fills 0, false, No, or today’s date, it may be recording something the user never actually said.

Unknown Is a Real State

We often design systems around binary thinking. Yes or no. Present or absent. Success or failure. But reality regularly contains a third state: unknown. Sometimes we simply do not know. That is not a failure of logic. It is a legitimate condition of the world. Suppose a deployment process asks whether a remote operation succeeded. If the connection disappears before confirmation, there are at least three possible states: The operation failed. The operation succeeded. The outcome is unknown. Collapsing “unknown” into “failed” may cause the operation to be repeated unnecessarily. Collapsing it into “succeeded” may cause an incomplete process to be trusted. The system needs to preserve uncertainty long enough to resolve it safely. This connects directly to yesterday’s idea about designing work that survives interruption. When the world becomes uncertain, a resilient system should represent that uncertainty rather than erase it.

False Precision Is Dangerous

Humans are naturally attracted to definite answers. A number feels reassuring. A status label feels complete. A percentage looks authoritative. But precision is only useful when it reflects reality. Suppose a dashboard reports:

That number appears precise. But what if 30% of the underlying records have unknown status? The dashboard may still calculate a percentage. Mathematically, the calculation can be correct. Semantically, it can be misleading. This is one of the most important lessons in data systems: A correct calculation can still produce an incorrect interpretation. The formula is only part of the story. The meaning of the inputs matters just as much.

Missing and Zero Behave Differently in Mathematics

Consider a simple average. Suppose we have five measurements: 10, 12, 8, ?, 10 If the unknown value is treated as zero, the average becomes: 8 If the missing value is excluded because it was not measured, the average becomes: 10 Neither calculation is automatically right in every context. The correct approach depends on what the missing value means. But substituting zero without thought creates a very strong assumption:

That assumption may never have been justified. The same problem appears in totals, rates, trends, forecasts, rankings, and statistical models. One small substitution can ripple through an entire analytical chain.

“No” Is Not Always the Same as “Not Answered”

The same principle applies to categorical data. Imagine a form that asks:

Possible answers might be: Yes. No. Unknown. Not assessed. Not applicable. If the interface offers only Yes and No, the person entering data may be forced to lie. Not intentionally. The system simply gives them no accurate option. That is an important design failure. A good data model does not merely accept information. It gives users a vocabulary that is capable of representing reality. Sometimes the most important value in a form is:

Null Is Not the Enemy

Developers are often taught to be cautious with NULL. For good reason. Null values can complicate queries, calculations, sorting, filtering, validation, and application logic. But trying to eliminate them everywhere can create a worse problem. A null value is not inherently bad. An undefined meaning for null is bad. If one part of a system interprets null as “not entered” while another interprets it as “not applicable,” the model becomes unstable. The solution is not necessarily to replace every null with zero. The solution is to define what each state means. In some cases, null is appropriate. In others, an explicit status field is better. For example: value = null measurement_status = "not_measured" This is more verbose than simply storing zero. It is also much clearer.

Data Quality Begins Before the Database

When people talk about data quality, they often imagine cleanup. Remove duplicates. Fix invalid values. Normalize formatting. Correct inconsistencies. Those things matter. But data quality begins much earlier. It begins when we define the question. Then when we design the field. Then when we choose the allowed values. Then when we decide whether a field may be empty. Then when we define defaults. Then when we decide what the user sees when the value is unknown. By the time bad data reaches the database, the real mistake may already be several design decisions old. This is why data quality is not only an analyst’s responsibility. It is also a product-design responsibility. A software-design responsibility. And sometimes an organizational responsibility.

Reports Should Reveal Uncertainty

A useful report does not merely display numbers. It also tells us how much confidence we should place in them. Suppose a system reports:

Useful. But perhaps the dataset contains 100 households, while only 80 were successfully assessed. Now the more informative statement is:

The underlying number has not changed. The meaning has. This distinction prevents readers from unconsciously assuming complete coverage. A mature reporting system makes important gaps visible. Not to weaken the data. To make the data trustworthy.

Missingness Can Reveal a Process Problem

Sometimes missing data tells us something about the process itself. Imagine that one field is missing in 2% of records. That may be ordinary. Now imagine the same field is missing in 60% of records from one location. The problem may not be the data. It may be: a confusing question, a broken form, a training gap, a permissions issue, a synchronization failure, or a real-world condition making the information difficult to collect. Missingness becomes diagnostic. If we automatically replace missing values with zero, that signal disappears. We have not only changed the data. We have erased evidence about the process that produced it.

Defaults Should Be Treated as Decisions

This brings us back to software design. Every default value should survive a simple question: If the user does nothing, is this value still true? If the answer is no, the field probably should not be pre-filled. Consider a quantity field. Defaulting to zero may be appropriate if every new item truly begins with quantity zero. It may be inappropriate if zero means the user intentionally counted none. Consider a checkbox. Unchecked might mean: No. Or it might mean: Not yet answered. Those meanings are not interchangeable. Consider a date field. Defaulting to today might save a click. But if the date represents when something actually happened, the default may silently create false records. Convenience is useful. Truth is more important.

APIs Need the Same Discipline

This issue becomes even more important when systems communicate with one another. Suppose an API returns:

{
  "availableBeds": 0
}

A consuming system reasonably understands:

Now suppose the source system was unavailable and the API still returns zero because the developer wanted to avoid nulls. The API has turned a technical failure into operational information. The consumer has no way to distinguish the two. A safer response might represent the condition explicitly:

{
  "availableBeds": null,
  "status": "unavailable"
}

The caller now knows that the number is not zero. The number is unknown. That difference may influence a real decision.

The Most Dangerous Data Errors Are Plausible

Obvious errors are often easy to catch. A person’s age is 400. A percentage is 180%. A date is malformed. The system rejects them. The more dangerous errors are plausible. A zero where the value was unknown. A false where the question was never answered. A date that was automatically inserted. A status inherited from an old record. These values pass validation. They look reasonable. They survive reports. They may remain undetected for years. This is why semantic correctness matters. A value can be syntactically valid and still be wrong.

Preserve the Difference

A strong system tries to preserve meaningful distinctions for as long as they matter. Zero. Unknown. Not measured. Not applicable. Pending. Failed. Succeeded. Unconfirmed. These states may eventually be grouped for a specific report. That is fine. But grouping should happen deliberately. It should not happen because the underlying system forgot the distinction. Once different meanings are collapsed into one value, recovering the original truth may be impossible. Information can always be simplified later. Lost meaning is much harder to reconstruct.

The Principle Extends Beyond Data

There is a broader lesson here. Good systems resist the temptation to erase uncomfortable distinctions. Not started is not the same as failed. Paused is not the same as abandoned. Unknown is not the same as false. Not available is not the same as zero. Temporary is not the same as permanent. Referenced is not the same as owned. These distinctions may appear small. But systems are built from precisely this kind of small meaning. Yesterday, we talked about preserving state through interruption. Before that, we talked about defining the purpose of a tool. Both ideas depend on clarity. A system must know what it is responsible for. It must know what happened. And it must know when it does not know.

Better Decisions Begin With Honest Data

Data is often described as the foundation of decision-making. That is only partly true. The real foundation is meaningful data. Numbers do not automatically create knowledge. Fields do not automatically represent reality. Reports do not automatically produce understanding. The chain works only when the system preserves the meaning of what was observed, what was not observed, and what remains uncertain. Sometimes that means accepting an empty field. Sometimes it means creating an explicit unknown state. Sometimes it means delaying a calculation. Sometimes it means telling the user:

That may feel less satisfying than displaying a number. It is often much more useful. Because zero is a value. Missing is a condition. And when we treat them as the same thing, we do more than corrupt a field. We teach the system to pretend that uncertainty does not exist. Good systems should do the opposite. They should make truth easier to see, including the parts we have not yet measured.

Filed under

  • Building What Matters
  • Systems Thinking
  • Software Design
  • Decision Making
  • Data Design
  • Data Quality
  • Analytics