Código: Más allá de la eficiencia, la clave es entenderlo

Fuentes: How Complex is my Code?

Este artículo explora la complejidad del código, yendo más allá de la mera eficiencia computacional para abordar la complejidad desde la perspectiva de la comprensión humana. La complejidad algorítmica tradicional se define como la cantidad de recursos (tiempo, memoria) necesarios para ejecutar un código. Sin embargo, la autora, Sofía Fischer, argumenta que para los desarrolladores, la complejidad cognitiva – la facilidad con la que el código puede ser entendido, mantenido y depurado – es a menudo un factor más crítico que la eficiencia bruta.

Se ilustra con ejemplos de algoritmos de ordenamiento: el insertion_sort (O(n²)) es fácil de entender porque imita la forma intuitiva de ordenar, mientras que el counting_sort (O(n)) es más eficiente pero más difícil de comprender debido a su lógica de creación de una tabla de conteo. La elección de un algoritmo más eficiente podría introducir una complejidad adicional en términos de tiempo de desarrollo, documentación y resolución de problemas.

Fischer introduce el concepto de 'complejidad de código de dominio', donde el tiempo de pensamiento humano y la memoria son recursos más valiosos que la potencia de cálculo. Propone medir la complejidad del código para humanos, reconociendo que las líneas de código son una métrica simplista. Se exploran métricas como la complejidad ciclomática (que cuenta las rutas de ejecución linealmente independientes, correlacionada con la densidad de defectos) y la complejidad de Halstead (que considera el número de operadores y operandos distintos para estimar el esfuerzo mental requerido). La complejidad ciclomática resulta igual para ambos algoritmos de ordenamiento, mientras que Halstead indica que counting_sort es menos cognitivamente complejo, a pesar de tener un mayor 'volumen'.

Finalmente, la autora sugiere que la lingüística, específicamente la psicolingüística, ofrece perspectivas valiosas para comprender la complejidad del código. Factores como la familiaridad de los patrones, la carga de memoria de trabajo (anidamiento de estructuras) y la coherencia (distancia entre declaración y uso de variables) influyen en la facilidad de comprensión. La conclusión es que la medición de la complejidad del código debe ir más allá de las métricas computacionales y considerar la experiencia del desarrollador.