it-swarm-es.com

¿Cómo supera sus propios sesgos de codificación cuando se le entrega código heredado?

Como programadores, a menudo nos enorgullecemos increíblemente de nuestras habilidades y tenemos opiniones muy sólidas sobre lo que es un código "bueno" y un código "malo".

En cualquier momento de nuestras carreras, probablemente hemos tenido algún sistema heredado en nuestras vueltas y pensamos '¡Dios mío, este código apesta!' porque no encajaba en nuestra noción de lo que debería ser un buen código, a pesar de que bien podría haber sido un código perfectamente funcional y mantenible.

¿Cómo te preparas mentalmente cuando intentas entender el trabajo de otro programador?

21
Bryan M.

Para cualquier base de código heredado, la forma correcta de prepararse mentalmente para lidiar con él es comience escribiendo pruebas unitarias para él.

Ya sea que apesta o no, primero debes tener la confianza para poder cambiarlo sin romper cosas.

31
Jeff Atwood

No puedo decirte cuántas veces dije "Oh, esto está totalmente mal", lo reescribí y luego descubrí por las malas por qué ese código se escribió de esa manera. Por lo general, es un requisito no escrito o no documentado que no es obvio. Al menos, eso es cierto en el código heredado en el que estoy trabajando actualmente.

29
Frank Shearar

Espera hasta que haya existido el tiempo suficiente para encontrarse con su propio código heredado de mierda. Es una experiencia de humildad y parte del proceso de aprendizaje. Anhelo el momento en que lo supe todo.

Creo que Fosco tuvo un gran punto en poder ponerlo en el contexto de posibles restricciones de tiempo y funcionalidad. A veces te ves obligado a hacer que algo funcione.

Y por último, comprenda que es por eso que tiene un trabajo.

10
JeffO

Ríase de ello, esfuércese por no juzgarlo demasiado y simplemente supere. No es bueno ser un verdadero code-nazi ... Definitivamente existe algo como "suficientemente bueno" o incluso "suficientemente bueno en ese momento". Hay muchas ocasiones en las que algo se desarrolla o venda para solucionar una crisis, y luego nunca se vuelve a revisar.

Si es realmente malo, vea si puede argumentar para reescribirlo ... si no es importante, simplemente entre y salga.

7
Fosco

Escoge tus batallas. Conozca la diferencia entre "no lo escribiría de esta manera" y "esto crea un serio desafío de mantenimiento o soporte"

7
AShelly

A menudo me resulta útil tener una idea de lo que los desarrolladores originales pensaban que era bueno.

Busque patrones y temas de lo que hicieron y muchas veces encontrará que hubo razones para algunas de las decisiones extrañas en primer lugar.

A veces encuentras que el desarrollador original era realmente malo, pero tienes una idea de qué tipo de cosas malas estaban vendiendo en ese entonces.

De cualquier manera, después de hacer esto, debería tener una mejor idea de dónde podría comenzar una reescritura o cómo se vería una solución rápida sin tener que refactorizar todo.

Lo más importante es que no asuma de inmediato que solo porque es feo es malo. Nada te hace parecer más tonto que dedicar tiempo a modernizar algo solo para descubrir que es menos capaz que el original.

4
Bill

Siempre pienso que el código feo es código que ha tenido muchas depuraciones, con muchas sutilezas que no son evidentes con una inspección superficial. Si lo reemplazo, o lo rediseño profundamente, necesito asegurarme de entender absolutamente todos los aspectos de lo que hace el código. Si no tengo tiempo para llegar al fondo, debo adoptar un enfoque de riesgo mínimo, haciendo el menor cambio posible para lograr mis objetivos.

Por lo general, haré una pequeña corrección/cambio y propondré una característica para un desarrollo posterior que excusaría llegar al fondo de las cosas y refactorizar todo. Luego, hago todo lo posible para ignorar el código hasta que la función termina en la hoja de ruta.

3
Joeri Sebrechts

Cuando el código heredado tiene más de un par de años, es posible que se haya escrito de esa manera debido a limitaciones en el idioma o los sistemas operativos, etc.que existían en el momento en que se escribió el código. Oye, se ve mal ahora, pero ¿estaba mal entonces? Intento asumir que el desarrollador tuvo una razón para lo que hizo. Es posible que esa razón ya no se aplique, pero asumir que hubo una en lugar de solo incompetencia general (los programadores jóvenes pensarán lo mismo sobre su código en 5 años, tal vez incluso menos) lo enoja menos por eso. Si funciona y no hay problemas asociados con él, valore ese código heredado, no importa lo feo que sea, ya que le permitirá resolver problemas más interesantes.

3
HLGEM

Si tengo tiempo lo ataco y mato el código mal escrito.

Es guerra.

3
user1842

A menos que esté preparado para poseer el código y las correcciones necesarias en el futuro, no lo toque. Superarás la tendencia a querer arreglar algo cuando rompas algo que no escribiste porque no lo estudiaste lo suficientemente bien antes de sumergirte, y te lleva 2 días y un simulacro de incendio para que vuelva a funcionar. .

No me malinterpretes ... hay razones legítimas para refactorizar el código, pero si una empresa exige que el código funcione y tú lo "arreglas" sin conocer las consecuencias antes de saltar, estás pidiendo un mundo de dolor. .

1
CokoBWare

En el pasado, cuando no tenía tiempo para mear en el código de otra persona y convertirlo en "mi" estilo, tuve que recurrir a estar muy centrado en las tareas:

¿Qué estoy tratando de agregar a este código/arreglar/hacer que funcione?

¿Lo que estoy haciendo funciona para lograr ese objetivo? Si no, deje de hacerlo y vuelva a la última vez que estaba haciendo cambios orientados a la tarea.

¿Terminé con esta tarea? Si es así, deje de jugar con el código, aunque parezca que fue escrito por un molde marciano no consciente.

1
Alex Feinman

Refactorizar poco a poco puede ser útil, pero tenga mucho cuidado al cambiar cualquier pequeño aspecto de cómo se comporta realmente el código, a menos que comprenda por qué ese comportamiento está ahí y a qué afecta. Desafortunadamente, el código que más lo necesita es a veces el más difícil de cambiar sin tocar el comportamiento, aunque por lo general puede enderezar partes de él, o al menos comentarlo.

1
David Thornley

Con la experiencia viene el juicio para saber cuándo el código es realmente malo y cuándo está escrito en un estilo diferente. Si es perfectamente funcional y se puede mantener y hay una buena cobertura de pruebas automatizadas, entonces no está mal y solo necesita abrir su mente. Probablemente aprenderá algo. El código incorrecto no es funcional ni se puede mantener.

Aquí hay algunos marcadores de código realmente incorrecto:

  • Se han duplicado grandes bloques de lógica en lugar de refactorizado.
  • Dependencias circulares entre clases o paquetes
  • Alto acoplamiento; baja cohesión
  • Variables no utilizadas, escritura en variables que nunca se leen, código inalcanzable.
  • Reimplementación de funciones de biblioteca estándar, p. Ej. formato de fecha.
  • Lógica innecesariamente compleja; es decir, 50 líneas de código donde 10 funcionarían bien.
  • No hay comentarios que describan el propósito de clases o métodos.
  • Comentarios engañosos.

La falta de pruebas automatizadas no significa que el código sea malo, pero significa que el proyecto es malo.

No son cuestión de gustos; estas prácticas encarecen mucho el mantenimiento del programa.

¿Cómo te preparas?

Acepte el hecho de que se necesita un tiempo para poder trabajar con éxito en una nueva base de código. Si es "perfectamente mantenible" y hay una gran cobertura de pruebas, lleva menos tiempo pero no sucederá de inmediato. Si el código es malo, lo primero que hago es advertir a las partes interesadas que está en mal estado y que el progreso inicial será lento. Si son escépticos, respaldo mi afirmación mostrándoles una muestra de problemas en el código real y explicándoles cómo varía de las mejores prácticas de la industria.

0
kevin cline

Estoy trabajando casi exclusivamente en código heredado en estos días y siempre pienso "Oh, mierda% t, ¿qué estaban pensando?" . Entonces empiezo a escribir pruebas unitarias para el código y ese es el punto en el que realmente tengo que analizar el flujo de control y las dependencias.

A veces no es posible escribir fácilmente pruebas unitarias. Pero mientras lo intento, obtengo información sobre el código y entenderé por qué fue escrito como está. A veces, eso demostrará que el código es realmente un desastre, a veces llego a comprender el proceso de pensamiento de los desarrolladores originales y puedo agregar documentación útil o reescribir un fragmento de código cuando quiero agregar una nueva funcionalidad.

Para mí, es útil pensar que mi código se verá igual para mí cuando vuelva a él en 12 meses.

0
cringe