¿Existen estudios de casos reales sobre reescrituras de tasas de éxito / fracaso de software?


36

He visto múltiples publicaciones sobre reescrituras de aplicaciones que son malas, las experiencias de las personas al respecto aquí en Programadores, y un artículo que he preparado de Joel Spolsky sobre el tema, pero no hay evidencia sólida o estudios de casos. Además de los dos ejemplos que dio Joel y algunas otras publicaciones aquí, ¿qué haces con una mala base de código y cómo decides qué hacer con base en estudios reales?

Para el caso en cuestión, hay dos clientes que conozco que ambos tienen código antiguo. Siguen cojeando con él porque, como uno de ellos descubrió, una reescritura fue un desastre, fue costoso y realmente no funcionó para mejorar mucho el código. Ese cliente tiene una lógica comercial muy complicada, como descubrieron rápidamente los reescritores.

En ambos casos, estas son aplicaciones de misión crítica que generan muchos ingresos para la empresa. El que intentó la reescritura sintió que golpearían una pared de ladrillos si el software heredado no se actualizara en algún momento en el futuro. Para mí, ese tipo de riesgo requiere investigación y análisis para garantizar un camino exitoso.

¿Ha habido estudios de casos reales que hayan investigado esto? No quisiera intentar una reescritura importante sin conocer algunas de las mejores prácticas, trampas y éxitos basados ​​en estudios reales.

Consecuencias: bueno, después de más búsquedas, encontré tres artículos interesantes sobre estudios de casos:

  1. Reescribir o reutilizar . Hicieron un estudio sobre una aplicación Cobol que se convirtió a Java.
  2. El otro fue sobre la reutilización de software: experiencias y percepciones de los desarrolladores .
  3. Reutilizar o reescribir Otro estudio sobre costos de mantenimiento versus una reescritura.

Recientemente encontré otro artículo sobre el tema: The Great Rewrite . Allí, el autor parece tocar algunos de los principales problemas. Junto con esto, surgió la idea de crear prototipos mediante el uso de la nueva pila de tecnología propuesta y medir la rapidez con que los desarrolladores lo recogieron. Todo esto fue el preludio de una reescritura, ¡lo cual me pareció una gran idea!


10
No sé sobre estudios de casos, pero creo que la respuesta estándar para un enfoque es probablemente "agregar pruebas unitarias y refactorizar".
Jerry Coffin

2
Me parece que posiblemente sea el enfoque de menor riesgo disponible. Por supuesto, no conozco suficientes detalles para asegurarme de que es el enfoque correcto, pero según lo que sé hasta ahora, no sé mucho de lo que es particularmente mejor.
Jerry Coffin

2
Si realizan pruebas unitarias (correctamente, capturando realmente todos los requisitos), es difícil encontrar una forma de refactorizar que resulte en un verdadero desastre. Lo peor que puede pasar es que no progreses tanto como quisieras. Al mismo tiempo, si su código base está en tan mal estado como lo implica la pregunta, es muy probable que se necesite un esfuerzo serio para permitir el progreso, independientemente de la ruta tomada.
Jerry Coffin

2
Debido a que muchos proyectos son privados, sería difícil para un estudio tener un conjunto de muestras realmente bueno. Puede estar limitado a evidencia anecdótica.
mike30

1
El problema no es reescribir toda la base de código. El problema es querer reescribir toda la maldita cosa de una vez y luego presionar un botón y soltar todos tus dolores de cabeza. En la mayoría de los casos, no puede permitirse el tiempo perdido para sus competidores agregando nuevas funciones, dejando errores para que se infecten y clientes para cancelar. Por más desastre que sea una base de código, debería ser posible identificar puntos débiles y modularizar las piezas correctas del espagueti a medida que avanza.
Erik Reppen

Respuestas:


6

No puedo tomar el crédito por estos excelentes comentarios, pero nunca fueron respondidos por el autor original, así que lo estoy marcando wiki de la comunidad.

No sé sobre estudios de casos, pero creo que la respuesta estándar para un enfoque es probablemente "agregar pruebas unitarias y refactorizar".

Me parece que posiblemente sea el enfoque de menor riesgo disponible. Por supuesto, no conozco suficientes detalles para asegurarme de que es el enfoque correcto, pero según lo que sé hasta ahora, no sé mucho de lo que es particularmente mejor.

Si realizan pruebas unitarias (correctamente, capturando realmente todos los requisitos), es difícil encontrar una forma de refactorizar que resulte en un verdadero desastre. Lo peor que puede pasar es que no progreses tanto como quisieras. Al mismo tiempo, si su código base está en tan mal estado como lo implica la pregunta, es muy probable que se necesite un esfuerzo serio para permitir el progreso, independientemente de la ruta que se tome.

Asumiría que los proyectos de reescritura no son significativamente diferentes en tasas de falla que los proyectos en general, y me referiría al último informe de CHAOS para obtener la mejor información.


8
el código que debe reescribirse generalmente se escribe de una manera que no se puede probar (acoplamiento estrecho, clases que hacen demasiado, etc.) que lo coloca en la extraña posición de necesitar refactorizar antes de poder realizar una prueba unitaria.
Kevin

Sí, por eso el comentario sobre el libro: "Trabajar eficazmente con código heredado" fue muy apropiado. Tuve que hacer algo como esto el año pasado y adoptar un enfoque más metódico como lo que se explica en ese libro me habría ahorrado mucho tiempo y dejado un rastro de documentación / prueba que me habría sido útil. Siento que simplemente hacerlo funcionar fue genial, pero no fue suficiente. Los objetos tenían tantas dependencias que sentí que mis pruebas podrían haber tenido una mejor cobertura.

6

Hice un vistazo a Trabajando efectivamente con código heredado de Michael Feathers hace un tiempo y descubrí que ofrecía algunas buenas ideas sobre la práctica del mundo real de mantener el código heredado, incluida la escritura de pruebas (incluso cuando no sabes para qué era el código) y de curso de refactorización / reescritura. Está un poco anticuado pero altamente calificado en Amazon.


3

Hablando de la experiencia y viviendo en una empresa que ha concebido mal la arquitectura empresarial desde el principio, puedo decir honestamente que el mayor problema es desarrollar una comprensión integral.

Esta idea de que un sistema puede dividirse en pedazos y entenderse individualmente es errónea. En algún momento, un solo individuo, o varios individuos, tuvieron que ser capaces de concebir todo el problema en su totalidad. Si ese problema es una serie de problemas comerciales y las tecnologías que los impulsan; Es posible que una persona de la empresa tarde varios años en comprender todos los sistemas a un nivel en el que sea posible reemplazarlos sin un desastre o un requisito perdido. Este fue ciertamente el caso en mi empresa cuando asumí el cargo de Director de Tecnología. Si no fuera por el hecho de que yo mismo soy un programador, no habría podido comprender lentamente todos los detalles de la arquitectura y la integración de la tecnología mal organizadas, estrechamente vinculadas y estrechamente vinculadas. Si hay pequeños detalles ocultos e indocumentados como"We put the eBay order number in the "SYSOENT.PO_NUMBER" field in the ERP system because that's what Wendell the VB coder from Florida decided to do" Si se pasan por alto, los resultados pueden ser desastrosos, y la única forma de saberlo es descubriéndolo todo lentamente.

Si se le pide a alguien que reemplace el motor de una aeronave mientras está en vuelo, o se enfrenta a una muerte segura, dada la cantidad adecuada de herramientas y recursos que esa persona necesitaría saber cómo anular los sensores, el sistema hidráulico, cómo redirigir el flujo de combustible , manipula sistemas que nunca fueron diseñados para ser cambiados o manipulados externamente o desde la cabina. Esto es a menudo como es la posibilidad de reescribir una aplicación comercial. La aplicación generalmente se incluye en el negocio entre muchas otras tecnologías diferentes.

Supongo que mi punto principal es que el sistema debe entenderse en casi toda su complejidad, y en algún momento debe entenderse en su integridad para que el nuevo sistema esté "diseñado" correctamente y no solo "hecho".

Las cookies están hechas, el software (debe ser) diseñado.


2
+1 por la necesidad de comprender tanto sobre el sistema comercial por adelantado. Sin embargo, como saben, el desafío aquí es el tiempo y los recursos (del negocio), así como los factores de cambio. Para sistemas medianos y grandes, a veces no siempre es posible comprender la complejidad total por adelantado.
NoChance

2

Hay muchos ejemplos de empresas que murieron de una reescritura, como Netscape . También hay empresas que sobrevivieron a una reescritura sin grandes problemas como Twitter .

No hay estudios de caso cuantificados, porque no es factible tener un experimento de control donde se mire el éxito comercial de no reescribir frente al éxito comercial de la reescritura. Cada aplicación es diferente.

Hay algunos casos obvios en los que una reescritura tiene sentido y muchos casos en los que no. He preparado una pequeña receta para averiguar si una reescritura tendría sentido en su caso.

Creo que las reescrituras tienen más sentido hoy en día porque estamos codificando rápidamente sobre los hombros de mejorar marcos invasores como Rails, Grails, AngularJS. Si desea pasar de js simple a angular, una reescritura es todo lo que puede hacer. Todavía podría tener mucho sentido. Si está reemplazando una implementación de bricolaje con otra (como todos los ejemplos en el artículo de Joel Spolsky ), probablemente esté loco.


1

No va a encontrar muchos estudios de caso no sesgados que no sean informes posteriores a la acción: la mayoría de las personas no van a pagar para hacer el mismo trabajo al menos dos veces (una vez como reescritura, una vez como actualización, mejor caso sería múltiples reescrituras / actualizaciones por diferentes equipos).

El estudio de caso que encontró parece haber sido producido por Fujitsu y, como era de esperar, el resultado fue que era mejor usar las herramientas de Fujitsu.

Desde el punto de vista de la organización, una reescritura es claramente un fracaso cuando la aplicación reescrita no funciona o el proyecto se cancela antes de que finalice; de ​​lo contrario, es imposible saber si el retraso en el lanzamiento de la versión reescrita fue causa de cualquier pérdida que haya sufrido o simplemente por casualidad. Si se cancela antes de terminar, generalmente se considera una pérdida total de tiempo y recursos. Una actualización puede tener el mismo problema, pero es poco probable que sea incremental estar en la misma escala (obtienes algo por tu dinero).

El mejor caso desde una perspectiva de programación es hacer ambas cosas: actualizaciones incrementales mientras se reescribe, apoyándose e inspirándose mutuamente. A menos que tenga diferentes equipos, esto naturalmente tomará más tiempo.

Tenga en cuenta que esto proporciona una guía aproximada para cuando debería considerar una reescritura total: el proyecto es lo suficientemente pequeño como para que pueda hacerlo fácilmente, o la organización es lo suficientemente grande como para permitirse hacer ambas cosas, contando el esfuerzo o el costo de aprendizaje vale la pena. También tenga en cuenta que si la reescritura nunca alcanza el reproceso, eso puede significar varias cosas, pero si todo lo demás es igual, probablemente significa que una reescritura fue innecesaria.


1
La reescritura puede ser un fracaso cuando se ejecuta masivamente por encima del presupuesto y se cancela antes de llegar a su finalización. Dinero por el drenaje. La posibilidad de esta eventualidad es la razón por la cual la reescritura se considera más riesgosa que la refactorización.
MarkJ

@ MarkJ: pensé que estaba cubierto en "no funciona", pero lo editaré para que quede más claro.
jmoreno
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.