Componentes: La Unidad de Despliegue
Los componentes son las unidades desplegables más pequeñas — JARs, DLLs, Gemas — los bloques de construcción de una arquitectura de plugins conectados en tiempo de ejecución.
Por qué importa
Un componente es la unidad desplegable y desarrollable más pequeña de un sistema — el archivo JAR en Java, la DLL en Windows, la Gem en Ruby, el paquete npm en Node. Los componentes son el nivel de granularidad al que se despliega el software: pueden enlazarse en un único ejecutable, o mantenerse como plugins desplegables independientemente que se conectan en tiempo de ejecución.
La evolución hacia la conectabilidad en tiempo de ejecución es significativa. Cuando los componentes pueden intercambiarse en tiempo de ejecución sin recompilar el resto del sistema, la arquitectura se convierte en una arquitectura de plugins — nuevas funcionalidades, nuevas integraciones y nuevos comportamientos llegan como nuevos componentes, dejando el núcleo existente intacto. Un módulo monolítico que mezcla preocupaciones no relacionadas obliga a que todo el sistema sea probado y redespliegado cada vez que cambia cualquier parte de él. El objetivo de la arquitectura de componentes es romper ese acoplamiento para que cada pieza desplegable independientemente tenga su propio versionado y cadencia de publicación.
✗El problema
A monolithic module bundles unrelated concerns — changing any one part forces a full redeploy of everything else.
Bad
# user_auth.py — HTTP logic, DB models, email, AND auth rules all mixed together
class User:
id: int
email: str
def hash_password(pw: str) -> str: ...
def send_welcome_email(user: User) -> None: ... # depends on email server
def save_user(user: User) -> None: ... # depends on database
def validate_token(token: str) -> bool: ... # auth logic
def render_profile_page(user: User) -> str: ... # depends on HTML templates
# Changing the email template forces a full redeploy of auth logic, DB code, etc.
// src/app.ts — auth, DB, email, HTTP all in one module
export function hashPassword(pw: string): string { /* ... */ }
export function sendWelcomeEmail(user: User): void { /* email dep */ }
export function saveUser(user: User): Promise<void> { /* DB dep */ }
export function validateToken(token: string): boolean { /* ... */ }
export function renderProfilePage(user: User): string { /* template dep */ }
// A bug in sendWelcomeEmail forces a full redeploy of all auth and DB code.
✓La solución
Separate packages with clear boundaries — each with its own version and release cadence. A change to notifications never touches auth or user packages.
Good
# auth/ ← pure auth logic, no external deps
# tokens.py, passwords.py
#
# users/ ← user domain — depends on auth, not on email or HTTP
# models.py
#
# notifications/ ← email/SMS — versioned separately
# email.py
#
# api/ ← HTTP layer — depends on users + auth
# routes.py
# Each package has its own version tag.
# A change to notifications/email.py triggers only notifications tests + deploy.
// packages/auth/ — pure auth logic
// index.ts: export { hashPassword, validateToken }
//
// packages/users/ — user domain
// index.ts: export { User, saveUser }
//
// packages/notifications/ — email/SMS
// index.ts: export { sendWelcomeEmail }
//
// packages/api/ — HTTP layer
// index.ts: import from auth, users, notifications
// Fixing a bug in notifications only redeploys that package.
// auth and users packages are never touched.
💡Conclusión clave
Si no puedes desplegar una parte de tu sistema sin redesplegar todo, tienes un monolito disfrazado de componentes. Los verdaderos componentes tienen versionado y despliegue independientes — cambiar una parte deja el resto probablemente sin cambios.
🔧 Algunos ejercicios pueden tener errores. Si algo parece incorrecto, usa el botón Feedback (abajo a la derecha) para reportarlo — nos ayuda a corregirlo rápido.
Pista: Si no puedes desplegar una parte de tu sistema sin redesplegar todo, tienes un monolito, no componentes.
✗ Tu versión