Saltar al contenido

Etiqueta: llm

Escribo menos código que nunca: Superpowers y el nuevo desarrollo con IA

Hace unos pocos meses me di cuenta de que cada vez escribía menos código directamente. No porque estuviera desarrollando menos software, sino porque mi forma de trabajar había cambiado por completo. Si antes abría mi editor y comenzaba a implementar una idea casi de inmediato, ahora paso mucho más tiempo entendiendo el problema, diseñando la solución y validando que todo tenga sentido antes de escribir una sola línea a través del uso de Superpowers.

Paradójicamente, eso me ha hecho desarrollar más rápido.

Durante los últimos años hemos visto aparecer herramientas capaces de generar código en cuestión de segundos. Sin embargo, cualquiera que haya trabajado en proyectos reales sabe que generar código y desarrollar software son dos cosas muy distintas. Un programa no solo necesita funcionar; también debe ser mantenible, probado, seguro y fácil de evolucionar.

Gracias al Ing. Ronald Escalona, quien me compartió información sobre las skills de Superpowers, un plugin que incorpora un conjunto de skills especializados para el desarrollo de software. Después de utilizarlo durante un mes, puedo decir que cambió por completo mi forma de trabajar con IA y, curiosamente, también mi forma de programar.

Programador trabajando con las skills de superpowers que sugiere código en pantalla
Gracias al skill de superpowers, ahora tengo un asistente que programa por mi

¿Qué es un plugin y qué es un skill?

Antes de hablar de Superpowers, conviene aclarar dos conceptos:

  • Un plugin es una extensión que añade nuevas capacidades a una aplicación. En este caso, Superpowers amplía las capacidades del modelo de lenguaje incorporando metodologías, procesos y herramientas orientados específicamente al desarrollo de software.
  • Un skill, por otra parte, puede entenderse como una habilidad especializada. No es simplemente un prompt enorme ni un conjunto de instrucciones copiadas y pegadas en cada conversación. Es un flujo de trabajo diseñado para resolver un tipo específico de problema siguiendo buenas prácticas de ingeniería.

La mejor forma de imaginarlo es pensar que, en lugar de conversar con una única inteligencia artificial, estás incorporando a tu equipo a diferentes especialistas: un arquitecto de software, un ingeniero de calidad, un experto en pruebas automatizadas, un revisor de código o un especialista en depuración. Dependiendo del problema que quieras resolver, utilizas el skill más adecuado.

Lo interesante es que estos skills no buscan reemplazar al desarrollador; buscan que la IA trabaje siguiendo un proceso similar al que utilizaría un buen equipo de ingeniería.

Los skills que componen Superpowers

Aunque cada skill puede utilizarse de forma independiente, en conjunto cubren prácticamente todo el ciclo de desarrollo de una funcionalidad.

El proceso suele comenzar con Brainstorming, una skill que ayuda a comprender el problema antes de pensar en la implementación. En lugar de generar código de inmediato, analiza los requisitos, identifica restricciones, plantea preguntas clave y propone distintas alternativas para resolver el problema.

Una vez que existe claridad sobre lo que se quiere construir, Writing Plans transforma esas ideas en un plan de implementación dividido en tareas pequeñas y ordenadas. Este paso resulta especialmente útil cuando se trabaja en funcionalidades grandes o proyectos complejos, ya que evita improvisar durante el desarrollo.

Si el proyecto requiere trabajar de forma aislada, Using Git Worktrees prepara automáticamente un entorno independiente. Aunque esta es una característica nativa de Git, pocas personas la utilizan, y resulta extremadamente útil para desarrollar funcionalidades sin afectar la rama principal del proyecto.

Uno de los skills más interesantes es el Test-Driven Development (TDD). En lugar de escribir primero el código, guía al desarrollador para que siga el ciclo clásico de TDD: crear una prueba, verificar que falle, implementar únicamente el código necesario para hacerla pasar y finalmente refactorizar. Esto convierte las pruebas en una especificación funcional y hace que la IA deje de «adivinar» cómo debería comportarse el sistema.

Cuando las tareas son demasiado grandes, Subagent Driven Development permite dividir el trabajo entre varios agentes especializados. Mientras uno analiza la arquitectura, otro implementa, otro escribe pruebas y otro revisa la documentación. El resultado se parece mucho más al trabajo colaborativo de un equipo que a una conversación tradicional con un modelo de lenguaje.

La fase de depuración también tiene su propio proceso, denominado Systematic Debugging, que evita modificar el código por intuición y propone investigar primero la causa raíz del problema antes de aplicar cualquier corrección.

Después de implementar una funcionalidad, entra en juego Requesting Code Review, encargado de revisar la calidad del código desde distintos puntos de vista, como mantenibilidad, claridad, arquitectura y rendimiento. Si posteriormente surgen comentarios durante una revisión, Receiving Code Review ayuda a analizarlos críticamente y decidir cuáles realmente mejoran el proyecto.

Superpowers también incorpora Fix CI, pensado para diagnosticar problemas en los pipelines de integración continua, especialmente cuando fallan las pruebas o los procesos de GitHub Actions.

Antes de considerar terminada una tarea, aparece Verification Before Completion, cuyo objetivo es comprobar que todo compile correctamente, que las pruebas pasen y que no existan errores conocidos. Finalmente, «Finishing a Development Branch» realiza una última revisión antes de integrar la rama al proyecto principal, verificando que el trabajo esté realmente listo para hacer merge.

Vistos individualmente, parecen herramientas independientes, pero juntos forman una metodología bastante completa para desarrollar software asistido por inteligencia artificial.

Cómo se trabaja con Superpowers

Todo comienza con Brainstorming. Antes de pensar en el código, intento entender el problema, revisar los requisitos y explorar diferentes alternativas. Muchas veces descubro que la primera idea no es necesariamente la mejor.

Cuando la solución está clara, utilizo Writing Plans para dividir el trabajo en pequeñas tareas. Tener un plan evita perder tiempo durante la implementación y hace mucho más sencillo saber qué falta por hacer.

Si la funcionalidad es importante, preparo un entorno aislado utilizando Using Git Worktrees, lo que me permite experimentar sin preocuparme por afectar el estado del proyecto principal.

A partir de ese momento, intento seguir siempre un enfoque basado en Test-Driven Development. Primero escribo las pruebas, luego implemento únicamente el código necesario para que pasen y, finalmente, refactorizo cuando todo funciona correctamente. Si el desarrollo requiere varias partes independientes, Subagent Driven Development permite repartir responsabilidades entre distintos agentes especializados, lo que acelera bastante el proceso.

Cuando inevitablemente aparece algún error, procuro resistir la tentación de modificar el código de inmediato. En lugar de ello, recurro a Systematic Debugging, que obliga a formular hipótesis, buscar evidencia y encontrar la verdadera causa del problema antes de proponer una solución.

Una vez implementada la funcionalidad, solicito una revisión mediante Requesting Code Review, analizo los comentarios utilizando Receiving Code Review y, antes de considerar terminado el trabajo, ejecuto Verification Before Completion para asegurarme de que todo compile correctamente y las pruebas pasen sin inconvenientes. Finalmente, Finishing a Development Branch sirve como una última comprobación antes de integrar la rama al proyecto principal.

Puede parecer un proceso más largo que simplemente pedirle a la IA «implementa esta funcionalidad», pero mi experiencia ha sido exactamente lo contrario. Al existir un proceso ordenado, aparecen menos errores, disminuye el retrabajo y las implementaciones suelen llegar mucho más maduras desde el principio.

Reflexión final

Después de varios meses utilizando este enfoque, tengo una conclusión bastante clara: la inteligencia artificial no está reemplazando al ingeniero de software; está cambiando cuál es su trabajo. Cada vez dedicaremos menos tiempo a escribir código repetitivo y mucho más a comprender problemas, diseñar soluciones, validar resultados y tomar decisiones técnicas. Es un cambio que, lejos de preocuparme, me parece una evolución natural de nuestra profesión.

De hecho, esto me recuerda a mi profesor de Sistemas de Información II cuando en clase dijo que una cosa es la Ingeniería de Software y otra programar. Que al estudiar ingenieria haríamos mas que aquellos que solo saben programar, y eso fue hace como 18 años. Todo un visionario.

Herramientas como Superpowers demuestran que utilizar IA para desarrollar software puede ser cada vez más seguro y confiable cuando existe una metodología que la respalda. Sin embargo, ninguna metodología elimina la necesidad del criterio humano. Comprender el contexto del negocio, decidir qué problema vale la pena resolver, evaluar riesgos y determinar cuándo una solución realmente cumple con los objetivos del proyecto siguen siendo tareas del desarrollador.

La IA seguirá mejorando, escribirá código cada vez más rápido y probablemente resolverá problemas cada vez más complejos. Pero mientras existan decisiones de diseño, arquitectura y negocio que tomar, la experiencia humana seguirá siendo indispensable. Quizás el futuro del desarrollo no consista en escribir más código, sino en construir mejores procesos para colaborar con la inteligencia artificial de forma responsable. Y, sinceramente, creo que ese futuro ya comenzó.

Happy coding!

Deja un comentario

Mi experiencia en el CityJS Medellín 2024

CityJS es un conjunto de conferencias que se realizan en diversas partes del mundo para reforzar conocimientos sobre Javascript, Typescript y NodeJS. Este año se realizó una edición en Medellín y tuve la oportunidad de participar como ponente. Aquí te comparto mi experiencia durante los dos días del evento.

Primer día

El CityJS Medellín comenzó puntualmente con unas palabras de los organizadores, explicando el propósito de la conferencia y dando la bienvenida a todos los asistentes. A continuación, Liz Parody, encargada de animar el evento y presentar a los ponentes, introdujo la primera charla a cargo de Wes Todd, quien nos ofreció una fascinante actualización sobre el estado de Express y los próximos cambios en el proyecto. Luego fue el turno de Lizzie Siegle, quien explicó cómo podemos utilizar los modelos de lenguaje (LLM) para crear juegos de rol tipo D&D, una forma de usar esa tecnología que me sorprendió. Más tarde, Rafael Gonzaga nos habló sobre el rendimiento de Node.js con NSolid, brindando ideas para optimizar y mejorar su desempeño.

Después de un descanso con un excelente refrigerio ofrecido por los patrocinadores, volvimos al auditorio para asistir a la presentación de Anuar Harb. Su charla fue especialmente interesante, ya que comenzó con un segmento musical que nos despertó tras el receso. Habló sobre cómo se está utilizando la inteligencia artificial para generar modelos 3D y facilitar la creación de animaciones, además de promover las comunidades locales de Barranquilla. Luego, Vanessa Aristizábal nos habló sobre cómo expandir los límites de JavaScript y nos cautivó con láminas y dibujos de estilo ‘anime’ que hicieron su presentación aún más amena. Tras su charla, me tocó cerrar el ciclo de la mañana con mi propia ponencia.

En la tarde, participé en dos talleres (de los cinco que se ofrecían en paralelo). Uno fue impartido por Wes Todd sobre cómo contribuir a Express; me encantó su forma de explicar y de motivar a la audiencia a colaborar. En muchos eventos en LATAM he notado que pocos envían código al proyecto, pero en este taller se logró recibir contribuciones. Para cerrar el día, asistí a un taller de Adrian sobre el uso de modelos de lenguaje (LLM) y cómo podemos crear nuestros propios modelos aprovechando los servicios existentes, una excelente introducción para adentrarse en este mundo.

IA + WEB

Mi charla fue sobre cómo ejecutar modelos de lenguaje de gran tamaño (LLM) en el navegador. Era la primera vez que presentaba este tema, y creo que salió bien; aunque olvidé mencionar algunos detalles, en general resultó como esperaba. Sentí que a la mayoría del público le gustó y se mantuvieron atentos durante toda la charla.

Gracias al feedback y a las preguntas de la audiencia, pude identificar qué información debo agregar y cómo mejorar la narrativa para hacer futuras presentaciones aún más interesantes.

Segundo día

El segundo día comenzó con una excelente presentación de un DJ que componía música utilizando JavaScript. Fue increíble ver cómo creaba música de la nada y cómo este lenguaje de programación puede emplearse para codificar música electrónica de alta calidad. Luego inició el ciclo de charlas, comenzando con Robin Ginn, presidenta de la OpenJS Foundation y miembro de la Linux Foundation. Su charla fue excelente para comprender el funcionamiento de la fundación y su labor en la mejora de JavaScript. A continuación, The Cap nos ofreció una interesante charla sobre el uso de JavaScript en computadoras cuánticas, explicando cómo funcionan estos dispositivos y cómo transformarán el mundo al aprovechar su potencial. Después, Courtney Yatteau nos habló sobre sistemas GIS en JavaScript, mostrando lo fácil que es agregar mapas y capas de información usando ArcGIS. Finalmente, Mariano Alvarez nos presentó el avance de la inteligencia artificial en el navegador Chrome, explicando cómo Google está integrando modelos de lenguaje en el propio navegador.

Al regresar del almuerzo, continuamos con una charla de Carmen Huidobro sobre cómo crear controles para videojuegos como Dance Dance Revolution y la experiencia de desarrollar drivers para comunicarlos con aplicaciones en JavaScript. Fue una charla muy interesante y divertida, especialmente por la manera en que Carmen relató su experiencia. Después, Joel nos habló sobre el proceso de liberar bibliotecas al público, que resulta ser distinto al de desplegar código; su presentación estuvo llena de humor y fue muy entretenida para todos. Luego, Giovanni Laquidara nos introdujo en la programación para SmartTVs, y aunque no logré tomarle una foto, resultó fascinante entender cómo se programa en JavaScript para televisores.

Más adelante, Andrés Villegas presentó sobre el uso de async/await en sistemas distribuidos, un tema que adquiere una nueva complejidad al requerir sincronización de las esperas y peticiones para procesar la información. Fue un tema muy útil e interesante para quienes gestionan clústeres. Finalmente, CityJS Medellín cerró con una charla de Miguel Durán, quien brindó una excelente síntesis de los temas abordados en las demás ponencias, utilizando un humor negro que encantó a toda la audiencia. Su popularidad y gran experiencia con el público fueron evidentes y cerraron el evento de forma memorable.

Luego se monto Adrián a darnos información sobre los resultados del evento, el futuro de la comunidad y pudimos ver a todos los organizadores del eventos en el escenario para despedirlos. Al salir, todos nos dirigimos a un sitio para tomar la foto de todos los asistentes y ahí dar por cerrado CityJS Medellín.

Palabras finales sobre el CityJS Medellín

CityJS Medellín ha sido una de las mejores conferencias en las que he participado. Contó con ponentes de gran nivel, excelente organización, una audiencia comprometida y una amplia variedad de temas sobre lo más reciente en tecnología. Permitiendo aprender sobre las novedades en el mundo de JavaScript.

Agradezco al equipo organizador por la invitación a este gran evento. Espero que sigan realizándose más ediciones y cada vez se sumen más participantes.

Deja un comentario