¿Cómo se intercambia la elegancia y el rendimiento del código?

Personalmente, creo que hay dos ocasiones en que las preocupaciones de las personas sobre el “rendimiento” están justificadas:

1. Tiempo de ejecución asintótico: el 99% del tiempo esto solo significa asegurarse de que su código no sea O (n ^ 2) cuando debería ser O (n). Incluso optimizar el código O (n log n) en O (n) podría ser excesivo. Ordenar una lista para obtener el tercer elemento más alto generalmente no es gran cosa.

2. Código de biblioteca: si el código va a ser utilizado por una tonelada de personas, o en una tonelada de lugares, entonces sí vale la pena optimizarlo a las características de rendimiento de factor constante.

Pero en general, creo que mucha gente necesita seguir el programa de la Ley de Amdahl. Los accesos a la CPU y la memoria son tan baratos que un factor constante de 10 en algunas funciones basadas en la CPU no tiene un impacto notable en la velocidad general de su programa.

Por otro lado, creo que el valor de la elegancia del código a menudo se pasa por alto. Es muy valioso asegurarse de que el código siga siendo legible y significativo, manteniendo tantos invariantes y convenciones como sea posible, a medida que el proyecto crece en tamaño. Ahorra innumerables horas hombre de tiempo de depuración.

Creo que el equilibrio común de prioridades debe alejarse del llamado rendimiento y hacia la elegancia. Mi empresa utiliza un marco de herencia clásico ridículamente lento para que yo pueda escribir JavaScript nativo hermoso. Mi plan es que si el sitio se vuelve notablemente lento, siempre puedo compilar el JS en JS más optimizado. Pero nunca me comprometeré en escribir código elegante y declarativo, la habilidad más valiosa de un profesional de ingeniería de software.

Inevitablemente, encontrará que el código elegante también es bueno en términos de rendimiento, a menos que use un bucle excesivo, recursividad, etc. La elegancia matemática no equivale a la elegancia algorítmica.

No veo cómo la elegancia del código puede obstaculizar el rendimiento o viceversa. Estos dos no son mutuamente excluyentes. La elegancia del código refleja un diseño adecuado. Rendimiento: la elección correcta de herramientas.