¿Cómo lidiar con conceptos erróneos sobre "la optimización prematura es la raíz de todo mal"?

26

Me he encontrado con muchas personas que están dogmáticamente en contra de cualquier cosa que pueda considerarse "optimización" en el sentido general de la palabra en el idioma inglés, y muy a menudo citan textualmente la cita (parcial) "la optimización prematura es la raíz de todo mal". como justificación de su postura, lo que implica que interpretan lo que estoy hablando como "optimización prematura". Sin embargo, estas opiniones a veces están tan ridículamente arraigadas que descartan casi cualquier tipo de desviaciones algorítmicas o de estructura de datos de la implementación "ingenua" más pura ... o al menos cualquier desviación de la forma en que han hecho las cosas antes.¿Cómo puede uno acercarse a las personas de esta manera para que vuelvan a "abrir los oídos" después de dejar de escuchar sobre "rendimiento" u "optimización"? ¿Cómo discuto un tema de diseño / implementación que tiene un impacto en el rendimiento sin que la gente piense instantáneamente: "Este tipo quiere pasar dos semanas en diez líneas de código?"

Ahora, la postura de si "toda la optimización es prematura y, por lo tanto, malvada" o no ya se ha cubierto aquí , así como en otros rincones de la Web , y ya se ha discutido cómo reconocer cuándo la optimización es prematura y, por lo tanto , mala , pero desafortunadamente todavía hay personas en el mundo real que no están tan abiertas a los desafíos a su fe en Anti-Optimization.

Intentos anteriores

Algunas veces, he intentado proporcionar la cita completa de Donald Knuth para explicar que "la optimización prematura es mala" ↛ "toda la optimización es mala":

Deberíamos olvidarnos de las pequeñas eficiencias, 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%.

Sin embargo, al proporcionar la cotización completa, estas personas a veces se convencen más de que lo que estoy haciendo es Optimización Prematura ™ y profundizan y se niegan a escuchar. Es casi como si la palabra "optimización" los asustara: en un par de ocasiones, pude proponer cambios reales en el código para mejorar el rendimiento sin que fueran vetados simplemente evitando el uso de la palabra "optimiz (e | ation)" ( y "rendimiento" también, esa palabra también da miedo) y en su lugar usa alguna expresión como "arquitectura alternativa" o "implementación mejorada". Por esta razón, realmente parece que esto realmente es dogmatismo y no ellos, de hecho, evalúan lo que digo críticamente y luego lo descartan como no necesario y / o demasiado costoso.

errante
fuente
10
Bueno, la última vez que tuvo esa discusión, ¿realmente midió que el rendimiento sería malo para la implementación más pura e ingenua? ¿O, al menos, hizo una estimación aproximada sobre el tiempo de ejecución esperado? Si no, esas otras personas podrían haber sido completamente correctas con su opinión, no tiene forma de saberlo.
Doc Brown
12
@errantlinguist: Si el programa realmente es "lento como la melaza", entonces claramente deberías ser capaz de detectar fácilmente el "3% crítico" de Knuth y, por lo tanto, superar cualquier argumento en contra de optimizarlo. Y si no puede detectar eso ... entonces aún no ha hecho su tarea y aún no está listo para optimizar. Entonces no está claro dónde está el problema.
Nicol Bolas
66
@errantlinguist: si presentó evidencia de que esa sección del código es un problema de rendimiento significativo para la aplicación, y la aplicación en su conjunto fue más lenta de lo necesario, y aún así negaron la necesidad de modificar el código, entonces no No importa Se trata de personas que son insensibles al razonamiento basado en la evidencia y, por lo tanto, no son razonables.
Nicol Bolas
66
@errantlinguist: La pregunta clave: ¿se quejaban los clientes de que la aplicación en esa área era lenta?
Gort the Robot el
55
Estoy votando para cerrar porque OP claramente solo busca a alguien para validar una opinión, en lugar de una respuesta a una pregunta real. No creo que esto (o deba) permanecer abierto en Workplace.SE tampoco.
BlueRaja - Danny Pflughoeft

Respuestas:

35

Parece que está buscando atajos para no probar primero la "implementación más pura e ingenua" e implementar directamente una "solución más sofisticada porque sabe de antemano que la implementación ingenua no lo hará". Desafortunadamente, esto rara vez funcionará: cuando no tiene hechos concretos o argumentos técnicos para demostrar que la implementación ingenua es o será demasiado lenta, lo más probable es que esté equivocado, y lo que está haciendo es la optimización prematura. Y tratar de discutir con Knuth es lo contrario de tener un hecho difícil.

En mi experiencia, tendrá que morder la bala e intentar primero la "implementación ingenua" (y probablemente se sorprenderá de la frecuencia con que esto es lo suficientemente rápido), o al menos hará una estimación aproximada sobre el tiempo de ejecución, como:

"La implementación ingenua será O (n³), yn es mayor que 100.000; eso se ejecutará algunos días, mientras que la implementación no tan ingenua se ejecutará en O (n), lo que tomará solo unos minutos" .

Solo con tales argumentos a mano puede estar seguro de que su optimización no es prematura.

En mi humilde opinión, solo hay una excepción : cuando la solución más rápida es también la más simple y limpia, entonces debe usar la solución más rápida desde el principio. El ejemplo estándar es el de usar un diccionario en lugar de una lista para evitar el código de bucle innecesario para las búsquedas, o el uso de una buena consulta SQL que le proporciona exactamente el único registro de resultados que necesita, en lugar de un gran conjunto de resultados que debe ser luego filtrado en código. Si tiene un caso así, no discuta sobre el rendimiento- el rendimiento puede ser un beneficio adicional, pero muy probablemente irrelevante, y cuando lo mencionas, la gente podría verse tentada a usar Knuth en tu contra. Discuta sobre la legibilidad, el código más corto, el código más limpio, la capacidad de mantenimiento: no es necesario "enmascarar" nada aquí, sino porque esos (y solo esos) son los argumentos correctos aquí.

Según mi experiencia, el último caso es raro: el caso más típico es que uno puede implementar primero una solución simple e ingenua que sea mejor comprensible y menos propensa a errores que una más complicada, pero probablemente más rápida.

Y, por supuesto, debe conocer los requisitos y el caso de uso lo suficientemente bien como para saber qué rendimiento es aceptable y cuándo las cosas se vuelven "demasiado lentas" a los ojos de sus usuarios. En un mundo ideal, obtendría una especificación formal de rendimiento por parte de su cliente, pero en proyectos del mundo real, el rendimiento requerido es a menudo un área gris, algo que sus usuarios solo le dirán cuando noten que el programa se comporta "demasiado lento" en la producción. Y a menudo, esa es la única forma de averiguar cuándo algo es demasiado lento: los comentarios de los usuarios y luego no es necesario citar a Knuth para convencer a sus compañeros de equipo de que su "implementación ingenua" no fue suficiente.

Doc Brown
fuente
15
@errantlinguist: ¿tal vez no me hice claro, o simplemente no es lo que quería escuchar? Mi consejo es: no intentes usar * argumentos filosóficos "de Knuth sobre" 3% "o" 97% ". Manténgalo en los hechos, de lo contrario sus colegas probablemente tengan razón en que sus argumentos de desempeño son inapropiados.
Doc Brown
44
@errantlinguist: en el caso que describió en su comentario a la respuesta de Karl Bielefeld, parece que tiene todos los argumentos de su lado sin la necesidad de usar el "rendimiento". Yo iría un paso más allá y diría que si discute sobre el desempeño en tal caso, comete un tremendo error, porque sus colegas tienen razón: el desempeño generalmente no importa allí. Discuta sobre simplicidad, legibilidad, facilidad de mantenimiento, menos líneas de código, pero no (!) Sobre rendimiento, ni siquiera como nota al margen. No les ofrezcas la posibilidad de usar Knuth contra ti.
Doc Brown
2
@errantlinguist: no lo entierre : ponga esos aspectos en foco, cuando sea correcto que esos aspectos deberían estar enfocados, y no use el rendimiento como argumento cuando no pueda probar que eso hace una diferencia importante para el usuario final.
Doc Brown
2
@errantlinguist: No estoy seguro de cómo llegar a esa conclusión. La respuesta de Doc Brown parece perfectamente clara: corta estos argumentos improductivos que tiene con sus colegas al apegarse a declaraciones objetivas sobre lo que es y lo que no es un rendimiento aceptable.
jl6
1
Este es un buen consejo para la programación en el pequeño, pero ignorar las preguntas de rendimiento a nivel de diseño arquitectónico puede llevar a un equipo a un largo callejón sin salida, porque podría hacer mucho antes de que se vea obligado a enfrentar el problema, y no hay garantía de que gran parte de ese trabajo sea reutilizable cuando el problema es arquitectónico (lo he visto matar un producto). Sé que tiene una excepción en su respuesta, pero para saber si se aplica, aún tiene que hacer la pregunta. , e incluso hacer la pregunta es aparentemente un anatema para los compañeros de trabajo de errantlinguist.
sdenham
18

Pregúntate esto:

  • ¿El software NO cumple con las especificaciones de rendimiento?
  • ¿Tiene el software un problema de rendimiento?

Estas son razones para optimizar. Entonces, si las personas se oponen, solo muéstreles la especificación y regrese a ellos y explique que necesitamos optimizar porque no estamos cumpliendo con las especificaciones. Aparte de eso, uno tendría dificultades para convencer a otros de que la optimización es necesaria.

Creo que el punto principal de la cita es que, si no tiene un problema, no realice una optimización innecesaria ya que el tiempo y la energía podrían gastarse en otro lugar. Desde una perspectiva empresarial, esto tiene mucho sentido.

Secundario, para aquellos que temen la optimización, siempre respalden los resultados de rendimiento con métricas. ¿Cuánto más rápido es el código? ¿Cuánto mejoró el rendimiento con respecto al anterior? Si uno pasara dos semanas solo para mejorar el código en un 2% con respecto a la versión anterior, si yo fuera su jefe, no sería feliz. Esas dos semanas podrían haberse dedicado a implementar una nueva característica que podría atraer a más clientes y ganar más dinero.

Finalmente, la mayoría del software no tiene que estar altamente optimizado. Solo en unas pocas industrias especializadas la velocidad es realmente importante. Por lo tanto, la mayoría de las veces uno puede usar bibliotecas y marcos preexistentes con buenos resultados.

Jon Raynor
fuente
44
Si bien es una buena información, esto en realidad no responde a mi pregunta sobre cómo trabajar con personas que interrumpen una discusión en el momento en que tiene que ver con el rendimiento.
errantlinguist
77
Estoy de acuerdo con todo esto, excepto "Solo en unas pocas industrias especializadas la velocidad es realmente importante". Creo que subestimas la cantidad de software que tiene problemas de rendimiento desde la perspectiva del cliente.
Gort the Robot
@StevenBurnap: Sí, ¿hay aplicaciones web en la naturaleza que en realidad no sean lentas? Me gustaría ver una en la ciencia.
errantlinguist
1
google.com es bastante rápido. :-P
Gort the Robot
Intente usar google.com en una conexión móvil EDGE. Sí, ese es un caso ridículo, pero definitivamente no será bastante rápido . ;) (Juego de palabras en realidad no intencionado-- realmente)
errantlinguist
7

¿Cómo trabajar con personas que bloquean una discusión en el momento que tiene que ver con el rendimiento?

Comience con principios compartidos que se basan en la dirección estratégica de su grupo.

Mis principios:

Mis principios personales en la escritura de código son primero apuntar a la corrección en mi programa, luego perfilarlo y determinar si necesita optimización. Yo mismo perfilo mi código porque otros programadores son consumidores potenciales de mi código, y no lo usarán si es lento, por lo tanto, para mi código, la velocidad es una característica.

Si sus consumidores son clientes, sus clientes le dirán si necesita un código más rápido.

Sin embargo, hay opciones conocidas y demostrablemente mejores en el código que uno puede hacer. Prefiero hacerlo bien en mi primer borrador por varias razones:

  1. Si lo hago bien la primera vez, entonces puedo olvidarme de la implementación (aprovechando la ocultación de información), y no abarroto mi código con TODOs.
  2. Otros (particularmente aquellos que solo aprenden en el trabajo) lo ven hecho de la manera correcta, y aprenden y usan el mismo estilo de código en el futuro. Por el contrario, si me ven hacerlo de la manera incorrecta, también lo harán de la manera incorrecta.

Asumir que la necesidad de optimización es correcta

Asumiendo que esta es una parte verdaderamente importante de su código que necesita optimización, podría contar la parábola de Schlemiel el pintor , o enfatizar el resto de la cita:

"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 pequeñas eficiencias, digamos acerca de 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% ". - Donald Knuth

Sopesar los costos de la complejidad adicional.

A veces hay un costo real en términos de mantenibilidad de la complejidad añadida. En este caso, puede mantener la implementación secundaria en una función o subclase diferente, y aplicarle las mismas pruebas unitarias para que no haya dudas de que es correcta. Más tarde, si perfila su código y encuentra que la implementación ingenua es un cuello de botella, puede cambiar su código optimizado y mejorar su programa de manera demostrable.

Liderazgo

A veces, el problema es el ego: algunas personas prefieren usar un código subóptimo o defectuoso antes de que alguien más tenga más razón de lo que ellos son. Probablemente quieras evitar trabajar con estas personas.

El liderazgo, especialmente cuando no tienes autoridad posicional sobre las personas, consiste en hacer sugerencias razonables y guiar a otros a un consenso. Si no puede guiar a su equipo a una reunión de las mentes, quizás no valga la pena presionar el asunto. Probablemente hay peces más grandes para freír.

Aaron Hall
fuente
6

El camino a seguir es olvidarse de la cita real y las diversas interpretaciones: es dogmatismo de cualquier manera enfocarse tanto en una cita específica de un gurú. ¿Quién dice que Knuth siempre tiene razón de todos modos?

En lugar de eso, enfóquese en el proyecto en cuestión, el software que está desarrollando junto con los colegas con los que no está de acuerdo. ¿Cuáles son los requisitos para un rendimiento aceptable para este software? ¿Es más lento que esto? Entonces optimiza.

No tiene que llamarlo "optimización", puede llamarlo "corregir un error", ya que, por definición, es un error si la implementación no cumple con los requisitos.

En términos más generales, hay dos posibilidades con respecto a las optimizaciones:

  1. El código optimizado también es más corto, más simple de entender y más fácil de mantener.

  2. El código optimizado es más complejo de entender, lleva más tiempo escribirlo y probarlo, o sería más complejo cambiarlo en el futuro si los requisitos cambian de manera inesperada.

Si el caso es (1), ni siquiera tiene que discutir sobre la optimización. Pero si (2) es el caso, entonces está tomando una decisión de compensación . Esta es en realidad una decisión de nivel empresarial, no puramente una decisión técnica. Debe sopesar el costo de la optimización contra el beneficio. Para que haya incluso un beneficio, la ineficiencia tiene que ser un problema en primer lugar, ya sea como mala experiencia del usuario o aumento significativo del costo del hardware u otros recursos.

JacquesB
fuente
Bueno, estoy totalmente de acuerdo con tu oración inicial. Sin embargo, estoy bastante seguro de que una pieza de software puede ser "molestamente lenta para el caso de uso previsto" sin tener los requisitos de rendimiento especificados explícitamente de manera formal.
Doc Brown
@DocBrown: Por supuesto, pero en cualquier caso es el cliente quien decide si es demasiado lento o no, no el desarrollador.
JacquesB
Nunca me he encontrado con requisitos empresariales que explícitamente indiquen requisitos de rendimiento.
errantlinguist
@errantlinguist: En mi experiencia, es bastante común en negocios centrados en el cliente como las tiendas en línea. Pero para las herramientas y aplicaciones para uso interno en una empresa, la experiencia del usuario generalmente no es una preocupación para el propietario del proyecto.
JacquesB
4

Creo que la cita completa en contexto es instructiva. Copiaré de una publicación que hice en Reddit sobre el tema:

No hay duda de que el grial de la eficiencia conduce al abuso. 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 las pequeñas eficiencias, 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%. Un buen programador no se dejará llevar por la complacencia por tal razonamiento, será sabio al mirar cuidadosamente el código crítico; pero solo después de que se haya identificado ese código.

- Donald Knuth, Programación estructurada con ir a declaraciones , Encuestas de computación de ACM, Vol. 6, No. 4, diciembre de 1974, p.268

El punto, y la implicación, es que hay cosas más importantes de las que preocuparse que poner su atención en la optimización demasiado pronto. Ciertamente, debe considerar cuidadosamente sus estructuras de datos y algoritmos (esto está en el 3%), pero no debe preocuparse por si la resta es más rápida que el módulo (esto está en el 97%) hasta que quede claro que la optimización de bajo nivel es necesario.

Lo primero no es necesariamente optimización en el sentido en que piensan sus colegas, pero es optimización en el sentido de que los algoritmos y estructuras de datos mal elegidos son subóptimos.

Greyfade
fuente
2
Podría agregarse que Knuth claramente no cree que analizar la complejidad temporal de los algoritmos y tomar decisiones de diseño sobre esa base sea una optimización prematura.
sdenham
3

En mi experiencia, si obtienes este tipo de oposición a la optimización regularmente , la gente no se queja realmente de la optimización. Se quejan de lo que está sacrificando en nombre de la optimización. Esto suele ser legibilidad, mantenibilidad o puntualidad. Si su código se entrega en la misma cantidad de tiempo y es igual de fácil de entender, a la gente no le importaría menos si está utilizando estructuras de datos y algoritmos más eficientes. Mi sugerencia en este caso es trabajar para que su código sea más elegante y fácil de mantener.

Si está obteniendo este tipo de oposición con respecto al código de otras personas, generalmente es porque está sugiriendo una cantidad significativa de retrabajo. En esos casos, realmente necesita algunas mediciones reales para demostrar que vale la pena el esfuerzo, o tal vez intente involucrarse más temprano en la fase de diseño, antes de escribir el código. En otras palabras, debes demostrar que está en el 3%. Si reescribiéramos todo el código que no era exactamente como nos gustaba, nunca lograríamos nada.

Karl Bielefeldt
fuente
Desafortunadamente, en realidad hice el caso opuesto, donde uso, por ejemplo, un Dequede la biblioteca estándar de Java para reemplazar una gran cantidad de lógica construida alrededor de una ArrayListutilizada como una pila mientras trabajo en el código ... y esto fue marcado para cambio en la revisión. En otras palabras, el revisor quería tener más código, que también es más lento y más propenso a errores porque no estaba familiarizado Deque.
errantlinguist
3
No estar dispuesto a aprender algo que ha estado en su idioma durante 10 años es una actitud tóxica para un programador y un problema mucho más profundo de lo que describió originalmente. Personalmente, en esa situación, rechazaría el consejo y lo enviaría a la gerencia si fuera necesario.
Karl Bielefeldt
55
@errantlinguist: cuando su revisor sugirió una solución claramente peor (que significa más complicada) como reemplazo de una solución limpia y simple, debe discutir sobre eso. ¡No discutas sobre el rendimiento! En serio, nunca uses la palabra "rendimiento" en esa discusión. Discuta solo sobre legibilidad y mantenibilidad. Y si el revisor insiste en su código incorrecto, escale.
Doc Brown
+1 No estoy seguro de por qué esta respuesta tiene votos negativos en lugar de votos positivos, además de ser la respuesta aceptada. Sugiere una forma de manejar el problema, además de un análisis de cuál podría ser el verdadero problema subyacente (es decir, que nadie quiere que se le diga que su código debe ser reescrito radicalmente).
Andres F.
2

De hecho, hay muchos malentendidos sobre esta cita, por lo que es mejor dar un paso atrás y ver cuál es el problema real. El problema no es tanto que nunca debas "optimizar". Es que "optimizar" nunca es una tarea que debe hacer. Nunca debes levantarte por la mañana y decirte a ti mismo "¡Hola, hoy debería optimizar el código!".

Esto lleva a un esfuerzo perdido. Simplemente mirando el código y diciendo "¡Puedo hacerlo más rápido!" conduce a un gran esfuerzo para hacer algo más rápido que fue lo suficientemente rápido en primer lugar. Puede que te enorgullezca decirte a ti mismo que hiciste un poco de código cuatro veces más rápido, pero si ese código fue un cálculo que sucedió al presionar un botón, y tomó 10 ms en primer lugar antes de mostrarlo a un usuario humano, nadie va a importar un bledo

Ese es el "prematuro" en "optimización prematura". ¿Cuándo no es "prematuro"? Cuando los clientes te digan "esto es demasiado lento, ¡arréglalo!" Ahí es cuando cavas el código e intentas hacerlo más rápido.

Esto no significa que debas apagar tu cerebro. No significa que deba mantener 10,000 registros de clientes en una lista vinculada individualmente. Siempre debe comprender los impactos en el rendimiento de lo que hace en mente y actuar en consecuencia. Pero la idea es que no estás gastando tiempo extra deliberadamente tratando de hacerlo más rápido. Simplemente está eligiendo la opción más eficiente de otras opciones iguales.

Gort the Robot
fuente
Esto no significa que debas apagar tu cerebro. No significa que deba mantener 10,000 registros de clientes en una lista vinculada individualmente. > Si bien estoy de acuerdo con usted al 100% en eso, en realidad he visto listas enlazadas que se usan de esa manera, y me dijeron "no tocarlo".
errantlinguist
Si bien es una buena información, esto en realidad no responde a mi pregunta sobre cómo trabajar con personas que interrumpen una discusión en el momento en que tiene que ver con el rendimiento.
errantlinguist
3
Lamentablemente, la cuestión de la "lista individualmente vinculada" no fue un ejemplo aleatorio sino algo con lo que me encontré personalmente.
Gort the Robot el
1

Puedes hacer las cosas de la manera incorrecta o hacer las cosas de la manera correcta.

A menudo, las cosas se hacen de la manera incorrecta y el código se refactoriza para que se haga de la manera correcta. Si va a escribir un código nuevo, y sabe que puede hacer las cosas de la manera correcta sin una penalización importante, simplemente me equivocaría al hacerlo de la manera correcta. (Tenga en cuenta que, después de las pruebas de rendimiento, etc., es posible que algunas cosas necesiten cambiar, pero está bien. Alternativamente, una implementación completamente ingenua rara vez, si alguna vez, es correcta).

No es necesariamente una optimización prematura si a) sabe que ayudará en el futuro ob) sabe que el camino subóptimo conducirá a problemas en el futuro. Es como un juego de ajedrez, de verdad.

Creo que la gente tenderá a querer hacer las cosas bien, en lugar de hacerlas mal. Use esto cuando discuta estrategias alternativas con sus compañeros.

almuerzo317
fuente
55
Nunca hay "el camino equivocado" o "el camino correcto". En general, hay un número infinito de formas que se ejecutan en un continuo desde "Dios mío, ¿cómo funciona esto?" a "John Carmack y Donald Knuth no pudieron mejorar esto mientras programaban parejas".
Gort the Robot
@StevenBurnap Esto es cierto. Sin embargo, creo que para las personas, generalmente hay algunas formas correctas y muchas formas incorrectas. (A medida que nos convertimos en mejores programadores, ese espectro comienza a cambiar: nuestras viejas "formas correctas" a veces pueden convertirse en nuestras nuevas "formas incorrectas", mientras que nuestras nuevas formas correctas son mejores que las viejas). Creo que es bueno hacer las cosas la mejor y más correcta manera posible para ti . Esto nos lleva a ser mejores programadores, a ser mejores compañeros de equipo (¡la tutoría importa!) Y a escribir un mejor código.
lunchmeat317
" Creo que la gente tenderá a querer hacer las cosas bien, en lugar de hacerlas mal ". El problema es que hay opiniones muy diferentes sobre lo que está bien o mal. Algunos incluso comienzan guerras santas al respecto (en el sentido literal).
JensG
1

Esto parece un problema de comunicación y no un problema de programación. Intenta entender por qué las personas sienten lo que sienten y trata de cristalizar por qué crees que tu camino sería mejor. Cuando haya hecho eso, no comience un argumento de confrontación en el que su objetivo sea decirles a los demás por qué están equivocados y usted tiene razón. Explica tus pensamientos y sentimientos y deja que la gente reaccione a eso. Si no puede llegar a ningún tipo de consenso y siente que este es un problema realmente crítico, entonces probablemente tenga algunos problemas serios en el equipo en general.

Más centrado en la programación real, no pierda el tiempo en largas discusiones sobre algo que simplemente tiene una intuición es "más rápido". Si ve a alguien que escribe un método que se llama una vez por solicitud en una aplicación web y tiene una complejidad de tiempo O (n ^ 2) cuando SABE que realmente es un problema de tiempo O (log (n)), entonces seguro, si es así un obvio, adelante.

Sin embargo, tenga en cuenta que, como humanos, los programadores somos realmente malos (y me refiero a HORRIBLE) al adivinar qué partes de nuestras aplicaciones tendrán un cuello de botella. Eric Lippert escribe sobre este interesante tema en esta publicación de blog. Siempre favorece la mantenibilidad. Cualquier problema de rendimiento que finalmente se encuentre se puede solucionar fácilmente (bueno, relativamente) cuando tenga más información.

sara
fuente
Edité la respuesta y desarrollé un poco más las cosas, ¿podría el votante agregar algún comentario? :)
sara
Aunque no soy el votante negativo, su primer párrafo es perfecto para abordar la pregunta en cuestión, pero el resto en realidad no responde mi pregunta sobre cómo trabajar con personas que bloquean una discusión en el momento en que tiene que ver con el rendimiento (aunque sigue siendo un buen consejo).
errantlinguist
Básicamente, lo que quiero transmitir en los últimos dos párrafos es "esas optimizaciones podrían no importar". en ese caso, es mejor elegir tus peleas.
sara