Refactoring seguro con agentes de IA
Un agente puede cambiar silenciosamente el comportamiento durante un refactoring, en vez de solo la estructura. Los tests y los pasos pequeños lo evitan.
Qué significa realmente hacer refactoring
Refactoring significa mejorar la estructura interna del código sin cambiar su comportamiento visible desde fuera. El término se popularizó sobre todo gracias al libro homónimo de Martin Fowler. El "sin cambiar el comportamiento" es la parte decisiva, y es justo lo que se pierde fácilmente con agentes de IA cuando nadie lo exige explícitamente.
Por qué los agentes se desvían aquí
Al reestructurar, un agente suele ver cosas que le parecen "incorrectas": una condición extraña, una comprobación duplicada. Sin una instrucción clara, las "arregla" de paso en lugar de limitarse a reestructurar. Así, un refactoring puro se convierte, sin que nadie lo note, en un cambio de comportamiento.
Las tres salvaguardas más importantes
- Tests primero: antes de reestructurar debe existir una suite de tests que asegure el comportamiento actual. Sin tests no puedes comprobar si algo ha cambiado.
- Pasos pequeños: una reestructuración por paso, ejecutar los tests después de cada paso, hacer commit de cada paso en verde por separado.
- Exigir el comportamiento explícitamente: di claramente 'haz refactoring sin cambiar el comportamiento' en vez de solo 'mejora el código'.
Trampas típicas
El agente cambia en silencio una interfaz pública, borra código que le parece muerto pero que en realidad se llama de forma dinámica, o mezcla refactoring con peticiones de nuevas funciones en una sola pasada.
EJEMPLO
Prompt: 'Extrae la lógica de validación de processOrder() a una función propia, validateOrder(). El comportamiento no debe cambiar. Después de la extracción, ejecuta la suite de tests existente y avísame si algún test falla, antes de continuar.'
🛠️ EJERCICIO — PRUÉBALO TÚ
Toma una función de tu propio proyecto que haga demasiadas cosas a la vez y haz que un agente la refactorice en pasos pequeños respaldados por tests.
- Comprueba primero si existe un test que cubra la función. Si no lo hay, haz que se escriba primero un test que registre el comportamiento actual.
- Pide al agente explícitamente: 'Extrae [parte X] a una función propia, el comportamiento no debe cambiar. Ejecuta los tests después de cada paso.'
- Lee el diff antes de hacer commit y busca específicamente cambios que vayan más allá de una simple reestructuración.
✅ AUTOEVALUACIÓN
- ☐ ¿Siguen todos los tests en verde después del refactoring, y ya se había comprobado eso antes?
- ☐ ¿Contiene el diff alguna línea que no solo mueva código, sino que cambie una condición, un valor o un mensaje de error?
- ☐ ¿Se hizo commit de todo de una vez, o se pueden rastrear los pasos individuales por separado?
QUIZ RÁPIDO
¿Cuál es el requisito más importante antes de que un agente de IA haga un refactoring grande sobre código existente?
FUENTES
- Martin Fowler: Refactoring (Buchübersicht) ↗ martinfowler.com
- Refactoring.com: Katalog der Refactorings ↗ refactoring.com
- Anthropic: Claude Code Best Practices ↗ code.claude.com
- Claude Code: Manage costs effectively ↗ code.claude.com