En WATA Factory nos hemos enfrentado en varias ocasiones a la modernización de proyectos con código Legacy. En esta entrada hablaremos de cuál ha sido nuestro planteamiento, y cómo hemos enfocado la situación.
Para entrar en materia debemos plantearnos las siguientes preguntas: (1) ¿Qué entendemos como proyecto Legacy? (2) Si funciona, ¿para qué tocarlo? (3) ¿Cómo podemos hacerlo? ¡Veamos!
¿Qué entendemos como proyecto Legacy?
Para nosotros, un código Legacy (o código espagueti), es aquél donde no se aplica lo que consideramos buenas prácticas de desarrollo (Clean Code), no sigue los principios SOLID y no cuenta con una buena cobertura de tests (o directamente, ni siquiera los tiene).
Normalmente este código es un código antiguo con varios años en producción (y más o menos fiabilidad), desarrollado sin framework, o en su defecto, utilizando alguna versión antigua de alguno (por ejemplo, Symfony 2).
Si funciona, ¿para qué tocarlo?
Ésta es una muy buena pregunta, sobre todo porque en nuestro gremio se escucha mucho la expresión (a veces, demasiado) Lo que funciona, no se toca.
La respuesta a esta pregunta no es sencilla. Deberíamos plantearnos la modernización (o no) según sostenibilidad y coherencia con las prácticas que se realizan a diario en la compañía.
- Sostenibilidad porque si estamos hablando de un proyecto vivo, cada vez que se hace un evolutivo nuevo, lo único que conseguimos es seguir alimentando al monstruo. Llegará un momento en el que esa modernización de la que hablamos sea prácticamente imposible sin invertir una gran cantidad de tiempo, y por lo tanto, también de dinero.
- Coherencia porque si los nuevos proyectos siguen una serie de estándares de calidad, se realizan tests unitarios o de integración, etc., ¿por qué vamos a tener proyectos vivos, donde no se apliquen estas prácticas por el mero hecho de ser un proyecto ya de largo recorrido?
¿Cómo lo hacemos?
Si hemos llegado a este punto es porque estamos convencidos de querer renovar nuestro código.
En WATA Factory trabajamos con Symfony, así que en nuestro caso, crearemos un proyecto sobre dicho framework e integraremos el código Legacy en él.
Conforme vayamos realizando nuevas funcionalidades, las iremos desarrollando dentro del proyecto Symfony. Las antiguas funcionalidades estarán dentro de lo que llamaremos LegacyBundle. Llevamos a cabo este proceso siguiendo los pasos mostrados en esta guía publicada por Yannick de Lange.
Este Bundle contendrá todo el proyecto Legacy, y mediante el routing iremos redirigiendo nuestros nuevos endpoints al código antiguo para que todo continúe funcionando.
Esta estructura nos da la opción de no tener que migrar todo el proyecto de una vez, con el tiempo y riesgo que ello conlleva. Debemos tener en cuenta a la hora de modificar funcionalidades existentes, sacarlas de la parte Legacy e introducirlas en la nueva. Esto provocará que, con el paso del tiempo, la parte Legacy se vaya haciendo cada vez más pequeña.
Si por alguna circunstancia no utilizamos Symfony, y no pueden convivir juntos el código Legacy y el código nuevo, recomendamos seguir la guía que se nos proporciona en el libro Modernizing Legacy Applications in PHP, de Paul M. Jones.
Paul M. nos proporciona pautas para ir modernizando el proyecto, incluyendo autoload, refactorizando el código, etc.