{"id":30700,"date":"2024-11-19T12:28:29","date_gmt":"2024-11-19T11:28:29","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=30700"},"modified":"2024-11-19T12:28:31","modified_gmt":"2024-11-19T11:28:31","slug":"de-programadores-junior-a-senior-con-chatgpt","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/","title":{"rendered":"De programadores junior a senior con ChatGPT"},"content":{"rendered":"\n<p>Qu\u00e9 es la IA y qu\u00e9 es ChatGPT lo sabemos todos. Cada uno de nosotros ha escrito montones de <em>prompts<\/em> para obtener respuestas de ChatGPT, con resultados m\u00e1s o menos satisfactorios.<\/p>\n\n\n\n<p>Para entender mejor c\u00f3mo ChatGPT puede ayudarnos a convertirnos en programadores senior, primero <strong>debemos comprender qu\u00e9 es la ingenier\u00eda de <em>prompts<\/em>, por qu\u00e9 es tan importante y en qu\u00e9 \u00e1reas un modelo de lenguaje grande (<em>Large Language Model<\/em>, LLM) <\/strong>como ChatGPT u otros pueden ayudarnos a crecer profesionalmente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-experiencia-en-el-campo\">Experiencia en el campo<\/h3>\n\n\n\n<p>Lo que estoy a punto de escribir surge de mi experiencia tras meses utilizando ChatGPT, <a href=\"https:\/\/www.codemotion.com\/magazine\/es\/\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a> Copilot, Claude y otros modelos de lenguaje grande (LLM), as\u00ed como de una serie de lecturas y estudios sobre el tema. Estoy seguro de que, en unos meses, esto quedar\u00e1 obsoleto con la llegada de herramientas nuevas (o ya existentes y que no uso) que ayudar\u00e1n a\u00fan m\u00e1s a los desarrolladores (y no solo) a crecer profesionalmente.<\/p>\n\n\n\n<p>Es probable que algunos de vosotros utilic\u00e9is<strong> herramientas distintas a las que yo empleo<\/strong>, pero enfoqu\u00e9monos en lo que podemos lograr con este tipo de herramientas, en lugar de centrarnos en cu\u00e1l es la mejor. De lo contrario, caeremos en una discusi\u00f3n interminable sobre cu\u00e1l es superior, y estoy seguro de que nadie ganar\u00e1 esa disputa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-comprender-chatgpt-y-en-un-sentido-mas-amplio-los-llm\">Comprender ChatGPT y, en un sentido m\u00e1s amplio, los LLM<\/h3>\n\n\n\n<p>Empecemos desde el principio: <strong>ChatGPT es un chatbot de inteligencia artificial (IA) que utiliza el procesamiento del lenguaje natural para crear un di\u00e1logo conversacional similar al humano. <\/strong>Este modelo de lenguaje puede responder preguntas y redactar diversos tipos de contenido escrito, como art\u00edculos, publicaciones en redes sociales, ensayos, c\u00f3digo y correos electr\u00f3nicos, convirti\u00e9ndose en una herramienta emocionante para devs de todos los niveles.<\/p>\n\n\n\n<p>Se trata, por lo tanto, de un<strong> modelo que no razona,<\/strong> pero que puede a<strong>plicar de manera muy eficaz las reglas aprendidas durante su entrenamiento. <\/strong>Esto significa que, si le proporcionamos una <strong>input incorrecta<\/strong>, obtendremos una<strong> output incorrecta;<\/strong> pero si damos una entrada precisa, obtendremos un resultado correcto.<\/p>\n\n\n\n<p>Del mismo modo, si utilizamos un LLM que ha sido entrenado con conjuntos de datos que contienen errores, el resultado tambi\u00e9n contendr\u00e1 errores.<\/p>\n\n\n\n<p>Adem\u00e1s, los modelos siempre intentan generar respuestas, lo que implica que habr\u00e1 un porcentaje, mayor o menor, de respuestas <strong>que ser\u00e1n incorrectas, inventadas o inexactas.<\/strong><\/p>\n\n\n\n<p>Partiendo de este punto inicial, cuyo prop\u00f3sito es centrar el tipo de herramienta que estamos <strong>intentando utilizar, veamos en qu\u00e9 \u00e1reas la tasa de error es m\u00e1s alta y en cu\u00e1les es m\u00e1s baja, <\/strong>permitiendo un uso m\u00e1s exitoso.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Los LLM no est\u00e1n dise\u00f1ados para resolver problemas o acertijos<\/h3>\n\n\n\n<p>Los LLM fueron creados para responder preguntas, redactar art\u00edculos, escribir c\u00f3digo, pero no para resolver problemas o acertijos. Esto significa que, si les presentamos un problema, no sabr\u00e1n c\u00f3mo resolverlo, pero si les proporcionamos un problema ya resuelto, podr\u00e1n ofrecernos la soluci\u00f3n.<\/p>\n\n\n\n<p>Cada vez que veo un video donde alguien propone un acertijo a ChatGPT y luego se sorprende de que no pueda resolverlo, me resulta gracioso. Es como pedirle a un ni\u00f1o de cinco a\u00f1os que resuelva un problema de f\u00edsica cu\u00e1ntica: son pruebas que no consideran las capacidades del interlocutor ni la forma en que fue dise\u00f1ado. No aportan valor y no demuestran que el modelo sea inadecuado; m\u00e1s bien, reflejan que el &#8220;creador&#8221; no ha entendido c\u00f3mo usarlo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Limitaciones del conocimiento<\/h3>\n\n\n\n<p>Otro punto importante es que<strong> los LLM no poseen un conocimiento ilimitado,<\/strong> sino que su conocimiento est\u00e1 restringido a los datos incluidos en sus <strong>conjuntos de entrenamiento. <\/strong>Esto significa que, si les proporcionamos una entrada que no est\u00e1 en esos conjuntos, no podr\u00e1n responder.<\/p>\n\n\n\n<p>\u00bfCu\u00e1ndo ocurre esto con mayor frecuencia? Cuando pedimos informaci\u00f3n sobre productos que no exist\u00edan o acababan de salir cuando el modelo fue entrenado.<\/p>\n\n\n\n<p>Se est\u00e1n desarrollando mitigaciones para este problema, como consultas en tiempo real a la red o entrenamiento continuo, pero estas soluciones <strong>no resuelven el problema por completo.<\/strong> Aunque pueden generar algunas respuestas, muchas veces estas son inventadas o de baja calidad.<\/p>\n\n\n\n<p>Por lo tanto, no esperen obtener respuestas confiables de ChatGPT sobre productos, tecnolog\u00edas o eventos recientes, ya que el modelo <strong>no tendr\u00e1 la informaci\u00f3n necesaria o, si responde, ser\u00e1 con respuestas inventadas o poco precisas.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00bfD\u00f3nde podemos obtener mejores resultados?<\/h3>\n\n\n\n<p>Existen modelos que no solo se basan en <em>prompts<\/em>, sino que tambi\u00e9n utilizan <strong>una serie de datos proporcionados al modelo, lo que permite obtener respuestas m\u00e1s precisas<\/strong>. Estos modelos, como GitHub Copilot, ofrecen mejores resultados porque poseen un conocimiento m\u00e1s amplio y detallado.<\/p>\n\n\n\n<p>Por ejemplo,<strong> GitHub Copilot <\/strong>genera sugerencias analizando el c\u00f3digo antes y despu\u00e9s de la posici\u00f3n del cursor en el editor, utilizando todos los archivos abiertos en ese momento e incluso repositorios de GitHub referenciados en el contexto. Esto hace que las sugerencias de c\u00f3digo no sean un simple copia y pega de los datos de entrenamiento, sino que est\u00e9n fuertemente contextualizadas.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ejemplo pr\u00e1ctico<\/h4>\n\n\n\n<p>Partamos de este c\u00f3digo, que podr\u00eda escribirse en cualquier lenguaje de programaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>public static final int UNO = 1; <br>public static final int DOS = 2; <br>public static final int TRES = 3; <br>public static final int CUATRO = 4; <br>public static final int CINCO = 5; <br><br>public static void main(String[] args) { <br> \/\/ Seg\u00fan el par\u00e1metro, buscar la correspondencia con las variables est\u00e1ticas <br>}<br><\/code><\/pre>\n\n\n\n<p><strong>El comentario es muy gen\u00e9rico y no indica claramente lo que espera el programador.<\/strong> Si us\u00e1ramos este comentario como <em>prompt<\/em> en ChatGPT, probablemente no obtendr\u00edamos una respuesta precisa. Sin embargo, Copilot, al entender que el comentario se refiere a las variables est\u00e1ticas, podr\u00eda sugerir un c\u00f3digo como este:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">i<code>nt parametro = Integer.parseInt(args[0]); <br>switch (parametro) { <br> case UNO: <br>     System.out.println(\"UNO\"); <br>     break; <br> case DOS: <br>     System.out.println(\"DOS\"); <br>     break; <br> case TRES: <br>     System.out.println(\"TRES\"); <br>     break; <br> case CUATRO: <br>     System.out.println(\"CUATRO\"); <br>     break; <br> case CINCO: <br>     System.out.println(\"CINCO\"); <br>     break; <br> default: <br>     System.out.println(\"Sin coincidencias\"); <br>}<br><\/code><\/pre>\n\n\n\n<p>Muchos pensar\u00e1n que este c\u00f3digo es demasiado sencillo o que podr\u00eda mejorarse, y tienen raz\u00f3n. Sin embargo, el objetivo aqu\u00ed es mostrar que Copilot entiende el contexto y proporciona una respuesta correcta, mientras que ChatGPT requerir\u00eda un <em>prompt<\/em> mucho m\u00e1s detallado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Comprensi\u00f3n del c\u00f3digo<\/h3>\n\n\n\n<p>A menudo nos enfrentamos a c\u00f3digo que no hemos escrito nosotros y que debemos modificar o extender. En estos casos, los LLM pueden ser \u00fatiles, ya que analizan el c\u00f3digo y nos explican qu\u00e9 hace y c\u00f3mo funciona. Esto facilita comprender el c\u00f3digo y trabajar con \u00e9l de manera m\u00e1s eficaz.<\/p>\n\n\n\n<p>Un programador senior generalmente no tiene problemas para entender c\u00f3digo ajeno, pero, al salir de su zona de confort, puede encontrarse con desaf\u00edos. Aqu\u00ed es donde los LLM pueden marcar la diferencia, especialmente para programadores junior o cuando se necesita trabajar con c\u00f3digo poco familiar.<\/p>\n\n\n\n<p>Por ejemplo, partamos de esta funci\u00f3n tomada del repositorio <a href=\"https:\/\/github.com\/jetty\/jetty.project\">Jetty Project<\/a>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>public static boolean matchesURI(URI uri1, URI uri2) { <br>    String scheme = uri1.getScheme(); <br>    if (scheme.equalsIgnoreCase(uri2.getScheme())) { <br>        if (uri1.getHost().equalsIgnoreCase(uri2.getHost())) { <br>            int thisPort = HttpClient.normalizePort(scheme, uri1.getPort()); <br>            int thatPort = HttpClient.normalizePort(scheme, uri2.getPort()); <br>            if (thisPort == thatPort) { <br>                return uri2.getPath().startsWith(uri1.getPath()); <br>            } <br>        } <br>    } <br>    return false; <br>}<br><\/code><\/pre>\n\n\n\n<p>Con un <em>prompt<\/em> gen\u00e9rico, podr\u00edamos obtener una explicaci\u00f3n b\u00e1sica, pero con una mejor contextualizaci\u00f3n, el modelo puede proporcionar una descripci\u00f3n m\u00e1s precisa y \u00fatil, ayud\u00e1ndonos a modificar o extender el c\u00f3digo seg\u00fan nuestras necesidades.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Probemos a pedirle a Claude (aunque lo mismo aplica para otros LLM) que nos explique qu\u00e9 hace esta funci\u00f3n.<\/h4>\n\n\n\n<p><strong>Pregunta:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u00bf<code>Me puedes describir este c\u00f3digo?<br>&lt;codigo><br><\/code><\/pre>\n\n\n\n<p><strong>Respuesta:<\/strong> Este c\u00f3digo define un m\u00e9todo est\u00e1tico llamado <code>matchesURI<\/code> que compara dos objetos URI (<em>Uniform Resource Identifier<\/em>) para determinar si coinciden seg\u00fan criterios espec\u00edficos. Aqu\u00ed tienes una descripci\u00f3n detallada del funcionamiento:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Par\u00e1metros del m\u00e9todo:<\/strong>\n<ul class=\"wp-block-list\">\n<li>El m\u00e9todo recibe dos par\u00e1metros: <code>uri1<\/code> y <code>uri2<\/code>, ambos de tipo URI.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Comparaci\u00f3n de esquemas (protocolos):<\/strong>\n<ul class=\"wp-block-list\">\n<li>Extrae el esquema de <code>uri1<\/code>.<\/li>\n\n\n\n<li>Compara los esquemas de <code>uri1<\/code> y <code>uri2<\/code> sin distinguir entre may\u00fasculas y min\u00fasculas.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Comparaci\u00f3n de hosts:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Si los esquemas coinciden, compara los hosts de <code>uri1<\/code> y <code>uri2<\/code>, tambi\u00e9n ignorando may\u00fasculas y min\u00fasculas.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Comparaci\u00f3n de puertos:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Utiliza el m\u00e9todo <code>HttpClient.normalizePort()<\/code> para manejar los puertos predeterminados de HTTP.<\/li>\n\n\n\n<li>Compara los puertos normalizados de ambos URI.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Comparaci\u00f3n de rutas:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Si los puertos coinciden, verifica si la ruta decodificada de <code>uri2<\/code> comienza con la ruta decodificada de <code>uri1<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Resultado del m\u00e9todo:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Devuelve <code>true<\/code> si todas estas condiciones se cumplen, y <code>false<\/code> en caso contrario.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p><strong>Resumen:<\/strong><br>El m\u00e9todo considera que dos URI coinciden si tienen el mismo esquema, host, puerto (considerando puertos predeterminados de HTTP) y si la ruta de <code>uri2<\/code> comienza con la ruta de <code>uri1<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Contextos \u00fatiles de los LLM: Entender c\u00f3digo desconocido<\/h3>\n\n\n\n<p>Como se puede observar, en contextos donde nos enfrentamos a c\u00f3digo que no conocemos, un LLM puede ser muy \u00fatil para entender qu\u00e9 hace el c\u00f3digo y c\u00f3mo funciona.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Creaci\u00f3n de pruebas<\/h3>\n\n\n\n<p>De manera similar, a menudo<strong> necesitamos escribir pruebas para el c\u00f3digo que hemos creado o que debemos modificar.<\/strong> La escritura de pruebas no siempre es sencilla, ya que requiere experiencia y conocimiento de las mejores pr\u00e1cticas.<\/p>\n\n\n\n<p>Un <strong>LLM puede ser de gran ayuda en este caso, ya que genera pruebas de calidad para el c\u00f3digo que estamos desarrollando, ayud\u00e1ndonos a cubrir mejor los escenarios necesarios. <\/strong>Aunque no proporciona un producto final, acelera significativamente el proceso, especialmente en contextos donde debemos escribir muchas pruebas o no tenemos mucha experiencia haci\u00e9ndolo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Ejemplo: Solicitar pruebas para la funci\u00f3n <code>matchesURI<\/code><\/h3>\n\n\n\n<p><strong>Pregunta:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>\u00bfPuedes escribir pruebas para esta funci\u00f3n?<br>&lt;codigo><br><\/code><\/pre>\n\n\n\n<p><strong>Respuesta de Claude:<\/strong> Por supuesto, puedo ayudarte a escribir pruebas para esta funci\u00f3n. Usar\u00e9 JUnit, un framework ampliamente utilizado para pruebas en Java. Aqu\u00ed tienes una serie de pruebas que cubren diferentes escenarios:<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Escenarios cubiertos:<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>URI coincidentes.<\/strong><\/li>\n\n\n\n<li><strong>Esquemas diferentes.<\/strong><\/li>\n\n\n\n<li><strong>Hosts diferentes.<\/strong><\/li>\n\n\n\n<li><strong>Coincidencia con puertos predeterminados.<\/strong><\/li>\n\n\n\n<li><strong>Puertos diferentes.<\/strong><\/li>\n\n\n\n<li><strong>Rutas no coincidentes.<\/strong><\/li>\n\n\n\n<li><strong>Insensibilidad a may\u00fasculas y min\u00fasculas en esquemas y hosts.<\/strong><\/li>\n\n\n\n<li><strong>URI con query y fragmentos.<\/strong><\/li>\n<\/ol>\n\n\n\n<p><strong>C\u00f3digo generado:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">j<code>import org.junit.Test; <br>import static org.junit.Assert.*; <br>import java.net.URI; <br><br>public class URIMatcherTest { <br><br>    @Test <br>    public void testMatchingURIs() throws Exception { <br>        URI uri1 = new URI(\"http:\/\/example.com\/path\"); <br>        URI uri2 = new URI(\"http:\/\/example.com\/path\/subpath\"); <br>        assertTrue(URIMatcher.matchesURI(uri1, uri2)); <br>    } <br><br>    @Test <br>    public void testNonMatchingScheme() throws Exception { <br>        URI uri1 = new URI(\"http:\/\/example.com\/path\"); <br>        URI uri2 = new URI(\"https:\/\/example.com\/path\"); <br>        assertFalse(URIMatcher.matchesURI(uri1, uri2)); <br>    } <br><br>    @Test <br>    public void testNonMatchingHost() throws Exception { <br>        URI uri1 = new URI(\"http:\/\/example.com\/path\"); <br>        URI uri2 = new URI(\"http:\/\/example.org\/path\"); <br>        assertFalse(URIMatcher.matchesURI(uri1, uri2)); <br>    } <br><br>    @Test <br>    public void testMatchingWithDefaultPort() throws Exception { <br>        URI uri1 = new URI(\"http:\/\/example.com\/path\"); <br>        URI uri2 = new URI(\"http:\/\/example.com:80\/path\/subpath\"); <br>        assertTrue(URIMatcher.matchesURI(uri1, uri2)); <br>    } <br><br>    @Test <br>    public void testNonMatchingPort() throws Exception { <br>        URI uri1 = new URI(\"http:\/\/example.com:8080\/path\"); <br>        URI uri2 = new URI(\"http:\/\/example.com:9090\/path\"); <br>        assertFalse(URIMatcher.matchesURI(uri1, uri2)); <br>    } <br><br>    @Test <br>    public void testNonMatchingPath() throws Exception { <br>        URI uri1 = new URI(\"http:\/\/example.com\/path1\"); <br>        URI uri2 = new URI(\"http:\/\/example.com\/path2\"); <br>        assertFalse(URIMatcher.matchesURI(uri1, uri2)); <br>    } <br><br>    @Test <br>    public void testCaseInsensitiveSchemeAndHost() throws Exception { <br>        URI uri1 = new URI(\"HTTP:\/\/EXAMPLE.COM\/path\"); <br>        URI uri2 = new URI(\"http:\/\/example.com\/path\/subpath\"); <br>        assertTrue(URIMatcher.matchesURI(uri1, uri2)); <br>    } <br><br>    @Test <br>    public void testWithQueryAndFragment() throws Exception { <br>        URI uri1 = new URI(\"http:\/\/example.com\/path\"); <br>        URI uri2 = new URI(\"http:\/\/example.com\/path\/subpath?query=value#fragment\"); <br>        assertTrue(URIMatcher.matchesURI(uri1, uri2)); <br>    } <br>}<br><\/code><\/pre>\n\n\n\n<p><strong>Nota importante:<\/strong><br>El c\u00f3digo proporcionado no debe tomarse como algo definitivo, sino como una base para crear las pruebas necesarias. Es poco probable que el modelo cubra todos los casos posibles, pero, manteniendo un enfoque sencillo (<em>Keep It Simple, Stupid<\/em> &#8211; KISS), se pueden obtener resultados bastante \u00fatiles.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Seguridad<\/h3>\n\n\n\n<p>Otro \u00e1mbito en el que un LLM puede ser muy \u00fatil es en la seguridad. Escribir c\u00f3digo seguro no siempre es f\u00e1cil y requiere experiencia y conocimiento de buenas pr\u00e1cticas.<\/p>\n\n\n\n<p>Existen herramientas que ayudan a escribir mejor c\u00f3digo en varios aspectos, pero contar con algo integrado o, al menos, alimentado por <em>prompts<\/em> representa un gran avance. Por ejemplo, al analizar el m\u00e9todo mencionado, pregunt\u00e9:<\/p>\n\n\n\n<p><strong>Pregunta:<\/strong><br><em>\u00bfPuedes darme sugerencias para hacer este c\u00f3digo m\u00e1s seguro?<\/em><\/p>\n\n\n\n<p><strong>Respuesta:<\/strong><br>El modelo sugiri\u00f3 algo que ya hab\u00eda considerado al revisar el m\u00e9todo:<\/p>\n\n\n\n<p><strong>Gesti\u00f3n de valores nulos:<\/strong><br>El m\u00e9todo actual no valida si los URI de entrada son <code>null<\/code>. Se puede agregar esta validaci\u00f3n al inicio del m\u00e9todo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>if (uri1 == null || uri2 == null) { <br>    throw new IllegalArgumentException(\"URIs cannot be null\"); <br>}<br><\/code><\/pre>\n\n\n\n<p>Este es solo un ejemplo recortado de las sugerencias recibidas, pe<strong>ro es importante notar que el modelo puede ofrecer recomendaciones \u00fatiles para mejorar la seguridad del c\u00f3digo<\/strong>, enfoc\u00e1ndose en aspectos como la normalizaci\u00f3n de par\u00e1metros y otros puntos clave.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Refactorizaci\u00f3n<\/h3>\n\n\n\n<p>Los LLM tambi\u00e9n pueden ser \u00fatiles en tareas de refactorizaci\u00f3n. Aunque el resultado no siempre ser\u00e1 m\u00e1s eficiente, obtener ideas para mejorar el c\u00f3digo es valioso.<\/p>\n\n\n\n<p>Pregunt\u00e9 a ChatGPT:<br><strong>Pregunta:<\/strong><br><em>\u00bfPuedes hacer un refactor para optimizar este c\u00f3digo?<\/em><\/p>\n\n\n\n<p><strong>Respuesta:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>public static boolean matchesURI(URI uri1, URI uri2) { <br>    \/\/ Memoriza esquema, host y puerto una vez<br>    String scheme1 = uri1.getScheme(); <br>    String scheme2 = uri2.getScheme(); <br><br>    if (scheme1 == null || !scheme1.equalsIgnoreCase(scheme2)) { <br>        return false; <br>    }<br><br>    String host1 = uri1.getHost(); <br>    String host2 = uri2.getHost(); <br><br>    if (host1 == null || !host1.equalsIgnoreCase(host2)) { <br>        return false; <br>    }<br><br>    \/\/ Normaliza los puertos una vez<br>    int port1 = HttpClient.normalizePort(scheme1, uri1.getPort()); <br>    int port2 = HttpClient.normalizePort(scheme2, uri2.getPort()); <br><br>    if (port1 != port2) { <br>        return false; <br>    }<br><br>    \/\/ Compara rutas al final<br>    String path1 = uri1.getPath(); <br>    String path2 = uri2.getPath(); <br><br>    return path2.startsWith(path1); <br>}<br><\/code><\/pre>\n\n\n\n<p>Aunque las mejoras en rendimiento son m\u00ednimas, el m\u00e9todo es m\u00e1s claro y legible al organizar los controles secuencialmente, evitando una estructura profundamente anidada. En casos de c\u00f3digo m\u00e1s complejo, este tipo de claridad puede marcar una gran diferencia.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Boilerplate<\/h3>\n\n\n\n<p>Una de las tareas m\u00e1s tediosas para los desarrolladores es escribir <em>boilerplate<\/em> para nuevos proyectos, funcionalidades o clases. Estas tareas iniciales consumen tiempo y requieren atenci\u00f3n para no omitir detalles importantes.<\/p>\n\n\n\n<p>Para acelerar este proceso, se pueden usar LLMs. Por ejemplo, al solicitar:<\/p>\n\n\n\n<p><strong>Pregunta:<\/strong><br><em>\u00bfPuedes escribir un proyecto m\u00ednimo en Vue con una pantalla de inicio de sesi\u00f3n que use el servicio <a href=\"https:\/\/reqres.in\/api\/login\">https:\/\/reqres.in\/api\/login<\/a>?<\/em><\/p>\n\n\n\n<p>El modelo gener\u00f3 un punto de partida que adapt\u00e9 seg\u00fan mis necesidades, logrando un prototipo funcional con un esfuerzo m\u00ednimo. Este enfoque puede ser especialmente \u00fatil para programadores junior que necesitan orientaci\u00f3n o para senior que buscan optimizar el tiempo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Escritura de <em>prompts<\/em><\/h3>\n\n\n\n<p>Escribir <em>prompts<\/em> efectivos requiere claridad, concisi\u00f3n y especificidad. Un buen <em>prompt<\/em> debe incluir:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Contexto y detalles necesarios.<\/li>\n\n\n\n<li>Entrada y salida esperada.<\/li>\n<\/ul>\n\n\n\n<p>Por ejemplo:<br><strong>Prompt:<\/strong><br><em>Escribe una funci\u00f3n en C# para calcular el factorial de un n\u00famero dado.<\/em><\/p>\n\n\n\n<p>Este enfoque garantiza respuestas m\u00e1s precisas y \u00fatiles. Sin embargo, para contextos muy espec\u00edficos, podr\u00eda ser preferible usar herramientas como Copilot, que analizan el entorno de trabajo y ofrecen respuestas contextualizadas.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Comentarios en el c\u00f3digo<\/h3>\n\n\n\n<p>Los LLM tambi\u00e9n son \u00fatiles para comentar c\u00f3digo de forma r\u00e1pida y efectiva. Por ejemplo:<\/p>\n\n\n\n<p><strong>Prompt:<\/strong><br><em>A\u00f1ade comentarios al siguiente c\u00f3digo:<\/em><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>private String readFile(String fileName) {  <br>    BufferedReader br;  <br>    try {  <br>        br = new BufferedReader(new FileReader(fileName));  <br>        final StringBuilder sb = new StringBuilder();  <br>        String line = br.readLine();  <br><br>        while (line != null) {  <br>            sb.append(line);  <br>            sb.append(System.lineSeparator());  <br>            line = br.readLine();  <br>        }  <br>        br.close();  <br>        return sb.toString();  <br>    } catch (IOException e) {  <br>        e.printStackTrace();  <br>    }  <br>    return \"\";  <br>}  <br><\/code><\/pre>\n\n\n\n<p><strong>Resultado:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>\/** <br> * Lee el contenido de un archivo y lo devuelve como una cadena de texto. <br> * @param fileName Nombre del archivo a leer. <br> * @return Contenido del archivo o una cadena vac\u00eda en caso de error. <br> *\/ <br>private String readFile(String fileName) { <br>    BufferedReader br; <br>    try { <br>        \/\/ Inicializa un BufferedReader para leer el archivo. <br>        br = new BufferedReader(new FileReader(fileName)); <br><br>        \/\/ Usa un StringBuilder para construir el contenido del archivo. <br>        final StringBuilder sb = new StringBuilder(); <br><br>        \/\/ Lee la primera l\u00ednea del archivo. <br>        String line = br.readLine(); <br><br>        \/\/ Lee y agrega l\u00edneas al StringBuilder hasta el final del archivo. <br>        while (line != null) { <br>            sb.append(line); <br>            sb.append(System.lineSeparator()); <br>            line = br.readLine(); <br>        } <br><br>        \/\/ Cierra el BufferedReader. <br>        br.close(); <br><br>        \/\/ Devuelve el contenido del archivo. <br>        return sb.toString(); <br>    } catch (IOException e) { <br>        \/\/ Maneja errores de I\/O. <br>        e.printStackTrace(); <br>    } <br>    \/\/ Devuelve una cadena vac\u00eda en caso de error. <br>    return \"\"; <br>}<br><\/code><\/pre>\n\n\n\n<p>En este caso, el c\u00f3digo queda comentado, siendo mucho m\u00e1s claro y comprensible.<\/p>\n\n\n\n<p>El ejemplo que he usado es muy sencillo, pero la idea principal es esta: \u00bften\u00e9is un software que no conoc\u00e9is y que necesit\u00e1is comentar? Pedid a un LLM que lo haga por vosotros, y esto podr\u00eda transformar vuestra base de c\u00f3digo de un infierno a un para\u00edso.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Revisi\u00f3n de c\u00f3digo en <em>Pull Requests<\/em> (PR)<\/h3>\n\n\n\n<p>De manera similar, imaginad que ten\u00e9is que gestionar las PR de un repositorio y quer\u00e9is agilizar el proceso. En GitHub existen m\u00faltiples <em>actions<\/em> que pod\u00e9is configurar para realizar revisiones autom\u00e1ticas de c\u00f3digo. Una de ellas, aunque hay muchas similares, es <a href=\"https:\/\/github.com\/magnificode-ltd\/chatgpt-code-reviewer\">ChatGPT Code Reviewer<\/a>.<\/p>\n\n\n\n<p>Esta <em>action<\/em> realiza revisiones autom\u00e1ticas de las PR, indicando de manera m\u00e1s precisa qu\u00e9 contienen y c\u00f3mo mejorar cada una. Es solo un ejemplo, pero lo interesante es que pod\u00e9is desarrollar vuestras propias <em>actions<\/em> para que se activen al procesar PR, ayudando a agilizar el trabajo y mejorar la calidad del c\u00f3digo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">An\u00e1lisis<\/h3>\n\n\n\n<p>Analizar un proyecto siempre es una tarea compleja que requiere tiempo y atenci\u00f3n. Antes sol\u00eda abordar esta fase estudiando documentos del proyecto y haciendo b\u00fasquedas exhaustivas en internet, con la esperanza de encontrar algo que me ayudara a comprender mejor el proyecto.<\/p>\n\n\n\n<p>Estas b\u00fasquedas, aunque \u00fatiles, eran dispersas: por muy bien que busques, es f\u00e1cil perderte en un mar de informaci\u00f3n y no encontrar exactamente lo que necesitas.<\/p>\n\n\n\n<p>\u00daltimamente, he cambiado mi enfoque: tras una primera fase en la que intento entender el proyecto, comienzo una conversaci\u00f3n con ChatGPT. Hablar con un LLM tiene varias ventajas:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Velocidad:<\/strong> Es mucho m\u00e1s r\u00e1pido que buscar en internet. Los temas est\u00e1n m\u00e1s enfocados y es posible obtener respuestas precisas.<\/li>\n\n\n\n<li><strong>Brainstorming:<\/strong> A diferencia de buscar en libros o sitios web, que puede ser costoso y lineal, un LLM permite conexiones horizontales entre la informaci\u00f3n sin necesidad de abrir m\u00faltiples pesta\u00f1as.<\/li>\n\n\n\n<li><strong>Funciona mientras conduces:<\/strong> En ocasiones, paso horas en el coche camino a un cliente, y hablar con un asistente virtual, aunque no sea perfecto, es mucho mejor que estar en silencio.<\/li>\n\n\n\n<li><strong>Informaci\u00f3n constante:<\/strong> Aunque no toda sea aplicable de inmediato, me aporta un buen n\u00famero de ideas nuevas.<\/li>\n\n\n\n<li><strong>Hablar vs. leer:<\/strong> La informaci\u00f3n hablada en voz alta es m\u00e1s f\u00e1cil de memorizar que la le\u00edda.<\/li>\n<\/ol>\n\n\n\n<p>Eso s\u00ed, desde fuera, alguien que me vea parado en un sem\u00e1foro hablando solo podr\u00eda pensar que estoy loco, pero en mi cabeza me siento como Michael Knight hablando con KITT.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Traducciones<\/h3>\n\n\n\n<p>Uno de los aspectos m\u00e1s tediosos para un programador es traducir la documentaci\u00f3n de un proyecto a otro idioma. Es una tarea aburrida que requiere tiempo y atenci\u00f3n, pero que es necesaria para hacer que el proyecto sea comprensible para quienes no hablan nuestro idioma.<\/p>\n\n\n\n<p>Hace unos a\u00f1os, empec\u00e9 a generar todo el material en formato Markdown. Este formato ligero permite escribir documentos de manera simple y r\u00e1pida, sin preocuparse demasiado por la maquetaci\u00f3n. Adem\u00e1s, facilita extraer r\u00e1pidamente diapositivas con herramientas como Marp y comparar versiones para identificar cambios.<\/p>\n\n\n\n<p>Recientemente, me enfrent\u00e9 a traducir la documentaci\u00f3n de un proyecto al ingl\u00e9s. Hacerlo manualmente, copiando y pegando entre archivos y un LLM, es una tarea tediosa y lenta. Estaba a punto de escribir mi propio programa cuando descubr\u00ed <a href=\"https:\/\/github.com\/3ru\/gpt-translate\">GTP-Translate<\/a>, una extensi\u00f3n para GitHub que automatiza la traducci\u00f3n de documentaci\u00f3n mediante <em>actions<\/em> simples.<\/p>\n\n\n\n<p>Con una simple <em>issue<\/em>, se activa la <em>action<\/em> de GTP-Translate, se indica qu\u00e9 documento traducir y a qu\u00e9 idioma, y el sistema genera autom\u00e1ticamente una PR con la traducci\u00f3n, lista para ser aprobada.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusiones<\/h3>\n\n\n\n<p>Cuando se utiliza un LLM, es importante entender que no es una varita m\u00e1gica que resolver\u00e1 todos los problemas, sino una herramienta que puede ayudar a acelerar el trabajo y mejorar la calidad del c\u00f3digo. Escribir un <em>prompt<\/em> y esperar que, como por arte de magia, el modelo traduzca exactamente nuestra idea en c\u00f3digo perfecto es irreal.<\/p>\n\n\n\n<p>Del mismo modo, pensar que existe una \u00fanica herramienta de IA que soluciona todos los problemas es, a d\u00eda de hoy, un error.<\/p>\n\n\n\n<p>El mejor enfoque para un programador es entender los l\u00edmites del LLM, identificar los contextos en los que puede ser exitoso y catalogar mentalmente estos casos para usar la t\u00e9cnica o herramienta adecuada en cada situaci\u00f3n.<\/p>\n\n\n\n<p>Es m\u00e1s eficaz dividir un proyecto en partes manejables y pedir al modelo que trabaje en cada una, logrando resultados m\u00e1s precisos y \u00fatiles. Incluso en casos donde un modelo no puede generar c\u00f3digo, es probable que pueda documentarlo, comentarlo, traducirlo o realizar otras operaciones que agilicen nuestro trabajo.<\/p>\n\n\n\n<p>Aunque a\u00fan no estamos en un momento hist\u00f3rico donde estas herramientas hagan todo de forma autom\u00e1tica, un programador que sepa c\u00f3mo utilizarlas puede obtener resultados excelentes y mejorar significativamente la calidad de su trabajo.<\/p>\n\n\n\n<p>Mejorar nuestra calidad significa ser m\u00e1s efectivos y dejar atr\u00e1s el rol de junior para asumir el sombrero m\u00e1s pesado y desgastado de un programador senior.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Qu\u00e9 es la IA y qu\u00e9 es ChatGPT lo sabemos todos. Cada uno de nosotros ha escrito montones de prompts para obtener respuestas de ChatGPT, con resultados m\u00e1s o menos satisfactorios. Para entender mejor c\u00f3mo ChatGPT puede ayudarnos a convertirnos en programadores senior, primero debemos comprender qu\u00e9 es la ingenier\u00eda de prompts, por qu\u00e9 es&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/\">Read more<\/a><\/p>\n","protected":false},"author":246,"featured_media":30647,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10610,10598],"tags":[],"collections":[],"class_list":{"0":"post-30700","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-aprendizaje-automatico","8":"category-inteligencia-artificial","9":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>De programadores junior a senior con ChatGPT<\/title>\n<meta name=\"description\" content=\"C\u00f3mo dar el salto de programador junior a senior gracias a herramientas como ChatGPT, GitHub Copilot y otros LLM.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"De programadores junior a senior con ChatGPT\" \/>\n<meta property=\"og:description\" content=\"C\u00f3mo dar el salto de programador junior a senior gracias a herramientas como ChatGPT, GitHub Copilot y otros LLM.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-19T11:28:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-19T11:28:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Matteo Baccan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matteo Baccan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/\"},\"author\":{\"name\":\"Matteo Baccan\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/58743a83113a6ac22788ab19bea03ad1\"},\"headline\":\"De programadores junior a senior con ChatGPT\",\"datePublished\":\"2024-11-19T11:28:29+00:00\",\"dateModified\":\"2024-11-19T11:28:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/\"},\"wordCount\":2988,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man.webp\",\"articleSection\":[\"Aprendizaje autom\u00e1tico\",\"Inteligencia Artificial\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/\",\"name\":\"De programadores junior a senior con ChatGPT\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man.webp\",\"datePublished\":\"2024-11-19T11:28:29+00:00\",\"dateModified\":\"2024-11-19T11:28:31+00:00\",\"description\":\"C\u00f3mo dar el salto de programador junior a senior gracias a herramientas como ChatGPT, GitHub Copilot y otros LLM.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#primaryimage\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man.webp\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man.webp\",\"width\":1792,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Inteligencia Artificial\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"De programadores junior a senior con ChatGPT\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Codemotion.Italy\/\",\"https:\/\/x.com\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/58743a83113a6ac22788ab19bea03ad1\",\"name\":\"Matteo Baccan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/matteo-baccan-100x100.jpg\",\"contentUrl\":\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/matteo-baccan-100x100.jpg\",\"caption\":\"Matteo Baccan\"},\"description\":\"Matteo Baccan is a professional software engineer and trainer with over 30 years of experience in the IT industry. He has worked for several companies and organizations, dealing with design, development, testing, and management of web and desktop applications, using various languages and technologies. He is also a passionate computer science educator, author of numerous articles, books, and online courses aimed at all levels of expertise. He runs a website and a YouTube channel where he shares video tutorials, interviews, reviews, and programming tips. Active in open-source communities, he regularly participates in programming events and competitions. He defines himself as a \\\"realistic dreamer\\\" who loves to experiment, innovate, and share his knowledge and passions, following the motto: \\\"Never stop learning, because life never stops teaching.\\\"\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/author\/matteo-baccan\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"De programadores junior a senior con ChatGPT","description":"C\u00f3mo dar el salto de programador junior a senior gracias a herramientas como ChatGPT, GitHub Copilot y otros LLM.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/","og_locale":"en_US","og_type":"article","og_title":"De programadores junior a senior con ChatGPT","og_description":"C\u00f3mo dar el salto de programador junior a senior gracias a herramientas como ChatGPT, GitHub Copilot y otros LLM.","og_url":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2024-11-19T11:28:29+00:00","article_modified_time":"2024-11-19T11:28:31+00:00","og_image":[{"width":1792,"height":1024,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man.webp","type":"image\/webp"}],"author":"Matteo Baccan","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Matteo Baccan","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/"},"author":{"name":"Matteo Baccan","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/58743a83113a6ac22788ab19bea03ad1"},"headline":"De programadores junior a senior con ChatGPT","datePublished":"2024-11-19T11:28:29+00:00","dateModified":"2024-11-19T11:28:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/"},"wordCount":2988,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man.webp","articleSection":["Aprendizaje autom\u00e1tico","Inteligencia Artificial"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/","url":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/","name":"De programadores junior a senior con ChatGPT","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man.webp","datePublished":"2024-11-19T11:28:29+00:00","dateModified":"2024-11-19T11:28:31+00:00","description":"C\u00f3mo dar el salto de programador junior a senior gracias a herramientas como ChatGPT, GitHub Copilot y otros LLM.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man.webp","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man.webp","width":1792,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/de-programadores-junior-a-senior-con-chatgpt\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Inteligencia Artificial","item":"https:\/\/www.codemotion.com\/magazine\/es\/inteligencia-artificial\/"},{"@type":"ListItem","position":3,"name":"De programadores junior a senior con ChatGPT"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/58743a83113a6ac22788ab19bea03ad1","name":"Matteo Baccan","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/matteo-baccan-100x100.jpg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/02\/matteo-baccan-100x100.jpg","caption":"Matteo Baccan"},"description":"Matteo Baccan is a professional software engineer and trainer with over 30 years of experience in the IT industry. He has worked for several companies and organizations, dealing with design, development, testing, and management of web and desktop applications, using various languages and technologies. He is also a passionate computer science educator, author of numerous articles, books, and online courses aimed at all levels of expertise. He runs a website and a YouTube channel where he shares video tutorials, interviews, reviews, and programming tips. Active in open-source communities, he regularly participates in programming events and competitions. He defines himself as a \"realistic dreamer\" who loves to experiment, innovate, and share his knowledge and passions, following the motto: \"Never stop learning, because life never stops teaching.\"","url":"https:\/\/www.codemotion.com\/magazine\/author\/matteo-baccan\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-600x400.webp","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-600x600.webp","author_info":{"display_name":"Matteo Baccan","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/matteo-baccan\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man.webp",1792,1024,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-150x150.webp",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-300x171.webp",300,171,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-768x439.webp",768,439,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-1024x585.webp",1024,585,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-1536x878.webp",1536,878,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man.webp",1792,1024,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-100x100.webp",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-180x128.webp",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-896x504.webp",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-400x225.webp",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-600x400.webp",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/11\/DALL\u00b7E-2024-11-18-12.58.45-A-horizontal-digital-illustration-depicting-a-senior-and-junior-developer-working-together-in-a-modern-office-environment.-The-senior-developer-a-man-600x600.webp",600,600,true]},"uagb_author_info":{"display_name":"Matteo Baccan","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/matteo-baccan\/"},"uagb_comment_info":0,"uagb_excerpt":"Qu\u00e9 es la IA y qu\u00e9 es ChatGPT lo sabemos todos. Cada uno de nosotros ha escrito montones de prompts para obtener respuestas de ChatGPT, con resultados m\u00e1s o menos satisfactorios. Para entender mejor c\u00f3mo ChatGPT puede ayudarnos a convertirnos en programadores senior, primero debemos comprender qu\u00e9 es la ingenier\u00eda de prompts, por qu\u00e9 es&#8230;&hellip;","lang":"es","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/30700","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/246"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=30700"}],"version-history":[{"count":2,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/30700\/revisions"}],"predecessor-version":[{"id":30709,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/30700\/revisions\/30709"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/30647"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=30700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=30700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=30700"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=30700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}