Todos lo hemos hecho, hemos etiquetado algunos códigos (a menudo cosas que hemos heredado) como "heredados"? Pero todavía se usa en los sistemas de producción, entonces ¿es realmente un legado? ¿Y qué lo hace legado? ¿Deberíamos evitar esta etiqueta injustificada de código que funciona perfectamente? donde el etiquetado es una pura conveniencia que nos permite impulsar nuevas cosas y mantener a la alta gerencia agradable y feliz?
Resumen de respuestas
Mirando las respuestas veo cuatro temas generales. Aquí es como veo el desglose:
- Cualquier código que se haya entregado: 6
- Sistemas muertos: 2.5
- Sin pruebas unitarias: 2
- Los desarrolladores no están alrededor: 1.5
source-code
legacy
Nim
fuente
fuente
Respuestas:
Soy bastante parcial al resumen de Wikipedia :
Mucho de lo que otras personas describen en sus respuestas son razones por las cuales el código se convierte en "legado". Pero la pregunta esencial en sí misma es esta:
El hecho de que todavía se use en producción es precisamente lo que lo hace legado . Si el código no funciona correctamente, o ya no se usa en producción, entonces ese código está "roto" o "retirado", respectivamente. Legacy significa que todavía está en uso y funciona bien, pero incorpora diseños o técnicas que ya no son de uso común.
Cualquier código o sistema que (a) le gustaría actualizar / actualizar, pero no puede, o (b) todavía está en medio de la actualización, es un sistema heredado. Esto no significa refactorización o limpieza general del código, significa cambios significativos en el diseño, posiblemente utilizando un nuevo marco o incluso una nueva plataforma.
Existen varias razones por las cuales los sistemas o el código pueden convertirse en heredados:
Falta de mantenimiento regular o software podrido . Claramente, si la aplicación no se mantiene regularmente, no seguirá el ritmo de los cambios importantes en el mundo del software. Esto puede deberse a una simple negligencia o puede ser una elección deliberada basada en prioridades comerciales o restricciones presupuestarias.
Falta de pruebas. Otra respuesta hace referencia a la afirmación hiperbólica de un autor popular de que cualquier código no cubierto por las pruebas es código heredado. Esto realmente no es una definición precisa, pero es una posible causa raíz; sin buenas pruebas (automatizadas o manuales), los desarrolladores se vuelven tímidos y temen hacer cambios importantes porque se preocupan por romper algo, lo que lleva a la "putrefacción del software" anterior.
Rev-lock, un factor que a menudo se pasa por alto y que es particularmente insidioso en proyectos que usan grandes bibliotecas o marcos de código abierto (aunque también lo he visto con herramientas comerciales). A menudo se realizará una personalización importante en el marco / biblioteca, lo que hará que una actualización sea prohibitivamente difícil o costosa. Por lo tanto, el sistema se vuelve heredado porque se ejecuta en una plataforma más antigua (y posiblemente ya no es compatible).
El código fuente ya no está disponible, lo que significa que el sistema solo se puede agregar, nunca cambiar. Dado que estos sistemas tienen que reescribirse para actualizarse, en lugar de revisarse de forma gradual / iterativa, muchas empresas no se molestarán.
Cualquier cosa que ralentice o detenga las actualizaciones de una base de código puede hacer que esa base de código se vuelva heredada.
Ahora la pregunta separada, no declarada pero implícita es, ¿qué tiene de malo el código heredado? A menudo se usa como un término peyorativo, de ahí la pregunta:
Y la respuesta es no, no deberíamos; el etiquetado está garantizado y el término en sí implica claramente un código funcional. El punto no es que sea función, sino cómo está funcionando.
En algunos casos no hay nada de malo con el código heredado. No es una mala palabra. Los códigos / sistemas heredados no son malvados. Acaban de recoger algo de polvo, a veces un poco, a veces mucho.
El legado se vuelve obsoleto cuando el sistema ya no puede atender (todas) las necesidades del cliente. Esa etiqueta es una de la que debemos tener cuidado. De lo contrario, es simplemente una ecuación de costo / beneficio; si el costo de la actualización sería menor que el costo de sus beneficios (incluidos los costos de mantenimiento futuros más bajos), entonces actualice, de lo contrario, déjelo en paz. No es necesario escupir la palabra "legado" en el mismo tono que normalmente reserva para "auditoría fiscal". Es una situación perfectamente aceptable para estar.
fuente
Por lo general, significa que está escrito en un idioma o basado en un sistema en el que normalmente no se realiza un nuevo desarrollo.
Por ejemplo, la mayoría de los lugares no escriben nuevos programas en Cobol. Sin embargo, una gran parte de su negocio puede ejecutarse en aplicaciones escritas en Cobol. Por lo tanto, esas aplicaciones están etiquetadas como "Legacy".
fuente
Legado significa cualquier código que prefiera reemplazar en lugar de trabajar. Dada la actitud de la mayoría de los programadores hacia la mayoría del código existente, eso generalmente incluye casi todo, excepto lo que está escribiendo activamente en este momento (y en un proyecto grande donde tiene que codificar un diseño congelado, incluso lo que está escribiendo en el momento puede ser incluido también).
El último punto lleva a otros dos puntos que creo que a menudo son ciertos.
Primero, el código a menudo se retiene como legado, incluso cuando realmente no debería serlo. Los gerentes de nivel superior generalmente asumen que volver a implementar un sistema costará tanto o más que la implementación inicial, lo que rara vez es cierto.
En segundo lugar, las pruebas unitarias son una espada de dos filos. Hacen que sea demasiado fácil pensar que los cambios localizados en la implementación son lo que realmente importa. Para realizar mejoras significativas en un sistema más grande, con frecuencia (¿generalmente?) Tiene que cambiar lo suficiente del diseño general que muchas (si no la mayoría) de las pruebas unitarias se vuelven irrelevantes. Desafortunadamente, la presencia de pruebas unitarias y la actitud que engendran pueden hacer que sea demasiado fácil ignorar los cambios que son realmente necesarios.
Quizás un ejemplo de eso ayudaría: supongamos que un programa tiene una biblioteca de interfaz de usuario con excelentes pruebas unitarias y varios programas que usan esa biblioteca. Alguien en la alta dirección se convence de que "web habilitado" es importante (y, solo por el argumento, supongamos que en este caso tiene razón al respecto). Después de una cuidadosa revisión, los gerentes intermedios encuentran que su prueba de unidad actual es suficiente para que puedan cambiar de una interfaz de usuario que se muestra a través de la capacidad de ventanas del sistema operativo local para que se muestre de forma remota a través de HTML / CSS / AJAX, mientras conservan toda la validación de entrada original.
Eso es genial, ¿no? Muestra cuán útiles pueden ser las pruebas unitarias. Hemos cambiado toda la implementación de la interfaz de usuario completa, pero nos aseguramos de que el aspecto, la sensación y la funcionalidad sigan siendo prácticamente consistentes, y todas las entradas del usuario se validan para garantizar la integridad de los datos. ¡Las pruebas unitarias han salvado el día!
¡O no! Esa gran biblioteca de interfaz de usuario altamente flexible y cuidadosamente probada ha ayudado a cegar a todos los involucrados ante el hecho de que para este programa en su mercado con sus usuarios, una interfaz de usuario basada en web es algo completamente incorrecto para trabajar. Lo que realmente se necesita es un servicio web con una interfaz RESTful y absolutamente ninguna interfaz de usuario propia.
Ahora, es cierto que las pruebas unitarias no eliminan, en sí mismas, la capacidad de las personas para comprender su mercado o darse cuenta de que es realmente necesario. Al mismo tiempo, la vieja línea sobre martillos y clavos prácticamente salta a la mente. Puede ser aún peor cuando no solo tiene un martillo, sino que tiene mucha experiencia con este martillo y sabe que es realmente un martillo de alta calidad que funciona increíblemente bien en muchas situaciones diferentes. El hecho mismo de que sea tan bueno en tantas cosas en tantas situaciones hace que sea aún más difícil reconocer cuándo es la herramienta completamente incorrecta para el trabajo en cuestión.
fuente
El código heredado generalmente está huérfano de alguna manera. El desarrollador principal, el único que lo entendió, fue atropellado por un autobús, y sus notas fueron escritas en su dialecto nativo de Ucrania, que ahora es un idioma muerto. O, alternativamente, cualquier cosa escrita en Visual Basic 6.0 .
Trabajo en código heredado todo el tiempo. Yo diría que las características son:
Si no tiene esas características, entonces probablemente no sea heredado. Si no le gustan los scripts de Perl de sus predecesores , lo compadezco, pero no creo que sea un legado. Recientemente modernicé un script de Perl de 15 años que estaba conectado a una base de datos Sybase obsoleta . Eso fue fácil en comparación con hacer incluso el más pequeño cambio en nuestro horrible sistema de contabilidad COBOL .
fuente
En su libro, Working Effectively with Legacy Code , Michael Feathers define el código heredado como un código que no está cubierto con pruebas unitarias. Esa es una definición, con la que estoy de acuerdo. También veo el código heredado como antiguo, pero aún utilizable.
fuente
Técnicamente, el legado es cualquier código que ya está escrito. Tan pronto como esté en producción, es legado. Debido a que ya hay valor allí, no puedes simplemente tirarlo ... Tienes que lidiar con eso.
Es "antes de tu tiempo" pero "sigue siendo tu dolor de cabeza" .
fuente
El código heredado es un código que solo permanece en la base del código porque, de lo contrario, muchas cosas dejarían de funcionar. En otras palabras: su única razón de ser es la compatibilidad con versiones anteriores.
Preferiría cambiarlo o incluso tirarlo a la basura, pero no puede porque romperá todo el código confiando en él (que podría ser un código que no puede adaptar en consecuencia). Por lo tanto, debe conservarlo (y a veces incluso mantenerlo), pero desea que no se escriba ningún código nuevo en su contra.
Un ejemplo son los métodos obsoletos de la API de una biblioteca. Todavía están allí, de modo que si quien actualiza la biblioteca aún puede construir su proyecto, pero están marcados como obsoletos y su compilador debería darle una advertencia.
Otro ejemplo son todos esos trucos extraños que Microsoft hace para ejecutar programas que fueron escritos para versiones de su sistema operativo que han desaprobado por completo. El pináculo de este ser:
fuente
El legado implica herencia. El código heredado es simplemente un código que heredas del pasado. ¡Es un código heredado incluso si lo escribió usted mismo antes!
Todas las demás consideraciones se derivan básicamente del hecho de que no lo escribió específicamente para su proyecto actual. No es necesariamente algo malo per se.
fuente
Mi opinión es que lo que se considera código heredado depende de varias cosas, y la etiqueta 'legado' probablemente sea específica de la organización.
Si el hardware / sistema operativo en el que se ejecuta es antiguo y ha sido descontinuado por el vendedor, pulse 1.
Si es más difícil tratar de arreglarlo, que reescribirlo, por cualquier motivo porque
para hacerlo
Huelga 2.
Una fusión de múltiples organizaciones en una sola - Strike 3 - un lado probablemente será etiquetado como legado.
¿Existe una alternativa mejor y más barata que se venda como una aplicación y / o servicio de terceros?
¿Es la organización algo así como un hospital o un distrito escolar donde se valora la coherencia sobre las nuevas tecnologías en lo que respecta a las operaciones diarias? Tomará más tiempo para que una aplicación se considere heredada en comparación con la misma aplicación en una organización comercial / competitiva.
Si la empresa es una pequeña empresa de desarrollo que sigue mejorando / apoyando la aplicación para hacer lo que los clientes necesitan, ¿se considera código heredado o simplemente código 'antiguo'? Conozco una empresa llamada Mc2Ok: desarrollaron el software en lo que parece haber sido Windows 3.1, y lo han seguido llevando adelante. Todavía tiene una apariencia de Windows 3.1, pero también le agregaron una interfaz web. Es una compañía de desarrolladores de dos hombres (supongo), y diría que cuando dejen de trabajar en ella, se considerará legado y tiempo para migrar un año o dos después si la usa. Pero eso podría ser otros 10 o más años.
A veces, cuando la administración cambia, puede cambiar en oleadas que tienen muchos efectos de goteo ... Dependiendo de la influencia de la nueva administración, puede hacer que muchas aplicaciones sean heredadas y que de otra manera estarían bien.
Creo que cada organización debe definir qué significa para ellos el "código heredado". Solía mirar los clasificados de The Sunday Times todas las semanas para ver qué buscaban las organizaciones. Ese solía ser mi barómetro para lo que ya no era relevante (es decir, legado). Bueno, The Sunday Times ya no es relevante :-) Y podemos generalizar que COBOL es legado, ASP Classic es legado, etc. Pero creo que cada organización tiene que decidir cuándo una aplicación se considera legada.
fuente
El código es heredado cuando uno tiene miedo de cambiarlo, porque puede romperlo. Es aún más doloroso cuando todo el sistema puede verse afectado por cambios en ese código.
Es por eso que también estoy de acuerdo con la definición de Michael Feathers. El código que tiene buenas pruebas unitarias se puede cambiar sin miedo.
También creo que el código heredado no tiene nada que ver con la antigüedad. Uno puede escribir código heredado desde el principio.
fuente