Anyone can change any code. Shared responsibility for the whole codebase.
In traditional models, code has owners. "That's Alice's module." "Talk to Bob about the database layer." This creates problems:
Bottlenecks: When Alice is on vacation, her module can't be changed. When Bob is busy, database work piles up.
Silos: People don't understand code they don't own. Integration becomes painful.
Bus factor: If Alice leaves, knowledge leaves with her.
Collective ownership means anyone on the team can change any code. There are no personal territories. The team owns the codebase together.
This is scary at first. Won't people break things they don't understand? Won't the code become inconsistent? Won't chaos ensue?
Not if you have the supporting practices.
The Trade-off
Individual ownership protects code from uninformed changes. Collective ownership enables flow and shared learning. XP uses practices (tests, standards, pairing) to get the benefits of collective ownership without the chaos.
Collective ownership requires supporting practices:
Comprehensive tests: If you break something, tests catch it immediately. This makes it safe for non-experts to change code.
Pair programming: When changing unfamiliar code, pair with someone who knows it. Knowledge transfers, and mistakes are caught.
Coding standards: Consistent style means anyone can read any code. No translation between "Alice's style" and "Bob's style."
Continuous integration: Changes integrate immediately. If something conflicts or breaks, you know fast.
Refactoring: Everyone improves code as they work. The codebase gets better, not worse, over time.
Without these practices, collective ownership is chaos. With them, it's liberating.
Individual ownership has a place. It provides:
But the costs are high:
XP says the costs outweigh the benefits. Shared ownership with supporting practices beats individual ownership.
Some teams use a hybrid: primary and secondary owners. The primary knows the code best; the secondary is learning. This provides expertise while reducing bottleneck risk.
A developer needs to fix a bug in an unfamiliar module. They pull up the code, read the tests, pair with someone who knows the area, make the fix, and run all tests. Knowledge spreads.
A critical bug is found in Alice's module. Alice is on vacation. The team decides to wait until she returns because no one else 'should' touch her code. The bug stays in production for a week.
Moving to collective ownership can be difficult:
"But I'm the expert!" You're still the expert. You'll pair with others when they change your code. Your expertise spreads—it doesn't diminish.
"People will mess up my code." Tests protect against messing up. Code review (or pairing) catches problems. And "your" code isn't really yours—it's the team's.
"I can't keep up with all the code." You don't have to. You learn what you need when you need it. Pair with experts. Read tests. Follow standards.
"Our code is too complex for non-experts." That's a code smell, not an ownership argument. Complex code should be simplified. Until then, pair programming protects against uninformed changes.
The shift is cultural as much as technical. It requires trust, transparency, and a growth mindset.
Moving to collective ownership gradually:
Week 1-2: Pair cross-domain. Have experts pair with non-experts on each other's code.
Week 3-4: Remove explicit ownership labels. Stop saying "Alice's module." Start saying "the payment module."
Week 5-6: Encourage cross-pollination. When assigning stories, intentionally put people on unfamiliar code (with pairing support).
Ongoing: Celebrate knowledge sharing. Recognize when someone learns a new area or when an "owner" successfully transfers knowledge.
Measure bus factor: How many people can meaningfully work on each area of the codebase? Aim for at least 2, ideally 3+.
A quick bus factor check: for each major area of code, who could fix a production bug there at 3 AM? If the answer is one person, you have a problem.