Why Good APIs Read Like Verbs and Good Pipelines Read Like Sentences
Hatched by min dulle
Apr 29, 2026
10 min read
3 views
55%
When a system says what it does, people can trust it
What makes a piece of software feel obvious to use, even before the documentation is opened? It is not just speed, elegance, or type safety. It is the feeling that the system speaks in clear actions instead of vague objects. A good interface does not merely expose data. It tells a story about what can happen next.
That may sound like a design concern for front end teams or API architects, but it reaches farther. The same discipline that makes a mutation name like createUser feel instantly understandable is what makes a data pipeline, a job, or a cloud workflow survivable at scale. In both cases, the real challenge is not technical capability. It is semantic clarity: can another human infer intent, constraints, and consequences from the shape of the system itself?
This is why naming is not cosmetic. It is governance. It is how we keep action from dissolving into ambiguity.
The deeper problem is not naming, it is meaning
Most teams think they are choosing names. In practice, they are choosing a theory of the system.
If you name a mutation userUpdate, you are subtly saying the object is the center of the universe. If you name it updateUserProfile, you are at least hinting at intent. If you name it resetPassword, publishPost, or reloadUserFeed, you have crossed a more important threshold: you are no longer describing a database operation, you are describing a meaningful human action.
That distinction matters because software is full of false symmetry. Not every action maps neatly to CRUD. Not every workflow is a clean edit of a record. Real products contain side effects, approvals, background jobs, retries, idempotency rules, and external systems that refuse to behave like tidy objects in a diagram. When we force every operation into a noun shaped mold, we make the system easier to implement for a moment and harder to understand forever.
The deeper question is this: Are we building a model of data, or a model of intent?
A mutation should answer the user’s question, not the database’s. A data pipeline should answer the operator’s question, not the storage engine’s. A code sample should show the smallest path from intention to outcome, not the widest surface area of what is technically possible.
The best system interfaces do not just reduce friction. They reduce interpretation.
That is the hidden connection between naming an API operation and presenting a code example for a cloud service. Both are acts of translation. They take something that could be expressed in many ways and choose one that makes the next step legible.
Clear verbs are the smallest unit of trust
Why do verbs matter so much? Because verbs carry consequence.
A noun tells you what something is. A verb tells you what is happening. In software, that difference is enormous. User, Post, and Feed are objects you can inspect. createUser, likePost, and reloadUserFeed are commitments. They imply an action, a boundary, and often a side effect. They tell you what must be true before the operation, what may change after it, and what kind of mental model you need to use.
This is why action-first naming is more than style guidance. It is a compression algorithm for intent. The more directly a name maps to a human decision, the less your team has to reconstruct meaning from context. A good name does three jobs at once:
- It identifies the intent.
- It hints at the scope.
- It signals the likely side effects.
Consider reloadUserFeed. Even if no one has seen the implementation, the name suggests that the feed is being refreshed, not permanently modified. Compare that with feedUpdate, which could mean anything from a UI repaint to a destructive rewrite of stored state. The first name gives permission to reason. The second forces a meeting.
The same logic applies outside APIs. A cloud code sample that is easy to follow is not just convenient. It is a trust-building artifact. It says: here is the path from raw input to useful work, and here are the assumptions you must notice. A clear sample does for a platform what a good mutation name does for an API: it lowers the cognitive cost of correctness.
And that is the real unit of trust in software systems. Not only “does it work,” but “can I predict how it works from the way it speaks?”
The hidden danger of over-abstracting the real world
There is a temptation in software design to believe that elegance comes from abstraction. Sometimes it does. But abstraction becomes dangerous when it strips away the very constraints that make a system understandable.
Imagine an ETL workflow where every step is named generically: processData, transformData, loadData. Technically accurate, but semantically useless. You know the mechanics, not the meaning. Is the job deduplicating customer records? Enriching orders? Validating event streams? Recovering failed rows? The name tells you almost nothing about the business effect.
Now compare that with a pipeline made of concrete steps: ingestCustomerEvents, normalizePhoneNumbers, joinOrdersWithAccounts, writeFraudSignals. Even if you do not know the implementation details, you can infer the business story. That is powerful because operational systems fail in story-shaped ways. Someone is awake at 2 a.m. trying to understand which stage broke, what data was touched, and whether rerunning the job is safe.
This is why the same discipline used for GraphQL mutations matters for jobs, scripts, and code samples. Every executable unit benefits from answering three questions:
- What human outcome does this represent?
- What input is required to make that outcome possible?
- What state changes or side effects should I expect?
If a name does not answer at least one of these questions, it is too generic. If it answers all three, it becomes documentation that compiles.
The more distributed a system becomes, the more names must carry meaning that used to live in people’s heads.
This is where many teams fail. They treat naming as a local concern, something a developer can fix later. But in distributed systems, naming is part of the architecture. It shapes debugging, observability, onboarding, incident response, and the social contract between teams.
A practical framework: name by story, not by structure
The strongest way to connect these ideas is to adopt a simple mental model: name by story, not by structure.
Structure answers: what kind of thing is this? Story answers: why does it exist, and what changes when it runs?
That distinction cuts through a lot of confusion. A structural name is often built from model nouns or technical layers. A story-based name is built from the user story, the operational outcome, or the business event. The structural version tends to be easier to generate, but the story-based version is easier to use.
For example:
-
Structural:
userUpdate -
Story-based:
changeEmailAddress -
Structural:
dataSync -
Story-based:
syncCustomerProfilesToCRM -
Structural:
taskRun -
Story-based:
recalculateAffiliateCommission
The story-based name gives the reader a miniature narrative. Someone can infer the actor, object, and outcome without opening ten files. That does not mean every name must be verbose. It means every name should be specific enough to eliminate guesswork.
This principle also improves code examples. A useful sample does not merely demonstrate syntax. It narrates a plausible job-to-be-done. If a Glue sample shows how to move data from source to target, but the names are vague, the user learns commands without learning judgment. If the sample instead presents a concrete transformation, the user learns a pattern they can adapt.
Think of it as the difference between showing someone a wrench and showing them how to tighten a bolt on a leaking pipe. The tool is necessary, but the story makes it usable.
Why “single, required, unique” inputs matter more than convenience
One of the most revealing design choices in a mutation or workflow interface is the shape of its input. Requiring a single, required, unique input object is not just a type-system preference. It is a declaration that the operation has a coherent contract.
Why does that matter? Because the more scattered the inputs become, the easier it is to hide uncertainty. A function with a few loose arguments invites casual usage. A function with one deliberate input object forces the caller to think in terms of the full action. It encourages explicitness about required fields, optional fields, and future expansion.
That discipline has a parallel in operational tooling. A well-designed sample or pipeline often bundles context into one clear object or configuration structure. This makes the workflow easier to reason about and harder to misuse. It also creates a natural home for validation, defaults, and schema evolution.
Here is the deeper insight: input shape is part of intent shape.
If the operation is truly one meaningful action, its input should feel like one coherent request, not a pile of unrelated parameters. This improves both human understanding and system reliability. It also makes it easier to map the operation to a user story or a job story, which is where the real clarity comes from.
When teams skip this discipline, they often end up with interfaces that are technically flexible but socially brittle. Everyone can call them, but nobody is confident about when or why. That is how systems accumulate accidental complexity.
The final test: can a stranger infer the story?
A strong name, a clear mutation, or a readable sample all pass the same test: can a stranger infer the story without being told the backstory?
If the answer is yes, the interface has done more than expose functionality. It has encoded judgment.
That is why the best teams often treat user stories, ticket titles, API names, and example code as part of one continuum. They are not separate artifacts. They are layers of translation from intention to execution. When those layers are consistent, engineering moves faster because fewer decisions have to be rediscovered.
This also explains why ambiguity is expensive. A vague name is not merely slightly unclear. It shifts the burden of interpretation to every future reader. Multiply that across a product, and you get meetings, debugging sessions, and fragile onboarding. Clear action names, concrete code samples, and disciplined input shapes all work against that drift.
The lesson is not to romanticize verbosity or to overload names with business jargon. The lesson is to make meaning the first-class interface. Code can be abstract, but the contract should never be.
Key Takeaways
- Name actions by intent, not by data shape. If an operation changes something meaningful for a user or system, its name should reflect the action, not the underlying object.
- Use one coherent input object for each meaningful operation. This makes the contract explicit and keeps the action understandable as a single unit.
- Prefer story-based naming over structural naming. Ask what business outcome or user story the operation serves, then encode that story in the name.
- Treat sample code as translation, not decoration. A good sample should reveal the workflow’s logic, assumptions, and likely side effects, not just the syntax.
- Audit for ambiguity at the boundaries. The more distributed your system, the more your names and examples must carry the meaning people used to infer from context.
The surprising conclusion: clarity is a form of architecture
We often talk about architecture as if it lives in diagrams, services, and data stores. But architecture also lives in verbs, input shapes, and examples. Every time you choose a name that reveals intent, you make the system easier to understand, safer to use, and simpler to extend.
The deepest lesson here is that software does not become understandable by being more object-like. It becomes understandable by being more truthful about what it is trying to do. A mutation, a pipeline, or a code sample succeeds when it lets the next person see the story immediately.
So the next time you name an operation or write a sample, do not ask only, “Is this technically correct?” Ask a harder question: If someone new read this once, would they know what world they are stepping into?
That question turns naming from a convention into a craft, and craft into trust.
Sources
Hatch New Ideas with Glasp AI 🐣
Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)
Start Hatching 🐣