IA para desarrolladores #1

Me invitaron a dar una charla sobre IA para un equipo de desarrollo americano e hindú. La idea fue abordar conceptos esenciales de IA y ver herramientas para aumentar las capacidades de los programadores, diseñadores y disciplinas afines.

Tratándose de una presentación privada, no puedo publicarla tal cual, pero a vamos con la transcipción.

Me saltearé ejemplos con herramientas como Copilot y Claude Code, que publicaré en otras entradas, para hacerlo más práctico.

La invitación se extendió a una serie de futuras charlas, que con gusto estaré compartiendo también (sin calendario definido por ahora).


No soy un experto (aunque estoy tratando de convertirme en uno). Mi experiencia con la IA se remonta a antes de ChatGPT y tal vez eso me dio algunas herramientas para comprender mejor cómo interactuar con esta nueva generación de IA. Pero más allá de eso, todo ha sido experimentación. A continuación, quiero compartir mis experiencias y consejos, tanto relacionados con la IA como relacionados con la ingeniería de sistemas en general, enfocándome en nosotros como desarrolladores. Simplificaré algunas cosas, intentando comunicarme en un lenguaje sencillo, en lugar de usar un montón de terminología.

Lado humano

Comencemos con el lado humano y respondamos la pregunta que está en la cabeza de todos:

¿La IA te reemplazará?

Bueno, simplemente, no.

Estudios muestran que las tareas de código complejas no se ven afectadas significativamente por el uso de IA generativa. Al menos hasta que obtengamos AGI, la IA necesita que nosotros pensemos. Pero la IA tiene que:

  • Ayudar con la creación de prototipos (ejemplo: Replit)
  • Mejorar la productividad, por ejemplo, realizando tareas simples y repetitivas.
  • Mejorar la experiencia del desarrollador, por ejemplo, haciendo que la IA haga las cosas tediosas que no nos gustan. Para mí, eso es el código de relleno, todo el código no funcional que hay que escribir en C# para ejecutar solo un par de líneas de trabajo real; eso es algo que la IA puede hacer fácilmente por nosotros.
  • Y lo más importante: Liberar tiempo para pensar.

¿Cómo puede ayudarme la IA?

Bueno, el mejor consejo que puedo darte es: Sólo usala. Usala, usala, usala. La IA no te juzgará, podés hacer cualquier pregunta, por tonta que parezca. Y al preguntar y tener que aclarar y repreguntar, aprenderás a obtener las mejores respuestas.

Algunos ejemplos prácticos de cosas con las que la IA puede ayudar son:

  • Quitar cosas triviales de tu mente. Le pido código básico que podría escribir yo mismo, pero que ya no quiero hacerlo. Cosas que sería vergonzoso preguntarle a un colega, pero a ChatGPT no le importará.
  • Hacer tareas repetitivas, como reemplazar texto, refactorizar código, etc.
  • Responder preguntas en lenguaje humano, en lugar de buscar en Google. Este es uno de mis principales casos de uso: Ya no uso Google a menos que esté buscando un lugar o un número de teléfono. Esto ahorra tiempo, ya que en lugar de revisar la documentación y GitHub para comprender bibliotecas de terceros, simplemente se le pide a la IA un fragmento de código y una breve explicación. Pero no te olvides de la explicación para entender lo que estás metiendo en el proyecto.
  • Sugerencias de código: Es más que el autocompletado normal. Puede proponer algoritmos completos a partir de oraciones en lenguaje humano.
  • Mejoras en el código. Solo pedí que lo mejore.
  • Traducción de código, lo cual puede ser útil, por ejemplo, si tiene un código viejo y se desea actualizarlo, o si tenemos un ejemplo en un lenguaje y necesitamos convertirlo a otro.
  • Crear pruebas.
  • Detectar de errores. Sólo preguntá si hay algún problema con el código o se puede mejorar.
  • Generar documentación resumiendo el código y explicándolo.
  • Explicación de errores. Hacer que la IA descubra por qué algo falló y sugiera soluciones.

¿Métricas?

Brevemente, ya que esto está fuera del alcance de este artículo, pero quiero al menos mencionar que más no significa necesariamente mejor. No esperen solo más código (para los managers), ni escriban más código simplemente para presumir su progreso.

Hay métricas que podemos implementar para medir como DORA *, herramientas como JIRA deberían darnos algunas pistas como cantidad de tareas en cada estado, tiempo de análisis, tiempo de entrega, tiempo promedio para corregir errores, etc.

* DORA: Investigación y evaluación de DevOps. Mide los KPI:

  1. Frecuencia de implementación: Con qué frecuencia se implementa el código en producción.
  2. Plazo de entrega de cambios: Cuánto tiempo lleva un compromiso para entrar en producción.
  3. Tasa de errores de cambio: El porcentaje de implementaciones que provocan un error en la producción.
  4. Tiempo medio de recuperación (MTTR): Cuánto tiempo lleva recuperarse de una falla en la producción.

Estos son los tipos de datos que deberían decirnos si lo estamos haciendo mejor o peor con la IA.

Programar vs escribir código

Volvamos al ítem de pensar. La IA generativa es muy buena escribiendo código. Pero tenemos que pensarla como una herramienta, una herramienta para aumentar nuestras capacidades.

Vos sos el programador, tenés que tener en cuenta que aunque el código de la IA compilará, cometerá errores. Tenés que leer y comprender el código antes de pegarlo en el proyecto. Creo que si la IA te ahorra un par de horas, podés dedicar algo de tiempo a asegurarte de que el resultado de la IA sea bueno.

Necesitás comprobar: 

  • El flujo y la lógica
  • Que las bibliotecas que utilizó tengan sentido ¿Realmente necesitamos una biblioteca para eso? ¿No tenemos ya una biblioteca que hace lo mismo? Solo pedile que la use.
  • Al resolver errores, ¿te hace ejecutar un comando peligroso? No te limites a ejecutar las instrucciones que sugiere, si no estás seguro o el problema no está solucionado, segí preguntando.
  • Verificá que no haya roto nada o que no haya generado propiedades o métodos inexistentes. Por ejemplo, me ha pasado que ha generado código decente, con todas las variables y objetos correctos, pero que en una línea usab una variable donde debería haber utilizado otra. No alucinó, tenía todo lo que necesitaba, era solo ese pequeño error que no habría notado si no hubiera interpretado el código.
  • Y no te olvides de asegurarte de que utilice las mismas versiones (versión del lenguaje, versión de APIs, etc.) que vos. Tené en cuenta que es posible que no conozca bibliotecas o versiones muy nuevas.

Entonces, tu trabajo se convierte en el trabajo de un ingeniero o un arquitecto. En resumen, esto significa que tenés que:

    • Pensar en algoritmos. Para los chicos de UI, deben pensar en el usuario humano y la UX, algo que la IA manejará mal.
    • Saber desglosar un problema en pasos.
    • Saber qué preguntarle a la IA.
    • Y luego supervisar los resultados.

    Así que mi recomendación aquí es: Profesionalizarse. Aprender, leer, ver videos sobre cómo hacer estas cosas y comenzar a hacer más preguntas y aprender de la experiencia de todos.

      Esto no es solo IA, de repente se convirtió en un consejo profesional, espero que te sirva.

      ¿Cómo hacer las preguntas correctas?

      Esta es la primera pregunta que hay que hacer, pero para vos mismo:

      ¿Necesito IA para hacer esto?

      Si vas tab, tab, tab, simplemente dejando que la IA haga todo, no estás pensando. A veces es más rápido escribir el código que preguntarle a la IA y revisar la respuesta y todo lo que acabamos de hablar.

      Luego, hay que preguntarse:

      ¿Cómo divido esta tarea en pasos?

      La IA fallará miserablemente ante preguntas vagas o abiertas. Hay que darle instrucciones precisas y accionables. Mantén esa palabra en mente esa palabra: Accionable. Me refiero a una instrucción sobre la que la IA puede actuar o ejecutar.

      Esto es menos un problema cuando usamos herramientas como Copilot, Claude Code o Replit, porque hacen el análisis por nosotros en segundo plano. Pero si vas directamente al ChatGPT, alucinará.

      Algo más a considerar es:

      ¿Dónde pregunto?

      Creo que todos los modelos de los que hablamos hoy son perfectamente capaces de ayudarnos en las tareas de programación.

      Pero, por ejemplo, Copilot, aunque internamente también susa ChatGPT y Claude, se especializa en tareas de codificación.

      Por eso, es buena idea combinar las diferentes herramientas que tenemos a nuestra disposición.

      Comenzar con ChatGPT (en realidad, Claude también, aunque el nivel gratuito es bastante inútil). Básicamente es más rápido. Tiene una amplia base de conocimientos y puede utilizar sus conocimientos generales para explicar un tema, desglosar tareas o proporcionar documentación y ejemplos.

      Al iniciar una nueva tarea, podés asignar a ChatGPT el rol de ingeniero de software y pedirle que analice el problema. O escribir un ejemplo, o escribir una plantilla.

      A continuación, podés pasar a vscode y usar Copilot para generar el código específico, editándolo según sea necesario.

      Mencioné cosas como «darle el papel», hagamos un poco de ingeniería rápida para entender eso.

      Ingeniería de prompts

      Esto es algo que se está convirtiendo en un arte en sí mismo, pero todo el mundo debería tener al menos una idea de la ingeniería de prompts.

      Es básicamente cómo preguntar, cómo escribir y estructurar tu pregunta en lenguaje humano.

      Lo bueno de ChatGPT y Claude es que no requieren tokens específicos. Hay modelos como Llama (de Facebook) que usan etiquetas especiales que se parecen a xml o html y se parece más a programar un mensaje. Pero con los modelos que utilizamos, sólo es cuestión de escribir en español (o inglés) directamente, añadir nuevas líneas, ejemplos, etc.

      Estos modelos por defecto son de «zero shot». Esto significa que intentan comprender y responder su pregunta generalizando a partir de sus conocimientos. Les resulta imposible comprender o adivinar cualquier contexto que no se haya proporcionado en el prompt.

      • La técnica más básica para obtener la respuesta que desea es: Aclaración. Agregá contexto a tu pregunta, por ejemplo no es lo mismo preguntar sobre «bancos» (podría ser un banco en una plaza) que sobre «tipos de bancos en finanzas».
      • Incluí ejemplos, contexto e instrucciones de formato para dirigir la atención de la IA a cosas relevantes que aprendió durante el entrenamiento. Esto se llama prompt de «few shot». Tan solo incluir un ejemplo antes de tu pregunta puede mejorar drásticamente los resultados.
      • Agregá instrucciones sobre cómo llegar a la respuesta, como «piensa paso a paso». No es lo mismo pedirle que «arregle un error» que «investigar un error». Establecé los roles («tú eres…», «actúa como…»). Eso es lo que quise decir con «establecer el rol». Cada palabra impacta los resultados. Es sorprendente cuán diferentes pueden ser las respuestas con y sin instrucciones.
      • Agreguá al menos un ejemplo del formato de salida esperado; esto es muy importante cuando trabaja con datos estructurados como listas o JSON.
      • Utilizá caracteres que agreguen estructura al texto, por ejemplo, elementos de lista (-) o comillas que separen el contexto, los datos y la pregunta final.
      • Utilizá terminología especializada y específica, un lenguaje conciso y preciso para transmitir ideas complejas. Esto ayuda al modelo a reconocer patrones y comunicarse de manera más eficiente, y es especialmente útil en campos técnicos como el nuestro.
      • Evitá la formalidad (por favor, ¿podrías?, gracias).
      • Usá los diálogos de manera eficiente. Podés chatear con la IA para realizar seguimiento (aclaraciones, etc.), pero intentá concentrarte en una sola tarea, inicnando un chat nuevo cuando necesites cambiar de tema o cambiar el rol de la IA.

        Algunos ejemplos:

        No es bueno:

        ¿Es este código seguro? (el código)

        Un mejor prompt:

        (el código primero)

        Valide la seguridad del código identificando entradas, verificando la administración de memoria y enumerando vulnerabilidades potenciales con sus puntuaciones CVSS.

        Malo:

        Escribe una función para ordenar una matriz.

        Mejor:

        Escriba una implementación estable de ordenación por combinación en C# que ordene una lista de números enteros en orden ascendente. La función no debe modificar la lista original y debe manejar casos extremos como listas vacías y listas con valores duplicados. Incluya breves comentarios en línea.

        Malo:

        Explique asíncrono/espera.

        Mejor:

        Explique cómo funciona async/await en JavaScript a un desarrollador junior. Utilice esta lista de conceptos como contexto para guiar la explicación:
        Bucle de eventos de JavaScriptPromesasCódigo de bloqueo versus código sin bloqueoManejo de erroresTambién incluya un ejemplo de código que muestre el uso adecuado de async/await con try/catch.

        Claude vs ChatGPT

        Dependiendo de la tarea, a veces Claude es mejor y otras veces es al revés. También depende del agente, si estás usando Copilot, Claude Code, Replit, etc. No hay una respuesta definitiva, tendrás que experimentar con ellos.

        Mi impresión es que Claude es mucho mejor con las tareas de código, mientras que ChatGPT es mejor resumiendo y escribiendo documentación técnica, revisando documentación, generando ejemplos, etc.

        Además, tenemos que pensar en el agente. Copilot no es muy bueno para encontrar implementaciones en tu propio código o implementar sus propias funciones; funciona mejor con C# aislado, o bibliotecas públicas y bien conocidas. Pero usando Claude Code, el mismo modelo de repente se vuelve mucho mejor y se pueden hacer cosas como explorar toda la base del código para que la IA lo comprenda mejor y pueda descubrir dónde realizar los cambios.

        Algo que realmente me impresiona es que Claude puede encontrar errores incluso antes de preguntar. Mientras trabaja en un cambio, es capaz de detectar y solucionar problemas o incluso errores tipográficos en otras partes del archivo.

        Algo malo: Hay que ser muy cuidadoso con SQL. En mi experiencia, tanto Claude como ChatGPT a veces hacen cosas peligrosas.

        Replit vs Claude Code vs Copilot

        En mi opinión, Replit es bueno para crear plantillas y tal vez para «vibe coding» (tal vez hayas oído hablar de eso). Pero no es una buena opción para un entorno profesional como.

        No parece haber una manera de integrarlo en vscode, la única opción sería subir nuestro código completo y trabajar en el sitio web de Replit… una pesadilla (sin mencionar una fuente de problemas, riesgos de seguridad, fuga de IP). Sin embargo, es una buena herramienta para crear plantillas, luego descargarlas y pasar a otras herramientas.

        Creo que Claude Code no sólo es una buena alternativa para Replit, sino que es muchísimo mejor. Puede hacer lo mismo y más mientras trabaja con nuestro código base en nuestro propio equipo. Es incluso un poco mejor que Copilot, ya que puede ver todo el proyecto a la vez y usar archivos existentes como guía para crear código nuevo, algo que Copilot al momento de escribir esto no puede hacer.

        El único tema a considerar es que consume muchos (muchos) tokens.

        Cabe mencionar que OpenAI acaba de lanzar lo que es básicamente un clon de Claude Code, que aún no he probado.

        ¿Cómo funciona la IA generativa?

        Hagamos un resumen muy breve de cómo funciona todo esto internamente, para comprender algunos conceptos básicos de IA.

        Es importante aclarar antes que nada qué son los Agentes y los LLM.

        Agente

        Un agente es un algoritmo que combina código no-IA de toda la vida, con código de IA y modelos de IA generativa para comunicarse con el usuario, tomar decisiones y ejecutar acciones para lograr un objetivo. Puede combinar herramientas, conocimiento dinámico, datos en vivo y ejecutar múltiples pasos y prompts para completar una tarea (las famosas técnicas RAG, REACT, COT, etc.). Copilot y Claude Code, son agentes, no modelos; son una combinación de diferentes modelos y herramientas.

        LLM

        Es un tipo de modelo de IA (porque hay muchas otras IA, como la visión artificial o el procesamiento del audio) que puede comprender y generar el lenguaje humano, o lenguaje natural, como se le llama. Solo recordá que IA no equivale a un chat, hay mucho más. ChatGPT, Claude, Llama son modelos LLM.

        Modelo (fundacional)

        Es el preentrenamiento, o conocimiento, de la IA. En los casos que estamos viendo, el modelo es básicamente Claude o ChatGPT, pero también hay modelos especializados y de código abierto. Por supuesto, la mayoría de nosotros no necesitamos crear nuestro propio modelo.

        Inferencia

        Es cuando proporcionamos el prompt, que es la consulta o el texto que enviamos a la IA generativa, y la IA comprende el contexto y la intención, o lo que queremos que haga.

        Generación

        Es cuando la IA genera la respuesta. Generará fragmentos de código utilizando el modelo aprendido y el contexto. Seguirá la estructura del lenguaje de programación, tal como lo hace con los lenguajes humanos (español, inglés).

        Feedback

        La IA misma, o vos, pueden usar el resultado para volver a preguntar y obtener respuestas cada vez más refinadas.

        El código es para humanos

        Finalmente, hay algo que me encantaría que todos tuvieran en cuenta en medio de todo este revuelo entre humanos y IA: El código es para humanos. A las máquinas no les importa en absoluto las convenciones de nomenclatura, tabs vs espacios y todo eso.

        No culpo a nadie aquí, simplemente me encantaría que todos estuviéramos alineados.

        • Necesitamos escribir código ordenado y más limpio.
        • Necesitamos reutilizar (código, estilos en el frontend, etc.).
        • Necesitamos escribir funciones más cortas, menos parámetros. Una regla general que uso es: Si la función necesita más de dos o tres parámetros, la divido en varias funciones, o uso un solo objeto como parámetro para que el orden de las propiedades no importe.
        • Necesitamos usar nombres claros, debería ser obvio qué necesita una función como entrada, qué hace y qué devuelve solo con el nombre.
        • Y no necesitamos ser tan vivos. A veces está bien escribir código redundante o tener un poquito menos de rendimiento en pos de la claridad, eso es mejor que una línea críptica que ni siquiera vos mismo entenderás dentro de un mes.

          Yo mismo a menudo soy culpable de romper estas reglas, pero el objetivo es tenerlas en cuenta y tratar de detectar cuando estamos haciendo un lío, identificar problemas en el código existente y ser capaces de pedirle a la IA que mejore el código.

          Nota: La charla original fue en inglés, la he traducido a español argentino.

          Nota: Tomo algunas ideas y citas de IBM.


          Publicado

          en

          ,

          por

          Etiquetas: