Una isla en Noruega, ChatGPT y Github Copilot

Código impreso, ¿para qué?

Hace aproximadamente dos años, GitHub –la empresa hoy propiedad de Microsoft, cuya herramienta aloja gran parte del código desarrollado en el mundo– anunció que iba a descargar todo el código abierto disponible en su plataforma, que lo imprimiría en cintas y lo almacenaría en el ártico, en una isla del archipiélago noruego Svalbard. La idea es asegurarle a la humanidad esa fuente de conocimiento para la posteridad. Como si te pusieras a imprimir todas las fotos digitales que hay alojadas en tu teléfono, en caso de que lo pierdas.

Algo extravagante y que suena muy original. Pero la gente de GitHub no fue la primera en pensar que una buena forma de cuidar algo para el futuro era esconderlo en un hoyo en el suelo, protegido por el permafrost de una isla desmilitarizada, que es a la vez uno de los lugares menos visitados por humanos en la Tierra. Este proyecto es muy similar a uno que está andando desde el año 2008 llamado Global Seed Vault: un búnker bajo tierra creado por una colaboración del gobierno de Noruega con la Crop Trust y la organización NordGen, que actúa como un banco en el que las naciones del mundo pueden almacenar semillas en caso de que existan problemas de abastecimiento en un futuro (no tan) lejano.

Ambos proyectos están muy, muy cerca. Aunque si bien son 20 minutos caminando, tal vez el clima no es el ideal para un "paseo por la isla"

Arctic Code Vault: ¿qué es?

Github, casi 20 años después, pensando en las miles de millones de líneas de código abierto que ha generado la humanidad, quiso hacer algo similar y decidió llamarlo Arctic Code Vault. Para lograrlo se aliaron con la minera noruega StoreNorske Spitsbergen Kulkompani (SNSK) y  con la compañía de preservación digital a largo plazo Piql AS. SNSK se puso con una mina de carbón dada de baja y Piql AS ayudó con la analogización del contenido digital. Así nació el Arctic Code Vault (ACV), un lugar donde países, universidades y otras instituciones, como GitHub, pueden almacenar contenido digital para generaciones futuras en formato impreso, en cintas que pueden ser interpretadas para recuperar su contenido en forma digital.

¿Pero, por qué impreso?, pues porque el código ya está almacenado en formato digital y con redundancia en servidores y unidades de almacenamiento alrededor del mundo, y la idea es asegurarse que si ocurre algo que afecte a lo digital, existan alternativas para recuperarlo.

Sí, parece como el comienzo de una película de ciencia ficción distópica: el mundo se va a las pailas, no pudimos con el cambio climático y la cuarta guerra mundial arrasó con casi todo. La última esperanza de la humanidad está en una isla en el ártico, donde 200 años atrás se escondieron los códigos que nos permitirán recuperar todo lo que hay en internet.

Los rollos que guardan el código

Gracias a este proyecto, todos los usuarios de GitHub que tengan algún repositorio público que haya tenido commits entre el 13 de Noviembre de 2019 y el 2 de Febrero de 2020, tienen un badge como el de la imagen de abajo en su perfil, que certifica que han sido un aporte para la humanidad en caso de que alguna catástrofe natural, política o extraterrestre haga que todo el código almacenado en la web se pierda.

El timbre verificador

Pero estar preparado para catástrofes naturales y futuros distópicos no es la única manera que ha encontrado GitHub para dar uso a los miles de millones de líneas de código de repositorios públicos que hay en su plataforma. Hace unos años, en un trabajo conjunto con OpenAI, iniciaron un proyecto llamado GitHub Copilot, que como muchos de los proyectos que hacen uso de Inteligencia Artificial, tiene el potencial para cambiar la forma en la que trabajamos.

Github Copilot está disponible desde hace un buen tiempo. Puedes probarlo aquí. Eso sí, como casi todo lo que diseña OpenAI, desde ya te digo que es otra de esas herramientas que tienen a algunos un poco nerviosos de que una IA nos reemplace en la pega. Pero vamos de a poco.

¿Que és Github Copilot?

GitHub Copilot es una herramienta de GitHub que, en sus propias palabras, genera sugerencias de código y funciones completas en tiempo real, directamente desde el editor de texto que estás usando. Para usar Copilot puedes instalar su extensión para editores de texto, que por ahora está disponible en VSCode, Visual Studio, Neovim y los IDEs de Jetbrains.

¿Cómo funciona Github Copilot?

Por detrás, Copilot hace uso de Codex, un modelo de inteligencia artificial de Open AI que traduce lenguaje natural a código. ¿Qué significa eso? Que puedes pedirle, de la misma forma que le pedirías a un desarrollador “escribe una función que reciba una palabra y me entregue el número de vocales que tiene” y será capaz de traducir esa instrucción en un pedazo de código que realice específicamente eso.

Ahora, ¿cómo es que el modelo de Codex logra entender lo que le estás diciendo y traducirlo a un lenguaje de programación? Lo que hizo la gente de Open AI fue tomar el modelo GPT-3 que ellos mismos crearon – y del que probablemente ya hayas escuchado – y le aplicaron un proceso que se llama fine tuning, utilizando un dataset conformado por instrucciones en lenguaje natural y miles de millones de líneas de código como datos de entrenamiento.

Ya buena onda, pero ¿qué es fine tuning?

Fine tuning –en caso de que no lo sepas– es el proceso de tomar un modelo que ya fue entrenado para una tarea específica y “enseñarle” a especializarse en algo mediante una serie de nuevos datos de entrenamiento y en ocasiones, modificaciones estructurales a su arquitectura original.

Si te sirve como ejemplo, piensa en una persona que termina de estudiar y egresa con conocimiento general de un montón de cosas. Luego, entra a un trabajo donde se ve expuesta a un contexto e información más específica y se convierte en experta en esa área. Imagina lo diferente que sería, por ejemplo, tratar de convertir a alguien en un experto en inversiones en fuentes de energía renovables para trabajar en el gobierno desde cero, versus tomar a alguien que estudió finanzas o ingeniería eléctrica en la universidad. Partir con una base de conocimiento y luego enfocarte en la especialización es probablemente el mejor camino.

Eso fue lo que hizo la gente de OpenAI. Luego de entrenar su modelo GPT-3  y darse cuenta del potencial que tenía para convertir lenguaje natural en extractos sencillos de código, decidieron extender este modelo para crear Codex y entrenarlo con muchos datos de repositorios públicos, transformándolo en una herramienta especializada en programar.

Si quieres leer el paper detrás de este modelo, te lo dejo aquí.

Wow ¿y de qué cosas es capaz el robotito?

Hoy en día, Codex es competente en 12 lenguajes de programación, y se destaca especialmente en Python. Esta herramienta puede ser usada para diferentes tareas, como por ejemplo:

  • Explicar extractos de código
  • Crear datos para realizar pruebas
  • Crear consultas para bases de datos en SQL
  • Crear código a partir de comentarios
  • Autocompletar el código que estamos escribiendo, entre otras cosas

Por ejemplo, puedes escribir un comentario describiendo lo que quieres que haga una función y esperar a que te sugiera una solución, como también puedes empezar a desarrollar y dejar que Copilot complemente lo que escribes. Probablemente ya te has encontrado con algo de este estilo en tu día a día al escribir un correo electrónico y ver cómo este te ayuda a completar lo que quieres comunicar.

En general evito las sugerencias de gmail, salvo cuando son exactamente lo que voy a escribir

Ya, pero y en el día a día… ¿qué puedes hacer con esto?

Cuando entré a Fintual no sabía mucho de Ruby on Rails (RoR). Había trabajado con otros lenguajes de programación en mis trabajos anteriores y a pesar de que las bases de la programación son –hasta cierto punto– agnósticas al lenguaje, existe una curva de aprendizaje al momento de comenzar con un framework nuevo como RoR. Algo puntual en lo que Copilot me ayudó mucho durante mis primeros meses en Fintual, fue aprender a usar mejor RSpec, la herramienta de unit testing que utilizamos en Fintual para asegurarnos que lo que hacemos funciona como tiene que funcionar.

Una de las características que menciona Github en la documentación de Copilot, es cómo logra acercarte al conocimiento. Este es uno de los puntos en los que, personalmente, más valor veo. Especialmente para alguien que está incursionando en un lenguaje nuevo.

En mi caso, sirvió para conocer funcionalidades de Ruby y sus librerías en el momento específico en el las necesitaba. Harri Edwards, Research Scientist de Open AI lo describe así:

Trying to code in an unfamiliar language by googling everything is like navigating a foreign country with just a phrasebook. Using GitHub Copilot is like hiring an interpreter.
Intentar programar en un lenguaje que no conoces googleándolo todo es como visitar un país extranjero con libro de frases. Usar Copilot es como contratar un intérprete.

Un intérprete que se encarga de mencionarte algo que cree fuertemente que te podría servir, en el momento que le parece que necesitarás usarlo. Como cuando visitas un lugar nuevo con algún amigo que vive ahí hace años: no hay mejor manera de turistear.

Con solo escribir un punteo de las cosas que sabía que tenía que testear, Copilot me entregaba una propuesta inicial de cada uno de los tests. La mayoría de las veces estos tests no están listos para llegar y usar, pero me permitieron conocer muchos de los métodos que provee la librería RSpec para asegurarnos que lo que hacemos funciona como y cuando tiene que funcionar.

¿Pero no sientes que aprendes menos al usar Copilot?

Tal vez te estás preguntando, con toda razón, si Copilot no produce el efecto muleta: cuando tienes una lesión grave te acostumbras a caminar con una muleta e incluso cuando ya estás recuperado, todavía cuesta un poco andar sin ella. Es una de las discusiones que ChatGPT ha puesto sobre la mesa en temas educativos: si los alumnos deberían o no ocupar estas herramientas, ya que tal vez te acostumbras a que una IA haga todo por ti; o más bien, como decía el bueno de Harri, es una forma de acercarte al conocimiento.

En mi caso,  Copilot me ha mostrado un montón de métodos que no sabía que existían, pero al mismo tiempo sus sugerencias no siempre (o casi nunca) son lo suficientemente buenas como para dejarlas pasar sin una revisión previa. Esto hace que no se sienta como que tu conocimiento no sea necesario porque un robotito lo puede aprender más rápido y mejor tú, sino que estas dejando de necesitar la misma cantidad de tiempo que te tomaría escribir todo el código por tu cuenta.

Como bien dice su nombre, Copilot es como hacer pair programming con un compañero que sabe algunas cosas que tú aún no conoces y además es rapidísimo para escribir. En ese trabajo en equipo, tú te encargas de definir un outline o plan de ruta de qué es lo que hay que hacer, Copilot se encarga de escribir la versión inicial y tú después de corregir lo que hizo, si es necesario, y dejarlo funcionando perfecto.

Clave tener un buen copiloto en la vida

Personalmente, todavía creo que programar con otro humano sigue siendo importante. El tema es que a veces no dan ni el tiempo ni los recursos. Ahí me parece que Copilot hace su gracia: trabajas en equipo aunque justo en ese momento no haya un compañero disponible.

Ya, pero no puede ser todo bueno. Where’s the poop?

Por supuesto, no todo es perfecto. Hay algunos problemas con la calidad del código que te recomienda–aunque ahí queda en cada uno no creerle todo–o que a veces recomiende código público (aunque cuenta con un feature para evitarlo). De todas formas, hay algunas discusiones éticas dando vueltas alrededor de Copilot: que se entrena con código de otras personas sin su autorización, por ejemplo, y que nos pone en un debate bien complejo: ¿qué es ser dueño de un código? Tal vez nos deberíamos cuestionar lo mismo antes de ir a guardar códigos en el ártico noruego.