En términos generales, ¿hacia qué tipo de optimizaciones se inclina generalmente cuando diseña software?
¿Eres del tipo que prefiere optimizar tu diseño para
- ¿Tiempo de desarrollo (es decir, rápido de escribir y / o más fácil de mantener)?
- Tiempo de procesamiento
- Espacio de almacenamiento (ya sea RAM, DB, disco, etc.)
Por supuesto, esto es muy subjetivo para el tipo de problemas que se resuelven y los plazos involucrados, por lo que me gustaría saber sobre las razones que lo harían elegir una forma de optimización sobre otra.
design
optimization
Jason Whitehorn
fuente
fuente
Respuestas:
Mantenimiento
Luego perfile si es necesario y optimice la velocidad. Raramente he tenido necesidad de almacenamiento, al menos no en los últimos 10 años. Antes de eso lo hice.
fuente
Tiempo de desarrollo
El procesamiento y el almacenamiento son baratos. Tu tiempo no es
Solo para notar:
Esto no significa hacer un mal trabajo al escribir código solo para terminarlo rápidamente. Significa escribir el código de una manera que facilite el desarrollo rápido. También depende completamente de sus casos de uso. Si se trata de un sitio web simple de dos o tres páginas con un formulario de contacto, probablemente no necesite usar un marco PHP. Un par de incluye y una secuencia de comandos de correo acelerará el desarrollo. Si, en cambio, el plan es crear una plataforma flexible en la que crecer y agregar nuevas características, vale la pena tomarse el tiempo para diseñarla correctamente y codificar en consecuencia, ya que acelerará el desarrollo futuro.
En la comparación directa con el tiempo de procesamiento y el almacenamiento, me inclino hacia un tiempo de desarrollo más rápido. ¿El uso de la función de sustracción collectionutils es el método más rápido y eficiente en cuanto a memoria para restar colecciones? ¡No! Pero es un tiempo de desarrollo más rápido. Si se encuentra con cuellos de botella en el rendimiento o la memoria, puede resolverlos más adelante. Optimizar antes de saber qué necesita ser optimizado es una pérdida de tiempo y eso es lo que estoy defendiendo.
fuente
Experiencia de usuario.
Este es el único valor que le importa a su cliente.
El tiempo de desarrollo es menos importante. Puedo escribir una aplicación de línea de comandos con todas las funciones mucho más rápido que una GUI, pero si la Sra. Jane no puede encontrar la forma de escupir los informes que quiere, es inútil.
El mantenimiento es menos importante. Puedo reparar un balancín muy rápido, pero si está en medio de un bosque, los usuarios no pueden encontrarlo.
El tiempo de procesamiento es menos importante. Si hago un automóvil que va 0 a la velocidad de la luz en 60 segundos, los usuarios no pueden conducir.
La estética es menos importante. Puedo pintar una Mona Lisa, pero si está escondida detrás de una pared, nadie podrá verla.
La experiencia del usuario es el único valor que importa. Hacer una aplicación que haga exactamente lo que el usuario quiere de la manera que el usuario espera es el logro final.
fuente
Solo hay una cosa para optimizar y es:
Lo que quieren tus clientes
¿Sus clientes necesitan el programa más rápido posible? Optimizar para la velocidad.
¿Sus clientes necesitan una fiabilidad absoluta? Optimizar para eso.
¿Lo necesitan entregado mañana o será inútil? Optimizar para la velocidad de desarrollo.
¿Funciona en un dispositivo increíblemente pequeño con recursos limitados? Optimizar para esos recursos.
fuente
Tiempo de procesamiento
El tiempo de mi usuario no es barato. Lo que viene, gira.Acabo de actualizar una aplicación que uso este año pasado. Habían reescrito completamente la aplicación, y vaya que era lenta. Finalmente tuve que comprar una computadora nueva para ejecutarla rápidamente. Te garantizo que no fue barato, pero mi tiempo es más valioso.
fuente
Tiendo a inclinarme hacia la limitación del consumo de memoria y las asignaciones. Sé que es de la vieja escuela, pero:
fuente
Diría que optimizo hacia la eficiencia, y la eficiencia se define como un compromiso entre el tiempo de desarrollo, el mantenimiento futuro, la experiencia del usuario y los recursos consumidos. Como desarrollador, necesita hacer malabarismos con todo esto para mantener algún tipo de equilibrio.
¿Cómo logras ese equilibrio? Bueno, primero debe establecer algunas constantes, como cuál es la fecha límite, en qué hardware se ejecutará su aplicación y qué tipo de persona la usará. Sin saber esto, no puede establecer el equilibrio correcto y priorizar dónde se necesita.
Por ejemplo, si está desarrollando una aplicación de servidor en una máquina poderosa, es posible que desee cambiar la eficiencia del rendimiento para asegurarse de cumplir con una fecha límite inamovible. Sin embargo, si su desarrollador tiene una aplicación que necesita responder rápidamente a la entrada del usuario (piense en un videojuego), entonces debe priorizar su rutina de entrada para asegurarse de que no sea lenta.
fuente
Cualquier tecnología de virtualización que esté usando
¿Recuerdas los días en que los sistemas con más de 512 MB de RAM se consideraban de última generación? Me paso los días escribiendo código para el anterior.
Trabajo principalmente en programas de bajo nivel que se ejecutan en el dominio privilegiado en un entorno Xen. Nuestro límite máximo para el dominio privilegiado es de 512 MB, dejando el resto de la RAM libre para que nuestros clientes la utilicen. También es típico que limitemos el dominio privilegiado a un solo núcleo de CPU.
Así que aquí estoy, escribiendo código que se ejecutará en un nuevo servidor de $ 6k, y cada programa tiene que funcionar (idealmente) dentro de un límite máximo asignado de 100kb, o evitar completamente la asignación de memoria dinámica.
De manera concisa, optimizo para:
También tengo que ser extremadamente diligente cuando se trata de pasar tiempo esperando cerraduras, esperando E / S o simplemente esperando en general. Una gran parte de mi tiempo se destina a mejorar las bibliotecas de sockets no bloqueantes existentes y a buscar métodos más prácticos de programación sin bloqueo.
Todos los días me parece un poco irónico que esté escribiendo un código tal como lo hice hace 15 años, en sistemas que se compraron el mes pasado, debido a los avances tecnológicos.
Esto también es típico para cualquiera que trabaje en plataformas integradas, aunque incluso muchos de ellos tienen al menos 1 GB a su disposición. Como Jason señala, también es típico cuando se escriben programas para ejecutarse en dispositivos móviles. La lista continúa, quioscos, clientes ligeros, marcos de cuadros, etc.
Estoy empezando a pensar que las restricciones de hardware realmente separan a los programadores de las personas que pueden hacer que algo funcione sin importar lo que realmente consuma. Me preocupa (si es necesario, vóteme) qué lenguajes que resumen completamente el tipo y la comprobación de memoria al conjunto colectivo de sentido común que (solía) compartirse entre programadores de diversas disciplinas.
fuente
Resultados de la investigacion
Como académico, pensé que debería compartir lo que optimizo. Tenga en cuenta que esto no es lo mismo que optimizar para un tiempo de desarrollo más corto. A menudo significa que el trabajo podría respaldar algunas preguntas de investigación, pero no ser un producto entregado y pulido. Esto podría verse como un problema con la calidad, y podría explicar por qué muchos dicen que los informáticos (académicos) no tienen ninguna experiencia del "mundo real". (Por ejemplo, "¿No sabrían cómo desarrollar un producto entregable de otra manera?" )
Es una línea muy fina. En términos de impacto, desea que su trabajo sea utilizado y citado por otros, y el efecto Iceberg de Joel entra en juego: un poco de brillo y brillo puede ser muy útil. Pero si no está haciendo una base para otros proyectos sobre los que se pueda construir, es posible que no pueda justificar el tiempo dedicado a hacer un producto entregable.
fuente
... después de eso todo lo demás
... finalmente, optimiza el rendimiento ;-)
fuente
Calidad / Pruebas
Optimice hacia la calidad, como para garantizar que haya tiempo en el cronograma de desarrollo para las pruebas, tanto las pruebas unitarias como las pruebas después de las características / fases.
fuente
Depende de la necesidad de su programa.
La mayor parte de lo que hago está fuertemente limitado por la capacidad de procesamiento y la memoria, pero no pasa por muchos, si es que hay alguno, cambios significativos en el año promedio.
En el pasado he trabajado en proyectos donde el código se cambia con frecuencia, por lo que la mantenibilidad se vuelve más importante en esos casos.
También he trabajado en sistemas en el pasado donde la cantidad de datos es el problema más importante, incluso en el disco para el almacenamiento, pero más comúnmente el tamaño se convierte en un problema cuando tienes que mover los datos mucho o demasiado lento enlace.
fuente
Elegancia .
Si su código está bien diseñado, tendrá varios efectos:
fuente
Tiempo de desarrollo, absolutamente. También optimizo para el ancho de banda, pero no voy a binario.
fuente
Como realizo instalaciones en varios tipos de sistemas, desde mainframe de IBM hasta PC, primero optimizo la compatibilidad, luego el tamaño y luego la velocidad.
fuente
Depende
Si está trabajando en un sistema de procesamiento de video incorporado en tiempo real, entonces optimiza la velocidad de procesamiento. Si está trabajando en un procesador de textos, optimiza el tiempo de desarrollo.
Sin embargo, en todos los casos su código debe funcionar y debe ser mantenible.
fuente
Expresividad de mi intento.
Quiero que alguien que lea mi código pueda ver fácilmente qué operaciones estaba intentando invocar en el dominio. Del mismo modo, trato de minimizar la basura no semántica (llaves, palabras clave de 'función' en js, etc.) para facilitar el escaneo.
Por supuesto, tienes que equilibrar eso por mantenibilidad. Me encanta escribir funciones que devuelven funciones y todo tipo de técnicas avanzadas y HACEN aún más mi objetivo, pero si el beneficio es leve, me equivocaré al apegarme a las técnicas con las que los programadores sólidos de jr estarían familiarizados.
fuente
Todos ellos
Tiempo de procesamiento
Las computadoras de hoy son rápidas, pero lejos de lo que es suficiente. Hay muchas situaciones en las que el rendimiento es crítico, si haces servidores de transmisión de medios.
Almacenamiento
Su cliente podría tener un disco grande, digamos, 1Tb. ¿Qué puede ocupar 1000 películas en HD? Si quieres que sea un servicio, está lejos de ser suficiente, ¿no?
Tiempo de desarrollo
Bueno, no estoy seguro de si esto cuenta como "optimización", lo que hago es usar Java en lugar de C ++, y el desarrollo es 10 veces más rápido. Siento que estoy diciendo lo que pienso directamente a la computadora, muy directamente adelante y totalmente rocas!
Por cierto, creo que para acelerar el desarrollo de su proceso de desarrollo, debe elegir Java, nunca intente basura como Python ... lo que afirma que pueden acortar el tiempo de desarrollo.
fuente