Preserving Productive Tensions
Overview
Some tensions aren't problems to solve - they're valuable information to preserve. When multiple approaches are genuinely valid in different contexts, forcing a choice destroys flexibility.
Core principle: Preserve tensions that reveal context-dependence. Force resolution only when necessary.
Recognizing Productive Tensions
A tension is productive when:
- •Both approaches optimize for different valid priorities (cost vs latency, simplicity vs features)
- •The "better" choice depends on deployment context, not technical superiority
- •Different users/deployments would choose differently
- •The trade-off is real and won't disappear with clever engineering
- •Stakeholders have conflicting valid concerns
A tension needs resolution when:
- •Implementation cost of preserving both is prohibitive
- •The approaches fundamentally conflict (can't coexist)
- •There's clear technical superiority for this specific use case
- •It's a one-way door (choice locks architecture)
- •Preserving both adds complexity without value
Preservation Patterns
Pattern 1: Configuration
Make the choice configurable rather than baked into architecture:
class Config:
mode: Literal["optimize_cost", "optimize_latency"]
# Each mode gets clean, simple implementation
When to use: Both approaches are architecturally compatible, switching is runtime decision
Pattern 2: Parallel Implementations
Maintain both as separate clean modules with shared contract:
# processor/batch.py - optimizes for cost # processor/stream.py - optimizes for latency # Both implement: def process(data) -> Result
When to use: Approaches diverge significantly, but share same interface
Pattern 3: Documented Trade-off
Capture the tension explicitly in documentation/decision records:
## Unresolved Tension: Authentication Strategy **Option A: JWT** - Stateless, scales easily, but token revocation is hard **Option B: Sessions** - Easy revocation, but requires shared state **Why unresolved:** Different deployments need different trade-offs **Decision deferred to:** Deployment configuration **Review trigger:** If 80% of deployments choose one option
When to use: Can't preserve both in code, but need to document the choice was deliberate
Red Flags - You're Forcing Resolution
- •Asking "which is best?" when both are valid
- •"We need to pick one" without explaining why
- •Choosing based on your preference vs user context
- •Resolving tensions to "make progress" when preserving them IS progress
- •Forcing consensus when diversity is valuable
All of these mean: STOP. Consider preserving the tension.
When to Force Resolution
You SHOULD force resolution when:
- •
Implementation cost is prohibitive
- •Building/maintaining both would slow development significantly
- •Team doesn't have bandwidth for parallel approaches
- •
Fundamental conflict
- •Approaches make contradictory architectural assumptions
- •Can't cleanly separate concerns
- •
Clear technical superiority
- •One approach is objectively better for this specific context
- •Not "I prefer X" but "X solves our constraints, Y doesn't"
- •
One-way door
- •Choice locks us into an architecture
- •Migration between options would be expensive
- •
Simplicity requires choice
- •Preserving both genuinely adds complexity
- •YAGNI: Don't build both if we only need one
Ask explicitly: "Should I pick one, or preserve both as options?"
Documentation Format
When preserving tensions, document clearly:
## Tension: [Name] **Context:** [Why this tension exists] **Option A:** [Approach] - Optimizes for: [Priority] - Trade-off: [Cost] - Best when: [Context] **Option B:** [Approach] - Optimizes for: [Different priority] - Trade-off: [Different cost] - Best when: [Different context] **Preservation strategy:** [Configuration/Parallel/Documented] **Resolution trigger:** [Conditions that would force choosing one]
Examples
Productive Tension (Preserve)
"Should we optimize for cost or latency?"
- •Answer: Make it configurable - different deployments need different trade-offs
Technical Decision (Resolve)
"Should we use SSE or WebSockets?"
- •Answer: SSE - we only need one-way communication, simpler implementation
Business Decision (Defer)
"Should we support offline mode?"
- •Answer: Don't preserve both - ask stakeholder to decide based on user needs
Remember
- •Tensions between valid priorities are features, not bugs
- •Premature consensus destroys valuable flexibility
- •Configuration > forced choice (when reasonable)
- •Document trade-offs explicitly
- •Resolution is okay when justified