¿Es mejor usar malas prácticas preexistentes o buenas prácticas que no encajan bien con el código antiguo?

25

Estaba pensando en esto porque estaba tratando de escribir una extensión para un software de terceros existente, y su base de datos está horriblemente desnormalizada. Necesitaba usar sus tablas existentes y agregar un montón de campos nuevos.

Tuve la opción de crear nuevas tablas en su estilo de diseño (que consiste en que casi todas las propiedades están en una tabla grande), o crear un nuevo conjunto de tablas en conjunto y usar algo adicional como Triggers para sincronizar datos entre el nuevo y Mesas antiguas.

Terminé optando por la primera opción de usar el estilo de diseño pobre existente, pero me quedé con esta pregunta: ¿Es mejor ir con malas prácticas preexistentes o implementar buenas prácticas que no funcionan bien con el código existente? ¿Hay algunas situaciones en las que debería elegir una sobre la otra?

NOTA: Muchas respuestas hasta ahora tienen que ver con la refactorización lenta del código incorrecto, sin embargo, no puedo hacerlo. El código no es nuestro y el proveedor lo actualiza con frecuencia. Solo puedo construir sobre eso.

Rachel
fuente
3
posible duplicado del mantenimiento
Péter Török
Gracias Peter, no vi esa pregunta. Es muy similar a lo que estoy preguntando, excepto que parece que las respuestas parecen estar relacionadas con la refactorización del código existente, sin agregarlo al código incorrecto existente. No puedo refactorizar el código existente, solo puedo construir sobre él.
Rachel
Depende de cuánto tiempo desea permanecer con su empleador actual;)
Trabajo

Respuestas:

21

Debe elegir un mejor diseño si:

  1. Vas a asumir una gran parte de la codificación futura

  2. Un mejor diseño no es más costoso para el cliente a largo plazo. Por ejemplo, he sido testigo de "refactorizaciones" de varios meses para proyectos que fueron descontinuados a finales de año.

Debe elegir "mismo mal estilo" si:

  1. Solo estás ayudando. No es realista pensar que puede tomar un grupo existente y que lo hará a estándares de diseño más altos si solo es un relleno de medio tiempo en el proyecto. Un mejor diseño es subjetivo y casi siempre tiene una curva de aprendizaje. Si ese nuevo diseño no es aprendido por el resto del equipo, entonces el proyecto terminará con una mezcla de estilos, y su código mejor diseñado puede terminar en la pila de cosas que nadie cambia porque no pueden entender eso. En su ejemplo anterior, ¿qué sucede si hay actualizaciones para el software de terceros?

  2. Sacrificar "un mejor diseño" le dará una ventaja comercial tangible. Al agregar mal la función X, obtendrás un gran contrato, pero perder el plazo hace que termines sin nada. Aquí es donde entra en juego el conflicto histórico entre mgmt y el equipo técnico. Al igual que la renovación de una casa, alguien tiene que decidir cuándo pagar. Puede pagar la deuda inicialmente viviendo sin electricidad ni plomería durante un año. O puede pagar 3 veces más con el beneficio de tener esas utilidades.

Steve Jackson
fuente
Grandes ejemplos de cuándo ir con un buen diseño sobre un mal diseño y viceversa, gracias :)
Rachel
11

A la larga, es mejor usar buenas prácticas. Ahorrará tiempo y esfuerzo ya que los cambios tomarán menos tiempo en implementarse.

Si es posible, tome pequeños pasos para refactorizar a una buena práctica (por ejemplo: en SQL eso sería dividir las tablas desnoramizadas a una normalizada y usar vistas con los nombres de las tablas anteriores).

Notarás que dije a largo plazo: el triángulo "calidad, tiempo, dinero" también se aplica aquí (es decir, elige dos). Si no tiene el tiempo, puede que tenga que seguir con las prácticas antiguas, pero esto significará que está agregando al problema y que su diseño también tendrá que repararse.

Si sigue trabajando y agregando código de mal diseño, nunca terminará con una base de código que use un buen diseño. En la medida de lo posible, intente utilizar un buen diseño y refactorizar el buen diseño.

Oded
fuente
Nunca pensé en esa solución para los datos SQL. Desafortunadamente, no tengo permiso para editar su base de código porque todavía lanzan actualizaciones regulares. Todo lo que agregue tiene que estar completamente separado.
Rachel
1
@Rachel: si tiene el control de las nuevas tablas, use un buen diseño para ellas (supongo que las actualizaciones del diseño anterior no afectarán las nuevas tablas). Cuando necesite cambiar su código, sus costos de mantenimiento serán más bajos.
Finalizado el
Las actualizaciones de la frecuencia del software incluyen actualizaciones de la base de datos y nuevos campos, por lo que eliminar tablas existentes y volver a escribirlas como vistas no es una opción viable para mí. Los usuarios aún usan la parte existente del software que usa estas tablas, solo necesitan una extensión. Si este fuera nuestro código en lugar de un proveedor de terceros, lo implementaría en un abrir y cerrar de ojos :) Un buen punto de vista general para mi pregunta original.
Rachel
1

Bueno, creo que depende mucho de cada caso. Si el rendimiento y el diseño lo permiten, es mejor usar buenas prácticas. Pero si, por ejemplo, si esa tabla es una tabla de alto acceso, crear un desencadenador para la sincronización podría tener un impacto negativo en el rendimiento.

Ahora, su cliente no verá que usó un mejor diseño, solo verá que su solución hizo que su sistema fuera más lento. Este tipo de decisión debe tomarse caso por caso, y debe usar su experiencia y criterios para decidir.

Creo que probablemente tomaste la decisión correcta.

AJC
fuente
1

En la medida de lo posible, debe aislar el código de su aplicación del diseño deficiente de los datos.

¿Estás actualizando sus tablas? De lo contrario, cree vistas SQL para presentar esas tablas de una manera conveniente para su aplicación. Las vistas SQL son relativamente fáciles de escribir y mucho más fáciles de probar que el código de la aplicación.

Si tiene que actualizar las tablas heredadas, considere escribir procedimientos almacenados para administrar las actualizaciones. Son un poco más complejos de escribir, pero pueden probarse instantáneamente.

Kevin Cline
fuente
1

Para mantener el código antiguo sincronizado cuando normaliza una base de datos con desencadenantes, es una buena solución si es temporal. El objetivo debe ser cambiar el código anterior, pero cuando se trata con un tercero, eso puede no funcionar. Tendrás que estar al tanto de sus cambios de esquema.

La acumulación de más y más funciones en el código incorrecto creará problemas continuos. Las soluciones se convierten en la norma. Los usuarios se sentirán frustrados porque los cambios tardarán demasiado y probablemente introducirán otros errores o limitaciones. ¿Quién quiere ser el programador para decir que no podemos hacer eso en lugar de que no deberíamos hacer eso?

Algún código se puede dejar solo; No siempre tenemos ese lujo.

JeffO
fuente
-1

Estás lidiando con una deuda técnica aquí. En resumen, la deuda técnica implica intereses, que debe pagar con el tiempo y, en algún momento, debe reembolsarlos.

El tiempo de Develloper cuesta dinero, por lo que la deuda técnica puede verse como la deuda real, y cuesta dinero real.

Básicamente tiene dos soluciones principales y muchas soluciones intermedias. Puede decidir que no desea reembolsar esa deuda ahora y continuar pagando intereses. Obviamente, esto le costará más a largo plazo, pero le permitirá obtener resultados ahora mismo. También puede optar por reembolsar esa deuda, por lo que no seguirá adelante mientras no la reembolse, pero, al final, no tendrá intereses.

Por lo general, tiene plazos para la entrega, y el incumplimiento de un plazo provocará la desconfianza de su cliente, y eventualmente lo perderá. Esta podría ser una razón válida para excavar la deuda técnica: considera que lo que gana con el cliente vale la pena adicional de la deuda tecnocal.

Sabes que al final, debes adoptar la nueva metodología, de lo contrario, obtendrás más y más deuda y finalmente te declararás en bancarrota (ahora, cuando la gente decide comenzar de nuevo desde cero o cuando el proyecto falla gravemente).

Debe planificar cómo cambiará la base de código existente y la transición a una nueva práctica a lo largo del tiempo, y distribuirá el cambio poco a poco a diario. En algún momento, cuando la refactorización lleve a otras pérdidas, considere qué pérdida es la peor y elija la mejor.

El costo de no refactorizar aumentará con el tiempo (son intereses de la deuda tecnocal). Entonces esto se convertirá eventualmente en la opción más costosa.

Asegúrese de que su jefe entienda el concepto de deuda técnica. Incluso con precaución, creará deudas técnicas. En algún momento, dinero para ser utilizado para reembolsarlo. Cuando crea una deuda técnica a propósito, TIENE QUE tener una razón válida para ello y ver la deuda como una inversión (al igual que la deuda real). En cualquier otro caso, NO HAGA deuda técnica a propósito.

Puede interesarle las metodologías para desarrollar DB e implementar estas evoluciones: http://richarddingwall.name/2011/02/09/the-road-to-automated-database-deployment

Por cierto, esa es una tarea difícil, así que buena suerte. Lo vale !

deadalnix
fuente
-1

Este es un problema típico de: "¿Necesito cosechar los beneficios de mi trabajo ahora o más tarde?" y no creo que pueda haber una solución genérica para esa respuesta. Solo usted conoce todos los factores (técnicos y humanos) involucrados en tal decisión.

Sin embargo, su problema plantea una pregunta interesante:

¿La refactorización automática del código está haciendo suficientes avances para que la uniformidad del código se valore más?

Finalmente, el mal diseño debería cambiar o morir. O de lo contrario, no es un mal diseño. La verdadera pregunta aquí es sobre el costo de la refactorización. Parece claro a partir de su pregunta que usted (o su empleador) no está dispuesto a pagar el precio ahora, y en el estado actual de la tecnología, es probable que nunca quiera hacerlo.

Sin embargo, la automatización de refactorización de código está haciendo algunos avances. Si los compiladores pueden optimizar los binarios hoy, ¿quién puede decir que no optimizarán el código mañana? En algún momento, surgirá alguna herramienta que permitirá a los desarrolladores y diseñadores refactorizar su código muy fácilmente para adaptarse a los requisitos más nuevos. Después de todo, lidiar con el código heredado es uno de los mayores desafíos de la actualidad.

Si alguna vez existe dicha herramienta (no me sorprendería que ya exista), sería bueno tenerla en cuenta al tomar esa decisión.

rahmu
fuente
-2

Las buenas prácticas siempre triunfan sobre las pobres. Si su base de código está llena de código de la manera incorrecta, no debe simplemente cargar sus propias cosas de la misma manera, debe escribir el código correctamente y luego tratar de educar a todos los demás de la manera correcta.

Wayne Molina
fuente
Como desarrollador, debe conocer el peligro de las declaraciones absolutas.
cuál es el
También sé el peligro de lidiar con malas prácticas y escribir código incorrectamente, y la OMI es el peor peligro de todos.
Wayne Molina