Queridos lectores, hace unas semanas me comprometí a compartir mis experiencias implementando SETI-Spec y he estado ausente desde entonces. La razón es simple: estaba inmerso resolviendo un reto técnico bastante complejo.
Teníamos un backend (una API) que con el tiempo mutó hasta convertirse en un monolito de 64.000 líneas de código, el cual compartía información de más de 10 dominios de negocio diferentes. El reto era dividir esto utilizando Domain-Driven Design (DDD) y, por supuesto, aplicar todo lo que habíamos diseñado en nuestro marco de trabajo basado en OpenSpec.
El mensaje principal que les quiero dejar con este artículo se resume en una palabra: Resiliencia.
La ilusión de la varita mágica
Si nos guiamos por la publicidad y los artículos que abundan en LinkedIn, pareciera que la Inteligencia Artificial es una varita mágica: le pides algo y al instante tienes código perfecto. Mi experiencia deconstruyendo este monolito demuestra todo lo contrario.
Inicié el proceso muy juiciosamente. Recopilé toda la información sobre la arquitectura, las buenas prácticas y las reglas de seguridad entregadas por el cliente y que deben ser aplicadas al proyecto. Una vez digerido este contexto, pasé a escribir las especificaciones (los contratos que la IA debía seguir) y generé la primera tanda de código para el primer dominio: Personas.
¿El resultado? El código estaba completamente alejado de la realidad y de lo que se requería.
Pivotear y mantener la mentalidad AI-First
Aquí es donde entra la resiliencia. Hay que empezar a pivotear, entender qué generó la IA y por qué lo hizo. Esto incluye delimitar qué cosas no le vas a delegar a la inteligencia artificial.
Para encarrilar el proyecto, apliqué las siguientes tácticas:
- Estructura estricta: Usé scripts de PowerShell y trabajo manual para definir una estructura de carpetas clara. Pasar una jerarquía bien definida con roles específicos es vital para que la IA entienda su entorno.
- Reglas inquebrantables: Definí límites claros, como la prohibición estricta de alterar el código legado; su único trabajo era iniciar el proceso de migración hacia los nuevos repositorios.
- Refinar, no editar: Cuando el código generado falla, la gran tentación es arreglarlo a mano. No lo hagan. El objetivo es usar un enfoque AI-First. Si hay un error, lo que se debe hacer es refinar las especificaciones y revisar qué no se le explicó bien al agente. A veces, la frustración llega porque asumimos que una frase en un Markdown es suficiente, pero la realidad es que a menudo hay que reiterar instrucciones críticas dentro del mismo prompt.
«Baby Steps» y el choque con la realidad del CI/CD
Terminé adoptando una estrategia de pasos de bebé. Más allá de usar el contexto de mi IDE de desarrollo, me apoyé en NotebookLM para tener un entorno de planeación a largo plazo. Allí definí qué prompts usaría paso a paso. Una táctica que me resultó sumamente útil fue dedicar un paso exclusivo para generar un plan de cumplimiento de Code Coverage después de haber completado el desarrollo.
Y justo cuando crees que ya estás del otro lado, el código entra al pipeline de CI/CD.
Al pasar por SonarQube, saltaron errores. Este es otro mensaje crucial: no crean que porque el código lo hizo una IA, va a pasar derecho. No es porque SonarQube sea más exigente, es porque la IA es probabilística, no determinística. Incluso con el mismo contexto y las mismas especificaciones, puede generar soluciones distintas. No se puede bajar la guardia.
La luz al final del túnel
Se requiere cero confianza ciega, pero mucha resiliencia para seguir ajustando las especificaciones.
Eventualmente, llega el momento en que ves la luz al final del túnel: código bien estructurado, indicadores de SonarQube en verde, linters validando la alta mantenibilidad y una cobertura de pruebas por encima de nuestra meta del 80% (incluso tocando el 100% en algunos casos).
Llegar a este estándar de calidad haciéndolo bien no es cuestión de días. Me tomó casi cuatro semanas de iteración y paciencia. La inteligencia artificial acelera y potencia, pero exige rigor. Hay que insistir, ajustar y refinar hasta que funcione bien.