En resumen: depende
En detalles
¿Vas a necesitar las cosas limpias y brillantes?
Hay cosas de las que hay que ser cauteloso aquí, y debe identificar el límite entre lo que es real, la ganancia medible y lo que es solo su preferencia personal y el mal hábito potencial de tocar el código que no debería ser.
Más específicamente, sepa esto:
Es un antipatrón, y viene con problemas integrados:
- que puede ser más extensible , pero no puede ser más fácil de extender,
- que no puede ser más sencillo de entender ,
- Por último, pero definitivamente no menos importante aquí: puede ralentizar todo el código.
Algunos también podrían mencionar el principio KISS como referencia, pero aquí es contra-intuitivo: ¿es la forma optimizada la forma simple o la forma de arquitectura limpia? La respuesta no es necesariamente absoluta, como se explica en el resto a continuación.
El principio YAGNI no es completamente ortogonal con el otro problema, pero ayuda a hacerse la pregunta: ¿lo va a necesitar?
¿La arquitectura más compleja realmente presenta un beneficio para usted, además de dar la apariencia de ser más sostenible?
Escriba esto en un póster grande y cuélguelo junto a su pantalla o en el área de la cocina en el trabajo, o en la sala de reuniones de desarrollo. Por supuesto, hay muchos otros mantras que vale la pena repetir, pero este en particular es importante cada vez que intentas hacer un "trabajo de mantenimiento" y sientes la necesidad de "mejorarlo".
Es natural para nosotros querer "mejorar" el código o incluso simplemente tocarlo, incluso inconscientemente, mientras lo leemos para tratar de entenderlo. Es algo bueno, ya que significa que somos obstinados e intentamos obtener una comprensión más profunda de los aspectos internos, pero también está vinculado a nuestro nivel de habilidad, nuestro conocimiento (¿cómo decide qué es mejor o no? Bueno, consulte las secciones a continuación) ...), y todas las suposiciones que hacemos sobre lo que creemos que conocemos el software ...:
- en realidad lo hace,
- en realidad necesita hacer,
- eventualmente tendrá que hacer,
- y qué tan bien lo hace.
¿Realmente necesita ser optimizado?
Dicho todo esto, ¿por qué se "optimizó" en primer lugar? Dicen que la optimización prematura es la raíz de todo mal, y si ve un código indocumentado y aparentemente optimizado, por lo general, podría suponer que probablemente no siguió las Reglas de optimización que realmente no necesitaba el esfuerzo de optimización y que era solo el la arrogancia habitual de los desarrolladores está empezando. Una vez más, tal vez sea solo tuyo hablando ahora.
Si es así, ¿dentro de qué límites se vuelve aceptable? Si es necesario, este límite existe y le da espacio para mejorar las cosas, o una línea dura para decidir dejarlo ir.
Además, tenga cuidado con las características invisibles. Lo más probable es que su versión "extensible" de este código también acumule más memoria en tiempo de ejecución y presente incluso una mayor huella de memoria estática para el ejecutable. Las características brillantes de OO vienen con costos poco intuitivos como estos, y pueden ser importantes para su programa y el entorno en el que se supone que se ejecuta.
Medida, medida, medida
Como la gente de Google ahora, ¡se trata de datos! Si puede hacer una copia de seguridad con datos, entonces es necesario.
Hay una historia no tan antigua que por cada $ 1 gastado en desarrollo será seguido por al menos $ 1 en pruebas y al menos $ 1 en soporte (pero en realidad, es mucho más).
El cambio impacta muchas cosas:
- es posible que deba producir una nueva compilación;
- debe escribir nuevas pruebas unitarias (definitivamente si no hubiera ninguna, y su arquitectura más extensible probablemente deja espacio para más, ya que tiene más superficie para errores);
- debe escribir nuevas pruebas de rendimiento (para asegurarse de que esto se mantenga estable en el futuro y para ver dónde están los cuellos de botella), y esto es difícil de hacer ;
- necesitará documentarlo (y más extensible significa más espacio para detalles);
- usted (u otra persona) deberá volver a probarlo exhaustivamente en QA;
- el código (casi) nunca está libre de errores, y deberá admitirlo.
Por lo tanto, no es solo el consumo de recursos de hardware (velocidad de ejecución o huella de memoria) lo que necesita medir aquí, sino también el consumo de recursos del equipo . Ambos deben predecirse para definir un objetivo objetivo, medirse, contabilizarse y adaptarse según el desarrollo.
Y para su gerente, eso significa adaptarlo al plan de desarrollo actual, así que comuníquese al respecto y no entre en la furiosa codificación cow-boy / submarine / black-ops.
En general...
Sí, pero...
No me malinterpretes, en general, estaría a favor de hacer por qué sugieres, y a menudo lo defiendo. Pero debe ser consciente del costo a largo plazo.
En un mundo perfecto, es la solución correcta:
- el hardware de la computadora mejora con el tiempo,
- los compiladores y las plataformas de tiempo de ejecución mejoran con el tiempo,
- obtienes código casi perfecto, limpio, fácil de mantener y legible.
En la práctica:
puedes empeorarlo
Necesitas más globos oculares para mirarlo, y cuanto más lo compliques, más globos oculares necesitarás.
no puedes predecir el futuro
No puede saber con absoluta certeza si alguna vez lo necesitará y ni siquiera si las "extensiones" que necesitaría hubieran sido más fáciles y rápidas de implementar en la forma anterior, y si ellos mismos tendrían que estar súper optimizados .
representa, desde la perspectiva de la gerencia, un gran costo sin ganancia directa.
Hazlo parte del proceso
Menciona aquí que es un cambio bastante pequeño, y tiene algunos problemas específicos en mente. Yo diría que generalmente está bien en este caso, pero la mayoría de nosotros también tenemos historias personales de pequeños cambios, ediciones casi quirúrgicas, que eventualmente se convirtieron en pesadillas de mantenimiento y plazos casi vencidos o explotados porque Joe Programmer no vio uno. de las razones detrás del código y tocó algo que no debería haber sido.
Si tiene un proceso para manejar tales decisiones, les quita la ventaja personal:
- Si prueba las cosas correctamente, sabrá más rápido si las cosas están rotas,
- Si los mide, sabrá si mejoraron,
- Si lo revisas, sabrás si ahuyenta a las personas.
La cobertura de prueba, la creación de perfiles y la recopilación de datos son difíciles
Pero, por supuesto, su código de prueba y sus métricas pueden sufrir los mismos problemas que está tratando de evitar para su código real: prueba las cosas correctas, y son lo correcto para el futuro, y mide lo correcto ¿cosas?
Aún así, en general, cuanto más pruebas (hasta cierto límite) y midas, más datos recolectas y más seguro estarás. Mal tiempo de analogía: piense en ello como conducir (o la vida en general): puede ser el mejor conductor del mundo, si el automóvil se descompone o alguien decide suicidarse al conducir con su propio automóvil hoy, su Las habilidades pueden no ser suficientes. Hay dos cosas ambientales que pueden afectarlo, y los errores humanos también importan.
Las revisiones de código son las pruebas de pasillo del equipo de desarrollo
Y creo que la última parte es clave aquí: hacer revisiones de código. No sabrás el valor de tus mejoras si las haces solo. Las revisiones de código son nuestras "pruebas de pasillo": siga la versión de Raymond de la Ley de Linus tanto para detectar errores como para detectar sobre ingeniería y otros antipatrones, y para asegurarse de que el código esté en línea con las habilidades de su equipo. No tiene sentido tener el "mejor" código si nadie más puede entenderlo y mantenerlo, y eso se aplica tanto a las optimizaciones crípticas como a los diseños arquitectónicos profundos de 6 capas.
Como palabras de cierre, recuerde:
Todo el mundo sabe que la depuración es el doble de difícil que escribir un programa en primer lugar. Entonces, si eres tan inteligente como puedes ser cuando lo escribes, ¿cómo lo vas a depurar? - Brian Kernighan