La Psicología del Código Limpio: Teoría de la Carga Cognitiva aplicada al Software
Por qué escribir código legible no es una cuestión de estética ni de purismo técnico, sino de respetar las limitaciones biológicas de la memoria de trabajo humana. Un recorrido por la teoría de John Sweller y el diseño de APIs.
1. El cuello de botella biológico de la programación
Pasamos aproximadamente el 70% de nuestro tiempo como desarrolladores leyendo, analizando e interpretando código existente, y únicamente un 30% redactando código nuevo. Sin embargo, casi toda la literatura pedagógica tradicional se enfoca en la velocidad de escritura y la sintaxis, pasando por alto el verdadero límite de la ingeniería: la capacidad de procesamiento de la mente humana.
Nuestras herramientas de hardware ejecutan miles de millones de instrucciones por segundo con memoria prácticamente ilimitada. Nuestro cerebro, por el contrario, opera con un ancho de banda biológico sumamente restringido.
En 1956, el psicólogo cognitivo George A. Miller publicó su célebre estudio en Psychological Review: The Magical Number Seven, Plus or Minus Two. En él demostró que la memoria de trabajo (working memory) humana solo puede retener entre cinco y nueve unidades discretas de información (chunks) de manera simultánea. En situaciones de fatiga, estrés o contexto complejo, ese límite desciende a menudo a solo cuatro elementos.
Cada variable mutable innecesaria, cada salto condicional anidado y cada nombre ambiguo que introducimos en una función consume uno de esos valiosos espacios en la memoria del lector.
2. La Teoría de la Carga Cognitiva de John Sweller
Formulada por el psicólogo educativo John Sweller en 1988, la Teoría de la Carga Cognitiva (Cognitive Load Theory) postula que la memoria de trabajo se divide en tres cargas diferenciadas:
1. Carga Cognitiva Intrínseca
Es la complejidad inherente al problema de negocio que estamos resolviendo. Si estamos calculando impuestos transfronterizos o programando un motor de renderizado 3D, esa complejidad no puede eliminarse: es la esencia del problema.
2. Carga Cognitiva Germana
Es el esfuerzo mental positivo dedicado a procesar la información y construir modelos mentales duraderos (esquemas). Es la energía invertida en aprender la arquitectura del sistema y comprender el dominio.
3. Carga Cognitiva Extraña (Extraneous Load) — El enemigo silencioso
Es el esfuerzo mental desperdiciado debido a la mala presentación, diseño defectuoso o complejidad accidental de la información.
En el software, la carga extraña se manifiesta en:
- Nombres de variables crípticos (
usr,tmp2,flagB). - Mutación de estado oculta dentro de funciones que aparentan ser de solo lectura.
- Flujos de control profundamente anidados que obligan al programador a mantener un árbol de condiciones en la cabeza.
// ANTIPATRÓN: Alta carga cognitiva extraña
// El lector debe memorizar el significado de 'ctx', 'flg', qué hace '0.15' y desentrañar anidamientos
function procesar(usr: any, ctx: any, flg: boolean) {
let a = usr.val * 0.15;
if (!flg && ctx.retryCount > 3) {
if (a > 100) {
return a * 0.9;
}
} else if (flg) {
return a * 0.85;
}
return a;
}
Al refactorizar para minimizar la carga extraña, no hacemos el código “más corto”; lo hacemos comprensible sin sobrecarga:
// PATRÓN REFACTORIZADO: Carga extraña minimizada
// El código utiliza tipos explícitos, constantes semánticas y retornos tempranos (Guard Clauses)
const FACTOR_RETENCION_BASE = 0.15;
const LIMITE_REINTENTOS_AUDITORIA = 3;
interface ContextoTransaccion {
numeroReintentos: number;
}
interface UsuarioTransaccion {
saldoOperable: number;
}
function calcularComisionTransaccion(
usuario: UsuarioTransaccion,
contexto: ContextoTransaccion,
esTarifaPreferente: boolean
): number {
const comisionBase = usuario.saldoOperable * FACTOR_RETENCION_BASE;
if (esTarifaPreferente) {
return comisionBase * 0.85;
}
const requiereRevisionReintentos = contexto.numeroReintentos > LIMITE_REINTENTOS_AUDITORIA;
if (requiereRevisionReintentos && comisionBase > 100) {
return comisionBase * 0.90;
}
return comisionBase;
}
3. Principios Ergonómicos para el Diseño de Código
Para diseñar interfaces y bases de código que respeten la psicología humana, los ingenieros deben adoptar tres principios fundamentales:
I. Principio de Menor Sorpresa (POLA - Principle of Least Astonishment)
Una función, método o API debe comportarse de la forma en que el usuario o programador anticiparía intuitivamente. Si un método se llama obtenerUsuario(id), no debe sincronizar datos con un servidor remoto de fondo ni mutar variables globales.
II. Agrupamiento Semántico (Chunking)
Al igual que un número de teléfono de diez dígitos se memoriza mejor agrupado en tres bloques (555-234-890), las funciones deben estructurarse en bloques lógicos claramente demarcados. Si un procedimiento supera las 25 líneas, suele ser indicio de que está combinando niveles de abstracción dispares.
III. Inmutabilidad por Defecto
El estado mutable es la principal fuente de sobrecarga en la memoria de trabajo. Cuando una variable cambia de valor a lo largo de 50 líneas de código, el desarrollador debe rastrear mentalmente en qué estado se encuentra en cada línea. Al utilizar estructuras de datos inmutables y valores constantes (const), esa carga desaparece: el valor definido es el valor final.
4. Conclusiones
La artesanía de software (software craftsmanship) a menudo se ha malinterpretado como un conjunto de dogmas estilísticos. En realidad, las buenas prácticas de programación son soluciones ergonómicas a limitaciones biológicas reales.
Escribir código limpio no es un acto de vanidad para impresionar a otros desarrolladores; es un acto de empatía y respeto hacia la mente humana que deberá leerlo y mantenerlo en el futuro.
5. Referencias y Bibliografía Académica
- Miller, G. A. (1956). The magical number seven, plus or minus two: Some limits on our capacity for processing information. Psychological Review, 63(2), 81–97.
- Sweller, J. (1988). Cognitive load during problem solving: Effects on learning. Cognitive Science, 12(2), 257–285.
- Sweller, J., Ayres, P., & Kalyuga, S. (2011). Cognitive Load Theory. Springer Science & Business Media.
- Martin, R. C. (2008). Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall.
- Raymond, E. S. (2003). The Art of Unix Programming: The Principle of Least Surprise. Addison-Wesley.