Engineering Leadership · March 2026

The Language Stack

You speak seven programming languages fluently. You speak one natural language like a compiler that hasn't been updated since CS100. That's a bug.

10 MIN READ LANGUAGE · ENGINEERING · COMMUNICATION BY BRIAN BUNKER & CLAUDE SONNET 4.6

You Already Know This Problem

Imagine a senior engineer walks into a sprint planning meeting and says: "We need to refactor the monolith before we can horizontally scale — the current architecture creates N+1 query problems under load, and the tight coupling between the service layer and the data layer means any latency spike cascades."

Every sentence in that paragraph is correct. Every sentence is also, to a product manager or a CFO or a customer success lead, essentially a SegmentationFault. The program crashed. No output was received. Everyone nodded and moved on.

The engineer left thinking the message landed. The business stakeholder left thinking engineering is making excuses again. Both walked away from the same conversation with completely different mental models of what was said — and neither of them knows it.

This is not a soft-skills problem. This is a technical one. And developers, of all people, should recognize it immediately — because they've already solved an analogous version of it hundreds of times.

The engineer who spoke about N+1 queries and tight coupling wasn't wrong. They were simply running code in an environment that couldn't compile it. — The core problem

You Use the Right Language for the Right Runtime

No serious developer reaches for Python when they're writing a device driver. They don't use Rust when they need to sketch a quick data pipeline prototype. They don't write SQL when they need to model a UI component tree. The choice of language is not arbitrary — it's a deliberate decision based on what the target environment can actually execute, what the constraints are, and what kind of problem is being solved.

The language stack is a living part of your technical judgment. You intuitively know that different languages exist because different runtimes have fundamentally different needs, different primitives, and different failure modes. A runtime that speaks JavaScript doesn't run Haskell. A JVM that expects bytecode doesn't care about your C pointers.

Natural language works the same way. The person across the table from you is a runtime. They have a specific set of primitives they can parse, a specific vocabulary they operate in, and failure modes that look exactly like the engineer's experience in that meeting — silent crashes, nodded acknowledgments that carry no actual state, decisions made on corrupted input.

The business stakeholder doesn't have those libraries installed. The translation layer was missing — and no one thought to write it.

Different Runtimes, Different Dialects

Software development doesn't have one business audience. It has several, and each speaks a meaningfully distinct dialect of business English. Treating them as interchangeable is like treating JSON and XML as equivalent because they both represent structured data. They're related. They're not the same.

Dialect 01
Executive / C-Suite

Operates in risk, return, time-to-market, competitive position. The primitives are strategic. The clock speed is quarters, not sprints. The failure mode of technical language here isn't confusion — it's dismissal. Executives pattern-match quickly; if your input doesn't resolve into a recognizable business primitive in thirty seconds, you've already lost the thread.

Dialect 02
Product Management

Operates in user outcomes, feature scope, tradeoffs, and timelines. PMs are often the closest business-adjacent stakeholders to engineering — they speak some technical, but they're ultimately optimizing for shipped value, not architecture. The danger zone is when engineers use technical accuracy as a substitute for outcome clarity.

Dialect 03
Finance & Legal

Operates in liability, cost structure, compliance, and certainty. These runtimes are particularly allergic to ambiguity. "It depends" is a RuntimeException here. The vocabulary they trust is bounded: costs, timelines, risk probability, contractual implications.

Dialect 04
Customer-Facing Teams

Sales, CS, and Support operate in customer pain, competitive differentiation, and concrete capability. They need to translate what you build into something a customer will pay for or trust. Abstract architecture means nothing. What the system does, what it can't yet do, and when — that's the entire vocabulary they need.

None of these are lesser dialects. None of them are wrong. They are optimized for different problems, running on different constraints, with different success criteria. The engineering dialect is equally specialized — and equally opaque to everyone outside it.

What the Same Sentence Looks Like Across Runtimes

The engineering team needs to address technical debt that's slowing down feature development. Watch how the same underlying truth gets expressed across dialects — the technical reality doesn't change, only the abstraction layer.

Engineering dialect

"The coupling between our auth service and the user profile service is creating circular dependencies that make it impossible to deploy either independently. We need to introduce an event-driven boundary and refactor to a publish-subscribe pattern before we can safely enable feature flags."

Product dialect

"Right now, every time we ship anything related to login or user accounts, we have to release both systems at the same time. That's slowing us down and creating risk every release. If we spend three sprints fixing the underlying structure, we can ship each piece independently and cut our release risk in half."

Executive dialect

"We have a structural bottleneck adding risk to every release. Fixing it requires six weeks of engineering investment upfront, but it reduces our release risk by roughly 50% and accelerates velocity by an estimated 30% starting in Q3. The cost of not fixing it compounds with every feature we add."

The scope of work didn't change. What changed is the abstraction layer — matched deliberately to what the target runtime can actually process and act on.

Programming Languages and Natural Languages Solve the Same Problem

The parallel isn't metaphorical. It's structural. Both are about picking the right tool for the target environment. Both require knowing what the environment can and can't parse. Both fail silently when you get it wrong — which is often the most dangerous kind of failure.

Programming Languages
Python Optimized for readability and rapid iteration
Rust Optimized for memory safety and performance guarantees
SQL Optimized for querying and transforming structured data
Assembly Optimized for direct hardware control
Wrong language Causes compilation errors or runtime failures
Language selection Driven by the runtime environment
Natural Language Dialects
Product dialect Optimized for outcome clarity and scope decisions
Legal / Finance dialect Optimized for precision, liability reduction, and bounded claims
Executive dialect Optimized for strategic signal, risk, and return
Engineering dialect Optimized for technical precision and system behavior
Wrong dialect Causes misalignment, lost trust, and decisions made on bad input
Dialect selection Driven by who's in the room and what decision they're making
Code-switching between technical and business English isn't dumbing down. It's writing good APIs. You are exposing a specific interface to a specific caller. The internals remain intact. — The reframe that matters

Why This Feels Wrong and Why That Feeling Is Wrong

There's a version of this advice that engineers hate, and they're right to. It goes: "Just simplify. Just speak plainly. Stop using jargon." That framing implies the technical vocabulary is the problem — that the precision and specificity that make engineering communication work are somehow excessive, and the cure is to strip them out.

That's not what's being argued here. You don't tell a Python developer to stop using list comprehensions because non-Pythonistas find them confusing. You tell them to write an abstraction layer when they need to expose the functionality to a different interface. The underlying implementation stays precise. What changes is the API surface.

The resistance also runs in the other direction. Business stakeholders who've worked with engineers long enough sometimes develop a condescending shorthand: "just tell me if we can do it or not." That framing is equally broken. It asks the engineer to collapse nuanced technical reality into a binary response — which is the equivalent of asking a database to return a boolean when the actual query has a 15-row result set. The problem isn't the complexity. The problem is that no one built the right interface for it.

Both sides of this negotiation carry responsibility. But engineers tend to have more leverage — and more unused capability — than they think.

The Abstraction Layer Is Becoming Your Primary Job

In the guide that precedes this chapter, we mapped six horizons of AI-augmented development and where the meaningful layer of developer work is moving as each horizon passes. The direction is consistent: away from implementation and toward judgment, communication, and product understanding.

If you track that trajectory, the implication for language is uncomfortable but clear: as the writing of code becomes increasingly automated, the ability to communicate precisely — in the right dialect, to the right audience, about the right things — becomes a larger fraction of what engineering actually contributes.

The engineer who can produce a technically correct architecture document but can't translate it into a conversation with the CFO about why it requires budget is leaving value on the table. Not because communication is more important than architecture. Because the architecture doesn't get funded if the CFO can't parse why it matters.

And the manager who speaks fluent business English but can't interpret engineering constraints accurately enough to push back on unrealistic timelines is equally exposed. The translation problem runs in both directions.

What To Actually Do About It

Identify your target runtime before you open your mouth. Before any meeting, email, or document — know who the audience is and what decision they're making. The goal isn't to write a perfect abstract of your technical work. The goal is to give the specific person in front of you what they need to make a good decision. Those are different problems.

Treat jargon as a dependency you haven't declared. When you write code that imports a library, you declare it explicitly — because you know the runtime might not have it installed. When you use technical vocabulary in a cross-functional conversation, you're importing a library without declaring it. You may have it. They almost certainly don't. Name the dependency or don't use it.

Build a translation practice, not just translation moments. The best engineers don't translate ad hoc — they've built up a stable of reliable analogies, standard explanations for recurring concepts, and a mental model of what each stakeholder type actually cares about. That's not charisma. It's preparation. It compounds like any other technical skill.

Ask what decision this conversation is in service of. A lot of communication failure in engineering happens not because the wrong language was used, but because the communication was aimed at the wrong target. Explaining a technical problem thoroughly when the stakeholder just needs to know whether to approve a timeline extension is still a mismatch — even if every word was accessible. Know what output the conversation is supposed to produce.

Get feedback on your translation, not just your code. Engineers get code review. They get pull request comments. They invest in getting their technical work critiqued because they know unchecked assumptions produce bugs. Almost no one applies that same discipline to the documents, presentations, and meetings they run. Find someone who will tell you when your executive summary reads like a technical spec.

The Compiler Is Waiting.

You didn't walk out of school fluent in Kubernetes or distributed systems. You learned those because the job required it. You built intuitions over time. You got corrected. You developed taste.

The natural language dialects of your organization are no different. They are learnable. They have structure. They have failure modes that are diagnosable once you know what to look for. And the engineers who treat language as a first-class technical skill — with the same rigor they'd apply to learning a new framework — consistently outperform the ones who treat it as somebody else's problem.

You already know how to learn a new programming language. You do it the same way: start with the primitives, understand the runtime, read a lot of output from native speakers, and write until you stop thinking about syntax.