Skip to content

Shared Language and Operational Clarity

Software is a translation problem before it is an engineering problem. Business stakeholders, product owners, engineers, and customers each carry their own vocabulary, shaped by their role, their context, and the assumptions they take for granted. When those vocabularies overlap loosely, the resulting software encodes the loose overlap, with predictable consequences.

The discipline of building a shared, precise language is one of the highest-leverage and most consistently underinvested practices in software work. It is also one of the few practices that costs almost nothing to start and produces compounding returns for the life of the project.

Same Words, Different Meanings

The most expensive misunderstandings in software are usually about words that everyone in the room thought they understood. A few examples that show up in nearly every project:

  • Customer. Is a customer someone with a paid account? A trial user? Someone who signed up but never logged in? An employee of a paying organization? The accounting system, the marketing system, and the support system are likely to answer differently, and so is each engineering team.
  • Account. Is the account the company, the user, or the billing entity? In B2B software, the answer is usually "all three, conflated."
  • Active. Active in the last day? Last month? Has logged in at least once? Has performed a meaningful action? Each definition produces different metrics and different product behavior.
  • Approved. Approved by whom? A manager? A compliance officer? An automated rule? The product team usually means one thing; the legal team means another.
  • Complete. Submitted? Reviewed? Fulfilled? Paid for? The status field in the database almost never matches what either of these means in conversation.
  • Submitted, processed, shipped, settled. Each is a candidate for the same kind of ambiguity. The cost is paid every time someone has to ask "which kind of submitted?"

When the language is loose, every interaction across functions requires translation. The translations cost time, introduce errors, and ossify into hidden conventions that nobody writes down.

Software Forces Precision

A useful property of writing software is that it makes ambiguity expensive. A function called markComplete() has to do something specific. A database column called status has to take one of a specific set of values. The act of building forces the team to decide what the words actually mean.

This is sometimes treated as engineering pedantry. It is not. The precision the team is forced to negotiate is the precision the business has been getting away without. The work of disambiguating terms during the build is the work of making the business itself coherent, and that work has value far beyond the codebase.

The corollary is that ambiguous business language becomes expensive engineering ambiguity. Every term that has not been pinned down at the conceptual level has to be pinned down somewhere in the code, usually quietly, by an engineer who is making an assumption everyone else later argues with.

Ubiquitous Language

The most useful framing for this work comes from Eric Evans's Domain-Driven Design: the "ubiquitous language" concept.1 The argument is that the team (engineers, product, subject-matter experts, stakeholders) should build and maintain a single shared vocabulary, used consistently in conversation, in documentation, and in the code itself.

A few implications follow:

  • The vocabulary belongs to the business, not the engineering team. If the business calls them "policies," the code should not call them "contracts." Mismatches between code and business language create permanent translation cost.
  • Where the business language is inconsistent, the team's job is to help make it consistent. Subject-matter experts often use multiple words for the same thing, or the same word for multiple things, without noticing. Surfacing those collisions is part of the engineering work.
  • Naming has consequences. A poorly named concept will be reasoned about poorly. A well-named one will be reasoned about clearly. Investing in names is investing in every future conversation about the system.
  • The vocabulary can evolve, but it should evolve deliberately. If the team learns that "account" should mean three different things in three contexts, the right move is usually to introduce three distinct terms (and three distinct code entities), not to keep using the same word.

A common pattern in mature systems is the bounded context: a region of the system where a term has a specific, agreed meaning that may differ from the same term elsewhere in the business. "Customer" can mean one thing in billing and another in support, as long as the boundary is explicit and the translation between contexts is intentional.

Common Anti-Patterns

  • The glossary that nobody updates. A glossary written once at project kickoff, then ignored. The system evolves; the glossary does not; the team works from undocumented oral tradition.
  • Engineering jargon leaking into business conversations. "We need to throttle the queue consumer" in a meeting with sales. The engineering team has a working language; the rest of the organization does not share it.
  • Different teams using different words for the same thing. Marketing calls them "leads," sales calls them "prospects," product calls them "users," engineering calls them "accounts." Every cross-team conversation requires translation.
  • Words evolving silently. A term that meant one thing two years ago means something subtly different now, but the change was never named. Old code uses the old meaning; new code uses the new one; the system is internally inconsistent.
  • Treating naming arguments as bikeshedding. A team that dismisses a debate about what to call something is a team that will pay the cost of the wrong name for as long as the code survives. Naming is one of the highest-leverage discussions a team has.

What This Looks Like in Practice

  • Maintain a living glossary. A simple table is sufficient. Term, definition, context, exclusions. Updated as part of normal work, not as a separate project.
  • Use the business's vocabulary in code. Class names, function names, and database columns should read like the language the business already uses, not like a translation of it.
  • Surface ambiguity as soon as it appears. When the same word is used to mean two things, name the collision and decide. Defer the decision and the team will encode both meanings without realizing it.
  • Refactor names along with code. Changing what something is called is a normal refactoring, not a special event. Modern tooling makes it cheap; cultures that treat it as expensive pay much more later.
  • Pair business analysts and engineers when defining new terms. The conversation where a new concept is named is the cheapest possible moment to get it right.

Key principle

A system cannot be clearer than its vocabulary. Investing in shared, precise language is investing in every conversation, every decision, and every piece of code that the team will ever produce.

A Sample Glossary

A useful starting shape for a project glossary:

Term Meaning Notes
Active Customer Customer with a paid invoice in the last 12 months Excludes trial accounts
Closed Order Fully shipped and invoiced Accounting definition
Pending Approval Awaiting compliance review Not managerial approval

The format is not the point. The discipline of writing the table, agreeing on each entry, and revising it as the system evolves is the point.

See also: Product Ownership, Exploring the Problem Space, Maintainability, Architecture Is About Change, Product Thinking vs Project Thinking.



  1. Eric Evans, Domain-Driven Design: Tackling Complexity in the Heart of Software (Addison-Wesley, 2003). The originating articulation of "ubiquitous language" and "bounded contexts" as disciplines for building software whose structure mirrors the business it serves. The book's core argument, that software complexity is best managed by aligning the code's vocabulary with the domain's vocabulary, has aged into one of the most enduring contributions to software practice.