La inteligencia artificial cambiará la manera en qué el software se programa (algunos llegan a predecir que el software se va a escribir a sí mismo vía Deep Learming). En eso creo que estamos todos de acuerdo. Lo que no tengo claro es como de cerca está ese futuro. Para averiguarlo, he buscado y probado todos los entornos de programación (IDEs) y extensiones que se llaman a sí mismos inteligentes.

Con todos ellos he intentado completar una tarea conceptualmente sencilla: leer un archivo de texto, pero que requiere acordarse de qué clases usar para abrir el archivo, leerlo,… Y yo nunca me acuerdo. Parece, pues, una tarea perfecta para que un editor inteligente me ayude.

Leyendo las descripciones de estos editores (“entiendo el código del mundo y te daré la sugerencia correcta cuando la necesites”, “analizo todo el código de la web y te doy rápidamente la forma de completar el código que te vaya bien ordenado por su popularidad”) debería haber sido una tarea fácil. Pero no ha sido así.

Repasemos cada una de las herramientas (avisad si me he dejado alguna) para ver qué tal me ha ido.

Contents

Visual Studio IntelliCode

IntelliCode es uno de los últimos plugins para Visual Studio. Creado por Microsoft mismo, IntelliCode te ahorra tiempo ordenando la lista de sugerencias de autocomplete del editor según lo que él cree que es más probable que estés buscando en función de lo que IntelliCode ha aprendido analizando miles de proyectos Open Source en GitHub con más de 100 estrellas. Opcionalmente se puede pedir a IntelliCode que también aprenda de tus propios repositorios para buscar patrones en la forma en que los programas de ejemplo utilizan las APIs del lenguaje.

Como podéis ver en esta captura de pantalla, IntelliCode fue capaz de recomendar correctamente el método que debería utilizar en el bucle para proceder a la lectura del archivo. El readLine aparece en primer lugar y marcado con una estrella en la lista.

Según cuenta Microsoft, IntelliCode es capaz de coger las recomendaciones y ordenarlas en función del contexto de tu código para afinar mejor las sugerencias. Y aún me gusta más lo que está por venir. IntelliCode vendrá pronto con la funcionalidad de detección que llaman  repeated edits. IntelliCode será capaz cuando estás aplicando una modificación repetitiva al código y te ayudará a aplicar ese mismo cambio en todos los archivos donde haga falta. De alguna manera detectará que estás haciendo como un refactoring manual y lo convertirá en automático.

IntelliCode soporta C#, Java, C++, Python, TypeScript/JavaScript y XAML.

Kite

Kite se define a sí mismo como el plugin para tu IDE que usa Machine Learning para proporcionarte code completions potentes para Python. 

A nivel de funcionalidad, es bastante similar a los otros. Útil para mostrar documentación de las clases y métodos que usas, incluyendo ejemplos (para los patrones de uso más populares hay que pagar) que cree que te podrían ser útiles. Esto es lo que me dió  a mí.

Kite python suggestions

Hasta hace poco, estas sugerencisa se basaban en las clases/métodos referenciados en el código pero sin tener en cuenta en qué contexto estos métodos se usaban. Las últimas versiones son capaces de ayudarte a escribir toda la línea entera de código teniendo en cuenta lo que has escribido hasta ese punto. Según Kite, esto te permite ahorrarte hasta un 30-40% de las pulsaciones de teclas neceasrias para acabar el código.

Este vídeo es también una buena descripción de lo que hace Kite.

Codota

Codota promete darte la buena sugerencia justo cuando la necesitas. Codota se integra con IntelliJ IDEA, Android Studio, y Eclipse. Trabaja con Java y Kotlin. A diferencia de otras soluciones, Codota necesita que estés conectado a  Internet para enviar a sus servidores un poco de información del código que estás programando para poder dar sus sugerencias.

Una funcionalidad que se agradece es la posibilidad de probar y buscar recomendaciones de código directamente en su web, aunque no tengas Codota instalado. Por ejemplo, a continuación podéis ver las recomendaciones que tuve buscando sugerencias para la clase BufferedReader. Una vez tienes el primer conjunto de resultados puedes ir acotando la búsqueda para mejorar la precisión.

Codota tiene también una versión para equipos capaz de aprender también del código de otros miembros de tu equipo. Así puedes ver quién ha escrito ya algo parecido (y como mínimo ir a preguntarle).

Otros asistentes inteligentes

PHPBot

PHPBot es un bot que intenta ser tu asistente virtual cuando programes en PHP. Dado el nombre de una función PHP, devuelve ejemplos de uso para esa función para ayudarte a entender como funciona. Es más una mejora de la documentación oficial de PHP que no un asistente inteligente de verdad, que enttienda tu código y té da ejemplos útiles para ti.

Aroma

Facebook AI anunció recientemente Aroma. Aroma es un buscador y recomendador de código que utiliza técnicas de Machine Learning para apreder patrones de código a partir de grandes bases de datos de ejemplos de programas. Es más un buscador inteligente que una herramienta de autocomplete.

Aún así, al mostrar ejemplos de código similares a los que tu estás escribiendo (la función de similaridad es justamente lo que determina la red neuronal creada durante el entrenamiento) te ayuda a mejorar tu código. Por ejemplo, comparando el código de la figura con la recomendaciónn es fácil darse cuenta que podemos mejorar nuestro código añadiendo el control de excepciones tal y como muestra la recomendación.Facebook AI Aroma code recommender

De momento, podéis leer acerca de como funciona Aroma pero no está de momento disponible para el gran público.

¿Y Google?

Pues también está. Google no tiene un IDE inteligente para los programadores pero sí que investiga en estos teams. De hecho, un equipo de Google Brain ha publicado el artículo Neural Networks for modeling source code edits donde entrenan un red neuroanl con millones de ediciones atómicas hechas por miles de programadores Python. Esto les permite predecir modificaciones futuras. Fijaros que Google no se focaliza tanto en los aspectos estáticos del código sinó que ve el código como un objeto dinámico sobre el qué predecir la evolución.

Los IDEs inteligentes que ya nos han dejado

La aplicación de la Inteligencia Artificial a la programación está hoy en día en plena ebullición. Igual que muchas nuevas herramientas aparecen, otras se quedan por el camino. Rendimos homenaje a las que ya no están.

Eclipse Code Recommender

Eclipse Code Recommender era un proyecto oficial Eclipse desarrollado por la empresa CodeTrails .

Ofrece una herramienta de “code completion” para Java que ordena todos los posibles métodos que puedes usar en un cierto punto del código basado en lo qué otros programadores han hecho en el pasado. Usa Jayes, una librería para redes Bayesianes en Java para ese fin.  Como se ve en la figura, dentro del loop de lectura del archivo, Eclipse Code Recommender sugiere next() comola mejor opción a ejecutar sobre el objeto  inputFile.

Eclipse Code Recommender

Para el aprendizaje de las recomendaciones utiliza ejemplos de código disponibles en el ” Eclipse Marketplace. Sólo da recomendaciones para las APIs de java.*javax.*  y org.eclipse.* . Con la  opción de pago puedes también proporcionar tus propios ejemplos para que aprenda de tu propio estilo de programación .

CodePilot

CodePilot.ai es más un buscador avanzado de código que un recomendador en sí. Puede buscar en tu entorno local o (previo pago) en StackOverflow o GitHub.

En mi ejemplo, CodePilot fue capaz de detectar rápidamente que ya tenía otro .java que utilizava la clase Scanner y me la enseñó por si me era útil.

Local search in code pilot

CodePilot no utiliza ningún tipo de algoritmo de Machine Learning para filtrar los resultados, sinó que enseña básicamente todos las coincidencias que encuentra.

CodePilot empezó como una empresa privada aunque ya hace un tiempo su fundador dejó el proyecto y simplemente liberó todo el código escrito hasta ese día en GitHub (link a CodePilot en GitHub). Vaya, qye técnicamente el proyecto no está muerto sino que ahora es open source. De todas formas desde que el proyecto fue liberado nadie ha contribuido a él con lo que lo podemos dar por muerto o como mínimo en coma profundo.

CodeCorrect

CodeCorrect utiliza la API de StackOverflow para encontrar soluciones a errores comunes que todos hacemos a la hora de programar. Fue el resultado de un Hackathon y consiguió un cierto eco mediático  pero de momento parece que no ha seguido adelante.

Ai.codes

Ai.codes desarrolló un plugin para IntelliJ llamado “AI predictive coding” en 2016 en beta. Parece que nunca fueron más allá de la beta.

Mi opinión sobre los entornos de programación inteligentes

En base a este experimento, la verdad es que me parece que esto de los IDEs inteligentes es de momento más marketing que realidad. Sí que estoy convencido que a la larga vamos a tenerlos y acabaremos trabajando con asistentes de programación virtuales pero nos queda todavía mucho para eso.

De hecho, este campo es un tema muy candente en investigación (nosotros mismos estamos trabajando en temas similares pero enfocado a las herramientas de modelado) con lo que puedo llegar a entender perfectamente lo que cuesta crear este tipo de herramientas.

Además, tienen una competencia feroz. No sólo tiene que demostrar que funcionan sinó que tienen que probar que són mejores que el ir directamente a Google y preguntar. Por ejemplo, si pregunto a Google algo como “open file in Java” el primer resultado incluye un código de ejemplo de Stack Overflow que es exactamente lo que estoy buscando. Difícil de competir con esto. Google search for open a file

 

Con Bing consigues también resultados similares. Y a veces aún mejores ya que depende de la consulta Bing te muestra directament el trozo de código que podrías estar buscando.

Fijaros además que toda la parte de “inteligencia” se focaliza en analizar los datos de GitHub o SO para ordenarlos, priorizarlos,… Para mí, no está ahí realmente el valor añadido (como decía Google es muy bueno en esto). Donde estos editores inteligentes pueden marcar la diferencia es en entender lo que el programador está intentando escribir y darle una solución para ese patrón de programación que ha reconocido.

Quiero un editor que me ayude a escribir código, no uno que sólo me ayude a buscar código útil online. Aún mejor si cuando me da una sugerencia me la adapta al código donde debería integrarla (ej. utilizando mis variables, mi estilo de programación,…) para que la adaptación sea mínima.

Que esto sea posible depende también, como en toda aplicación de Aprendizaje Automático, de la calidad de los datos de entrenamiento. Si en lugar de entrenar las redes neuronales de estos IDEs con ejemplos sacados de GitHub o Stack Overflow, lo hacemos con los repositorios internos de nuestra propia organización, los resultados serán mucho mejores.

En un futuro aún más distance, estoy convencido que tendremos un ejército de bots de programación con los que haremos pair programming y con los que hablaremos (tipo chatbot) para explicarles qué queremos hacer. Con ellos podríamos ir más allá de tener sugerencias para acabar la línea de código que estamos escribiendo y llegar a poder tener sugerencias a nivel de bloque entero. Pero de momento, lo que tenemos que tener es un montón de paciencia. Falta todavía bastante para llegar allí.