Preparing your learning space...
80% through Customer-Facing Engineering tutorials
A delivered project lives or dies in the customer's reaction to it. This tutorial covers the full "managing the response" skill: taking feedback without getting defensive, handling technical objections, setting and managing expectations, and surfacing project risks early enough that they stay manageable. The prototype feedback-loop mechanics live in Chapter 9; here we cover the human side.
Customer feedback is anything the customer says about your work — praise, confusion, a complaint, a wish. Handled well, it's the cheapest course-correction you get; handled poorly, it's a fight. (The loop of showing a prototype and feeding corrections back into it is Chapter 9.)
Why it is useful: feedback is data about whether the build matches reality. The customer is the only one who lives in their own workflow; their reaction is evidence you can't get any other way.
The instinct when criticized is to explain why it's fine. That reflex kills the feedback. Your first move is always to absorb, not justify.
CUSTOMER: "This feels slower than the old tool." BAD: "It's actually faster, the API just takes a moment to respond." GOOD: "Slower where exactly — on open, on search, or after a save?"
Explanation: the "BAD" reply defends and shuts the conversation down; you learn nothing and the customer feels dismissed. The "GOOD" reply treats the complaint as a clue and digs for the specific spot — the only thing you can actually fix.
Best Practice: pause for one breath before replying to any criticism. That breath is the difference between a defender and an engineer.
Not all feedback is equal. Sort it fast so you spend effort where it pays.
| Feedback type | Example | Action |
|---|---|---|
| Specific, actionable | "I can't find the export button" | Fix now — high value, low cost |
| Vague taste | "It feels off" | Probe for the specific thing |
| A wish, not a need | "Add dark mode" | Park; confirm it's worth it |
| A misunderstanding | "So it deletes my data?" | Re-explain — no code change |
Note: the most dangerous feedback is the kind that doesn't come. Silence after a demo often means confusion, not satisfaction. If nobody pushes back, ask a specific question (Tutorial 3).
Common Mistake: treating every wish as a requirement. "Add a chatbot" said in passing is not a spec. Confirm the need, the frequency, and the cost before building.
A technical objection is pushback on the how: "why Python and not our Java stack?", "this won't scale", "our security team won't allow that." These come from the customer's engineer or a wary stakeholder, and they're usually legitimate concerns wearing a harsh tone.
Why it is useful: objections are often the customer's real risks surfacing. Answer them well and you earn technical trust (Chapter 1); dodge them and the deal stalls in their IT review.
When faced with an objection, don't argue — use a three-step move:
OBJECTION: "A prototype in a notebook won't hold up in production." ACKNOWLEDGE: "Fair — a notebook is absolutely not where this lives for real." REF RAME: "It's the proof of the idea. The production version is a small, tested service — a separate job from this prototype." EVIDENCE: "Here's the same logic as 12 lines of tested Python we'd ship — the notebook just shows you the result fastest."
Explanation: acknowledge shows you heard and respects their concern (no defensiveness). Reframe separates the prototype from the product so the objection no longer applies to the demo's purpose. Evidence gives them something concrete to trust. You never said they were wrong — you dissolved the objection.
Best Practice: never win the argument and lose the relationship. If you "destroy" their objection condescendingly, they'll approve nothing. Make them feel smart for raising it.
Sometimes the objection is simply correct — your approach has a gap. That's a gift, not an insult. Say so.
OBJECTION: "This calls our API on every page load — that'll rate-limit us." YOU: "You're right, that's a real problem. I'll cache the response and only refresh every 5 minutes. Thanks — that would've bitten us in week two."
Explanation: admitting the gap costs you nothing and buys credibility. The customer now trusts you to surface hard truths, which is exactly what they need from an FDE.
Note: track objections you couldn't answer. "I'll confirm the rate limit with your infra team and come back Thursday" is a complete answer if you actually come back.
Managing expectations means making sure the customer's mental picture of the deliverable — what it does, when it lands, what it costs — matches the real one. It is ongoing, not a one-time pitch.
Why it is useful: a customer who expects "full automation by Friday" and gets "a working prototype of the first step" feels betrayed even if you delivered exactly what was possible. The betrayal came from the unmanaged gap, not the work.
The cheapest time to manage an expectation is before anyone writes code. State the scope, the timeline, and — crucially — what is not included, in writing.
SCOPE FOR THIS PHASE (written up front) IN: one-way sync from System C to the report, daily at 8am. OUT: bi-directional sync, historical backfill, mobile view. LANDS: working prototype Thu; production version 3 weeks after sign-off.
Explanation: the "OUT" line does more work than the "IN" line. Customers remember what they hoped for; writing the exclusions prevents the "but I thought you'd do the mobile view" conversation three weeks later.
Best Practice: put the exclusions somewhere the customer has to read and reply to. A scope nobody acknowledged is a scope nobody agreed to.
The expectation gap is the distance between hoped-for and actual. You manage it by pulling the two together continuously, not by springing the real version at the end.
| Symptom | What it signals | Fix |
|---|---|---|
| "I thought it'd be done by now" | Timeline not re-confirmed | Give a weekly status, even if "on track" |
| "This isn't what we asked for" | Scope drifted silently | Re-share the written scope |
| "Why is it so basic?" | They expected production, not prototype | Re-state the phase goal |
Note: under-promising and over-delivering beats the reverse every time. A small honest "this phase is a proof" sets a low bar you clear easily. Over-promising to win the room sets a bar you'll miss.
A project risk is anything that could push timeline, scope, or quality off track — a flaky customer API, missing credentials, an unclear data owner. Communicating risk means saying it out loud, early, with a mitigation, instead of hoping it resolves itself.
Why it is useful: risks hidden until they blow up become your fault. Risks named in week one become a shared problem the customer helps you solve — and often has the answer to.
The rule: if a risk would surprise the customer when it hits, you should have said it a week earlier. Silence is not optimism; it's a deferred apology.
HIDDEN: (say nothing) → API credentials arrive 2 weeks late → "why isn't it done?" → trust damaged. SURFACED: "Heads-up: this depends on read-only DB credentials from your infra team. If those take 2 weeks, the demo slips. Want to flag that to them now so we stay on track?"
Explanation: the surfaced version turns a future blame session into a present joint fix. The customer can now chase their own infra team — something you couldn't do — and the slip, if it happens, is expected, not a betrayal.
Best Practice: lead with the mitigation, not just the scare. "Risk: X. Here's what I'm doing about it, and here's what you can do." A risk with no path forward is just anxiety dumped on the customer.
A risk message has four parts. Skip any and it loses its usefulness.
RISK: Customer's payment API has no sandbox — we'd test against live. IMPACT: A bad test call could double-charge a real customer. LIKELYHOOD: Medium (their docs are unclear on test mode). MITIGATION: I'll confirm test mode with their eng first; if none exists, we test on a 1-cent amount and you approve each call.
Explanation: impact tells them why to care, likelihood tells them how worried to be, mitigation tells them it's handled. A risk stated as only "the API might be an issue" gives them fear and no control — useless.
Note: keep a running risk list and review it in meetings. A risk you named once and forgot is as bad as one you never named.
Honesty here is a dial, not a switch. You owe the customer the truth about things that affect their decisions — timeline, scope, cost, risk. You don't owe them every internal struggle.
| Share openly | Handle internally |
|---|---|
| Timeline slips, scope cuts, risks | A library you had to swap |
| Anything changing their plan | A bug you already fixed |
| Bad news, early | Your own learning curve |
Common Mistake: over-sharing internal chaos to seem transparent — it reads as incompetence. Under-sharing bad news to seem in control — it reads as deceit when it surfaces. Calibrate to their decision, not your conscience.
Save your progress and earn XP for completing tutorials.
4 questions · Pass with 70%+
1When a customer criticizes your work, your first move should be…
2The Acknowledge–Reframe–Evidence move is used to handle…
3In a written scope, the "OUT" line matters because…
4A good risk message must include…
Technology
Forward Deployed Engineer
Lesson group
Customer-Facing Engineering
Progress
80% complete