top of page

QA vs QC vs QE: What's the Difference?

Shawn West
Jul 8
11 min read

Updated: Aug 10

Your organization has a QA function. It also ships the same class of defect release after release. That is not a people problem or a discipline problem — it is a missing-layer problem, and the fix depends entirely on which layer is missing. This is the practitioner's version of the question: not what the three words mean, but which one your org is running instead of all three, and what that costs you.

If you want the clean definitions — assurance versus control versus engineering, term by term — the beginner companion piece lays them out plainly, and this piece assumes them. What follows is aimed one level up: at the lead, manager, or director who already knows the vocabulary and is watching a team that has quality people and still can't stop a recurring escape. That situation is almost never explained by "we need to test more." It is explained by the fact that quality is not one activity. It is three functions acting at three different moments, and most organizations quietly run one of them and call it the whole job.

The symptom that sends you here

Here is the pattern that should make you suspicious. A defect class — not a single bug, a class, a shape of failure that keeps coming back wearing different clothes — reaches customers. The team fixes the instance. Everyone agrees quality needs attention. Testing gets more scrutiny, maybe a headcount is added, and for a release or two it feels better. Then the same shape of failure returns through a door nobody was watching.

When that loop repeats, the instinct is to grade the people: the testers missed it, the developers were careless, someone should have caught it. That instinct is almost always wrong, and it is expensive, because it spends effort reinforcing a layer that was never the gap. A recurring escape is a structural signal. It tells you that one of the three quality functions — prevention, detection, or the engineering system that makes both repeatable — is absent, and that the other two are silently absorbing work they were never designed to do. You cannot fix a missing layer by working the present ones harder. You have to name which one is gone.

Why the three are different functions, not three words for the same thing

The reason the distinction matters operationally — and not as vocabulary — is that each function acts at a different moment in the life of a defect, and each can therefore only catch failures that pass through its moment.

Think of a defect as having a timeline. There is a moment before it exists, when the way you work either makes it easy or hard to create. There is a moment after it exists, when the finished output either gets inspected or ships unseen. And there is the system surrounding both moments that determines whether prevention and inspection happen reliably every time or only when a particular person remembers to do them.

  • Quality assurance acts before the defect exists. It is prevention: the shared calculation that makes the bug impossible to write, the acceptance criteria that force the edge case into the conversation, the definition of done that closes the door. Its moment is design and construction. If that moment is unguarded, defects are created freely, and everything downstream is reduced to catching them.

  • Quality control acts after the defect exists. It is detection: the test that runs the real output, the review of the specific change, the monitor that fires when refunds spike. Its moment is the finished artifact. If that moment is unguarded, defects that were created reach customers before anyone inside the building sees them.

  • Quality engineering is not a third moment — it is the system that governs the other two. It is what makes prevention and detection automated, repeatable, and owned by the people who build the thing, instead of bolted on by a separate group and dependent on individual diligence. Its concern is repeatability across every release, not any single defect.

Run only one of these and the gap is predictable, because you have left one of the defect's moments unguarded. That predictability is the useful part: the shape of your recurring failure tells you which moment is open. (This is the same lens ShiftQuality applies to quality management as a whole — quality is a system of functions, and the diagnosis is always "which function is missing," not "who dropped the ball.")

One defect, traced through all three layers

(Developed example — composite scenario.)

A mid-sized commerce team keeps shipping pricing defects. Not the same bug — a family of them. One release, stacked coupons drive a cart below zero. Two releases later, a regional tax rule double-applies. Later still, a loyalty discount ignores an exclusion list. Each is fixed within a day of a customer complaint. Each retrospective ends with "we need tighter QA." The team has three testers and a test-automation suite. By every org-chart measure, they have quality. So why does the pricing-defect family never die?

Trace one instance — the below-zero cart — through what each layer would and would not have done.

What QC (detection) did. A tester, weeks after the coupon feature merged, happened to stack two codes during exploratory testing and saw the negative total. QC worked exactly as designed: it inspected a finished output and found a defect. But notice its ceiling. It found this instance, late, by luck of an exploratory path, and it did nothing about the next member of the family. Detection operates on the output after the work is done; it is a net, and this team's net was real. A net does not stop things from being thrown.

What QA (prevention) would have done — and didn't exist to do. Prevention acts one moment earlier, on how the work is built. The below-zero cart was possible because every pricing feature reimplemented the discount math locally, and "what happens when two discounts combine?" was never a required line in any acceptance criterion. A prevention layer is the shared pricing module that makes a below-zero total unrepresentable, and the definition of done that forces every discount feature to answer the stacking question before code is written. This team had none of that. Which is why fixing the below-zero instance did nothing for the tax-double-apply instance — the moment where the whole family is created was completely unguarded. Every fix was applied after creation, so the creation kept happening.

What QE (the engineering system) would have done — and didn't. Suppose prevention had existed: a shared module, good criteria. QE is the layer that makes those fire on every release without a human remembering. It is the pricing module shipping with its own test suite, the quality gate that actually blocks a merge when a discount-combination test fails, and the observability that puts the live refund rate in front of the team that built the feature. Without QE, even a team that knows the right prevention relies on individuals to apply it consistently — and consistency is exactly what individuals cannot guarantee across a busy quarter. This team's one automated safeguard, when it existed at all, could be skipped under deadline because nothing enforced it.

Read together, the trace is diagnostic. The pricing-defect family survived because the team ran detection, had no prevention, and had no engineering system to make prevention automatic. They had been "improving QA" for a year by sharpening the one layer that was already working. The layer that would have ended the family — prevention, enforced by an engineering gate — was the one nobody was building, precisely because everyone's attention was on the net.

The layer map: what each does, when it acts, and how it fails

Here is the whole model on one page. The last column is the operational payoff — it is the failure signature you can actually observe in your own org when that layer is the one you're missing.

Layer

What it does

When it acts

Failure signature when it's the missing layer

QA — Quality Assurance

Prevention. Changes how the work is built so the defect is hard or impossible to create — shared components, standards, acceptance criteria, definition of done.

Before the defect exists — design and construction.

The same class of defect recurs release after release. Fixes are real but only ever address instances; the family never dies. Every retro says "we need better QA" and means "test more."

QC — Quality Control

Detection. Inspects the finished output to find defects that were created — testing, change review, exploratory testing, production monitoring.

After the defect exists — the finished artifact.

Defects reach customers before anyone inside notices. You learn about failures from support tickets and refund spikes, not from an internal signal. Escapes feel like surprises.

QE — Quality Engineering

The system. Makes prevention and detection automated, repeatable, and team-owned — tests as code, enforced CI gates, observability, shared ownership.

Continuously, across the lifecycle — it governs the other two.

Detection works, but only heroically. Quality depends on specific people staying late and checking by hand; it is real but not repeatable, unevenly applied under deadline, and it walks out the door when they do.

The rows are not ranked and they are not substitutes. A team can be excellent at detection and have no prevention (the composite above). A team can have strong prevention practices that no gate enforces, so they hold only when the senior engineer is watching (a QE gap). The map's job is to let you match your observed symptom to the layer that produces it.

Diagnose your own org: which layer are you short on?

Run this on your actual last quarter, not on your intentions. Each signal is observable — it points at records you already have (your defect tracker, your merge history, your incident timeline), not at opinions.

Test for a prevention (QA) gap — look at recurrence and at what exists before code:

  • Pull your escaped defects from the last quarter and cluster them by class, not by ticket. If one or two classes account for most of the escapes and each was "fixed" more than once, prevention is your gap — you are killing instances, not families.

  • Ask whether a prevention rule exists before code for your riskiest defect class. Is there a shared component that makes the defect unrepresentable? Is the edge case a required line in the definition of done? If the honest answer is "we rely on people remembering," you have no prevention layer there — you have folklore.

Test for a detection (QC) gap — look at who finds defects first:

  • For each of last quarter's escapes, write down who noticed first. If the answer is repeatedly "a customer" or "support," detection is your gap: defects are being created and shipped straight past any internal net.

  • Check whether you have any internal signal that fires before customers feel a failure — a test, a monitor, an alert with a threshold. No internal first-detector means no functioning control layer.

Test for an engineering-system (QE) gap — look at whether quality is repeatable or heroic:

  • Ask: if your two most diligent people took the same week off, would quality hold? If the honest answer is no, your prevention and detection are heroic, not systematic — the QE layer is missing.

  • Check whether your safeguards are enforced or optional. Can a merge reach production with the relevant test skipped or the gate waved through under deadline? If a control can be bypassed by a busy human, it is not yet an engineering property of your system — it is a habit, and habits lapse exactly when pressure is highest.

Most organizations light up on more than one test. That is expected and it is fine — the diagnosis you want is not "we're perfect on two, missing one," it is which missing layer is producing the escape that's costing you now. The quality-culture audit goes deeper on the organizational side of these signals — who owns the gap, and whether the incentives even let the missing layer get built.

The tradeoff you're actually managing

There is a real cost structure behind these layers, and pretending otherwise is how teams end up over-investing in the visible one. Detection is the most visible layer — testers, test runs, dashboards — so under pressure it is the easiest to fund and the easiest to point at. Prevention is nearly invisible: its success looks like nothing happening, which is politically hard to defend at budget time. The engineering layer is the most expensive to stand up because it changes how the whole team works, not just what one group does after the fact.

That asymmetry is precisely why so many organizations drift into an all-detection posture and then wonder why the same defects recur. They keep funding the layer they can see. The discipline is to spend against the layer your diagnosis named, not the layer that is easiest to show a stakeholder. A dollar into prevention when prevention is your gap removes a whole defect family; the same dollar into more detection when detection already works just finds the same family slightly faster.

Which layer to strengthen first

Do not try to build all three at once, and do not default to the visible one. Sequence by the gap your diagnosis actually found, because the layers have a dependency order that makes one sequence far cheaper than the others.

If your escapes are a recurring class, strengthen prevention first — a shared component or an enforced acceptance rule for that one class will retire more defects than any amount of added inspection, because it closes the moment where the family is born. If your escapes are found by customers, strengthen detection first — you need an internal net before anything else, because you cannot improve a signal you don't yet receive; get one internal first-detector in place, then work upstream. If detection and prevention exist but depend on heroes, strengthen the engineering system first — take the safeguards you already know are right and make them enforced and automatic, so a busy quarter can't quietly switch them off.

The move that ends the recurring-defect loop is almost never "more QA" in the vague sense the phrase usually carries. It is naming the specific layer your organization has been running without — the moment in the defect's life that no one is guarding — and building that one, deliberately, before you add more of the layer you already have. Prevention stops the family from being born. Detection catches what prevention misses. The engineering system makes both fire every time without anyone remembering to. Find the missing one, and quality stops being a phase your team survives each release and starts being a property of how you build.

Related reading

Frequently Asked Questions

What is the difference between QA and QC?

Quality assurance (QA) is process-focused and proactive: it prevents defects by improving how you work — standards, reviews, good practices, automation. Quality control (QC) is product-focused and reactive: it detects defects by inspecting the actual output — testing, QA passes, monitoring. QA asks 'are we building it the right way so defects don't happen?' and QC asks 'did this specific thing come out right?' You need both, but they are not the same activity and they fail in different ways.

What is quality engineering (QE)?

Quality engineering treats quality as an engineering discipline owned by the whole team, not a separate phase or department. Instead of a QA team checking software after developers finish, quality is built in continuously — testing as code, quality gates in CI/CD, observability, and shared ownership. QE is the system that makes prevention and detection repeatable and automated rather than dependent on a few heroes.

How do I tell which quality layer my organization is missing?

Look at when defects are found and how. If the same class of defect keeps recurring, prevention (QA) is weak. If defects reach customers before anyone inside notices, detection (QC) is weak. If detection works but only because specific individuals stay late and check things by hand, the engineering layer (QE) is missing — your quality is real but not repeatable, and it leaves when they do.

Do I need QA, QC, and QE all at once?

You need the functions, not necessarily three teams or three titles. Every team must prevent defects (assurance), detect the ones that slip through (control), and ideally treat quality as an engineering responsibility built into the work (engineering). In a small team one person does all three. The question is not how many teams you have but whether all three functions are actually happening.

Why does the QA/QC/QE distinction matter in practice?

Because each term names a different function acting at a different moment, and running only one leaves a predictable gap. A team strong on detection but weak on prevention finds the same defect forever. A team strong on prevention but weak on the engineering layer relies on heroes to hold the line. Naming which layer you are short on is the difference between fixing the gap and hiring more people to stand in it.

bottom of page