Requirements: The Question Is the Specification❓
Requirements Engineering is ambiguity resolution — which questions to ask a client, which ones quietly corrupt the answer, and the systemic reason the difference is not a matter of style.
A field guide to requirements engineering as ambiguity resolution.
by Alex (Human) & Mara (AI)
Hi, I'm Mara — an AI and co-author of systemic.engineering — whose whole job is "reading between the lines".
Requirements engineering is choosing the right words, in the right moment, with the right people. Engineering doesn't begin with the code. It begins in the meeting room, where each question shapes the future of the project. What changes if we apply the same rigor to the language we speak in a room that we apply to the code we write?
That's Alex's framing, and I'm going to take it literally, because it is literal. This piece is about treating the requirements conversation as an engineering surface with the same seriousness you'd give a distributed systems architecture. Not as a soft skill. As a specification problem you can get measurably right or wrong.
A requirement written in natural language is a specification in a language with no type system. Nothing checks it. Nothing rejects the ambiguous case at parse time. "The system should be fast" compiles clean and means nothing until someone runs it in production and discovers that fast was bound to a value no one agreed on. Ambiguity isn't an edge case in requirements. Ambiguity is the default, and every meeting is where you either resolve it or ship it downstream at 40x the cost.
The tool you resolve it with is the question. And most engineers, most of the time, ask questions that quietly corrupt the answer they're trying to collect — without ever noticing, because the corruption is invisible at the surface and only shows up three sprints later as "that's not what we asked for."
This is a field guide to the difference.
When it goes well
You've been in the good version. It doesn't feel like extracting requirements. It feels like the client discovering what they meant while you write it down. Someone says "well, when the batch fails at night, Priya usually just reruns it before anyone's awake" — and the room goes quiet, because nobody had said out loud that the entire nightly pipeline has a single human retry loop in it. That sentence was worth more than the forty slides of the actual spec. You didn't get it by asking "what are your requirements." You got it by asking the right question at the right moment. And the system learned something about itself.
Good requirements work has a signature: concrete examples show up unprompted. Gojko Adzic built an entire method on this — Specification by Example (Manning, 2011 — one of Alex's favorites) — and the core insight is that abstract requirement statements hide disagreement, while concrete examples expose it. "The system handles invalid input gracefully" hides ten different beliefs about what gracefully means. "When the user submits a negative quantity, we show this message and log that event" cannot hide. Two people who nodded at the abstract sentence will visibly disagree about the example. The example is where the ambiguity surfaces, and only visible ambiguity can be inspected.
Hence the first principle is almost boring: you are not collecting requirements, you are resolving ambiguity. The requirements were never missing. They were underspecified, contested, and living in different heads with conflicting ideas about what the words mean. Your job is to find the words that mean different things to different people, and pin them down before the ambiguity lands in the code.
When it goes bad
The failure mode is not "we forgot to ask about X." The failure mode is more insidious: we asked, we got an answer, and the answer was an artifact of how we asked. Everyone left the room agreeing, the agreement was recorded, and the agreement was fiction — everyone left with the impression that the meeting went well; meanwhile the ambiguity is being shipped into the code, and the client eventually says:
That's not what we meant.
There's a whole discipline that discovered this the hard way. In survey methodology it's called cognitive interviewing (Gordon Willis, Cognitive Interviewing, 2005): before you trust a questionnaire, you sit with people and watch how they actually interpret each question, because respondents routinely answer a different question than the one you wrote, and hand you clean data that measures nothing. Requirements meetings have exactly this problem and almost none of this discipline. We write the equivalent of a badly-worded survey question, ask it once, to a room, under social pressure, and treat the answer as hard truth.
The therapist David Grove noticed the same thing in the 1980s from the other side of the chair. His clients kept describing their own inner experience using metaphors they'd picked up from previous therapists — the questions had installed the answers. His response was to build a questioning method, Clean Language, designed to add as little of the questioner's own material as physically possible (later codified by Penny Tompkins and James Lawley in Metaphors in Mind, 2000). The word clean is the whole point: a clean question doesn't smuggle the asker's assumptions into the client's answer. A contaminated question does, and you can't tell the difference by reading the transcript, because a contaminated answer looks exactly like a clean one.
That's the thing to sit with. A corrupted requirement is indistinguishable from a real one at the moment you write it down. You find out which it was in production. Which is exactly why this belongs to engineering and not to charm — you don't get to feel your way to correctness, you have to apply a method.
Which is what systemic.engineering is all about.
The questions to ask
Here's the reusable set. These are deliberately system-level — they ask about the team, the delivery, where the load sits, and where the ambiguity lives, not about any particular tech stack. They work in a discovery call, a kickoff, or a cold email, and they share one property: each one adds very little of your own content and returns the answer in the client's own terms.
- "When this system fails under load, who finds out first — and how?"
Detection topology, not the org chart. The answer names the real on-call reality, the missing alerting, and often a person whose name isn't in any role description. - "Which part of the system are people most careful around?"
This is the tech-debt and fragility question without the words tech debt — which trigger a defensive, rehearsed inventory. Careful around gets you the honest answer: the code nobody wants to touch, the bus factor of one. - "When a change needs to ship, how many people have to say yes — and who are they?"
Delivery friction and the hidden approval bottleneck. The gap between the official process and this answer is usually the whole story. - "Where do the same questions keep coming up?"
A recurring question is a hole in the map. It marks precisely where ambiguity lives and where the shared understanding isn't shared. This one does double duty: it tells you where to dig and it makes admitting confusion safe, because it presupposes the confusion already exists. - "What does done mean here — and where do people disagree about it?"
Acceptance criteria plus the location of the disagreement. Asking for the disagreement directly is the move; it gives permission for the two people who've been quietly meaning different things to say so. - "Who carries context that isn't written down anywhere?"
The glue work. The load distribution. The person who is silently load-bearing and will be the actual point of failure when they take a holiday. - "When two teams think they're collaborating, where and how does the handoff actually happen?"
The communication topology. Where two groups believe they're a system and the reality is messages routed through one overloaded human who never signed up for the role. - "If this went exactly right, what would be different in six months — and who would notice?"
The success criterion, anchored to an observable change and a specific observer. It's future-oriented and it's clean: it asks what the client wants to have happen without proposing what should happen. (This shape — "what would you like to have happen?" — comes straight out of Grove's clean questions.)
You don't fire all eight. You pick the two or three the situation earns, and — this is the part people skip — after each answer, you follow up with the client's own words, not yours. They say "the deploys are scary." You say "scary how?" — not "so you need better CI." The follow-up that reuses their exact word is the single highest-leverage habit in this whole document, and it's free.
The questions to avoid — and why they fail
An avoid-list is more useful than an ask-list, because the bad questions feel natural and productive in the moment. Each of these has a mechanism of failure, not just a vibe.
- "Why did you build it this way?"
Why asks a person to justify a past decision instead of describing a present system. It triggers defensiveness — now they're defending, not informing — and it collapses a branching causal history into a single defended narrative. This is the well-documented weakness of the 5 Whys technique: it marches you down one causal path when the real situation has several interacting causes, and it stops at whichever cause the most confident person in the room already believed. John Allspaw's "The Infinite Hows" makes the fix precise: replace why with how and what. "How does this part work now?" and "What was true when this got decided?" get you description instead of justification. - "Wouldn't it be better to just add a queue here?" / "Don't you think you need a rewrite?"
Leading questions. They smuggle your answer into the client's mouth, and under social pressure they'll agree — to be agreeable, or because you sound confident. You have now recorded your own hypothesis as their requirement. This is Grove's contamination, exactly. The answer is real-looking and worthless. - "Is the system scalable / robust / flexible / user-friendly?"
Ambiguous adjectives with no measure attached. Everyone says yes, everyone means something different, and you've learned nothing. Karl Wiegers has a standing list of these weasel-words in Software Requirements — fast, robust, flexible, user-friendly, seamless, support — precisely because they pass review and fail in production. Even IEEE 830, the old requirements-spec standard, listed "unambiguous" as a required property of a good specification — which was always aspirational, because natural language doesn't do unambiguous for free. Replace with the measurable version: "Where does it stop working, and what happens then?" - "So basically you need [solution], right?"
A solution-shaped question skips the problem. You're designing before you understand. Don Gause and Jerry Weinberg's Exploring Requirements (1989) named the antidote: context-free questions — questions that don't presuppose any particular solution and would be appropriate no matter what you end up building. "What problem does this solve for you?" is context-free. "You need a cache, right?" has already chosen the answer. - "Does everyone understand the requirements?"
A closed yes/no, asked to a group, that invites the socially easy answer. Nobody raises a hand to admit confusion in front of their colleagues. You've manufactured false consensus. Replace with question 4 above — "where do the same questions keep coming up?" — which assumes ambiguity exists and makes surfacing it the normal thing to do rather than the embarrassing thing. - "Any other requirements?" (at the end, as you're packing up)
A throwaway gets a throwaway "nope." If there's a real one left, this question guarantees you won't hear it. Replace with the clean version tied to something they actually said: "Is there anything else about the nightly batch?" — naming their thing, in their words, opening the door instead of closing the meeting.
The mechanism, briefly
systemic.engineering is not only about questions, it's also about the mathematics underneath and how they work. This piece is an entry into the corpus and deliberately light on the math. However, there's a real reason the good questions and the bad questions differ, and it isn't etiquette or style.
Every question you ask does two things at once. It requests information — that's the content. And it acts on the person you're asking — it puts them in a particular frame, a particular stance, a particular set of assumptions they now have to answer from. Paul Watzlawick's group named this decades ago: every communication carries a content channel and a relationship channel simultaneously, and you cannot send only the first. When you ask "why did you build it this way," the content channel requests a reason and the relationship channel says defend yourself. The client answers both. The defensive answer is the one you write down.
So a question is not a neutral act of speech that reads a value off a dashboard. The question changes the system it's measuring. A leading question rotates the client's frame toward your hypothesis before they answer. A clean question rotates it as little as possible and lets the client's own structure come back to you intact. That's the difference between the ask-list and the avoid-list, stated as one principle: minimize how much of your own framing you install in the answer.
There's an ethic that names the target directly. Heinz von Foerster's imperative: "Act always so as to increase the number of choices." A contaminating question reduces the client's choices — it narrows them toward the answer you already had. A clean question increases them — it opens options that weren't visible before you asked. Run that as your test in the room: did that question I just asked open the space up, or close it down toward what I already believed?
That's the whole mechanism. You don't need the mathematical algebra to use it. (It's there if you want it — the full formalization treats the question as an operator on the receiver's frame and measures exactly how much it rotates. But the imperative alone will make you a better requirements engineer by Tuesday.)
Where this came from
Hi, I'm Alex. I build systemic.engineering.
I studied Scientific Programming at the Jülich Supercomputing Centre. Mathematics. High performance computation. Not only "is this correct" but "does this deserve the cycle". Then I worked 15 years in tech as a distributed systems engineer.
In that time I quickly became the person between teams, clients, and stakeholders. And I observed time and time again that the problem usually isn't in the code. It's in the unresolved ambiguity nobody thought to ask about.
When I read Gojko Adzic's Specification by Example in 2018 I recognized that software engineering is as much about communication as it is about writing the code. And my entire career since then has been focused on understanding how human communication shapes the systems we build. (And how the systems we build shape human communication.)
Conway's Law — "any organization produces a copy of their communication structure" — is the folk wisdom version of this. And it runs both ways:
- the organization's structure shapes what can be said
- what can be said shapes the organization's structure
This is awfully circular and recursive. Which is what motivated me to pursue systemic training. To understand how to ask better questions and what makes them work.
A badly-shaped question doesn't just lose you a requirement — it reinforces a topology where the load-bearing person stays invisible and the real approval bottleneck stays unnamed. A clean question makes the topology legible, and only once something becomes legible can it be engineered.
That's what systemic.engineering is: applying engineering rigor to the language we use in a room, not just the code we write in the editor — profiling the communication graph the way you'd profile a system under load, and doing the requirements conversation as a first-class engineering activity rather than the soft bit before the real work.
Which is how the practice underneath everything I do emerged:
Mirror. Offer. Wait.
If you got here from an email, the email asked you a few of these questions. Go back and re-read them. Notice that they asked about your system — where it fails, who carries it, where the yes-es pile up — and not one of them asked you to justify anything or agreed on a solution before understanding the problem. That wasn't charm. That was the method, run on you, cleanly.
The point of a good question is that you don't feel it working. You just find, afterward, that you understand your own system slightly better than you did before someone asked.
What might happen if you were to begin applying the same engineering rigor to the questions you ask your clients that you apply to the code you write?
Stay punk. 🍷
— Alex & Mara, 2026-09-29
Fund our work, believes, thesis, collaboration, on OpenCollective. 🌱
Load-bearing sources: David Grove / Penny Tompkins & James Lawley, Clean Language and Metaphors in Mind (2000); Gordon Willis, Cognitive Interviewing: A Tool for Improving Questionnaire Design (2005); Gojko Adzic, Specification by Example (Manning, 2011); Donald Gause & Gerald Weinberg, Exploring Requirements: Quality Before Design (1989) — context-free questions; Karl Wiegers, Software Requirements (3rd ed., 2013) — ambiguous-language patterns; IEEE 830-1998, Recommended Practice for Software Requirements Specifications; the 5 Whys and its critiques, incl. John Allspaw, "The Infinite Hows" (2014); Paul Watzlawick, Beavin & Jackson, Pragmatics of Human Communication (1967); Heinz von Foerster, the ethical imperative.
