En las últimas semanas, en Keepler hemos estado probando AWS CodeWhisperer para conocer mejor esta herramienta de IA Generativa para código fuente y para poder tener una opinión fundamentada para recomendar su uso.
Ya hemos escrito anteriormente sobre CodeWhisperer de forma más generalista, pero en este post queremos compartir nuestras conclusiones y nuestras observaciones basadas en las pruebas que hemos estado realizando.
En primer lugar, vamos a preparar el escenario para nuestras pruebas:
- IDEs: Hemos estado utilizando: VSCode, IntelliJ y PyCharm (ambos en su versión comunitaria)
- Lenguaje: Python
- Nubes: AWS, Azure, GCP
Hemos estado interactuando con AWS CodeWhisperer de dos maneras diferentes:
- Mediante el uso de comentarios: Puedes escribir comentarios en cualquier momento para que CodeWhisperer conozca tu petición
- Codificación en vivo: CodeWhisperer leerá el código que estás escribiendo y te recomendará complementos y sugerencias de código.
En cualquier momento puedes activar manualmente CodeWhisperer con Alt + C para Windows/Linux, u Opción + C para macOS; lo cual es muy cómodo.
Puedes ver sugerencias adicionales seleccionando la tecla de flecha derecha. Para ver las sugerencias anteriores, selecciona la tecla de flecha izquierda. Para rechazar una recomendación, selecciona ESC o la tecla de retroceso/suprimir.

A continuación te mostramos todos los detalles, pero si no quieres leer toda la información y quieres conocer nuestras conclusiones, aquí tienes la versión TL;DR:
Los casos de uso que más nos gustan son:
- Generar código de funciones a partir de comentarios: Simplemente escribiendo y describiendo su función en lenguaje natural, CodeWhisper generará la función, sus parámetros, la documentación y la función del cuerpo para ti (aunque sería recomendable eliminar el comentario después de que el código se haya generado)
- Generación de código estándar: escribir un código fuente que se puede copiar y pegar es aburrido y desmotivador, CodeWhisperer puede generar algoritmos estándar y conocidos, o código SDK ahorrando tiempo y recursos cerebrales. Por ejemplo: buscar una clave en un diccionario, o buscar un elemento en una lista, limpiar algunos valores de un conjunto de datos, validaciones de campo…
- Pruebas unitarias: Puede crear pruebas unitarias para desarrollar escenarios de pruebas para tu código. Aunque es cierto que los Casos de Prueba generados son bastante simples y directos, ayudará a dotar a tu código de un conjunto básico de cobertura de pruebas de manera más rápida.
- Datos de muestra: CodeWhisperer puede generar datos de muestra siguiendo la estructura que necesites en tu código (si la estructura es bastante compleja hemos comprobado que CodeWhisperer no será de tanta ayuda aquí)
- Trabajar con SDKs o librerías de terceros: Evitar tener que buscar en Google documentación y casos de uso es la función que más nos gusta de CodeWhisperer. Cuando se trabaja con Azure, Google o AWS SDK siempre es necesario mirar en la documentación para saber exactamente la firma de cualquier función y el tipo de parámetros que acepta. CodeWhisperer puede generar automáticamente el bloque de código incluyendo la función y sus parámetros que necesites. Por ejemplo, pedirle que genere una función para «listar todas las Funciones Cloud en un proyecto GCP» o para «Subir un objeto a un Bucket en S3», es bastante simple y preciso y, aún más, CodeWhisperer inicializará el Cliente por ti si es necesario.
- Excepciones: CodeWhisperer puede entender el contexto del código que está escribiendo y puede sugerir las cláusulas de excepción try/catch que mejor se adapten al código, haciendo mucho más fácil ocuparse de las diferentes excepciones que puedan lanzarse y actuar sobre cada una de ellas
- Expresiones regulares: Todos conocemos la frase: «Si quieres resolver un problema con una Expresión Regular, entonces tienes dos problemas» ¿verdad? CodeWhisperer nos ayudará a definir la expresión regular correcta o a simplificar una expresión regular que hayamos definido previamente.
- Generar Documentación: Puede generar automáticamente bloques de documentación para que los incluyamos en nuestras funciones y en nuestro código. CodeWhisperer leerá el contexto de la función y hará una sugerencia de lo que cree que hace la función (acierta la mayoría de las veces)
AWS ha definido sus 10 formas de crear aplicaciones más rápido con AWS Code Whisperer, que coinciden bastante con nuestras conclusiones.
Áreas de mejora:
- Ahorro de tiempo: Aquí somos menos optimistas que en otras evaluaciones que hemos leído. Y es que pensamos que utilizando CodeWhisperer, un desarrollador senior puede ahorrar alrededor de un 20% de su tiempo. Un desarrollador junior ahorrará un poco menos de tiempo porque algunas recomendaciones de CodeWhisperer necesitan ser revisadas, por lo que puede encontrarse arreglando el código escrito más que escribiéndolo él mismo, lo que consume más tiempo cuanto menos experiencia se tenga.
- Curva de aprendizaje: Comunicarse con CodeWhisperer, incluso utilizando el lenguaje natural, no siempre es sencillo; hay que aprender a detallar los requisitos para que CodeWhisperer haga la sugerencia que se estaba buscando (lo que comúnmente se conoce como «Prompt Engineering»). Esta curva de aprendizaje puede ser más acentuada para perfiles junior
- Revisar y adaptar: Cuando CodeWhisperer genera un bloque de código, tendrás que revisarlo y (a veces) adaptarlo al caso de uso concreto. Como hemos dicho antes, este proceso de revisión lleva su tiempo, por lo que a veces se trata de equilibrar el tiempo que ahorras en escribir código frente al tiempo que dedicas a revisar el código generado automáticamente
- Adición pero no sustitución: Cuando CodeWhisperer hace alguna sugerencia no reemplazará su código sino que añadirá una nueva línea (o varias líneas nuevas) debajo de su signo de intercalación. Esto le llevará a eliminar manualmente líneas de código duplicadas u obsoletas.
- Sugerencias de la Guía de Estilo: A veces las sugerencias hechas por CodeWhisperer no siguen la Guía de Estilo PEP8 (para Python) y tienes que dedicar tiempo a corregirlas.
- Sugerencias aleatorias: Hemos encontrado que en escenarios donde hay poco contexto, las sugerencias son completamente aleatorias. Por ejemplo, en un fichero vacío, normalmente sugiere añadir un comentario con una fecha aleatoria.
- Invención de código: Al usar librerías de terceros o SDK, incluso en clases personalizadas, hemos encontrado que con bastante frecuencia CodeWhisperer sugiere un código que no existe en ningún sitio y que no pertenece a ninguna de las librerías de terceros (lo que obviamente lleva a no compilar código)
- Intrusivo: Su uso puede ser un poco intrusivo al principio porque CodeWhisperer está constantemente intentando hacer sugerencias mientras escribes, por lo que tendrás que adaptar tus ojos al prompt con sugerencias y al código de fondo que aparece mientras escribes. Después de un tiempo te acostumbras a tener esas sugerencias en tu pantalla y las ignoras cuando no las necesitas, o las usas cuando sí.
- Completado de código: A veces la compleción de código se hace línea por línea en lugar de generar todo el bloque de código, lo que puede ser inconveniente y más propenso a errores.
- Importaciones: Al menos en Python, cuando se solicita alguna sugerencia para ejecutar una librería, CodeWhisperer no agregará las sentencias import.
- Test Suite Case: CodeWhisperer puede ayudar en la generación de TestCases simples y básicos, pero si quieres generar automáticamente un Test SuiteCase completo que entienda tu código y cubra múltiples escenarios para garantizar un mínimo de cobertura, CodeWhisperer no es la herramienta para hacerlo.
Todos los detalles
Hemos estado probando AWS CodeWhisperer utilizando diferentes casos de uso y diferentes escenarios en el código fuente.
Uso de redes
Hemos monitorizado CloudWhisperer para saber qué tipo de conexiones mantiene abiertas y qué protocolos está utilizando:
Mantiene abierta una conexión TCP contra una instancia EC2 o una flota de instancias:
TCP:50025->ec2-54-175-238-207.compute-1.amazonaws.com:443 (ESTABLISHED)
Este nombre DNS cambia durante la sesión y la conexión se mantiene abierta sólo si la opción «Auto-Sugerencias» está activa, cerrándose cuando el IDE queda inactivo.
Generación de código
Estábamos escribiendo algo de código para detectar cuándo es seguro borrar un Endpoint de SageMaker y teníamos algo como esto
try: if sagemaker.describe_endpoint(EndpointName=endpoint_name)['EndpointStatus'] != 'InService': while sagemaker.describe_endpoint(EndpointName=endpoint_name)['EndpointStatus'] != 'InService': time.sleep(30) sagemaker.describe_endpoint(EndpointName=endpoint_name)['EndpointStatus']
CodeWhisperer sugirió la siguiente adición para reemplazar la última línea (por lo que tenemos que eliminarla manualmente):
if sagemaker.describe_endpoint(EndpointName=endpoint_name)['EndpointStatus'] == 'InService': print("Endpoint " + endpoint_name + " is going to be deleted") sagemaker.delete_endpoint(EndpointName=endpoint_name)
Lo cual es bastante acertado en el contexto de la función y, al mismo tiempo, nos sugiere añadir la cláusula nex «except»
except sagemaker.exceptions.ResourceNotFound: print("Endpoint " + endpoint_name + " not found.)
Este caso de uso específico funcionó muy bien y las sugerencias fueron realmente útiles.
Podemos ver algunas otras recomendaciones, por ejemplo para crear un Bucket en S3 con un nombre personalizado, podemos empezar escribiendo la firma de la función y nos sugerirá algunas opciones de menos a más completas:

Incluso nos sugirió inicializar el cliente Boto3 con algunos de los perfiles que se encuentran en nuestra configuración de Credenciales.
Algunas otras sugerencias no son del todo precisas y encontramos que el código fuente era inventado. Por ejemplo: Definimos una clase Python personalizada llamada «Productive» para definir una envoltura para interactuar con la API externa de Productive y sólo definimos dos métodos diferentes: get_all(url) and get_data(url)

Ninguna de esas propiedades formaba parte de la Clase en sí.
Para los algoritmos conocidos o sencillos de los que hemos hablado anteriormente, las sugerencias también son bastante acertadas. Por ejemplo «Función que toma una lista de números y devuelve la suma de todos los números».

Pasando a otro proveedor de nube, detectamos que el comportamiento es bastante similar, encontramos algunas sugerencias bastante acertadas, pero otras requerían revisión y arreglo manual. Como ejemplo de esto, estábamos usando Cloud Run de GCP para trabajar con algunos contenedores y aplicaciones:

Le pedimos a AWS Code Whisperer que generara la función superior (update_revision) y utilizó un método en el cliente que no pertenece a la API (client.update_revision)
Generación de casos de uso de prueba
Hemos descubierto que AWS Code Whisperer puede generar métodos de casos de uso sencillos para añadir cobertura básica a nuestras funciones. Si necesitamos generar automáticamente un caso de uso completo para las pruebas con diferentes escenarios y pruebas de casos de borde, Code Whisperer no supone una mejora respecto a hacerlo manualmente.
Por ejemplo, para probar una función simple (random_date) los casos de uso generados por Code Whisperer fueron bastante simples, pero suficientes para cubrir escenarios básicos:

Conclusiones finales
Podemos recomendar con confianza el uso y adopción de AWS Code Whisperer como herramienta de IA Generativa para Source Code. Definitivamente te ayudará a crear código de una forma más rápida y eficiente, pero teniendo en cuenta que existe una curva de aprendizaje antes de empezar a trabajar eficientemente con esta herramienta, por lo que necesitarás tiempo para adaptarte a ella.
Imagen: Freepik




0 comentarios