Working effectively with legacy code

Hace poco he terminado de leer Working effectively with legacy code, de Michael Feathers, un libro clásico de programación y, como me ha gustado mucho, me he decidido a compartir unas notas sobre él, por si a alguien le pica el gusanillo de leerlo. Forma parte de la colección "Robert C. Martin Series", en el que existen otros libros muy interesantes.

legacycode1.jpg
Es un libro muy práctico, especialmente si programas con orientación a objetos, pero su título quizá es poco afortunado. En realidad, se trata de un libro que habla sobre todo de Tests y Refactoring, y de cómo usar ambas técnicas para trabajar con Legacy Code ("código legado"), algo que muchos programadores tratan de evitar siempre que pueden.

El libro está organizado en tres bloques:

  1. Las mecánicas del cambio: en el que presenta unos conceptos generales y herramientas de trabajo.
  2. Cambiando el software: un "catálogo de recetas" ante problemas concretos
  3. Técnicas para romper dependencias

Las mecánica del cambio

El libro comienza hablando de las causas principales que motivan los cambios en un software: añadir una funcionalidad, corregir un error, mejorar el diseño u optimizar el uso de un recurso.

De aquí me quedo con una reflexión que hace el autor, que me parece muy valiosa, y es que da igual la causa final, probablemente el mayor reto para el programador será mantener el comportamiento existente, algo que ilustra con esta imagen

ExistingBehaviour

Sobre la forma en la que habitualmente hacemos los cambios, el autor critica lo que ya conocemos: muchas veces se usa el arriesgado "Edit and Pray" (editar el código y rezar porque nuestro esfuerzo sea acertado), cuando lo más adecuado sería aplicar "Cover and Modify", es decir cubrir primero el código con tests y, solo después, comenzar a modificarlo.

Los test cumplen aquí una doble misión: actuar como red de seguridad y proporcionar un feedback rápido sobre nuestro conocimiento del sistema, el cual crecerá con ellos.

De hecho, la definición de "Legacy Code" por parte del autor es "un código Legacy es aquel que no tiene tests" (y por tanto es difícil de modificar), algo que si nos paramos a pensar tiene todo el sentido del mundo. Tener buenos tests en un proyecto es una señal de su salud, pero la realidad es que muchas veces no existen y que añadirlos no es fácil. Entonces ¿cómo comenzar a trabajar con un código sin tests e incorporarlos?

El libro sugiere seguir estos pasos:


Cambiando el software

Este bloque del texto sigue un modelo de "recetas", planteando consejos y técnicas de refactoring a una lista extensa de problemas. Por citar algunos de los ejemplos:

Técnicas para romper dependencias

Presenta varias técnicas de forma detallada y con código de ejemplo, algunas adaptadas del libro Refactoring, de Martin Fowler. Técnicas que, una vez aplicadas, rompen dependencias y favorecen la creación de tests.

Algunas de ellas son por ejemplo:

—-

En resumen, creo que el libro merece la pena por el mensaje que trasmite: Legacy no es "un código que otro ha hecho mal hace mucho tiempo", puede ser un módulo que acabamos de escribir nosotros mismos sin crear unos tests asociados. Y es valioso también por el catálogo de recetas del segundo bloque, algo a lo que personalmente seguro que volveré buscando consejo en el futuro.

Si te enfrentas a actualizar un sistema antiguo, sin duda éste es un libro muy útil para ti.

Saludos