Why Documentation Reads Like an Observer’s Log
Think about your own vantage point. The sunrise you see is shaped by where you are: the buildings in the way, the time of year, the weather. The sun itself is a constant; the observation is not. That gap between an objective reality and a situated observer is what phenomenology describes. In software, the same principle applies to documentation.
Long-lived systems carry their history with them. Features solve problems from a particular moment, constraints protect against past failures, and trade-offs looked reasonable under conditions that may no longer exist. Developers who build on such systems inevitably dig into that history. They need to understand why something was done a certain way, not just what it does.
Documentation that records what was seen, when it was seen, and under what constraints transforms that archaeology into a traceable process. It becomes less a supporting artifact and more a feature of the project itself.
PostgreSQL’s Context-First Approach
PostgreSQL’s documentation is not notably shorter, friendlier, or more interactive than its peers. What makes it stand out is consistency: it preserves design context close to the moment of change. Contributors document not just the implementation, but the guarantees that come with it and the boundaries where those guarantees stop applying.
Because documentation and release notes move with the code, the observer and the describer are typically the same person. The engineer on the roof writes down what they saw from that roof. Over decades, that habit builds into trust.
Consider how MVCC is documented. Multi-Version Concurrency Control is not presented as an abstract trick. It is described as a set of visibility and isolation guarantees. Different transactions can see different versions of the same data at the same time, and each view is correct within its isolation level. There is no single global “now.” The documentation never pretends there is one observer-free truth — the mechanics are stated in terms of what is visible from each position.
Docs as Code Isn’t Enough
Versioning documentation with source code, routing it through the same reviews, and shipping it alongside releases keeps descriptions aligned with current behavior. That is necessary, but it is not sufficient. Docs-as-code practices protect behavioral correctness. They do not force anyone to record why a feature exists, which trade-offs were made, or when a behavior should not be relied upon.
Many projects adopt tooling like this and still end up with documentation that explains what and how while leaving readers to guess about why. PostgreSQL goes further because of its culture, not its tooling. Contributors write their own changes. Release notes anchor those changes in time. Public discussion lists preserve the reasoning behind them. The result is enough context to reconstruct intent, even when it is not written as explicit philosophy.
The New Developer’s Dilemma
Now imagine John Doe. He buys a product, follows the manual exactly as written, and remains confused. The manual explains every feature from a pure usage perspective but leaves out the base assumptions underneath. The behaviors are technically correct, yet they feel wrong because the foundation was invisible.
That happens in software too, when the base assumptions are hidden. People, driven to frustration, fall back on blind experimentation. When the base is visible, learning is deliberate.
Take a developer building an analytics tool on pg_stat views. They can read the documentation to see what those statistics represent, check release notes to learn when and why behavior changed, and trace the decisions back through commits and mailing-list discussions. If something is still unclear, they ask focused questions because the discussion history is public and contextualized. That turns testing into validation, not archaeology.
Different Layers, Different Responsibilities
Compare that with documentation like Stripe’s. Stripe’s docs are exceptional at describing behavior through stable interfaces. They spell out exactly what happens when you call an endpoint with given parameters, deliberately obscuring internal complexity to speed up your integration.
PostgreSQL is not Stripe. It operates at a lower layer. Other systems are composed on top of it, so its documentation has a heavier responsibility: exposing assumptions, constraints, and limitations to make higher-level work safe. Judging the two by the same standard misses what each is trying to do.
What a Technical Writer Takes From This
I came up as a developer learning tools from their documentation, and for a long time I rarely found answers to why a thing worked the way it did. When I moved into writing, I started adding that missing context myself — preserving intent rather than just describing behavior.
In PostgreSQL, that gap is almost nonexistent. The people who identify the problem, design the solution, implement it, and write it down overlap. The documentation feels grounded because it comes from a lived engineering context. It preserves real perspective, rather than claiming a view from nowhere.



