¿Hay alguna manera de evitar el código espagueti a lo largo de los años? [cerrado]


He tenido varios trabajos de programación. Cada uno con 20-50 desarrolladores, proyecto pasando por 3-5 años.

Cada vez es lo mismo. Algunos programadores son brillantes, otros son promedio. Todo el mundo tiene su título CS, todos leen patrones de diseño. Las intenciones son buenas, la gente está tratando de escribir un buen código, pero todavía después de un par de años el código se convierte en espaguetis. Los cambios en el módulo A rompen repentinamente el módulo B. Siempre hay estas partes del código que nadie puede entender excepto para la persona que lo escribió. Cambiar la infraestructura es imposible y los problemas de compatibilidad con versiones anteriores impiden que se introduzcan buenas características. La mitad del tiempo solo quieres reescribir todo desde cero.

Y las personas con más experiencia que yo tratan esto como algo normal. Es? ¿Tiene que serlo? ¿Qué puedo hacer para evitar esto o debo aceptarlo como un hecho de la vida?

Editar: Chicos, estoy impresionado con la cantidad y la calidad de las respuestas aquí. Este sitio y su comunidad rock!

Author: skaffman, 2008-12-16

19 answers

La diligencia despiadada combinada con pruebas unitarias constantes es la única manera de evitar el código espagueti. Incluso entonces es sólo una solución curita. Tan pronto como dejas de prestar atención sale la pasta.

Muy a menudo encuentro que el código espagueti se introduce porque alguien simplemente está siendo perezoso ese día. Saben que hay una mejor manera de hacerlo y simplemente no tienen tiempo. Cuando ves que eso sucede, solo hay una cosa que hacer.

Llámalos y pregúntales para cambiarlo

Me parece que señalar la mejor manera durante una revisión de código suele ser suficiente para que la gente se ponga en marcha. Si lo comprueban y me siento fuerte, lo refactorizaré yo mismo.

¿De vez en cuando me parezco un poco excéntrico? Seguro que sí. Francamente, aunque no me importa. No soy un idiota y me acerco a esto de la mejor manera social posible. Sin embargo, dejar que el código malo se compruebe en casi asegura que voy a tener que depurarlo en algún momento en el futuro. Prefiero tomar un poco de fuego ahora y obtener el código correcto.

También siento que una cultura de pruebas unitarias también ayuda a prevenir el código spaghetti. Es mucho más difícil probar unitariamente el código spaghetti que el código bien factorizado. Con el tiempo, esto obliga a las personas a mantener su código algo factorizado.

 29
Author: JaredPar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-25 19:02:20

Creo que la clave para evitar la putrefacción del código radica en las metodologías de diseño e implementación de abajo hacia arriba (lo creo tan firmemente que nombré mi negocio - Piense de abajo hacia Arriba - después de él!). Las herramientas de elección aquí son:

  • Programación por contrato
  • Diseño en capas
  • Centrarse en la disociación
  • Siempre construya con la reutilización en mente, buscando soluciones genéricas
  • Mantenga marcos ligeros, simples y enfocados

Según lo sugerido por otros los encuestados, es necesario detectar los problemas temprano. Con los desarrolladores verdes, esto significa tutoría (la programación de pares es genial aquí) y revisiones (revisiones de código y diseño). Con desarrolladores más experimentados, esto significa vigilancia.

Sobre todo, no tengas miedo de refactorizar. Si la refactorización te asusta, ya estás hundido. Si la refactorización se ve como "mala", entonces hay algo mal con su negocio.

Cuando arregles algo, arréglalo correctamente. Uso el término "fux" para describir una solución eso se hizo de la manera equivocada: simplemente " fux " su base de código.

Salud,

Dan

 13
Author: Daniel Paull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-25 16:08:37

20 a 50 desarrolladores es probablemente el problema. Eso es bastante alto y necesitaría una gran cantidad de gestión y recursos para mantener todo bajo control.

Consideraría dividir el proyecto en segmentos reutilizables más pequeños. Abstraer ciertas capas lejos del sistema central.

 11
Author: nbevans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:03:46

Cree "firewalls" entre diferentes áreas del código. Esto se hace definiendo diferentes áreas o capas de código, y definiendo una sola API (en Java, esto generalmente se hace con una interfaz) a la que responde cada capa. Debe haber intefaces o clases básicas que utiliza la API, pero que "no saben" nada sobre el funcionamiento interno de esas capas. Por ejemplo, la gui no debe saber ni preocuparse por cómo almacena los datos, y su base de datos no debe saber ni preocuparse por cómo se presentan los datos a la usuario final.

Estas APIs no tienen que ser fundidas en piedra, deberías poder agregar cosas según sea necesario, siempre y cuando te asegures de no contaminar los firewalls.

 10
Author: Paul Tomblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:04:44

Creo que el punto principal es cuando dices

Solo quieres reescribir todo desde cero

Solo acéptalo.
Use tantas pruebas unitarias como sea posible, luego deje que la refactorización sea una práctica común .
La prueba automatizada y unitaria asegurará que los cambios no introduzcan regresiones; dedicando un cierto porcentaje de su tiempo a refactorizar código antiguo (y esto significa, menos nuevas características!) asegúrese de que el código base existente no se vuelva viejo, o en menos no tan rápido.

 7
Author: Roberto Liffredo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:08:22

Revisiones de código, estándares de codificación y políticas de la empresa.

Lo siguiente es aplicable a nuestra tienda - ya que no se que tipo de tienda tiene, su kilometraje puede variar. Mientras nos mudábamos a Team Foundation Server, una gran parte de nuestro enfoque estaba en mantener la calidad del código, o al menos ayudar a mantener la calidad de cualquier manera posible. Algunos ejemplos de lo que estamos agregando:

  • Flujo de trabajo de revisión de código: Impone la revisión de código como parte del proceso. Contiene una política que evite que se realicen check-ins si el código no ha sido revisado.
  • TeamReview - Hace que las revisiones de código sean menos dolorosas al proporcionar una experiencia completa "dentro del IDE".
  • Políticas de check-in (en general) - Muchas cosas interesantes disponibles para controlar el flujo de código. Cosas como asegurarse de que los métodos públicos y protegidos estén documentados antes del check-in o asegurarse de que no se pueda registrar ningún trabajo sin un elemento de trabajo correspondiente.

Como he dicho, si usted está utilizando un plataforma diferente, tal vez las herramientas disponibles y lo que puede hacer es diferente. Pero no descartes herramientas para ayudar de cualquier manera posible. Si puede usarlo para mejorar, controlar y auditar su flujo de trabajo y los elementos que se mueven dentro de él, debería valer la pena considerarlo.

Recuerde, cualquier cambio en el proceso va a implicar retroceso. La forma en que hemos ayudado a facilitar esto es construir las políticas en el entrenamiento para la transición de nuestro antiguo control de versiones / defecto sistema de rastreo.

 7
Author: Joseph Ferris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:15:26

Parece que muchos no están siguiendo algunos principios básicos de encapsualtion y buen diseño.

Mantener las cosas aisladas y poco fiables en otras partes es esencial para evitar el problema que describe. Es posible que necesite algún diseñador o arquitecto de nivel superior. Este es un escenario típico donde la gente ha justificado algunos procesos draconianos y la gestión del cambio. (No abogo por eso)

Debe evitar dependencias e interrelaciones y definir y usar interfaces públicas solo. Por supuesto, esto es una simplificación excesiva, pero probablemente aprenderá mucho por algunas métricas en su código: complejidad de clases, métodos públicos, diagramas UML construidos a partir de ingeniería inversa del código, etc.

 3
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:07:40

Creo que el acoplamiento suelto que puede obtener con el uso completo de la inyección de dependencias es una característica técnica que puede ayudar mucho. Cuando rompes las piezas de la aplicación, es menos probable que obtengas espaguetis como resultado de la reutilización" interesante".

Puede que se dirija a una fragmentación excesiva, pero ese es otro problema y menos problema estructural global.

 3
Author: krosenvold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:09:13

No permita que el código se confirme hasta que al menos dos pares de ojos lo hayan visto.

 3
Author: Norman Ramsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-16 02:39:56

Refactorización

Esfuérzate por mantener el diseño lo más limpio posible. Esto no es fácil, pero vale la pena el esfuerzo.

 2
Author: philant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:06:38

No creo que sea normal. Es realmente difícil luchar contra esta cosa cuando estuvo allí durante un par de años.

La única manera de evitarlo es cambiar la actitud:

"La actitud que los desarrolladores ágiles tienen hacia el diseño del software es la misma actitud que los cirujanos tienen hacia el procedimiento estéril.  El procedimiento estéril es lo que hace posible la cirugía .  Sin ella, el riesgo de infección sería demasiado alto para tolerar.  Los desarrolladores ágiles sienten lo mismo sobre sus diseños.  El riesgo de dejar que incluso la más pequeña parte de la putrefacción comience es demasiado alto para tolerarlo." Martin C. Robert "Principios, Patrones y Prácticas Ágiles en C#"

Recomiendo encarecidamente mirar este libro para obtener consejos. Nombra a todos los "olores de diseño", las razones de su existencia y las consecuencias de abandonarlos. Que esto le ayude a persuadir a su dirección de que la situación actual no es apropiada.

¡Buena suerte!

 2
Author: Dzmitry Huba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:09:00

El mayor problema en la industria del software es que la calidad del código de programación se ve como un problema subjetivo. Sin una métrica bien definida, solo ser ordenado y ordenado, y seguir las convenciones no es suficiente para garantizar que la calidad sea aceptable.

Hay intentos de cambiar esto, pero es poco probable que obtengan suficiente interés o aceptación principalmente porque la cultura establecida desde hace mucho tiempo de los programadores está en tratar muy duro para mantenerse alejado de cualquier cosa que se parezca a la ingeniería. La filosofía de" arte puro "de la programación significa que sus 20-50 desarrolladores van a cambiar el código en su propia manera única, por lo que no importa lo buenos que sean los codificadores individuales, la suma total del esfuerzo del grupo siempre va a ser"una gran bola de barro".

Para evitar esto, obtenga todos los codificadores en la misma 'página', haga que el código normalizado forme parte de su convención, o busque trabajos donde los equipos de desarrollo sean más pequeños (1-3 personas) y tú eres el gran kahuna. Algún día los grandes equipos pueden encontrar una manera de construir mejores cosas, pero hasta entonces, incluso los mejores de ellos son extremadamente afortunados si pueden acercarse a 6 de 10. Construimos software de baja calidad porque eso es lo que hemos establecido para hacer en nuestra industria ...

Paul.

 2
Author: Paul W Homer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 22:27:42

Debe seguir de cerca las prácticas de desarrollo de software. Tiene que haber revisiones de código y pruebas unitarias que se aseguren constantemente de que las actualizaciones están afectando a otras cosas en el sistema. 20-50 desarrolladores es mucho, pero se puede hacer. Implementar buenos procesos es lo único que te salvará en este entorno. Las normas de codificación obligatorias también son clave.

 1
Author: kemiller2002,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:06:26

El seguimiento de defectos y el rendimiento de varias partes del sistema le permitirá identificar problemas. A medida que se cambian los sistemas, las funciones o módulos mal diseñados o escritos tendrán una mayor tasa de defectos. Cuando se identifica un módulo "problema", se puede tomar la decisión de reescribir el módulo (NO la aplicación).

 1
Author: Jim Blizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:08:09

Refactorización continua. tiene para refactorizar a medida que avanza, especialmente a nivel de diseño. Cuando vea código o diseño roto, prepárese para arreglarlo. Este es a menudo un caso de arreglar algo que no está roto, per se. Excepto que lo es... simplemente no está manifestando su quebrantamiento... aun.

 1
Author: Lawrence Dol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:13:37

No

:)

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:13:56

Shore and Warden's El Arte del Desarrollo Ágil es un gran libro, con una sección sobre "Aplicar XP a un Proyecto Existente" (en el capítulo 4). Los proyectos empeoran con el tiempo a menos que luches duro: superar esa deuda técnica es difícil y hará que sea cada vez más difícil enviar liberaciones aceptables. La única solución es reducir la velocidad a la que entrega nuevas funciones y dedicar el tiempo ahorrado a mejorar la cobertura de las pruebas y la refactorización.

Normalmente, los proyectos no tiene mucha cobertura de prueba, y no tiene la opción de ejecutar un script automatizado de 10 minutos que construirá y ejercitará su código bastante a fondo. En cambio, la mayoría del código está estructurado de manera que es difícil de probar. La mejor opción entonces es agregar cobertura de prueba simple donde pueda, mientras comienza a refactorizar con el fin de hacer que el código se abstraiga de manera que sea más fácil de probar.

Aunque el equipo necesitará pasar tiempo mejorando el código para hacerlo limpio y comprobable, probablemente no será capaz de dejar de entregar por el tiempo que tomaría "terminar" la limpieza. Por lo tanto, usted tiene que hacerlo paso a paso, mientras que también la adición de nuevas características. Está bien, elige primero las peores áreas y no esperes beneficios obvios de inmediato. Sigue así, porque eventualmente llegarás allí. No escuches las voces que dicen que todos los grandes proyectos son malos.

En resumen, dedique un poco de tiempo cada semana a ordenar, y asegúrese de que el código sea mejor la próxima semana que esta semana.

 1
Author: Dickon Reed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-18 16:02:40

Más revisiones de código y quizás propiedad de código.

Si simplemente hackeas algún código aleatorio, entonces no te importa tanto como el código que "posees". Si es tu responsabilidad mantener un módulo del proyecto, quieres brillar.

Y revisiones de código es un momento en el que muestra su código.

 0
Author: stesch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:04:50

Comience a crear pruebas unitarias, esto le ayudará a desacoplar su código y evitar errores de seguimiento en correcciones de errores. Si tiene una buena cobertura, también le será más fácil eliminar el código no utilizado.

 0
Author: terjetyl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 21:09:30