- Published on
Control the Inputs, Not the Outcomes
- Authors
- Name
- Iván González Sáiz
- @dreamingechoes
There’s a specific kind of stress that shows up in software when things start moving fast. Not the stress of hard problems — the kind you can sit with, reason about, and eventually solve — but the stress of uncertainty.
A roadmap shifts mid-sprint. A stakeholder changes the definition of “done” right after a demo. A dependency breaks at the worst moment. A production issue steals a day you didn’t have. A launch that felt “basically ready” quietly turns into late-night decisions, rushed trade-offs, and that familiar feeling of trying to keep a moving thing from falling apart.
And even when your team is competent — especially when your team is competent — the pressure can turn inward. You start carrying the outcome in your body. You wake up thinking about the release. Slack notifications sound like tiny alarms. You feel responsible not just for shipping, but for how shipping will land.
If this doesn’t go well, what does it say about me? About us?
This is where Stoicism becomes surprisingly practical.
Not as a “be tough” philosophy, and not as a way of suppressing emotion, but as a way of reclaiming clarity in a world that loves chaos. Stoicism starts with a simple split: what is within your control, and what isn’t. When you take that split seriously, your relationship with delivery changes.
You stop trying to control the outcome. You start controlling the inputs.
The Stoic Misunderstanding
When people hear “stoic,” they often picture emotional numbness — someone detached, unbothered, almost cold. But that’s not the heart of it. Stoicism doesn’t ask you to stop caring. It asks you to stop attaching your peace to things you cannot command.
In engineering, we do the opposite all the time.
We attach our calm to timelines we don’t fully control. We attach our self-worth to launches that depend on dozens of moving parts. We attach our sense of safety to other people’s reactions: will Product be happy, will leadership approve, will users complain, will the market notice, will this become a postmortem?
The result is a low-grade dread that feels like “responsibility,” but behaves like anxiety.
The Stoic move isn’t to care less. It’s to care cleanly — with clear boundaries around where your agency actually lives.
Inputs, Outputs, Outcomes
A useful translation for software looks like this.
Inputs are what you choose and how you work: clarity, prioritization, scope, focus time, code quality, testing, observability, communication, risk management. Inputs are where your agency lives.
Outputs are what gets produced: a PR, a feature, a migration, a release candidate, a deployed change. Outputs matter — but they’re still not the full story.
Outcomes are what happens next: adoption, retention, revenue, stakeholder reactions, user sentiment, incidents, competitor moves, macro timing. Outcomes are influenced by your work, but never fully owned by it.
Most teams plan as if outcomes were controllable. We write dates and confidence into the future as if the world will cooperate. We pretend we can “own” results that are shaped by timing, dependencies, and randomness — and then we punish ourselves when reality behaves like reality.
The Stoic lens doesn’t deny outcomes. It just refuses to confuse them with your worth.
You’re responsible for the quality of your inputs. You’re not responsible for the universe.
What You Can Control (More Than You Think)
When delivery feels unstable, it’s tempting to believe nothing is controllable. That’s usually a symptom of overwhelm, not truth. In practice, you have more agency than it feels like — just not over the things your anxiety wants to grab.
Within your control, you can shape:
Clarity: whether the problem is understood, and whether you’re building the right thing.
Commitment: how much you take on, and what you explicitly choose not to do.
Sequencing: how you slice the work (small, reversible steps vs big, fragile leaps).
Risk posture: how you reduce risk (flags, rollouts, observability, rollback plans).
Communication: how early you surface trade-offs, unknowns, and confidence levels.
Attention: how much parallel work you allow, and what you protect while building.
Outside your control, you’ll always have variables:
A dependency team missing a deadline.
A stakeholder changing their mind.
A user reacting emotionally to change.
A competitor shipping something similar.
A random production incident at the worst possible time.
The trick isn’t to pretend the second list doesn’t matter. It’s to stop building your plan on top of it — and to stop storing your nervous system inside it.
A Worked Example: Shipping With an External Dependency
Let’s make this concrete.
Imagine your team is building a feature that depends on an external API — a vendor integration, a payments provider, a data export you don’t own, or another team’s platform that’s “almost ready.” The value is clear, the scope is reasonable… and the timeline is suddenly not yours.
This is where delivery anxiety tends to spike, because the mind quietly makes a move it shouldn’t: it starts trying to control the dependency. You refresh Slack threads, you chase updates, you rehearse explanations, you try to predict how the other side will behave — and you call that “being responsible.”
But the Stoic split is simple:
You can’t control the dependency’s timeline. You can control how you design your work around that reality.
A Stoic way to run this project is to treat the dependency as weather: you plan with it, you adapt to it, but you don’t build your inner stability on top of it.
So your inputs might look like this:
You define an interface early (contract, payloads, error shapes, versioning).
You build a stub or mock so most work can progress without waiting.
You slice the work so you can ship value in stages (even if the integration isn’t live yet).
You add observability and rollback paths upfront, not as an afterthought.
You communicate in ranges and checkpoints, not in single promises.
And you explicitly name what’s not under your control:
When the external team ships.
Whether their API behaves consistently.
Whether their “done” means the same as yours.
How users will react when the integration lands.
From there, your posture becomes calmer and sharper:
We can’t promise the dependency. We can promise our posture. We will build everything that is ours to build, reduce the blast radius, and be ready to integrate the moment reality allows.
And if the dependency slips, it doesn’t become a moral failure or a late-night scramble. It becomes what it always was: a variable. You adapt your scope, your sequencing, and your communication — without turning uncertainty into self-punishment.
That’s the point: in an unstable world, stability doesn’t come from controlling outcomes. It comes from controlling the inputs that make your work reliable even when the world isn’t.
A Stoic Way to Plan: The Input Contract
One of the most effective shifts you can make for delivery anxiety is moving the team conversation from:
“When will this be done?” to: “What will we do, consistently, to make success likely?”
That’s an Input Contract.
It’s not a motivational poster. It’s a practical agreement the team can actually uphold — especially when things get messy. It creates stability where stability is possible: in execution, in communication, and in the quality of decisions.
Here’s a lightweight version you can use for any project.
The Input Contract
1) What are we optimizing for? Speed, reliability, learning, revenue, stability, trust. Pick one primary. If you don’t, you’ll try to optimize for everything — and you’ll end up optimizing for stress.
2) What’s the smallest version that creates real value? Name the thin slice. Define “done” in human terms, not in checklist terms. If it can’t be explained simply, it’s probably too big.
3) What risks are we taking — and how are we reducing them? List the top 3 risks. Pair each one with a mitigation: flags, staged rollouts, extra monitoring, a spike, a fallback.
4) What will we protect while building this? Focus time, code review quality, on-call load, a testing bar, time for refactoring. You don’t “hope” these survive. You name them, and you treat them as constraints.
5) What will we communicate, and when? Decide how you’ll share progress: weekly demo, async update, risk flags, decision logs. Delivery becomes calmer when surprises are rare.
Notice what’s missing: a single fixed promise about the outcome. Instead, you create a plan that you can honor even when the world shifts — because it’s built on actions you can actually control.
The Anxiety Pattern: Trying to Manage Other People’s Feelings
A lot of delivery anxiety is not technical. It’s social.
It’s the fear of disappointing. The fear of being judged. The fear that if the outcome is messy, your competence will be questioned — or your team’s credibility will take a hit.
So you start trying to control what you can’t control: other people’s reactions.
You overwork to reduce uncertainty. You inflate commitments to sound confident. You hide risks until you can “fix them,” and by the time you speak up, it’s already late and stressful.
The Stoic alternative is simple, but not always easy: tell the truth earlier. Not with drama, and not with self-blame — just with clarity:
“This is what we know.”
“This is what we don’t know yet.”
“These are the risks.”
“These are the inputs we’re controlling.”
“Here’s what we need to decide.”
Honest communication is an input. It’s one of the most powerful ones — because it prevents fear from becoming silence, and silence from becoming surprise.
Shipping With Volatility: Ranges, Not Prophecies
In unstable environments, single-point estimates turn into emotional traps. They become promises. Promises become pressure. Pressure makes people hide.
A Stoic delivery stance prefers ranges — not to dodge accountability, but to stay aligned with reality:
“Best case / likely case / risk case.”
“This is a two-week piece; the full thing is likely 4–6 depending on X.”
“We can commit to shipping something usable by Friday, and we’ll iterate weekly.”
Ranges don’t make you less accountable. They make you more truthful about uncertainty — and truth reduces anxiety because it removes the need to perform certainty.
A Practical Ritual: The Stoic Daily Reset
When delivery gets intense, teams often spiral because they keep re-litigating the same uncertainty. The work is moving, but the mind keeps running the same loop: What if this goes wrong? What if we don’t make it?
A small ritual can help. At the start of the day (or standup), ask two questions:
What is one input we can control today that meaningfully improves the odds? Not “finish the project.” Something concrete: clarify scope, remove a dependency, write a test, add a metric, reduce WIP.
What’s one thing we can’t control — and how are we adapting to it? Name it without panic. “Dependency might slip.” “Stakeholder feedback unknown.” Then adapt: slice smaller, add buffer, prepare options.
This is Stoicism as a team practice: not pretending uncertainty doesn’t exist, but refusing to let it hijack the day.
How This Connects to “Every Yes Kills Something”
Last week’s lens was finitude: every yes has a cost. This week’s lens is agency: not everything is yours to carry.
They work together.
Because when you accept limits, you prioritize more cleanly. And when you accept what you can’t control, you execute more calmly. You stop “earning” safety through overwork. You build safety through inputs: clarity, scope, quality, communication.
You ship with less inner violence. Not because the work becomes easy — but because your relationship with the work becomes more honest.
This article is part of the series Philosophy for Builders, where I translate philosophical ideas into practical tools for building software — prioritization, design, delivery, and culture.
Final thoughts
Stoicism doesn’t promise a stable world. It assumes instability is normal.
It teaches you to place your energy where it can actually do something: into the quality of your attention, the integrity of your choices, the care in your execution, and the honesty of your communication. Those are inputs — and inputs are yours.
Outcomes still matter. Of course they do. But they’re not a reliable place to store your self-worth.
So the next time delivery starts to feel like a threat, try a small shift. Don’t ask, “How do I guarantee this goes well?” Ask: “What are the inputs I can control today — and what does ‘good work’ look like under uncertainty?”
That question won’t remove volatility. But it will give you back your ground — and it will help you ship with the kind of steadiness that doesn’t depend on the world behaving nicely.
Enjoyed this article?
Stay in the loop
Get notified when I publish new articles about engineering leadership, remote teams, and building better tech cultures. No spam, unsubscribe anytime.