¿Qué tan malo tiene que ser el software antes de que valga la pena reescribirlo?

Las situaciones no triviales no pueden resolverse suficientemente con una métrica trivial. Me gusta ver el conjunto completo de costos asociados con el software:

  • ¿Cuánto cuesta mantener tal como es? Para abordar los defectos que los clientes informan?
  • ¿Cuánto cuesta modificar el código? Añadir una nueva característica? ¿Cambiar una función existente?
  • ¿Cuánto cuesta operar? Para una aplicación web que sería la infraestructura: servidores, equilibradores de carga, bases de datos, etc. Para una aplicación instalada que sería el personal de marketing, ventas, soporte, cualquier solución implementada para clientes, etc.
  • ¿Qué tan fácil es encontrar nuevos desarrolladores para agregar al equipo? ¿Cuánto tiempo se tarda en aumentarlos para que sean productivos? ¿Cuál es la tasa de rotación del equipo?
  • ¿Existen planes de proyectos concretos (nuevas características, integraciones, migraciones, etc.) que tendrán una cantidad de trabajo cuantificable? ¿Cuáles son los costos involucrados con estos proyectos?

No todos estos aspectos pueden ser significativos para su producto y equipo. Elija lo que tenga sentido, pero no evite algo solo porque no lo sabe. Haga una estimación razonable, digamos del personal de soporte (atención al cliente, TI, soporte de ventas) para que, si las cosas cambian, pueda señalar el número y decir si es probable que baje, permanezca igual o suba con cualquier alternativa considerada

La clave aquí es conocer el valor comercial que proporciona el código. Ese valor debe expresarse en moneda porque así es como sus clientes pagan a una empresa. Si es demasiado costoso, y es una llamada de valor, entonces es una muy buena idea evaluar otras opciones. Puede comenzar un esfuerzo de refactorización tomando una sección del código a la vez y actualizándola. Puede rediseñar el código extrayendo áreas discretas de responsabilidad y convirtiéndolas en servicios independientes.

Cualquier ruta alternativa también debe evaluarse en términos del costo para el negocio para hacer el trabajo, el costo de oportunidad de otras cosas que no se pueden hacer mientras se realiza este trabajo, el costo de operar, mantener y actualizar el nuevo código también.

Todas estas opciones se reducen a números: la cantidad para ejecutar el software actual cada trimestre y año durante los próximos años, dando expectativas razonables sobre el crecimiento de la aplicación. La cantidad para ejecutar cada alternativa para el mismo período con los mismos planes de crecimiento.

Puede argumentar que el código es demasiado complejo y, por lo tanto, demasiado difícil de mantener, pero eso es solo una parte del rompecabezas. Tome una perspectiva comercial como si cada centavo que se utiliza para pagar la solicitud provenga de su cuenta bancaria y tenga en cuenta todos los costos de las soluciones actuales y alternativas. Luego puede tomar una decisión informada sobre cómo utilizar mejor los recursos disponibles.

Una recomendación más. No hay visiones de “pastel en el cielo” de lo que podría ser el software. Base todas las evaluaciones solo en lo que sabe que debe estar en el software; de ​​lo contrario, se arriesga a tomar decisiones hoy en base a un plan futuro que tal vez nunca se realice. En mi experiencia, muy pocos planes más allá de los 6 meses entran en producción sin alteraciones significativas. Muy, muy, muy pocos.

Necesita refactorizar o rediseñar por completo desde una perspectiva técnica, pero luego tiene la perspectiva comercial. La reescritura no es muy “visible” desde el exterior, porque no está agregando nuevas funciones. Entonces es difícil de vender. Excepto en industrias donde la calidad es muy importante: médica, aviación, espacio, …

Debe tener una muy buena historia para un rediseño completo. Si el proyecto ya no es manejable, porque hay demasiadas correcciones de errores y hacks, y luego otras correcciones y hacks para compensar los problemas que causan las primeras correcciones, etc., o si nadie en su equipo comprende el código, podría ser necesario un rediseño y probablemente llegues tarde. Lo mejor es tener a los muchachos originales aún a bordo para explicar el “diseño” y cómo evolucionó en una pila de basura. Pero revise su nuevo diseño y participe en él, y revise su código. Es poco útil reescribir si reemplaza un montón de basura por otro montón de basura.

Por cierto, no se dice que los diseñadores / desarrolladores originales que finalmente produjeron la basura, son malos diseñadores / desarrolladores. Los sistemas evolucionan. A menudo hay muy poco tiempo para refactorizar. Y: la gente aprende de sus errores. Así que la segunda vez hacen un mejor diseño. Ojalá.

Siempre puede dedicar un poco de tiempo cada día a la refactorización. No le digas a ningún no programador como un gerente. Usa tu propio juicio.

Luego hay algo entre refactorizar piezas pequeñas y una reescritura completa. Haga un diseño de alto nivel y varios subsistemas en gran medida independientes deberían volverse obvios. Usar interfaces entre subsistemas. Luego

  1. agregar pruebas unitarias
  2. reescribir un subsistema
  3. vea si todavía pasa las pruebas de unidad, integración y regresión.

Además de usar interfaces, un diseño en capas también puede ser útil (también deberían tener interfaces).

Puede usar el patrón de envoltura / adaptador para encapsular el código heredado de mierda detrás de una nueva interfaz nueva. Nadie debería llamar al código heredado al no usar la nueva interfaz. Esta nueva interfaz debe acomodar a los clientes internos / externos y, con suerte, llamar al código heredado a través de esta nueva interfaz hará que el código heredado falle con menos frecuencia.

Para mí, los signos que debo considerar revisar mi código son:

  1. Cuando pasas más tiempo arreglando errores que desarrollando nuevas funciones
  2. Cuando encuentre que su código tiene múltiples funciones que pueden simplificarse o incluso reescribirse en una sola función
  3. Cuando se tarda demasiado en completar el proceso solicitado. La mayoría de las veces esto está relacionado con el proceso de escalado. Por ejemplo, la primera vez, quizás hacer una consulta de búsqueda será muy rápido, pero a medida que pasa el tiempo, su base de datos crece y una consulta de búsqueda llevará mucho tiempo, luego debe volver a escribir su código para admitir la indexación de registros.
  4. Cuando es demasiado bajo versión. Aunque la mayoría de los grandes lenguajes de programación aún admiten su código heredado, nunca es bueno dejar que su código sea obsoleto. Cuanto más grande sea la brecha, más tiempo llevará reescribir el código.

Un software debe mejorarse y reescribirse constantemente. Si espera hasta que falle o hasta que nadie sepa qué partes hace lo que ya es demasiado tarde.

Por supuesto, si lo único que harían los programadores sería reescribir el código antiguo, no se escribiría ningún código nuevo. Por lo tanto, debe escribir una nueva funcionalidad y siempre encontrar tiempo para mejorar las partes malas con las que tropieza.