{"id":2118,"date":"2023-06-13T07:11:27","date_gmt":"2023-06-13T06:11:27","guid":{"rendered":"https:\/\/keepler.io\/2023\/06\/13\/aws-code-whisperer-punto-de-vista-tecnico\/"},"modified":"2024-01-15T13:27:08","modified_gmt":"2024-01-15T12:27:08","slug":"aws-code-whisperer-punto-de-vista-tecnico","status":"publish","type":"post","link":"https:\/\/keepler.io\/es\/2023\/06\/13\/aws-code-whisperer-punto-de-vista-tecnico\/","title":{"rendered":"AWS CodeWhisperer: Un punto de vista t\u00e9cnico"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">En las \u00faltimas semanas, en Keepler hemos estado probando <a href=\"https:\/\/aws.amazon.com\/codewhisperer\" target=\"_blank\" rel=\"noopener\">AWS CodeWhisperer<\/a> para conocer mejor esta herramienta de IA Generativa para c\u00f3digo fuente y para poder tener una opini\u00f3n fundamentada para recomendar su uso.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Ya hemos <a href=\"https:\/\/keepler.io\/2023\/06\/codewhisperer-aws-ai-for-coding\/\" target=\"_blank\" rel=\"noopener\">escrito anteriormente sobre CodeWhisperer<\/a> de forma m\u00e1s generalista, pero en este post queremos compartir nuestras conclusiones y nuestras observaciones basadas en las pruebas que hemos estado realizando.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">En primer lugar, vamos a preparar el escenario para nuestras pruebas:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>IDEs:<\/b><span style=\"font-weight: 400;\"> Hemos estado utilizando: VSCode, IntelliJ y PyCharm (ambos en su versi\u00f3n comunitaria)<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Lenguaje<\/b><span style=\"font-weight: 400;\">: Python<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Nubes<\/b><span style=\"font-weight: 400;\">: AWS, Azure, GCP<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Hemos estado interactuando con AWS CodeWhisperer de dos maneras diferentes:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Mediante el uso de comentarios<\/b><span style=\"font-weight: 400;\">: Puedes escribir comentarios en cualquier momento para que CodeWhisperer conozca tu petici\u00f3n<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Codificaci\u00f3n en vivo<\/b><span style=\"font-weight: 400;\">: CodeWhisperer leer\u00e1 el c\u00f3digo que est\u00e1s escribiendo y te recomendar\u00e1 complementos y sugerencias de c\u00f3digo.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">En cualquier momento puedes activar manualmente CodeWhisperer con Alt + C para Windows\/Linux, u Opci\u00f3n + C para macOS; lo cual es muy c\u00f3modo.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">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\u00f3n, selecciona ESC o la tecla de retroceso\/suprimir.<\/span><\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-54479 aligncenter\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2023\/06\/keepler-aws-codewhisperer-code.png?resize=512%2C133&#038;ssl=1\" alt=\"\" width=\"512\" height=\"133\" \/><\/p>\n<p><span style=\"font-weight: 400;\">A continuaci\u00f3n te mostramos todos los detalles, pero si no quieres leer toda la informaci\u00f3n y quieres conocer nuestras conclusiones, aqu\u00ed tienes la versi\u00f3n <a href=\"https:\/\/es.wikipedia.org\/wiki\/TL;DR\" target=\"_blank\" rel=\"noopener\">TL;DR<\/a>:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Los casos de uso que m\u00e1s nos gustan son:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Generar c\u00f3digo de funciones a partir de comentarios<\/b><span style=\"font-weight: 400;\">: Simplemente escribiendo y describiendo su funci\u00f3n en lenguaje natural, CodeWhisper generar\u00e1 la funci\u00f3n, sus par\u00e1metros, la documentaci\u00f3n y la funci\u00f3n del cuerpo para ti (aunque ser\u00eda recomendable eliminar el comentario despu\u00e9s de que el c\u00f3digo se haya generado)<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Generaci\u00f3n de c\u00f3digo est\u00e1ndar<\/b><span style=\"font-weight: 400;\">: escribir un c\u00f3digo fuente que se puede copiar y pegar es aburrido y desmotivador, CodeWhisperer puede generar algoritmos est\u00e1ndar y conocidos, o c\u00f3digo 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&#8230;<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Pruebas unitarias<\/b><span style=\"font-weight: 400;\">: Puede crear pruebas unitarias para desarrollar escenarios de pruebas para tu c\u00f3digo. Aunque es cierto que los Casos de Prueba generados son bastante simples y directos, ayudar\u00e1 a dotar a tu c\u00f3digo de un conjunto b\u00e1sico de cobertura de pruebas de manera m\u00e1s r\u00e1pida.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Datos de muestra<\/b><span style=\"font-weight: 400;\">: CodeWhisperer puede generar datos de muestra siguiendo la estructura que necesites en tu c\u00f3digo (si la estructura es bastante compleja hemos comprobado que CodeWhisperer no ser\u00e1 de tanta ayuda aqu\u00ed)<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Trabajar con SDKs o librer\u00edas de terceros<\/b><span style=\"font-weight: 400;\">: Evitar tener que buscar en Google documentaci\u00f3n y casos de uso es la funci\u00f3n que m\u00e1s nos gusta de CodeWhisperer. Cuando se trabaja con Azure, Google o AWS SDK siempre es necesario mirar en la documentaci\u00f3n para saber exactamente la firma de cualquier funci\u00f3n y el tipo de par\u00e1metros que acepta. CodeWhisperer puede generar autom\u00e1ticamente el bloque de c\u00f3digo incluyendo la funci\u00f3n y sus par\u00e1metros que necesites. Por ejemplo, pedirle que genere una funci\u00f3n para <em>&#8220;listar todas las Funciones Cloud en un proyecto GCP&#8221;<\/em> o para <em>&#8220;Subir un objeto a un Bucket en S3&#8221;<\/em>, es bastante simple y preciso y, a\u00fan m\u00e1s, CodeWhisperer inicializar\u00e1 el Cliente por ti si es necesario.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Excepciones<\/b><span style=\"font-weight: 400;\">: CodeWhisperer puede entender el contexto del c\u00f3digo que est\u00e1 escribiendo y puede sugerir las cl\u00e1usulas de excepci\u00f3n try\/catch que mejor se adapten al c\u00f3digo, haciendo mucho m\u00e1s f\u00e1cil ocuparse de las diferentes excepciones que puedan lanzarse y actuar sobre cada una de ellas<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Expresiones regulares<\/b><span style=\"font-weight: 400;\">: Todos conocemos la frase: &#8220;Si quieres resolver un problema con una Expresi\u00f3n Regular, entonces tienes dos problemas&#8221; \u00bfverdad? CodeWhisperer nos ayudar\u00e1 a definir la expresi\u00f3n regular correcta o a simplificar una expresi\u00f3n regular que hayamos definido previamente.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Generar Documentaci\u00f3n<\/b><span style=\"font-weight: 400;\">: Puede generar autom\u00e1ticamente bloques de documentaci\u00f3n para que los incluyamos en nuestras funciones y en nuestro c\u00f3digo. CodeWhisperer leer\u00e1 el contexto de la funci\u00f3n y har\u00e1 una sugerencia de lo que cree que hace la funci\u00f3n (acierta la mayor\u00eda de las veces)<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">AWS ha definido sus 10 formas de crear aplicaciones m\u00e1s r\u00e1pido con AWS Code Whisperer, que coinciden bastante con nuestras conclusiones.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00c1reas de mejora:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Ahorro de tiempo<\/b><span style=\"font-weight: 400;\">: Aqu\u00ed somos menos optimistas que en otras evaluaciones que hemos le\u00eddo. Y es que pensamos que utilizando CodeWhisperer, un desarrollador senior puede ahorrar alrededor de un <strong>20%<\/strong> de su tiempo. Un desarrollador junior ahorrar\u00e1 un poco menos de tiempo porque algunas recomendaciones de CodeWhisperer necesitan ser revisadas, por lo que puede encontrarse arreglando el c\u00f3digo escrito m\u00e1s que escribi\u00e9ndolo \u00e9l mismo, lo que consume m\u00e1s tiempo cuanto menos experiencia se tenga.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Curva de aprendizaje<\/b><span style=\"font-weight: 400;\">: 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\u00fanmente se conoce como &#8220;Prompt Engineering&#8221;). Esta curva de aprendizaje puede ser m\u00e1s acentuada para perfiles junior<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Revisar y adaptar<\/b><span style=\"font-weight: 400;\">: Cuando CodeWhisperer genera un bloque de c\u00f3digo, tendr\u00e1s que revisarlo y (a veces) adaptarlo al caso de uso concreto. Como hemos dicho antes, este proceso de revisi\u00f3n lleva su tiempo, por lo que a veces se trata de equilibrar el tiempo que ahorras en escribir c\u00f3digo frente al tiempo que dedicas a revisar el c\u00f3digo generado autom\u00e1ticamente<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Adici\u00f3n pero no sustituci\u00f3n<\/b><span style=\"font-weight: 400;\">: Cuando CodeWhisperer hace alguna sugerencia no reemplazar\u00e1 su c\u00f3digo sino que a\u00f1adir\u00e1 una nueva l\u00ednea (o varias l\u00edneas nuevas) debajo de su signo de intercalaci\u00f3n. Esto le llevar\u00e1 a eliminar manualmente l\u00edneas de c\u00f3digo duplicadas u obsoletas.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Sugerencias de la Gu\u00eda de Estilo<\/b><span style=\"font-weight: 400;\">: A veces las sugerencias hechas por CodeWhisperer no siguen la Gu\u00eda de Estilo <a href=\"https:\/\/peps.python.org\/pep-0008\/\" target=\"_blank\" rel=\"noopener\">PEP8<\/a> (para Python) y tienes que dedicar tiempo a corregirlas.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Sugerencias aleatorias<\/b><span style=\"font-weight: 400;\">: Hemos encontrado que en escenarios donde hay poco contexto, las sugerencias son completamente aleatorias. Por ejemplo, en un fichero vac\u00edo, normalmente sugiere a\u00f1adir un comentario con una fecha aleatoria.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Invenci\u00f3n de c\u00f3digo<\/b><span style=\"font-weight: 400;\">: Al usar librer\u00edas de terceros o SDK, incluso en clases personalizadas, hemos encontrado que con bastante frecuencia CodeWhisperer sugiere un c\u00f3digo que no existe en ning\u00fan sitio y que no pertenece a ninguna de las librer\u00edas de terceros (lo que obviamente lleva a no compilar c\u00f3digo)<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Intrusivo<\/b><span style=\"font-weight: 400;\">: Su uso puede ser un poco intrusivo al principio porque CodeWhisperer est\u00e1 constantemente intentando hacer sugerencias mientras escribes, por lo que tendr\u00e1s que adaptar tus ojos al prompt con sugerencias y al c\u00f3digo de fondo que aparece mientras escribes. Despu\u00e9s de un tiempo te acostumbras a tener esas sugerencias en tu pantalla y las ignoras cuando no las necesitas, o las usas cuando s\u00ed.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Completado de c\u00f3digo<\/b><span style=\"font-weight: 400;\">: A veces la compleci\u00f3n de c\u00f3digo se hace l\u00ednea por l\u00ednea en lugar de generar todo el bloque de c\u00f3digo, lo que puede ser inconveniente y m\u00e1s propenso a errores.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Importaciones<\/b><span style=\"font-weight: 400;\">: Al menos en Python, cuando se solicita alguna sugerencia para ejecutar una librer\u00eda, CodeWhisperer no agregar\u00e1 las sentencias import.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Test Suite Case<\/b><span style=\"font-weight: 400;\">: CodeWhisperer puede ayudar en la generaci\u00f3n de TestCases simples y b\u00e1sicos, pero si quieres generar autom\u00e1ticamente un Test SuiteCase completo que entienda tu c\u00f3digo y cubra m\u00faltiples escenarios para garantizar un m\u00ednimo de cobertura, CodeWhisperer no es la herramienta para hacerlo.<\/span><\/li>\n<\/ul>\n<h3><b>Todos los detalles<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Hemos estado probando AWS CodeWhisperer utilizando diferentes casos de uso y diferentes escenarios en el c\u00f3digo fuente.<\/span><\/p>\n<p><b>Uso de redes<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Hemos monitorizado CloudWhisperer para saber qu\u00e9 tipo de conexiones mantiene abiertas y qu\u00e9 protocolos est\u00e1 utilizando:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Mantiene abierta una conexi\u00f3n TCP contra una instancia EC2 o una flota de instancias:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">TCP:50025-&gt;ec2-54-175-238-207.compute-1.amazonaws.com:443 (ESTABLISHED)<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">Este nombre DNS cambia durante la sesi\u00f3n y la conexi\u00f3n se mantiene abierta s\u00f3lo si la opci\u00f3n &#8220;Auto-Sugerencias&#8221; est\u00e1 activa, cerr\u00e1ndose cuando el IDE queda inactivo.<\/span><\/p>\n<p><b>Generaci\u00f3n de c\u00f3digo<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Est\u00e1bamos escribiendo algo de c\u00f3digo para detectar cu\u00e1ndo es seguro borrar un Endpoint de SageMaker y ten\u00edamos algo como esto<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">try:<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0if sagemaker.describe_endpoint(EndpointName=endpoint_name)['EndpointStatus'] != 'InService':<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0\u00a0\u00a0while sagemaker.describe_endpoint(EndpointName=endpoint_name)['EndpointStatus'] != 'InService':<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0time.sleep(30)<\/span>\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sagemaker.describe_endpoint(EndpointName=endpoint_name)['EndpointStatus']<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">CodeWhisperer sugiri\u00f3 la siguiente adici\u00f3n para reemplazar la \u00faltima l\u00ednea (por lo que tenemos que eliminarla manualmente):<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">if sagemaker.describe_endpoint(EndpointName=endpoint_name)['EndpointStatus'] == 'InService':<\/span>\n<span style=\"font-weight: 400;\"> \u00a0\u00a0print(\"Endpoint \" + endpoint_name + \" is going to be deleted\")<\/span>\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sagemaker.delete_endpoint(EndpointName=endpoint_name)<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">Lo cual es bastante acertado en el contexto de la funci\u00f3n y, al mismo tiempo, nos sugiere a\u00f1adir la cl\u00e1usula nex &#8220;except&#8221;<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">except sagemaker.exceptions.ResourceNotFound:<\/span>\n<span style=\"font-weight: 400;\">\u00a0\u00a0\u00a0print(\"Endpoint \" + endpoint_name + \" not found.)<\/span><\/pre>\n<p><span style=\"font-weight: 400;\">Este caso de uso espec\u00edfico funcion\u00f3 muy bien y las sugerencias fueron realmente \u00fatiles.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">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\u00f3n y nos sugerir\u00e1 algunas opciones de menos a m\u00e1s completas:<\/span><\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-54485 aligncenter\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2023\/06\/keepler-aws-codewhisperer-bucket-S3.png?resize=512%2C270&#038;ssl=1\" alt=\"\" width=\"512\" height=\"270\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Incluso nos sugiri\u00f3 inicializar el cliente Boto3 con algunos de los perfiles que se encuentran en nuestra configuraci\u00f3n de Credenciales.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Algunas otras sugerencias no son del todo precisas y encontramos que el c\u00f3digo fuente era inventado. Por ejemplo: Definimos una clase Python personalizada llamada &#8220;Productive&#8221; para definir una envoltura para interactuar con la API externa de Productive y s\u00f3lo definimos dos m\u00e9todos diferentes: <\/span><i><span style=\"font-weight: 400;\">get_all(url)<\/span><\/i><span style=\"font-weight: 400;\"> and <\/span><i><span style=\"font-weight: 400;\">get_data(url)<\/span><\/i><\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-54489 aligncenter\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2023\/06\/keepler-aws-codewhisperer-test-productive.png?resize=364%2C512&#038;ssl=1\" alt=\"\" width=\"364\" height=\"512\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">Ninguna de esas propiedades formaba parte de la Clase en s\u00ed.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Para los algoritmos conocidos o sencillos de los que hemos hablado anteriormente, las sugerencias tambi\u00e9n son bastante acertadas. Por ejemplo &#8220;Funci\u00f3n que toma una lista de n\u00fameros y devuelve la suma de todos los n\u00fameros&#8221;.<\/span><\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-54495 aligncenter\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2023\/06\/keepler-aws-codewhisperer-numbers.png?resize=512%2C247&#038;ssl=1\" alt=\"\" width=\"512\" height=\"247\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Pasando a otro proveedor de nube, detectamos que el comportamiento es bastante similar, encontramos algunas sugerencias bastante acertadas, pero otras requer\u00edan revisi\u00f3n y arreglo manual. Como ejemplo de esto, est\u00e1bamos usando <a href=\"https:\/\/cloud.google.com\/run?hl=es\" target=\"_blank\" rel=\"noopener\">Cloud Run<\/a> de GCP para trabajar con algunos contenedores y aplicaciones:<\/span><\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-54500 aligncenter\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2023\/06\/keepler-google-cloud-run.png?resize=512%2C302&#038;ssl=1\" alt=\"\" width=\"512\" height=\"302\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Le pedimos a AWS Code Whisperer que generara la funci\u00f3n superior <\/span><i><span style=\"font-weight: 400;\">(update_revision)<\/span><\/i><span style=\"font-weight: 400;\"> y utiliz\u00f3 un m\u00e9todo en el cliente que no pertenece a la <a href=\"https:\/\/cloud.google.com\/python\/docs\/reference\/run\/latest\/google.cloud.run_v2.services.revisions.RevisionsClient\" target=\"_blank\" rel=\"noopener\">API <\/a><\/span><i><span style=\"font-weight: 400;\">(client.update_revision)<\/span><\/i><\/p>\n<p><b>Generaci\u00f3n de casos de uso de prueba<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Hemos descubierto que AWS Code Whisperer puede generar m\u00e9todos de casos de uso sencillos para a\u00f1adir cobertura b\u00e1sica a nuestras funciones. Si necesitamos generar autom\u00e1ticamente 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.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Por ejemplo, para probar una funci\u00f3n simple <\/span><i><span style=\"font-weight: 400;\">(random_date)<\/span><\/i><span style=\"font-weight: 400;\"> los casos de uso generados por Code Whisperer fueron bastante simples, pero suficientes para cubrir escenarios b\u00e1sicos:<\/span><\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-54505 aligncenter\" src=\"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2023\/06\/keepler-aws-codewhisperer-random-date.png?resize=512%2C216&#038;ssl=1\" alt=\"\" width=\"512\" height=\"216\" \/><\/p>\n<h3><b>Conclusiones finales<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Podemos recomendar con confianza el uso y adopci\u00f3n de AWS Code Whisperer como herramienta de IA Generativa para Source Code. Definitivamente te ayudar\u00e1 a crear c\u00f3digo de una forma m\u00e1s r\u00e1pida 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\u00e1s tiempo para adaptarte a ella.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p>Imagen: Freepik<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En las \u00faltimas semanas, en Keepler hemos estado probando AWS CodeWhisperer para conocer mejor esta herramienta de IA Generativa para c\u00f3digo fuente y para poder tener una opini\u00f3n fundamentada para recomendar su uso. Ya hemos escrito anteriormente sobre CodeWhisperer de forma m\u00e1s generalista, pero en este post queremos compartir nuestras conclusiones y nuestras observaciones basadas [&hellip;]<\/p>\n","protected":false},"author":134360170,"featured_media":34887,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","_crdt_document":"","content-type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[222],"tags":[236,284,248],"class_list":["post-2118","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ia","tag-aws","tag-code-es","tag-ia-generativa"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/keepler.io\/wp-content\/uploads\/2023\/06\/keepler-aws-codewhisperer.jpg?fit=1280%2C450&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p9CeZw-ya","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/2118","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/users\/134360170"}],"replies":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/comments?post=2118"}],"version-history":[{"count":1,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/2118\/revisions"}],"predecessor-version":[{"id":2250,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/posts\/2118\/revisions\/2250"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media\/34887"}],"wp:attachment":[{"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/media?parent=2118"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/categories?post=2118"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/keepler.io\/es\/wp-json\/wp\/v2\/tags?post=2118"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}