Ingeniería compuesta: una base de código que acelera
La mayoría de los códigos se ralentizan a medida que crecen. El mío se acelera. Después de construir 95 hooks, 44 skills y 14 archivos de configuración en mi infraestructura .claude/, cada nueva función cuesta menos que la anterior porque la infraestructura se encarga de más trabajo.1
TL;DR
La ingeniería compuesta describe códigos donde cada función añadida abarata la construcción de las siguientes. Lo he experimentado de primera mano: mi sistema de hooks de Claude Code comenzó con 3 hooks y creció hasta 95. El primer hook tomó una hora en construirse. Los hooks recientes toman 10 minutos porque la infraestructura (eventos del ciclo de vida, carga de configuración, gestión de estado, entorno de pruebas) ya existe. El patrón opuesto, la ingeniería entrópica, describe códigos donde cada función incrementa el costo de las funciones posteriores. La diferencia entre un equipo que entrega más rápido en el tercer año que en el primero y un equipo que se estanca es si sus decisiones de ingeniería se componen positiva o negativamente.
La composición en la práctica: mi infraestructura .claude/
La curva de crecimiento
| Mes | Hooks | Skills | Configs | Tests | Tiempo por hook |
|---|---|---|---|---|---|
| Mes 1 | 3 | 2 | 1 | 0 | 60 min |
| Mes 3 | 25 | 12 | 5 | 20 | 30 min |
| Mes 6 | 60 | 28 | 10 | 80 | 15 min |
| Mes 9 | 95 | 44 | 14 | 141 | 10 min |
El primer hook (git-safety-guardian.sh) requirió construir todo el ciclo de vida de hooks: comprender los eventos PreToolUse, escribir bash que analice la entrada JSON, manejar casos de error, probar manualmente. El hook número 95 heredó toda esa infraestructura. El tiempo por hook se redujo 6 veces no porque los hooks se hicieran más simples, sino porque la infraestructura se encargaba de más trabajo.
Lo que se compone
Consistencia de patrones. Cada hook sigue la misma estructura: leer la entrada JSON, analizar con jq, verificar condiciones, producir JSON de decisión. Un desarrollador (o agente de IA) que lea cualquier hook reconoce el patrón al instante. Mi linter de blog de 12 módulos sigue el mismo principio de consistencia: cada módulo exporta la misma interfaz (check(content, meta) -> findings), lo que hace trivial agregar nuevos módulos.
Comportamiento dirigido por configuración. Los 14 archivos de configuración JSON codifican umbrales y reglas que originalmente estaban escritos directamente en el código. Cuando moví el umbral de consenso de deliberación de un valor fijo 0.70 en Python a deliberation-config.json, obtuve la capacidad de ajustarlo por tipo de tarea (seguridad=85%, documentación=50%) sin cambios en el código.2
Infraestructura de pruebas. Los primeros 20 hooks no tenían pruebas. Agregar el entorno de pruebas (48 pruebas de integración en bash, 81 pruebas unitarias en Python) costó dos semanas. Cada hook posterior se entrega con pruebas en menos de 5 minutos porque los fixtures, las funciones auxiliares de aserción y los ejecutores de pruebas ya existen.
Sistema de memoria. Mi archivo MEMORY.md captura errores, decisiones y patrones entre sesiones. Con 54 entradas, evita que repita errores. El problema de ((VAR++)) en bash del hook #23 ha prevenido el mismo error en los hooks #24 al #95. Cada entrada se compone en todas las sesiones futuras.3
El modelo de composición
Composición positiva
La productividad de ingeniería sigue una fórmula de interés compuesto:
Productivity(n) = Base × (1 + r)^n
Donde r es la tasa de cambio de productividad por función y n es la cantidad de funciones entregadas.
r positivo (composición): Cada función hace la siguiente un 2-5% más barata. Después de 50 funciones: 1,03^50 = 4,38 veces de mejora en productividad.
r negativo (entropía): Cada función hace la siguiente un 2-5% más cara. Después de 50 funciones: 0,97^50 = 0,22 veces de productividad, una degradación del 78%.
La diferencia entre estas trayectorias es una brecha de 20 veces en la velocidad de ingeniería después de 50 funciones.4
Mis números reales
Mi sitio blakecrosley.com comenzó como una única ruta FastAPI con una plantilla HTML. Nueve meses después:
| Función | Tiempo de construcción | Infraestructura utilizada |
|---|---|---|
| Primera renderización de publicación | 4 horas | Ninguna (construida desde cero) |
| Listado de blog con categorías | 2 horas | Plantillas Jinja2 existentes, content.py |
| Sistema de traducción i18n | 6 horas | Pipeline de contenido existente, base de datos D1 |
| Modal de búsqueda del blog | 45 min | Patrones HTMX existentes, estado Alpine.js |
| Linter de calidad del blog (12 módulos) | 3 horas | Infraestructura de pruebas existente, pipeline CI |
| Nuevo módulo del linter (salud de URL) | 15 min | Interfaz de módulo existente, fixtures de pruebas |
La última entrada es el resultado de la composición: agregar un nuevo módulo del linter toma 15 minutos porque la interfaz del módulo, la integración con CLI, el entorno de pruebas y el pipeline CI ya existen. El primer módulo tomó 3 horas porque nada de esa infraestructura existía.5
Ejemplos de entropía en mi propio código
La composición no es automática. También he experimentado entropía:
El atajo del esquema ContentMeta
Definí el dataclass ContentMeta para publicaciones del blog en una sola sesión: título, slug, fecha, descripción, etiquetas, autor, publicado. No incluí category, series, hero_image, scripts ni styles. Cada adición posterior requirió modificar el analizador, actualizar cada plantilla que consumía los metadatos y volver a probar todo el pipeline. Cinco adiciones a lo largo de tres meses costaron más tiempo total que diseñar el esquema cuidadosamente desde el principio. Este es el problema del momento de las decisiones: las decisiones irreversibles merecen un análisis previo.
La colisión de claves de caché i18n
Una implementación rápida del almacenamiento en caché de traducciones usó los slugs del blog como claves de caché. Cuando existían dos traducciones del mismo slug en diferentes locales, la caché devolvía el idioma incorrecto. La depuración tomó 3 horas. La corrección tomó 15 minutos (agregar prefijo de locale a la clave de caché). El atajo que ahorró 5 minutos durante la implementación costó 3 horas en depuración y una revisión arquitectónica de cada clave de caché en el sistema.6
El directorio de depuración de 3,2 GB
La salida de depuración de los hooks se acumuló en ~/.claude/debug/ sin limpieza. En tres meses, el directorio creció a 3,2 GB. El skill de auditoría de contexto que construí después detectó esto y limpió archivos con más de 7 días de antigüedad, pero la infraestructura de limpieza debió haberse construido junto con la primera salida de depuración.
Prácticas que se componen
Patrones consistentes sobre patrones óptimos
Un equipo que usa el mismo patrón “suficientemente bueno” en 50 funciones opera más rápido que un equipo que usa el patrón “óptimo” para cada función individual. La consistencia reduce la carga cognitiva, habilita herramientas automatizadas y acelera las revisiones de código.7
Mi sistema de hooks usa el mismo patrón en bash para los 95 hooks aunque algunos hooks se expresarían más naturalmente en Python. La consistencia significa que cualquier hook es legible por cualquier persona (o cualquier agente de IA) que haya leído un solo hook. La elección subóptima del lenguaje se compensa ampliamente con la curva de aprendizaje nula para nuevos hooks.
La infraestructura como primera función
Construí mi pipeline CI/CD, el entorno de pruebas y el flujo de despliegue antes de construir cualquier función del producto en blakecrosley.com. La inversión se sintió lenta en su momento. Cada función desde entonces se despliega en menos de 2 minutos con pruebas automatizadas.8
| Fase | Inversión en infraestructura | Plazo de retorno |
|---|---|---|
| Semana 1-2 | FastAPI + Jinja2 + pipeline de despliegue | Se recuperó en la publicación 3 |
| Semana 3-4 | Pipeline de contenido + análisis de markdown | Se recuperó en la publicación 5 |
| Mes 2 | Ciclo de vida de hooks + seguridad git | Se recuperó en el hook 10 |
| Mes 3 | Infraestructura de pruebas (pytest, pruebas bash) | Se recuperó en el módulo 5 |
El patrón del palacio mental
Mi directorio .claude/ funciona como un “palacio mental” — un conjunto estructurado de documentos optimizado tanto para consumo humano como de IA:
~/.claude/
├── configs/ # 14 JSON files — system logic, not hardcoded
├── hooks/ # 95 bash scripts — lifecycle event handlers
├── skills/ # 44 directories — reusable knowledge modules
├── docs/ # 40+ markdown files — system documentation
├── state/ # Runtime tracking — recursion depth, agent lineage
├── handoffs/ # 49 documents — multi-session context preservation
└── memory/ # MEMORY.md — 54 cross-domain error/pattern entries
El palacio mental se compone porque cada nueva entrada enriquece el contexto disponible para futuras sesiones de desarrollo. Después de 54 entradas en MEMORY.md, el agente de IA evita errores que ya he resuelto. Después de 95 hooks, los nuevos hooks se escriben solos siguiendo los patrones establecidos. El contexto más rico produce código generado por IA mejor adaptado, lo que hace que la siguiente función sea más barata.9
La composición en la era de la IA
La IA amplifica ambas direcciones
Los asistentes de programación con IA aceleran cualquier patrón que el código ya siga. Mis 95 hooks con patrones consistentes producen hooks generados por IA excelentes porque la IA replica la estructura establecida. Un código con 5 estilos de hooks diferentes produciría código generado por IA peor porque la IA no tiene un patrón consistente que replicar.10
El efecto de composición se duplica: los patrones consistentes hacen el desarrollo humano más rápido (reducción de carga cognitiva) Y el desarrollo asistido por IA más rápido (coincidencia de patrones). Los patrones inconsistentes hacen ambos más lentos.
Códigos legibles por agentes
Diseñé mi infraestructura .claude/ para el consumo de agentes de IA:
- Configuraciones estructuradas (JSON, no valores escritos directamente en el código) que los agentes analizan programáticamente
- Convenciones de nomenclatura consistentes (
verb-noun.shpara hooks,SKILL.mdpara definiciones de skills) - Verificaciones de calidad comprobables por máquinas (141 pruebas que los agentes ejecutan de forma autónoma)
- Documentación explícita (MEMORY.md, handoffs, docs/) que los agentes leen al inicio de sesión
Cada inversión en legibilidad para agentes se compone a medida que las herramientas de IA se vuelven más capaces.11
Conclusiones clave
Para ingenieros: - Mida su “tiempo por función” a medida que el código crece; si aumenta, tiene entropía; si disminuye, tiene composición - Aplique la regla de tres antes de extraer abstracciones: construya la solución específica dos veces, luego extraiga el patrón reutilizable en la tercera ocurrencia - Invierta el 15-20% de cada sprint en mejoras de infraestructura y herramientas; los retornos compuestos superan el costo de velocidad de funciones a corto plazo en 3-5 sprints
Para gerentes de ingeniería: - Mida la salud de ingeniería por el tiempo de entrega por función a lo largo del tiempo; un tiempo de entrega creciente señala entropía - Trate la documentación y la infraestructura de pruebas como funciones, no como gastos generales; mi inversión en infraestructura de pruebas (2 semanas) ha ahorrado más de 50 horas en 95 hooks
Referencias
-
Métricas de la infraestructura
.claude/del autor: 95 hooks, 44 skills, 14 configs, 141 pruebas. El tiempo de implementación de nuevos hooks disminuyó de 60 min a 10 min en 9 meses. ↩ -
Configuración de deliberación del autor. Umbrales de consenso adaptativos por tarea: seguridad=85%, funciones=80%, refactorización=65%, documentación=50%. ↩
-
MEMORY.md del autor. 54 errores documentados con patrones de aprendizaje entre dominios en bash, Python, CSS y validación HTML. ↩
-
Forsgren, Nicole et al., Accelerate, IT Revolution Press, 2018. Medición de velocidad de ingeniería y composición. ↩
-
Cronología de desarrollo del sitio del autor. Tiempos de construcción de funciones rastreados durante 9 meses de desarrollo. ↩
-
Experiencia de depuración del autor. Colisión de claves de caché i18n documentada en las entradas de error de MEMORY.md. ↩
-
Shipper, Dan, “Compounding Engineering,” Every, 2024. La consistencia como fuerza de composición. ↩
-
Humble, Jez & Farley, David, Continuous Delivery, Addison-Wesley, 2010. ↩
-
Estructura del palacio mental
.claude/del autor. 95 hooks + 44 skills + 14 configs + 54 entradas en MEMORY.md = contexto compuesto para el desarrollo con agentes de IA. ↩ -
Anthropic, “Best Practices for Claude Code,” 2025. ↩
-
Observación del autor sobre patrones de código legibles por agentes. La nomenclatura consistente, las configuraciones JSON y las pruebas verificables por máquinas mejoran la calidad de generación de código por IA. ↩