Teaching Senior Engineers to Think in Systems, Not Just Code
Why the path to systems thinking isn't "think bigger." It's learning to trust and grow the people around you. A story about a senior engineer, a reorg, and the hardest skill nobody teaches.
I once worked with a senior engineer who could solve anything you threw at them. Complex concurrency bug? Fixed by lunch. Performance bottleneck nobody else could diagnose? They’d have a PR up by end of day. Clean code, solid tests, thorough reviews. By every conventional measure, they were one of the strongest engineers on the team.
But there was a pattern. Their solutions were always scoped to their module. They’d optimize a caching layer without considering that three other features read from the same cache with different freshness requirements. They’d refactor a dependency injection graph for their feature and break the object lifetime assumptions two other teams depended on. The code was excellent. The thinking stopped at the service boundary.
In an org with five services and one team, this doesn’t matter much. In an org with thirty-plus services and a dozen teams, it’s a problem that compounds quietly until something breaks loudly.
The Reorg That Changed Everything
Then came a reorg. This engineer’s scope expanded from one service to an entire domain: several services, multiple integration points, dependencies on teams they’d never worked with. Overnight, their world got three times bigger.
What happened next is the part I want to highlight, because it’s rare. They came to me and said, essentially: “I can see that I can’t brute-force this. If I try to own everything at this new scope the way I owned my old service, I’ll be working seventy-hour weeks and still dropping things. I need help figuring out a different approach.”
That self-awareness is uncommon. Most engineers in this situation just quietly start working longer hours, convincing themselves that if they just push harder, they’ll get on top of it. This engineer was honest enough to admit the old approach wouldn’t scale. That honesty made everything that followed possible.
The Real Blocker Wasn’t Technical
My first instinct was straightforward: delegate more. Spread the work across the team. You’ve got junior engineers who are capable, so let them take on some of the tasks you’ve been handling yourself.
The response was immediate: “To whom?”
It wasn’t dismissive. It was genuine. They didn’t trust that the junior engineers had enough context about the system to work on it safely. And here’s the uncomfortable part: they were partly right. The juniors didn’t have the context. But that wasn’t because the juniors were incapable. It was because nobody had ever given them the context.
This senior engineer had been the fastest path to a solution for years. When something broke, they fixed it. When something needed building, they built it. They’d accumulated enormous institutional knowledge about how services interacted, where the hidden dependencies lived, which contracts were implicit, what would break if you changed the wrong thing. But none of that knowledge existed anywhere outside their head.
This is the trap that nobody warns you about: the more you do, the more you become the only person who can do it. Your competence builds your own bottleneck. And the longer it goes on, the harder it is to escape, because now you genuinely are the only person with the context, which confirms your belief that you can’t delegate.
The Conversation That Reframed Everything
I laid it out directly. “You have two options. Keep doing everything yourself and burn out in three months, maybe six if you’re stubborn. Or invest in making two or three people capable enough that you trust them with real work. Option one feels productive every single day. Option two feels painfully slow for the first few weeks. But only option two actually works at this scope.”
The framing that landed wasn’t about mentoring or coaching or any of the soft-skill language that makes senior engineers’ eyes glaze over. It was mechanical: you are a single point of failure in a system that now requires redundancy. This is an engineering problem. The system you need to redesign just happens to be made of people instead of services.
That clicked. They could reason about it the same way they’d reason about eliminating a single point of failure in their architecture. You don’t solve it by making the single component work harder. You solve it by distributing the capability.
Starting Small, Building Evidence
We started with low-risk tasks. Nothing that could cause a production incident if it went sideways. The senior engineer paired with two junior engineers, not just handing off tickets, but actually sitting with them, walking through the code, explaining the “why” behind decisions that had become invisible through familiarity.
Two things happened that mattered.
The first junior nailed it. Picked up the task, asked good questions during pairing, delivered clean work. This was important because it gave the senior immediate evidence that delegation could work. The fear of “they’ll break everything” met reality, and reality won.
The second junior struggled initially. Their first attempt needed significant rework. In the old world, the senior would have said “see, this is why I have to do it myself” and taken the work back. But we’d agreed to give it time. And within a couple of weeks, something shifted. That junior started building momentum. Their early wins, however small, compounded. They got faster. They started anticipating problems instead of stumbling into them. Their proactivity paid off visibly, and the senior noticed.
Both outcomes were essential. The first proved that trust could be warranted. The second proved something deeper: that struggle isn’t the same as failure, and that people grow fastest when they’re given real responsibility with real support.
Three Exercises That Made Systems Thinking Concrete
During this process, I used three techniques to develop systems thinking, not just in the senior engineer, but across the team. I’m only including exercises I’ve actually used with real engineers. No theoretical frameworks.
Failure Mode Mapping
I’d pose a scenario: “A singleton in your DI graph holds user state but doesn’t clear on logout. Walk me through what the next user sees.”
Most engineers can handle that one. They’ll trace through the obvious flows: profile screen shows wrong data, cached preferences belong to someone else, maybe a payment method leaks across sessions.
Then the harder version: “The singleton does clear on logout, but a background sync job still holds a reference to the old instance. What data gets written where?”
This is where it gets revealing. The second scenario surfaces hidden assumptions about object lifetimes, session boundaries, and which features implicitly trust that shared state is “correct.” Engineers who think in modules will trace through their own feature and stop. Engineers who think in systems will ask: “Who else injects this singleton? What scope is it registered in? Does the sync job have its own lifecycle or does it follow the session?”
When the senior had to walk the junior engineers through exercises like this, something important happened: they had to articulate knowledge they’d been navigating on instinct. They knew the system, but they’d never had to explain it. The act of explaining it made their understanding both deeper and more transferable.
Design Review With Outsiders
Instead of reviewing designs internally, where everyone shares the same assumptions and blind spots, I had the team present to an engineer from a different team.
The questions from someone who doesn’t know your system are brutal in the best way. “What happens if this service is down? Why does this call need to be synchronous? Who owns this data after it leaves your module?” These are questions the team stopped asking themselves years ago because they already “know” the answers. Except sometimes they don’t; they just stopped questioning.
The senior engineer resisted this at first. It felt like exposing their work to uninformed criticism. After one session, they started doing it voluntarily. The outsider questions consistently surfaced assumptions they’d been carrying for years without examining.
”What Happens When This Team Disappears?”
Remove any one team from the org chart. What breaks? What has no owner? What critical knowledge is trapped in someone’s head with no documentation?
This exercise forces systems-level thinking about organizational dependencies, not just technical ones. It’s particularly powerful in large orgs where Conway’s Law is constantly biting back, where the org structure creates technical boundaries that don’t match the actual flow of data or responsibility.
This one hit home for the senior engineer when they realized that they were the answer to several of those questions. If they disappeared, entire flows would break, not because the code was bad, but because the knowledge of how and why things were connected lived nowhere but in their head. That was the moment the abstract idea of “being a bottleneck” became visceral.
Why Mentoring Was the Real Catalyst
The exercises helped, but I want to be honest about what actually drove the shift: it was growing the junior engineers.
To delegate effectively, the senior had to explain the system, not just navigate it on instinct. They had to articulate why services were connected the way they were, what the failure modes looked like, which contracts were implicit and dangerous, which were explicit and safe to rely on. They had to make the invisible visible.
Teaching is the most underrated systems thinking exercise. You can’t explain what you don’t truly understand, and most senior engineers understand their systems far less rigorously than they think. They navigate by pattern matching and accumulated instinct. That works until it doesn’t. Forcing yourself to explain the system to someone who has zero context is the fastest way to discover the gaps in your own understanding.
Within two to three months, the transformation was visible to everyone, not just me. The senior engineer started showing up in design reviews for other teams, not because I asked them to, but because they’d developed the habit of thinking about cross-domain impacts. They wrote their first ADR, and it was good, not because the writing was polished, but because it captured decisions and trade-offs that would have otherwise lived in their head forever. Other teams started seeking them out for systems-level advice.
They went from “the person who writes the best code on the team” to “the person who makes the whole domain work.” That’s the staff engineer shift, and it didn’t come from a workshop on strategic thinking. It came from the hard, unglamorous work of learning to trust other people with real responsibility.
The Pattern Behind the Pattern
In every large engineering org I’ve worked in, three problems keep recurring:
Nobody owns the gaps. Every team owns their services. Nobody owns the integration points between them. The seams are where the failures happen, and the seams are where ownership is thinnest.
Critical knowledge lives in heads, not docs. The system’s actual behavior, not the documented behavior, the actual behavior, is distributed across the memories of senior engineers who’ve been around long enough to know where the bodies are buried. When they leave, that knowledge leaves with them.
Conway’s Law keeps biting back. The org structure creates team boundaries that become technical boundaries. But data doesn’t care about your org chart. User flows don’t care about your team topology. The mismatch between organizational boundaries and system reality is a permanent source of surprises.
All three are systems problems disguised as people problems. And all three get better when senior engineers shift from individual contributors to force multipliers.
You can’t teach systems thinking by telling someone to “think bigger.” It’s not a mindset problem; it’s a skills gap. They’ve spent years being rewarded for local optimization. Now you need them to think about global effects. The way to get there isn’t a lecture or a book recommendation. It’s giving them a reason to see the system clearly, and the most powerful reason turns out to be: someone else needs you to explain it.
The system becomes visible when you have to teach it to someone who can’t see it yet.