Field Notes11 min read

The Engineer Who Owns the Product

Owning a product as an engineer means more than shipping correct code. It means managing context, uncertainty, and the habits that keep teams aligned.

#engineering#product#ownership#leadership#documentation#communication

Plain markdown for AI crawlers

There is a big difference between being responsible for code and being responsible for a product.

When you own a product as an engineer, your job rarely ends with implementing a feature correctly. You are thinking about architecture, debugging production issues, understanding users, questioning requirements, coordinating with other teams, prioritizing work, documenting decisions, mentoring engineers, and sometimes realizing that something everyone has been discussing for weeks probably should not be built at all.

Technical depth still matters, but product ownership requires a much wider set of skills. In my experience, some of the habits that have made the biggest difference are surprisingly simple: staying organized, documenting almost everything, communicating more than feels necessary, asking uncomfortable questions, understanding why before thinking about how, continuously learning, giving people space to experiment, and recognizing bad directions before they become expensive.

Organization and Documentation: Your Brain Should Not Be the Database

One of the most valuable habits I have developed is documenting things as I work. Important decisions, experiments, strange bugs, assumptions, meeting outcomes, architectural reasoning, approaches that did not work, and decisions that we may want to revisit later all deserve some form of written record.

I also document how to do things. If setting up an environment, deploying a service, debugging a particular class of failure, or performing some operational task requires knowledge that currently lives only in someone’s head, I try to turn it into a short guide. The same applies to product documentation. People should be able to understand what the product does, how different pieces work together, what its limitations are, and how it is supposed to be used without finding the one person who happens to remember everything.

This may sound bureaucratic, but good documentation is almost the opposite. It reduces bureaucracy because people can answer their own questions. It also becomes extremely valuable months later, when nobody remembers why a particular architectural decision was made or why an apparently strange piece of code exists.

A lightweight decision record is often enough: what options we considered, what we chose, why we chose it, what risks we accepted, and under what conditions we should reconsider the decision. Writing these things down turns temporary individual knowledge into organizational knowledge.

A good engineer manages code. An engineer who owns a product also manages context.

Communication: Overcommunication Is Usually Cheaper Than Misalignment

Engineers sometimes treat communication as something that interrupts the real work. Over time, I have come to think about it very differently. A ten-minute conversation can prevent someone from spending three days solving the wrong problem, and a short written update can prevent multiple teams from operating with completely different assumptions.

When several people are involved, I would rather slightly overcommunicate than assume everyone has the same mental model. That does not mean inviting everyone to every meeting or constantly posting updates. It means making important context visible: what we are building, why we are building it, what changed, what we learned, what we are uncertain about, where the risks are, and what decisions still need to be made.

Good communication also means understanding your audience. Another engineer might care about logs, benchmarks, interfaces, and implementation details, while a product manager may care more about tradeoffs, user impact, and timing. Leadership may mostly need to understand risk and expected outcomes. The underlying information is the same, but the interface should change depending on who is consuming it.

Asking Embarrassing Questions

One of the most underrated engineering skills is being comfortable asking a question that feels almost too basic to ask.

“What exactly does this service do?” “Why does this limitation exist?” “Who actually uses this feature?” “Why can’t we remove this entirely?” or simply “I don’t understand why we need this.”

Complex systems accumulate terminology, historical decisions, and assumptions. Eventually, people can start pretending they understand things simply because everyone else appears to understand them. That is dangerous.

I have seen supposedly basic questions reveal outdated constraints, misunderstandings between teams, unnecessary complexity, and requirements that nobody had seriously challenged for years. Quite often, when someone finally asks the embarrassing question, several other people in the room were wondering the same thing.

Experience should make you more comfortable asking simple questions, not less.

Ask Why Before How

Engineering naturally pulls us toward implementation. Someone says that a system needs a cache, and immediately we start thinking about Redis, invalidation, consistency, and eviction policies. Before getting there, however, I think the more valuable question is: why do we need a cache in the first place?

Maybe the underlying query is unnecessarily slow. Maybe the architecture is making a redundant request. Maybe the data does not need to be real-time. Maybe there is a simpler design, or perhaps the feature itself is not important enough to justify the additional complexity.

“How do we build this?” assumes the proposed solution is correct. “Why are we doing this?” tests the premise.

Before getting deep into implementation, I try to understand what problem we are solving, who actually experiences that problem, why it matters now, and what evidence would tell us that we solved it. Once those questions have good answers, the technical design usually becomes much clearer.

Product Sense: Code Is a Means, Not the Goal

Engineers who own products need to develop some product intuition. This does not mean becoming a product manager. It means remembering that architecture, infrastructure, models, APIs, and code ultimately exist to create some useful outcome.

A technically beautiful feature that nobody needs is still a bad feature, just as an elegant architecture designed for imaginary future scale can be worse than a simple implementation that solves today’s problem.

One question I find especially useful during early development is: what are we trying to learn?

Sometimes the most important outcome of a feature is not the feature itself. It may be learning whether users care about it, whether a workflow makes sense, whether a technical assumption holds, or whether the problem is large enough to justify further investment.

The faster we can answer those questions, the cheaper our mistakes become.

Detecting the Wrong Direction Early

One of the highest-leverage things an experienced engineer can do is recognize when a project is drifting in the wrong direction.

A questionable architecture discovered after two days may cost an afternoon to replace. The same architecture discovered six months later may have ten services, several teams, and a customer workflow depending on it.

This is why I like prototypes, benchmarks, early integrations, design reviews, and small experiments. Instead of spending too much time arguing about whether something should work, I prefer bringing reality into the conversation as early as possible. Run the benchmark, test with representative data, build the ugly prototype, integrate with the real dependency, or let a few users try the workflow.

The earlier assumptions meet reality, the easier it is to change direction.

Give People Space to Experiment

Detecting bad decisions early should not become an excuse to shut down every uncertain idea. Teams also need room to experiment and fail.

If every proposal is challenged until it is perfectly justified, people eventually stop proposing anything interesting. Some of the best improvements begin with someone saying, “I think this might work. Let me try it.”

The important distinction is between uncontrolled risk and bounded experimentation. Give someone a day or two, define what question the experiment is supposed to answer, agree on what success looks like, and then evaluate the evidence.

People learn much faster when they are allowed to make small mistakes. The goal should not be eliminating failure; it should be making failure cheap, visible, and informative.

Prioritization and Leverage

Product-owning engineers almost always have more possible work than available time. Bugs, features, refactoring, technical debt, infrastructure improvements, documentation, performance work, support requests, and experiments all compete for attention.

Because of that, prioritization becomes an engineering skill of its own.

A question I often find useful is: what happens if we do not do this now? If the answer is that almost nothing changes for six months, it probably does not deserve today’s attention. Another useful question is whether a task unblocks other people. Spending an hour removing an obstacle for five engineers can be much more valuable than spending a day optimizing your own component.

Engineering productivity is not simply the number of tickets you personally close. Sometimes your highest-leverage contribution is making everyone around you faster.

Build Systems That Explain Themselves

A system is much easier to own when it tells you what it is doing. That means thinking about logs, metrics, tracing, dashboards, alerts, meaningful error messages, testing, and debuggability as part of the product rather than work that gets added at the end.

The difference between debugging a system with good observability and one without it can be the difference between ten minutes and two days.

The same principle applies to product behavior. When something is launched, measure whether people are using it, where they get stuck, whether it fails, and whether the metric we wanted to improve actually changed. Without feedback, engineering decisions slowly become speculation.

Make Reversible Decisions Quickly

Not every engineering decision deserves the same amount of debate.

Some choices are genuinely expensive to undo, such as public APIs, foundational data models, major infrastructure dependencies, or decisions that affect many teams. Those deserve careful thinking.

Other decisions are cheap to reverse. Spending three meetings on a choice that could be changed in an afternoon is often more expensive than making the wrong choice in the first place.

A useful question is simply: how difficult will this be to undo?

Being thoughtful does not mean being slow. Good engineering judgment includes knowing which decisions deserve deep analysis and which ones should be made, tested, and adjusted.

Simplicity Is a Feature

Engineers naturally enjoy sophisticated solutions, but every new abstraction, dependency, service, and framework increases the amount of system somebody will eventually have to understand.

I have learned to value boring solutions much more over time.

If two designs solve the same problem, the one that is easier to understand, operate, debug, and replace is often the stronger choice. Complexity should be something we pay for because it provides measurable value, not something we add because the architecture looks more advanced.

Technical debt follows the same rule. Taking on technical debt deliberately is sometimes exactly the right decision. The problem starts when nobody remembers that the debt exists, why it was accepted, or what conditions should trigger paying it back. Once again, documentation and visibility matter.

Continuous Learning: Protect Time for It

Another habit I believe is increasingly important is deliberately protecting some time for learning, ideation, and improving your skills.

Software changes too quickly to rely only on what you learn through assigned tasks. I try to spend some time regularly reading new material, understanding developments in adjacent areas, trying small experiments, and strengthening fundamentals.

The goal is not to chase every new framework or immediately introduce new technology into production. Most new things probably should not enter your production stack. The value comes from knowing what is becoming possible.

I also think experimentation matters more than passive consumption. Reading about a new approach is useful, but running it, reproducing an example, looking at the source code, or testing it against a real problem builds a much stronger mental model.

A small amount of consistent learning compounds surprisingly quickly.

Ownership Without Becoming a Bottleneck

There is also an important distinction between ownership and control.

As engineers gain responsibility, it is easy to become the person who knows everything and therefore needs to approve everything. That may work for a while, but eventually the engineer becomes the bottleneck.

Real ownership should spread context rather than concentrate it. Explain why decisions were made, let other engineers lead experiments, allow people to own areas of the system, and review reasoning rather than prescribing every implementation detail.

When something goes wrong, ownership does not mean fixing everything yourself either. It means making sure the problem reaches the right person, the right decision gets made, and the issue does not disappear somewhere between team boundaries.

The goal is not to build a team that always knows whom to ask. It is to build a team that increasingly has enough context to make good decisions without asking.

Engineering Is Mostly Managing Uncertainty

Earlier in my career, I thought becoming a better engineer mainly meant getting technically stronger. Technical depth absolutely matters, but owning a product changed my definition of engineering.

A large part of the job is actually managing uncertainty.

You document so knowledge survives. You communicate so people do not drift apart. You ask uncomfortable questions so assumptions become visible. You ask why before how so you do not beautifully solve the wrong problem. You experiment so uncertainty becomes evidence. You give people room to fail so they can grow. You detect bad directions early so mistakes remain inexpensive. You simplify systems so they remain understandable, and you keep learning because the set of possible solutions keeps changing.

Eventually, engineering becomes less about knowing exactly how to build everything and more about knowing which questions to ask, what risks to investigate, which problems deserve attention, and when it is time to change direction.

Writing the code is still an important part of the job. It is simply no longer the whole job.