"Conoce tus límites".
El hombre debe conocer sus limitaciones.
Dirty Harry
Consejos de programación para #programadores.
-----------------------------------------------------------------------
LIBRO: 97 COSAS QUE TODO PROGRAMADOR NECESITA SABER.
POR: KEVLIN HENNEY.
-----------------------------------------------------------------------
45° "CONOCE TUS LÍMITES":
Tus recursos son limitados. Tienes un límite de tiempo y dinero para hacer tu trabajo, incluido el tiempo y el dinero necesarios para mantener actualizados tus conocimientos, habilidades y herramientas. Sólo puedes trabajar tan duro, tan rápido, tan inteligentemente y durante tanto tiempo. Tus herramientas son tan poderosas. Las máquinas de tu objetivo no son tan poderosas. Por éso, debes respetar los límites de tus recursos.
¿Cómo respetar esos límites? Conócete a ti mismo, conoce a tu gente, conoce tus presupuestos y conoce tus cosas. Especialmente, como ingeniero de software, conoce la complejidad espacial y temporal de tus estructuras de datos y algoritmos, la arquitectura y características de rendimiento de tus sistemas. Tu trabajo es crear una combinación óptima de software y sistemas.
La complejidad del espacio y el tiempo se da como la función O(f(n)), que para n igual al tamaño de la entrada es el espacio o tiempo asintótico requerido a medida que n crece hasta el infinito. Clases de complejidad importantes para f(n) incluya ln(n), n, n ln(n), ne y en. Como muestra claramente la gráfica de estas funciones, a medida que n crece, O(ln(n)) es mucho más pequeño que O(n) y O(n ln(n)), que son mucho más pequeños que O(ne). yO(es). Como dice Sean Parent, para n alcanzable, toda complejidad las clases equivalen a casi constantes, casi lineales o casi infinitas.
El análisis de la complejidad se mide en términos de una máquina abstracta, pero el software se ejecuta en máquinas reales. Los sistemas informáticos modernos están organizados como jerarquías de máquinas físicas y virtuales, incluidos tiempos de ejecución de lenguajes, sistemas operativos, CPU, memoria caché, memoria de acceso aleatorio, unidades de disco y redes. Esta tabla muestra los límites de tiempo de acceso aleatorio y capacidad de almacenamiento para un servidor en red típico. Tenga en cuenta que la capacidad y la velocidad varían en varios órdenes de magnitud. El almacenamiento en caché y la anticipación se utilizan mucho en todos los niveles de nuestros sistemas para ocultar ésta variación, pero sólo funcionan cuando el acceso es predecible. Cuando los errores de caché son frecuentes, el sistema se verá afectado. Por ejemplo, inspeccionar aleatoriamente cada byte de un disco duro podría llevar 32 años. Incluso inspeccionar aleatoriamente cada byte de la RAM podría llevar 11 minutos. El acceso aleatorio no es predecible. ¿Qué es? Eso depende del sistema, pero volver a acceder a elementos usados recientemente y acceder a elementos de forma secuencial suele ser una victoria.
Recomendado por LinkedIn
Los algoritmos y las estructuras de datos varían en la eficacia con la que utilizan las cachés. Por ejemplo:
• La búsqueda lineal hace un buen uso de la búsqueda anticipada, pero requiere comparaciones O(n).
• La búsqueda binaria de una matriz ordenada requiere sólo comparaciones O(log(n)).
• La búsqueda de un árbol de Van Emde Boas es O(log(n)) y no tiene en cuenta la memoria caché.
¿Cómo escoger? En última instancia, midiendo. La siguiente tabla muestra el tiempo necesario para buscar matrices de enteros de 64 bits mediante estos tres métodos. En mi computadora:
• La búsqueda lineal es competitiva para matrices pequeñas, pero pierde exponencialmente para matrices más grandes.
• van Emde Boas gana sin lugar a dudas gracias a su predecible patrón de acceso.
Tú pagas tu dinero, y tú tomas las decisiones.
-Punch.
-Greg Colvin-