The idea
What it is
A CRC card is one index card per class, split into three areas: the Class name at the top, its Responsibilities down the left, and its Collaborators down the right. That's the whole technique — invented by Kent Beck and Ward Cunningham in 1989 as a way to teach object-oriented thinking, and still one of the fastest, cheapest ways to sketch a design with a group of people around a table.
Think of casting a play. Before you build any sets, you assign roles to actors: you carry the message, you guard the gate, you settle the bill. A CRC card is an actor's role sheet — what this object is responsible for, and which other actors it has to speak to on stage. The genius is the index card: it's deliberately tiny. If a class's responsibilities won't fit on a small card, that's a loud signal the class is doing too much and should be split. The physical limit does the design critique for you.
CRC sits one rung below a UML class diagram. It's not a formal artifact you keep forever; it's a brainstorming and discovery tool. You shuffle cards, scribble on them, tear them up, and redo — and out of that play-acting falls a candidate set of classes, their responsibilities, and the wiring between them, ready to be drawn up properly afterwards.
The one sentence to remember
A CRC card is an index card naming one class, what it's responsible for, and which classes it collaborates with — and if the responsibilities don't fit on the card, the class is doing too much.
Mechanics
How it works
The three regions of a card
Every CRC card has the same layout. The class name goes across the top. The left column lists responsibilities — the things this class knows (data it holds) or does (operations it performs), written as short verb phrases like "calculate total" or "hold line items." The right column lists collaborators — the other classes this one must talk to in order to meet its responsibilities. Responsibilities and collaborators usually line up: a responsibility on the left that needs help from another class names that class on the right.
┌─────────────────────────────────────────────┐
│ Order (Class) │
├──────────────────────────┬──────────────────┤
│ Responsibilities │ Collaborators │
├──────────────────────────┼──────────────────┤
│ • hold the line items │ OrderLine │
│ • calculate the total │ OrderLine │
│ • know the customer │ Customer │
│ • request payment │ Payment │
└──────────────────────────┴──────────────────┘Notice how each responsibility on the left maps to a collaborator on the right. "Calculate the total" can't be done alone — Order has to ask each OrderLine for its subtotal — so OrderLine appears as a collaborator. That two-column pairing is what turns a vague class name into a concrete, testable role.
Brainstorm the cards as a group
You start by reading a use case and pulling out the nouns as candidate classes — Customer, Order, Product, Payment — and writing each on its own physical card. Then, with the team gathered around the table, you hand the cards out and assign responsibilities by asking, for each thing the system must do, "whose job is this?" The cards are cheap and movable on purpose: anyone can pick one up, cross something out, or tear it up and start over. Because everyone can see and touch the deck, the whole group designs together instead of one person at a whiteboard.
The heart of it: role-play a scenario
The real magic isn't writing the cards — it's enacting a scenario with them. You pick a concrete use case ("a customer checks out their cart") and walk it step by step. For each step, you ask "which card is responsible for this?", physically pick up that card, and act as if you are that object. To do the step, the object almost always needs help — and the moment you say "to total the order, I ask each line for its price," you've discovered a collaborator. You point from the active card to the cards it talks to, and those arrows become the relationships in your design.
Walking the scenario this way surfaces three things at once: missing responsibilities (a step nobody's card can do), missing classes (a step that needs an object you forgot to create), and the collaboration graph (who calls whom). It's a dry run of the system performed by people holding cards — and it finds design holes far faster and cheaper than writing code would.
Too many responsibilities is a smell
As you role-play, watch the cards. If one card keeps getting picked up for everything and its responsibility list overflows the index card, that's a God class forming — low cohesion, too many reasons to change. The fix is to split it: peel some responsibilities onto a new card and hand them off. This is exactly the Single Responsibility Principle and high cohesion you met earlier, now made physical: the size of the card is your cohesion budget.
Keep responsibilities high-level and few
Write responsibilities as short, high-level verb phrases, and keep them few — a handful per card, not twenty. If it doesn't fit on the card, the class is doing too much. The index card's small size is a feature: it forces brevity and exposes bloated classes at a glance.
A low-cost precursor to diagrams
CRC is deliberately informal. There's no rigorous notation, no tool, no version control — just cards you're happy to throw away. That cheapness is the point: you can explore three different decompositions in the time it would take to draw one careful class diagram. Once the deck stabilizes and the scenarios run cleanly, the cards translate almost directly into a UML class diagram (cards → classes, responsibilities → methods/fields, collaborators → associations) and the role-play steps into a sequence diagram.
CRC feeds class diagrams and GRASP
CRC is the brainstorming front-end to formal modeling: the cards become a class diagram and the walkthrough becomes a sequence diagram. Deciding who owns each responsibility while you role-play is exactly the responsibility-assignment question that GRASP (Information Expert, Creator, Controller…) gives you principled answers to.
Interactive prototype
See it. Build it. Break it.
A sandboxed, hands-on simulation — no setup, no install. Play with it as you read.
About this simulation
A small deck of CRC cards for a checkout — Cashier, Order, OrderLine, Product, Payment — each showing its responsibilities (left) and collaborators (right). Pick the scenario "Customer checks out a cart" and step through it with Next/Prev: each step names an action, the responsible card lights up, and arrows are drawn to every collaborator it must talk to — enacting the walkthrough. Toggle Quiz me to guess which card owns a step before it's revealed, and watch the active card and collaborations drawn indicators update live.
Hands-on
Try these yourself
Open the prototype above, predict what happens, then verify.
Read the deck, then step the scenario
Five CRC cards load — Cashier, Order, OrderLine, Product, Payment — each with its responsibilities (left) and collaborators (right). With the scenario set to "Customer checks out a cart", press Next to take the first step. The console states the action (e.g. "start a new order"), the responsible card lights up, and arrows are drawn to each collaborator it must talk to. Keep pressing Next to walk the whole checkout end to end, then Prev to step back.
Quiz yourself on who owns each step
Toggle Quiz me on. Now, before each step is revealed, you must click the card you think is responsible for that action. Pick Order for "calculate the total" and you get a ✓; pick the wrong card and you get a ✗ with the answer. The active card and collaborations drawn indicators update as you go — this is the role-play forcing you to assign responsibilities deliberately.
Switch scenarios and reset
Use the scenario selector to switch to "Payment is declined" and step through it: watch how Payment now collaborates differently and the arrows redraw. Hit Reset at any time to clear the highlights, rewind to step zero, and start the walkthrough fresh — exactly like tearing up the cards and re-enacting the scenario from scratch.
In practice
When to use it — and what trips people up
When CRC cards earn their keep
Reach for CRC at the start of design, right after you have use cases but before any diagrams or code. It shines when a group needs to agree on a decomposition quickly — onboarding people onto an existing design, exploring an unfamiliar domain, or settling an argument about who should own a responsibility. Because the cards are throwaway, it's ideal precisely when you're unsure and want to try several shapes cheaply.
It's less useful once the design is settled and detailed — at that point a real class diagram, sequence diagram, and code carry the weight. CRC is a discovery tool, not a system of record; don't try to make the cards authoritative or keep them in sync forever.
Don't over-formalize the cards
The value of CRC is its informality and speed. If you find yourself adding fields for types, multiplicities, and method signatures, you've outgrown the cards — graduate to a UML class diagram. Keep responsibilities verb-phrase-short and stay willing to tear cards up.
What it gives you
- Cheap and fast — index cards cost nothing and a whole decomposition can be explored and discarded in minutes.
- Collaborative — everyone around the table can see, touch, and move the cards, so the whole group designs together.
- Surfaces design holes early — role-playing a scenario exposes missing classes, missing responsibilities, and God classes before any code exists.
- Smooth on-ramp to UML — cards map almost directly to a class diagram and the walkthrough to a sequence diagram.
Common mistakes
- Informal and non-persistent — cards aren't a lasting artifact and can drift from the real design if relied on too long.
- Scales poorly — a deck of dozens of cards becomes hard to lay out and role-play for a large system.
- Group-dependent — much of the value comes from live discussion, so it's weaker as a solo, asynchronous activity.
- Coarse — it captures responsibilities and collaborators but not types, multiplicities, or detailed signatures.
Reference
Code & further reading
A minimal reference implementation and pointers worth bookmarking.
// Cards translated to skeletons: responsibilities → methods, collaborators → fields.
//
// Order resp: hold lines, calc total, request payment collab: OrderLine, Payment
// OrderLine resp: know product & qty, give subtotal collab: Product
// Product resp: know its price collab: —
// Payment resp: charge the customer collab: —
class Product {
constructor(public name: string, public price: number) {} // "know its price"
}
class OrderLine {
constructor(private product: Product, private qty: number) {} // collaborator: Product
subtotal(): number {
return this.product.price * this.qty; // "give subtotal" — asks Product for its price
}
}
class Payment {
charge(amount: number): boolean { // "charge the customer"
return amount > 0;
}
}
class Order {
private lines: OrderLine[] = []; // collaborator: OrderLine
constructor(private payment: Payment) {} // collaborator: Payment
addLine(line: OrderLine): void { this.lines.push(line); } // "hold the line items"
total(): number { // "calculate the total"
return this.lines.reduce((sum, l) => sum + l.subtotal(), 0);
}
checkout(): boolean { // "request payment"
return this.payment.charge(this.total());
}
}References & further reading
6 sources- Paperc2.com
Beck & Cunningham — "A Laboratory For Teaching Object-Oriented Thinking" (OOPSLA '89)
The original 1989 paper that introduced CRC cards — short, readable, and the source of the whole technique.
- Articleen.wikipedia.org
Wikipedia — Class-responsibility-collaboration card
Concise definition of the three regions and how CRC fits between use cases and class diagrams.
- Articleagilemodeling.com
Agile Modeling — CRC Cards: An Agile Introduction
Scott Ambler's practical walkthrough of brainstorming cards and role-playing scenarios with a team.
- Articleagilealliance.org
Agile Alliance — What are CRC Cards?
A short glossary entry placing CRC cards in the XP / agile design context.
- Book
Object Design: Roles, Responsibilities, and Collaborations — Rebecca Wirfs-Brock & Alan McKean
The definitive book on responsibility-driven design, the philosophy CRC cards grew into.
- Book
Extreme Programming Explained — Kent Beck
From a co-inventor of CRC; situates cards within lightweight, collaborative, throwaway-friendly design.
Knowledge check
Did it land?
Quick questions, answers revealed on submit. Sign in to save your best score.
question 01 / 05
What do the three letters in CRC stand for?
question 02 / 05
On a CRC card, what goes in the two columns below the class name?
question 03 / 05
What is the point of 'role-playing' or 'enacting a scenario' with CRC cards?
question 04 / 05
During role-play, one card's responsibility list keeps growing until it won't fit on the index card. What does this signal?
question 05 / 05
How does CRC relate to formal UML modeling?
0/5 answered