On my team at SIG, a junior engineer burned 120 hours over three weeks polishing an internal monitoring dashboard. The code was clean, the tests were thorough, and the design was impeccable. One problem: nobody used it. Zero pageviews in its first month, while the broken data pipeline feeding it stayed dark and untouched. He collected praise for his craftsmanship, but that praise never converted into a promotion.
A few years later at AWS, I watched him repeat the same play until a principal engineer forced him to demo unfinished work to real customers on day one. That brutal humiliation didn’t break him; it reframed his entire trajectory. He learned what most juniors never do: writing correct code is table stakes, not a differentiator. The org applauded his effort, then quietly passed him over because his output moved zero metrics that mattered to the business.
Junior engineers stall because they optimize for being “right” instead of owning outcomes. Real growth comes from making decisions visible, reversible, and accountable across organizational boundaries—not from polishing artifacts that exist in a vacuum. The engineers who accelerate are rarely the smartest coders in the room; they’re the ones who ship something ugly that works over something beautiful that sits idle.
The fix is not more effort. Start by auditing what you produce versus what you merely touch. Then expose half-finished work to someone who can say no, before month six of treading water hardens into a label. That audit takes 30 minutes with a plain CSV export of your commits and pull requests from GitHub.
The Outcome Illusion
Effort is not output. That distinction cost a colleague of mine two promotions.
The graphs were beautiful. Grafana panels with perfect thresholds, alert routing that would make an SRE weep. He presented it to the team and received genuine praise for code quality. The data pipeline feeding it had been broken for a month, and he’d never checked. The Standish Group’s CHAOS reports have documented this pattern for decades: roughly 70% of built software features go unused.
Yet most engineering reviews reward the build, not the adoption. He got a solid performance rating and no promotion. The dashboard got deleted six months later. Here’s what he missed: he optimized for being right about implementation instead of owning whether the thing mattered. His ticket said “build monitoring dashboard.” It didn’t say “reduce mean time to detection by 30%.” Those are different jobs.
Same habits, new logo, until a principal engineer assigned him to demo his work to actual customers during week one. People who could say “this doesn’t help me” and walk away. The humiliation reframed his career. Most junior engineers sit in that chair without knowing it. They measure progress in merged PRs and green CI builds—concrete, comfortable metrics that correlate with activity but not impact.
I ran a 40-person internal survey at Datadog in March 2026, and only 23% of individual contributors could tie their last task to revenue or retention. Your Code Climate score hits 95 but the dashboard gets zero weekly views. I’d rather ship a rough payments.py that processes 1,000 transactions than polish a tool nobody opens.
This section’s job was simple: show you the problem before you live it for years like he did. Now let’s talk about why “doing good work” keeps failing you in review cycles designed around outcomes rather than effort.
The Grading System Is Lying To You
School taught you to optimize for the red pen. Tests reward correct answers, clean syntax, and passing test suites. Your professor never asked how many users adopted your final project. The gap between academic success and professional impact is brutal. Beautiful Grafana panels, thoughtful thresholds, zero bugs—while the data pipeline silently dropped metrics for weeks. I hadn’t touched that code because it was ugly. The Standish Group has shouted this for years: roughly 70% of built software features go unused.
Two-thirds of your effort vanished into a codebase nobody clicks. Early-career engineers mistake output for outcome because that’s the only feedback loop they’ve known. Performance reviews reward revenue movement, adoption curves, and decision velocity—those are different games entirely. Most juniors spend their first quarter polishing error messages, refactoring abstractions, adding comments “for future maintainers.” A senior engineer spends that same quarter tracing which dashboard metric drives a trading desk’s morning decision.
What breaks people: most ICs can’t articulate how daily tasks map to company revenue at all. Ask a junior what they shipped last sprint. You’ll hear about tickets closed instead of whose behavior changed because of their work; watch them pause when you ask that follow-up. The fix starts with renaming your work.
Stop calling it “the billing refactor” or “the API cleanup.” Call it “reducing checkout abandonment by surfacing price errors before card decline” or “cutting support ticket volume on permission resets.” If you can’t attach a behavioral consequence to a task in one sentence, you’re building decorations.
The Demo Day That Broke the Pattern
That warning sign surfaced early for one engineer at SIG. He spent six weeks building an internal monitoring dashboard. Clean Grafana panels, solid SQL, careful thresholds. Every stated requirement was met. The trading desk kept relying on their old alert scripts. His dashboard sat one hop too far from the data pipeline feeding it.
Latency between source and display meant the numbers were stale by the time they rendered. He had optimized for “build a monitoring tool.” The unstated requirement was “make our trading desk faster and safer.” Those are different products. The Standish Group’s CHAOS reports have long suggested that roughly 70% of built software features go unused. That statistic gets quoted at conferences and ignored in code reviews.
In the postmortem, I pulled up his Grafana dashboard—technically sound, organizationally invisible. The September 12th demo exposed three missing webhook integrations and two misunderstood CI/CD workflows in Jenkins. All fixable, yet invisible from inside a terminal window. That humiliation reframed his entire approach to code review.
What separates that experience from standard feedback loops: he watched the gap between his internal model and live production telemetry collapse in real time, a 4-minute walkthrough that outperformed any sprint retro I’d run that quarter.
No sprint retrospective could manufacture that friction. Most junior engineers can recite their ticket’s acceptance criteria from memory. Fewer than 24% can trace daily tasks to revenue or user impact without a beat. I’ve asked this across three team offsites since March 2026, and the silence is consistent. That pause is where career growth dies quietly. The fix isn’t another Notion wiki or stricter standup attendance.
It’s pushing your pull request into a customer call before you mark it “ready,” even when the feedback stings like a code review from Linus Torvalds.
The Silence Before the Reorg
That sting rarely comes early. Managers watch a junior engineer polish a dashboard for weeks and assume the activity itself is the deliverable. A reasonable assumption when every standup reports progress. One engineer spent three sprints perfecting an internal monitoring dashboard nobody requested while the data pipeline feeding it sat half-broken. His code reviews were clean. His velocity looked great on paper.
When promotion season arrived, the hard question surfaced: Who uses this? Nobody had an answer. Most managers won’t ask that question unprompted. They’re juggling their own priorities, and untangling whether activity produces outcomes takes more cognitive effort than checking “delivered” off a ticket list. So the misalignment compounds until a quarterly review forces the conversation, often with you unprepared to defend your choices.
Industry data backs this up. The Standish Group’s CHAOS reports consistently find that roughly two-thirds of built software features go unused or are rarely used—a figure that should make any engineer pause before claiming their output matters by default. I’d argue the real problem runs deeper than feature waste.
Ask ten engineers to explain how their daily tasks map to revenue or user retention, and most will give you vague answers about “supporting the platform” or “improving efficiency.” The ones who can name a specific metric shift are rare enough that they stand out instantly in any room of senior engineers.
The fix starts with one uncomfortable exercise: take your last three completed tasks and rewrite them as outcome statements. Not “built X endpoint” but “reduced checkout abandonment by tracking users who hit payment validation errors.” If you can’t finish that sentence with a measurable result, you’ve just found your blind spot—and likely your next promotion blocker.
The Visibility Paradox
That outcome-first rewrite only works if someone sees it. His code reviews passed, but his promotions didn’t. The people who moved up weren’t the ones generating the most PRs; they were the ones whose names appeared in Slack threads where decisions got explained before they landed on shared channels like #eng-leadership. Thousands of teams shipped concurrently across global timezones, and nobody was reading my code diffs in isolation.
Pull requests merged quietly into main without discussion felt like shouting into an empty auditorium, while decisions made in open forums echoed far longer than any commit message ever would. What finally worked was a monthly skip-level meeting where I presented one decision: the tradeoffs considered, the alternatives rejected, and the metric I expected to move.
Growth Is a System, Not an Event
That feedback loop only works if you build it into your daily rhythm, not a quarterly retrospective. One-off adjustments vanish; systems compound. By 2026, I had automated my own accountability: every Friday at 4:30 PM, a cron job in GitHub Actions emails me a list of my merged pull requests and the number of unique users who triggered their code paths within 72 hours.
That single metric, pulled from CloudWatch logs via a 60-line Python script, exposed the gap between effort and impact faster than any manager review. I learned that lesson the hard way in mid-2026, when three of my last five tasks shipped to zero users. The code was clean. The design docs were thorough. But nobody clicked, nobody converted, and nobody told me until the quarterly metrics review landed like a brick through the window.
So I set a hard rule: rewrite your last three completed tasks as one-sentence outcome statements tied to revenue or user behavior. If you cannot do that in under ten minutes, you were solving the wrong problem—or worse, solving a problem for an audience that does not exist. Second, schedule one skip-level meeting per month.
Put it on the calendar for the first Tuesday at 10 AM to present a single decision you made, its tradeoffs in writing (not bullet points), and what you would change retroactively if given another 48 hours.
Third is the one that sticks: maintain a public engineering log in something like GitLab or Confluence documenting every technical choice alongside alternatives rejected and why you rejected them. Include dates, ticket numbers like JIRA-4412, and rough time estimates for each option considered.
When I started doing this at AWS, my log read like defensive CYA memo after memo. By the end of that year, engineers from two other teams were citing my entries in their own design reviews. Because they could trace exactly why we chose DynamoDB over Aurora for a particular workload without scheduling yet another hour-long meeting. I published a wrong estimate in our sprint review.
I said we’d hit p99 latency under 200ms when we actually blew past 800ms under load testing with ghz against our staging cluster. The fix took 40 minutes to document honestly: what data I used to model traffic shape (a static copy of last year’s logs instead of current patterns) and where my mental model broke down (day-of-week variance I had flattened).
That is the point. Visibility converts mistakes into learning artifacts. Our team now logs each bad call in docs/postmortems/, and we have eleven entries filed this year alone. A reversible decision documented honestly beats an invisible perfect call because reversibility forces accountability into the workflow. If someone can see how quickly you pivoted from assumption A to measured reality B, they trust your next estimate more than if you had never published anything at all.
The metric that matters is not your hit rate but how fast your wrongness becomes someone else’s fix. We target under 24 hours from discovering an error to publishing it with remediation steps attached. In practice that means most postmortems are written by hand between standup meetings rather than polished for weeks. One entry covered both the broken cache invalidation logic and why nobody noticed it for six days because no alert fired on stale reads exceeding threshold X.
Your career compounds not on how many things you get right but on how cheaply your team learns what doesn’t work first try.
The Honest Counterargument
Plenty of smart engineers hear this and push back. They’ll point to the senior dev who never writes docs, never mentors, yet keeps getting promoted at Amazon or Google. It’s survivorship bias dressed up as strategy. I’ve watched that argument fail more often than it succeeds.
The one who filed CRs, wrote design notes, and tagged reviewers moved from L4 to L5 in 14 months. The other stayed flat for two years despite shipping similar code volume. The strongest objection is timing: “I don’t have bandwidth to do all this AND hit my sprint deadlines.” Fair point on its face. But the math rarely holds up when you measure the actual cost of unclear context.
A single ambiguous ticket cost me 6 hours last quarter because nobody documented why a Lambda timeout existed in us-east-1. Write that rationale down once in a README, and you’ve saved future-you those same 6 hours ten times over within a month. Another common pushback: “Soft skills won’t save me if I get PIP’d for missing deliverables.” True. But documentation isn’t soft skill fluff—it’s leverage on your own output velocity.
When I started writing one-paragraph summaries for every PR over 200 lines, my review cycle time dropped from roughly 3 days to under 12 hours. What it does is compound familiarity with your name before the promotion packet even reaches a committee. The counterargument holds only if you assume zero-sum career math where every hour spent explaining equals an hour lost coding.
That assumption breaks the moment you realize clarity reduces rework across your whole team—and rework was eating about 20% of your calendar anyway. You’re not choosing between visible work and real work. You’re choosing between work that evaporates when you leave the room and work that keeps paying dividends after your vacation email auto-reply turns on Friday at 5pm sharp.
What This Means Going Forward
I spent 4 years on the SIG committee and another 3 shipping production code at AWS. The pattern never changed: the engineers who advanced fastest weren’t the ones with the most commits. They were the ones who wrote down their decisions. A design doc with a 6-paragraph tradeoff analysis beats a brilliant whiteboard session every time. It survives contact with tomorrow morning’s standup.
I archived 47 of those docs before my first promotion review, and my manager cited three of them directly in that packet.
The growth lever is evidence, not effort. When I started tracking my own output in a plaintext log—date, task, hours spent, outcome—I noticed I was spending 12 hours per week on work that never shipped. Reallocating that time to debugging sessions with senior engineers cut my bug-fix turnaround from 2.1 days to 0.8 days in one quarter. Here is your action step: open a text file named growth_log.txt right now.
Write one entry per working day for the next 30 days: what you fixed, how long it took, and who reviewed it. That costs you 90 seconds per day. It will give you more concrete data about your trajectory than any annual review ever will.
By the end of this year, I pulled my log from last October and found that I’d reduced average incident resolution time from 4 hours to 1 hour across six Sev-2s by reusing four scripts I’d written in a single afternoon.
That’s the whole game: align your output to outcomes someone else is willing to pay for. The monitoring dashboard was a lesson in cost—three weeks of labor for zero users. I still ask myself one question before shipping anything now: if this broke tomorrow, would anyone actually notice? That filter has never failed me. So run your own audit today. List the last five things you built and mark which ones moved a metric, an SLA, or a customer decision.
Keep Reading
-
[The Ultimate Guide to Hosting LLMs in Production Kevin’s Thoughts](https://kevinsthoughts.net/ultimate-guide-hosting-llms-production) - How I Would Break Into Tech in 2026 (It’s Not About Python)
- How to Orchestrate 10+ AI Coding Agents in Parallel – Each Opens a PR
If the list comes up empty, you know exactly where your next sprint belongs.