Browse narratives

EN · · 4 min read

Research as an Engineering Habit

A practical method for moving from vague curiosity to questions, experiments, evidence, and decisions.

Technical GuideIntroductoryEvergreen

Revised

Research can sound separate from software engineering: papers on one side, implementation on the other. In practice, engineering repeatedly asks research-shaped questions. Which approach is safer? Why did this system slow down? What evidence supports an architectural choice? Under which conditions does a technique stop working?

The useful habit is not academic formality. It is learning to reduce uncertainty without pretending to know more than the evidence allows.

Turn a topic into a question

“Study distributed systems” is a direction, not a research question. A question becomes workable when it names a comparison, mechanism, or condition. For example: how does authorization latency change when relationship depth increases, or which retry strategy behaves best when failures are correlated?

A precise question tells me what to read, what to build, and what result could change my mind.

Record the current belief

Before searching, I write my current explanation and confidence. This creates a baseline and reveals hidden assumptions. Without it, research can degrade into collecting sources that agree with the conclusion I already prefer.

Read in layers

I begin with orientation: official documentation, survey material, and terminology. Then I move toward primary sources, implementation notes, benchmarks, and counterexamples. The goal is not to collect the largest bibliography; it is to understand where claims come from and under which conditions they hold.

Notes should distinguish among facts from a source, my interpretation, and open questions. Mixing those categories makes confident writing easy and reliable reasoning difficult.

Build the smallest useful experiment

Code is valuable when it isolates the disputed mechanism. A good experiment controls irrelevant variables, uses representative inputs, records its environment, and can be repeated. It also has a stopping condition: what result would be enough to make the next decision?

Benchmarks deserve particular care. Warm-up, allocation, input distribution, network effects, caches, and measurement noise can dominate the result. A precise number without a precise setup is often less useful than an honest range with stated limitations.

Treat negative results as information

An experiment that fails to confirm the hypothesis is not wasted. It may expose a false assumption, an insensitive measurement, or a condition the original question ignored. Recording that path prevents future work from repeating it.

This is one reason I write while learning. A polished conclusion hides the route; a durable note preserves the decisions, uncertainty, and failed branches that make the conclusion trustworthy.

Close with a decision, not certainty

Engineering rarely receives universal proof. We make bounded decisions: for this workload, team, risk level, and operating environment, this choice is currently justified. The conclusion should include what was observed, what remains unknown, and what signal would trigger reconsideration.

Research, practiced this way, is not a phase before building. It is a loop inside responsible engineering: ask, inspect, test, explain, decide, and remain willing to update the model.

Preserve reproducibility

An experiment should leave behind its input, environment, command, relevant versions, raw result, and interpretation. The interpretation may change; the evidence should remain inspectable. For performance work, record warm-up, sample size, hardware constraints, and whether the measurement includes network or storage effects.

Publish uncertainty explicitly

Useful engineering writing distinguishes observation, interpretation, and decision. “The request took 420 ms in this run” is an observation. “Serialization is probably dominant” is an interpretation. “We will measure allocation and payload size next” is a decision. Mixing the three creates confidence without evidence.

Keep a compact research record

My preferred record is intentionally small:

Question:
Current belief:
Environment and versions:
Evidence collected:
Counterexample or failed attempt:
Decision:
Confidence and limits:
Next trigger for review:

The format makes unfinished reasoning visible. It also lets another engineer repeat the experiment without reverse-engineering a polished conclusion.

A worked example: investigate before optimizing

Suppose an API endpoint becomes slower after a release. “The database is slow” is a topic, not a research question. A better question is: “For the affected request shape, which segment accounts for the latency increase compared with the previous build?”

First preserve the environment, input, trace, and deployment difference. Then compare the request boundary, query duration, materialization, serialization, and downstream calls. Change one variable at a time. A negative result — such as an unchanged query plan — is valuable because it removes a plausible story.

Research becomes an engineering habit when it changes the next decision. The goal is not certainty. It is a smaller uncertainty, honestly described, with enough evidence that the next person can continue from somewhere better.

I want technical notes to distinguish “observed,” “inferred,” and “recommended.” An observation reports what happened under stated conditions. An inference proposes why. A recommendation adds values and constraints. Keeping those layers visible makes an article easier to challenge — and therefore more useful.