Data-oriented development changed how I think about software. Not in the usual “performance tuning is cool” sense, though that matters. More in the sense that it strips away excuses. Once you start looking at a system as a sequence of transformations over real data, a lot of decorative architecture stops looking serious.

That bias shows up all over how I like to build: raw text first, markdown as source, compiled views later, simple interchange formats, inspectable intermediate state, and systems that can be reasoned over by both humans and AI. None of that is accidental.

Programming is not mainly about objects. It is mainly about turning data from one useful shape into another without losing your mind in the middle.

Truth One: The Data Is More Real Than The Model

People fall in love with domain models because the story feels clean. The data does not care. It arrives late, malformed, incomplete, duplicated, or with edge cases nobody wanted to admit existed. If your architecture only works for the idealized case, you did not build for reality.

Truth Two: Transformations Are The Work

Every system is a pipeline whether people like the word or not. Input is parsed, normalized, enriched, filtered, transformed, and emitted. Once you admit that, the design questions get better. Where do we preserve provenance? Which step is lossy? Where do we need raw state kept around? Which stage becomes the bottleneck? This is a much more productive conversation than pretending the system is a set of elegant objects talking politely to each other.

Truth Three: Preserve Optionality

Over-compressing data early is one of the fastest ways to make future work harder. If you preserve raw inputs and useful structure, you can re-derive new views later, feed the data through better models later, or explain the lineage later. That matters even more in the AI era because downstream value often comes from reinterpreting existing raw material through a new lens.

This is one reason I keep coming back to text-first systems. Text survives. Text composes. Text can be diffed, searched, transformed, summarized, and repurposed. If you atomize the source well, you can build many outputs later without lying about where they came from.

That is not abstract philosophy to me. It is a delivery strategy. Systems designed around actual data tend to stay easier to change. Systems designed around fantasy abstractions tend to calcify early and then demand religion to maintain.