¿Un ingeniero de Google sacrificaría la legibilidad del código por el rendimiento?

Para citar a Donald Knuth: “Los programadores pierden enormes cantidades de tiempo pensando o preocupándose por la velocidad de las partes no críticas de sus programas, y estos intentos de eficiencia en realidad tienen un fuerte impacto negativo cuando se consideran la depuración y el mantenimiento. Deberíamos olvidarnos de eficiencias pequeñas, digamos alrededor del 97% del tiempo: la optimización prematura es la raíz de todo mal. Sin embargo, no debemos dejar pasar nuestras oportunidades en ese crítico 3% “.

Google tiene un riguroso proceso de revisión de código, tiene estrictas guías de estilo y hace mucho énfasis en la legibilidad. También pone mucho énfasis en la eficiencia y la velocidad, porque incluso las optimizaciones modestas pueden valer millones cuando se implementan a escala. Y la mayoría de las veces se puede escribir una solución altamente optimizada en código legible, por lo que este tipo de compensación no es necesaria.

En casos extremos, cuando una solución optimizada no se puede escribir en un código legible, esperaría que se extraiga en una función o módulo separado, y tenga una buena explicación en los comentarios sobre cómo funciona. Durante mi tiempo en Google, he visto fragmentos de código ilegibles en las bibliotecas más críticas para el rendimiento, pero estas son excepciones y no la regla.

Con respecto a su ejemplo, no estoy seguro de por qué la recursividad superaría a la iteración en la legibilidad: la recursividad es un concepto más complejo y generalmente requiere más esfuerzo para comprender su flujo de control.

Una de las señales de un buen programador es saber cuándo optimizar. Siempre está equilibrando el tiempo que lleva escribir el código versus el tiempo que tarda el código en ejecutarse. En la mayoría de los casos, la optimización no importa en absoluto. En algunos casos, es más importante si el código se usa para problemas mayores.

Dicho esto, casi nunca he visto ningún código recursivo en Google. La mayoría de los ingenieros de Google son lo suficientemente inteligentes como para darse cuenta de que la recursión solo está usando un marco de llamada completo para almacenar el estado de su algoritmo, en lugar de algo más razonable, como un int o un vector.