Hoy encontrarás:
Un arma de doble filo para desarrollar
Mi experiencia usándola por el filo equivocado
Aprendizajes y trucos nuevos
Cosas que me llamaron la atención
Memes para reírnos un rato
Aplicado, como no, al uso de LLMs para desarrollar software.
Dos caras de la misma moneda
Los desarrolladores tenemos una habilidad que funciona como un arma de doble filo, tiene múltiples nombres:
Determinación
Resiliencia
Persistencia...
A mí me gusta llamarla:
SER CABEZOTA
Cuando fue la última vez que te pusiste a montar algo, y no había manera de que saliera, y lo intentaste, y lo intentaste, y lo intentaste ... x200 hasta que te salió!
Es una habilidad poderosa, sin ella, al tercer error del compilador, habríamos dejado la profesión.
Sin embargo, a veces, echas la vista atrás y dices. ¿Y por qué estaba yo haciendo esto?
Ahora, con las herramientas de IA, podemos llegar más lejos antes del bloqueo. Parece todo tan fácil, de nuestra idea brotan automáticamente líneas que realizan nuestros deseos. Pero el bloqueo, algo que la IA no consigue resolver, una y otra vez, acaba llegando. Y en esta situación actuamos muy diferente.
Cuando no somos nosotros los responsables
Cuando la IA se atasca, a menudo, entramos en un bucle de "voy a conseguir que lo haga, cueste lo que cueste". A mí me pasó el otro día, te voy a explicar como ocurrió.
Un poco de contexto: Habitualmente uso Windsurf con Gemini, pero no andaba fino últimamente, así que le volví a dar una oportunidad a Claude, que recién nos activaron la versión 4 Sonnet.
La jugada no me salió del todo bien, Claude es muy bueno, pero es hiperparanoico haciendo validaciones de que los pasos que va haciendo son adecuados, lo que aparentemente es bueno, no acaba siempre en mejores resultados, haciendo que la implementación de cosas triviales sea lenta y costosa (se te van de 10 a 20 créditos de Windsurf por operación, eso es +10x vs Gemini). Además, es propenso a tocar más de lo que debe (por ejemplo, te va cambiado literales a diestro y siniestro), por mucho que le instruyas de lo contrario, así que si eres más caro, más lento y menos fiable... vamos mal.
Así que volví a Gemini, ya con el ánimo calentito.
Hasta aquí, son males menores, estaba construyendo un par de nuevas "pantallas" y como era "de cero" ambos funcionaron muy bien. Ahora tocaba arreglar minucias, y aquí es donde los LLM aún patinan mucho.
El problema del ajuste fino
Eran unas "pantallas" de configuración de "Personas" (concepto de UX) basándonos en unos arquetipos y casos de personalidad extremos.
Nada complicado, formularios con comboboxes, inputexts dinámicos según lo que selecciones, etc.
Tenía una lista de controles, 1 por persona y tengo que asignarle con un desplegable, el caso extremo: "usuario que usa el producto", "usuario que no lo usa", y así…
Quería un botón que reparte aleatoriamente esos comportamientos “Aplicar Distribución Equilibrada”.
El error: el botón funciona al primer clic, si le das una segunda vez, no vuelve a reasignar valores.
Gemini no conseguía corregirlo, cosas que no funcionaron:
Mi explicación detallada
Capturas de pantalla
Referencias al objeto DOM que le pasaba desde el navegador interno del propio Windsurf
Que el propio agente usara el MCP de Playwright para probar el error (eso fue un drama aparte)
Gemini la cagó en la implementación, yo la cagué en la dirección.
Se me metió entre ceja y ceja que esa función era útil y que corregirla era tan trivial que el agente debía solucionarlo de un plumazo.
Perdí mucho tiempo, demasiado.
La solución a un problema que no existía
Finalmente, le pido a Gemini que me diga el fichero y las líneas de código exactas que ejecutan la lógica de ese botón.
Me responde de manera ejemplar con varios enlaces directos a varias partes del código que interactúa (es un proyecto NextJS).
Llego al código (un JS con sus maps y sus filters)
Seleccioné ese código, se lo pasé al agente, en un nuevo chat y le pregunté:
¿Puedes explicarme por qué este código no está rehaciendo las asignaciones cuando pulso una segunda vez y sucesivas?
A lo que me responde:
¡Por supuesto! Este código no tienen ningún componente de aleatoriedad, así que decide una primera asignación y la repite para ejecuciones posteriores. Si quieres ese comportamiento, usa esta otra implementación (código corrector)
¡La madre que te parió! ¿Y no podrías haber hecho eso desde el principio?
Así que ya tengo mi funcionalidad inútil trabajando como quería.
Que el código funcione no es el objetivo
¿Cómo podría haber aumentado 100x mi productividad?
Limpiando la ventana de contexto en un nuevo chat.
Validando los cambios que hacía el LLM.
Mejor prompting o usar otro modelo,
No, ninguna de las anteriores, la manera más efectiva de haber resuelto el problema es:
Piensa en qué problema estás resolviendo antes de implementarlo.
En esta ocasión soy mi propio Product Owner, y me pareció útil añadir ese botón para crear agilidad en la configuración de la pantalla.
Pero pensémoslo, fríamente, un usuario real, ¿va a ponerse a pulsar varias veces ese botón hasta que aleatoriamente consiga la configuración que quiere? ¡No tiene sentido!
He cometido todos los errores anteriores:
No usar un chat nuevo hasta que se me hincharon las narices
Vibecodeo a tope, no vi que el LLM no atacaba el problema hasta el final
Quizás pivotar de modelo hubiera ayudado
Pero de haberme parado a pensar y darme cuenta de que estaba resolviendo un problema que no existía, todo lo anterior, aun llevándome al éxito de "el código funciona", todo lo anterior, se vuelve irrelevante.
¿Por qué nos sucede esto más con la IA?
Es muy fácil probar y tirar, el coste oportunidad es muy bajo, a menudo funciona el "tirar millas" sin pensar. Pero ¡ay cuando no funciona!
Ego al cuadrado. Si somos cabezotas con nosotros mismos, cuando nos ponemos en modo Master & Command podemos perder la cabeza rápido. Es curioso darse cuenta de que yo no actuaría de esta manera con un compañero humano, pero con la IA, inconscientemente tomo dinámicas más "agresivas".
Estamos viviendo un nuevo paradigma de trabajo. No es solo la herramienta o la productividad, está cambiando la manera en la que nos relacionamos con la tarea. Me parece un descubrimiento muy interesante sobre el que reflexionar.
Aprendizajes
Piensa primero, implementa después. La funcionalidad que me bloqueó no debería ni existir
Los LLM fallan bastante en el ajuste fino.
Cuida la ventana de contexto, los agentes son una caja negra dentro de una caja negra. Hay muchísima gestión de la ventana de contexto que pasa a tus espaldas y que no controlas directamente.
Audita las acciones del LLM, vibecodear para prototipar rápido, validar ideas… bien. Para construir funcionalidad robusta… te la juegas.
Evita el Master and Commander, ayuda al LLM como ayudarías a un compañero humano. Cuando me puse a mirar "junto al LLM" el origen del problema, dimos con la solución enseguida
Otros trucos y descubrimientos
Hay más límites de los que piensas
Me topé con una nueva limitación usando Agentes IA.
Una tool del agente puede tener sus propios límites, independientes de los del modelo.
La herramienta de "edit", con la que el LLM hace cambios en los ficheros, llegó a su límite de input, es decir, que tenía que editar ficheros tan grandes que la tool te decía que no, y el LLM me pedía hacer los cambios manualmente.
Me pasó con ficheros de literales muy extensos.
Lo solucioné troceándolo en varios ficheros y con un proceso en el build que unía todos los ficheros en uno.
Ajuste fino y límite de la tool, double the trouble
Alguna vez me he encontrado que el LLM es incapaz de hacer una edición "inline" de algún fichero JSON grande de configuración, porque no le da el límite a entender todo el fichero, y te hace la edición en algún lugar aleatorio y te rompe el fichero.
Antes de que vayas a las secciones interesantes y salgas de la newsletter, ¿qué tal si te suscribes? Si te has tragado toda la chapa, es que la cosa te ha gustado, ¿no? ;-)
Enlaces de interés
Me he dado cuenta de que mucha gente hace una sección de enlaces que les han parecido interesantes y que es bastante útil, así que voy a animarme a hacerlo yo también.
Nuevo benchmark para evaluar que los LLM siguen las instrucciones
Recopilatorio de reglas para hacer a Github Copilot más efectivo
Memes
Coleccionar memes es mi hobby oculto y he decidido sacarlo a la luz
Comparte el artículo, aunque solo sea por los memes :-)