Cómo escribir RFCs técnicos y documentos de diseño eficaces
Escribe RFCs y documentos de diseño que impulsen decisiones: estructura las propuestas en torno a compromisos, alternativas y criterios medibles.

La mayoría de los documentos de diseño fracasan antes de que alguien los lea. O son demasiado largos —especificaciones de 40 páginas que nadie tiene tiempo de leer— o demasiado vagos —un párrafo de generalidades que en realidad no propone nada concreto—. Los peores describen una solución sin explicar el problema, dejando que los revisores adivinen si el enfoque tiene sentido para unas restricciones que solo pueden inferir.
Un RFC eficaz hace una sola cosa: ayuda a un grupo de ingenieros a tomar una decisión bien informada. Todo lo que contiene el documento debe servir a ese objetivo. Si una sección no ayuda a alguien a decidir si aprobar, modificar o rechazar la propuesta, sobra.
La estructura mínima viable de un RFC
Todo RFC necesita exactamente cinco secciones. Todo lo demás es opcional. Si no puedes completar estas cinco secciones, no entiendes el problema lo suficiente como para proponer una solución.
# RFC: [Short descriptive title]
## Status
- **Author**: [Name]
- **Reviewers**: [Names — people whose input you need]
- **Status**: Draft | In Review | Approved | Rejected | Superseded
- **Date**: [Created date]
- **Decision deadline**: [When this must be decided by]
## Problem Statement
What problem are we solving? Who has this problem?
Why does it matter now?
[2-4 paragraphs, no solution details here]
## Proposed Solution
How do we solve it? Be specific enough that someone
could implement this without talking to you.
[Technical details, diagrams, interface definitions]
## Alternatives Considered
What other approaches did you evaluate? Why were they
rejected? This is the most important section — it shows
you've actually explored the design space.
[At least 2 alternatives with honest trade-off analysis]
## Trade-offs and Risks
What are we giving up? What could go wrong? What
assumptions might be wrong?
[Honest assessment of downsides]Cómo redactar el planteamiento del problema
El planteamiento del problema es donde la mayoría de los RFCs triunfan o fracasan. Un planteamiento claro hace que el resto del documento casi se escriba solo. Uno vago genera un debate interminable sobre la solución, porque en realidad los lectores están debatiendo el problema.
## ❌ Bad problem statement
"We need to improve our authentication system. The current
system is old and doesn't scale. We should use OAuth 2.0."
Problems:
- Mixes problem and solution ("We should use OAuth 2.0")
- "Old and doesn't scale" — what specifically doesn't scale?
- No data or evidence
- No impact statement
## ✅ Good problem statement
"Our session-based auth system creates two problems as we
scale to multiple regions:
1. **Session stickiness breaks multi-region failover.**
Sessions are stored in-memory on the origin server. When
we fail over to another region, all users are logged out.
We've had 3 incidents in Q3 where failover caused a spike
of 40,000 simultaneous re-authentication requests that
overwhelmed the auth database.
2. **Third-party integrations require per-integration auth
code.** Each of our 12 integration partners requires
custom authentication middleware. Adding a new partner
takes 2-3 weeks of engineering time, primarily spent on
auth plumbing rather than business logic.
Our SLA requires 99.9% availability across regions, and our
roadmap includes 8 new integration partners in the next two
quarters. Both goals are blocked by the current auth
architecture."Alternativas consideradas: la sección más infravalorada
Los revisores confían más en una propuesta cuando ven que has explorado el espacio de soluciones. Las alternativas no son relleno: son evidencia de buen criterio de ingeniería.
## Alternatives Considered
### Alternative A: Migrate sessions to Redis cluster
Store sessions in a Redis cluster replicated across regions.
**Pros:**
- Minimal application code changes
- Team already operates Redis
- Session data remains mutable
**Cons:**
- Cross-region Redis replication adds 50-100ms latency
- Redis cluster adds operational complexity
(split-brain risks)
- Doesn't solve the third-party integration problem
**Why rejected:** Solves problem #1 partially (failover works
but with added latency) and doesn't address problem #2 at all.
### Alternative B: JWT tokens with no session store
Stateless JWTs eliminate the session store entirely.
**Pros:**
- No session storage to manage
- Naturally works across regions
- Verification is a local operation
**Cons:**
- Revocation is complex (requires blocklist)
- Token size increases with claims
- Cannot invalidate tokens before expiry without
additional infrastructure
**Why rejected:** Revocation complexity is a dealbreaker for
our security requirements (we need instant session
termination for compromised accounts).
### Proposed: OAuth 2.0 with short-lived access tokens
and refresh token rotation
[Details in Proposed Solution section]
**Why this over the alternatives:** Addresses both problems,
revocation works via refresh token invalidation, and standard
protocol means integration partners use off-the-shelf
libraries.Diagramas que realmente ayudan
Un diagrama bien ubicado sustituye párrafos enteros de texto. Pero un diagrama mal hecho confunde más de lo que aclara.
## Diagram best practices
### Include diagrams for:
- System architecture (what talks to what)
- Request flow (step-by-step sequence)
- Data model relationships
- State machines
### Skip diagrams for:
- Obvious relationships that text explains clearly
- Decorative purposes
- Things that will change before implementation
### Format:
- Use Mermaid, PlantUML, or Excalidraw
(version-controllable, editable by reviewers)
- Label every arrow (what data flows, what protocol)
- Include a legend if using symbols
- Keep to one concept per diagram// Anti-pattern: implementation details that don't
// help the decision
// ❌ Don't include in the RFC:
// - Exact variable names and function signatures
// - Database column types
// - CSS class names
// - Test file structures
// ✅ Do include:
// - API contracts (what the interface looks like)
// - Data flow between systems
// - Key algorithms or approaches (pseudocode is fine)
// - Performance characteristics (Big O, expected latency)
// Example: API contract in an RFC
interface AuthAPI {
// Token endpoint — called by clients to authenticate
'POST /auth/token': {
request: { grant_type: string; code?: string; refresh_token?: string };
response: { access_token: string; refresh_token: string; expires_in: number };
};
// Revocation — called to invalidate a session
'POST /auth/revoke': {
request: { token: string };
response: { revoked: boolean };
};
// Introspection — called by services to validate tokens
'POST /auth/introspect': {
request: { token: string };
response: { active: boolean; sub: string; exp: number; scope: string };
};
}Criterios de éxito y planes de reversión
Un RFC sin criterios de éxito nunca podrá evaluarse después de implementarse. Define desde el principio qué significan «terminado» y «funcionando».
## Success Criteria
### Functional:
- [ ] Multi-region failover completes without logging
out users
- [ ] New integration partner can authenticate in <3 days
of engineering work (down from 2-3 weeks)
- [ ] Session revocation takes effect within 5 minutes
### Performance:
- [ ] Auth endpoint P99 latency < 200ms (current: 150ms)
- [ ] Token validation < 5ms per request (local operation)
- [ ] No increase in auth-related error rate
### Operational:
- [ ] Auth system operates independently in each region
- [ ] Monitoring and alerting configured before rollout
- [ ] Runbook for common failure scenarios documented
## Rollback Plan
If the migration causes issues:
1. **Immediate (< 1 hour):** Feature flag to route traffic
back to session-based auth
2. **Short-term (< 1 week):** Dual-write to both session
store and token system during migration
3. **Reversal condition:** Rollback if auth error rate
exceeds 0.5% or P99 latency exceeds 500ms for
more than 10 minutesCómo llevar a cabo el proceso de revisión
El documento es solo la mitad de la batalla. El proceso de revisión determina si las decisiones realmente se toman.
## RFC review process
### Before sharing:
- Get informal feedback from 1-2 people
(catch obvious issues before the formal review)
- Make sure the problem statement is solid
(reviewers will nit-pick solutions; they'll reject
unclear problems)
### Review meeting structure (60 min max):
1. Author presents problem statement only (10 min)
2. Group validates: "Is this the right problem?" (10 min)
3. Author presents proposed solution (15 min)
4. Group discusses trade-offs and alternatives (20 min)
5. Decision: approve / request changes / reject (5 min)
### Common review anti-patterns:
- "Let me redesign the whole thing" → Time-box feedback
- "What about edge case X?" → Great, file it as a follow-up
- No decision after review → Set a decision deadline
- "I need more time" → OK, but the deadline doesn't move
### Decision modes:
- **Consensus**: everyone agrees (ideal but slow)
- **Consent**: nobody objects (faster, usually good enough)
- **Authority**: designated decision-maker decides
(fastest, use for time-sensitive decisions)Conclusiones clave
Todo RFC necesita exactamente cinco secciones —planteamiento del problema, solución propuesta, alternativas consideradas, contrapartidas y criterios de éxito— y si no puedes completar las cinco, no entiendes el problema lo suficiente como para proponer una solución. El planteamiento del problema es la sección más crítica: cuantifica el impacto con datos (incidentes, horas de ingeniería perdidas, incumplimientos del SLA), separa por completo el problema de la solución y explica por qué importa ahora; un planteamiento claro hace que la solución resulte casi obvia, mientras que uno vago garantiza un debate interminable. La sección de «alternativas consideradas» genera confianza en los revisores al demostrar que has explorado el espacio de diseño: incluye al menos dos alternativas genuinas con un análisis honesto de sus ventajas y desventajas, explicando específicamente por qué se descartó cada una. Establece criterios de éxito explícitos con objetivos medibles antes de comenzar la implementación, incluye un plan de reversión concreto con condiciones que lo activen, y lleva las revisiones como decisiones con un plazo definido: un RFC que nunca llega a una decisión es peor que no tener RFC.


