{"id":30638,"date":"2024-11-18T13:04:28","date_gmt":"2024-11-18T12:04:28","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=30638"},"modified":"2024-11-18T13:04:29","modified_gmt":"2024-11-18T12:04:29","slug":"da-programmatori-junior-a-senior-con-chatgpt","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/","title":{"rendered":"Da programmatori junior a senior con ChatGPT"},"content":{"rendered":"\n<p>Cosa sia l&#8217;AI e cosa sia <a href=\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/chatgpt-search-perplexity-e-google-quali-sono-le-differenze-e-quale-scegliere\/\">ChatGPT <\/a>lo sappiamo tutti. Ognuno di noi ha scritto valanghe di prompt per ottenere risposte da <a href=\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/7-plugin-di-chatgpt-per-sviluppatori\/\">ChatGPT<\/a>, con risultati pi\u00f9 o meno soddisfacenti.\u00a0<\/p>\n\n\n\n<p>Per capire al meglio come ChatGPT possa aiutarci a diventare programmatori senior, <strong>dobbiamo prima comprendere cosa sia l&#8217;ingegneria dei prompt<\/strong> e perch\u00e9 sia cos\u00ec importante e quali siano gli ambiti in cui un LLM (Large Language Model) come ChatGPT o altri possano aiutarci a crescere professionalmente.\u00a0<\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-84dce878 gb-headline-text\">Esperienza sul campo&nbsp;<\/h2>\n\n\n\n<p>Quello che sto per scrivere nasce dall&#8217;esperienza di mesi di utilizzo di ChatGPT, <a href=\"https:\/\/www.codemotion.com\/magazine\/it\/open-source\/awesome-lists-su-github\/\">GitHub <\/a>copilot, Claudie e altri LLM, e da una serie di letture e studi sull&#8217;argomento, sono sicuro che fra qualche mese verr\u00f2 smentito ed usciranno, o sono gi\u00e0 usciti e non li utilizzo, strumenti migliori che aiutano in modo ancora pi\u00f9 importante gli sviluppatori (e non solo) a crescere professionalmente.\u00a0<\/p>\n\n\n\n<p>Sicuramente qualcuno fra di voi utilizza<strong> strumenti diversi da quelli che uso io<\/strong>, ma proviamo a concentrarci su quello che possiamo far fare a tool di questo genere e non su quale sia il migliore, altrimenti si innesca una guerra infinita su quale sia il migliore e sono sicuro che nessuno ne uscirebbe vincitore.\u00a0<\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-365ae5d0 gb-headline-text\">Comprendere ChatGPT e in modo pi\u00f9 ampio i LLM&nbsp;<\/h2>\n\n\n\n<p>Partiamo dal principio: <strong>ChatGPT \u00e8 un chatbot di intelligenza artificiale (AI) che utilizza l&#8217;elaborazione del linguaggio naturale per creare un dialogo conversazionale simile a quello umano.<\/strong> Il modello linguistico pu\u00f2 rispondere a domande e comporre vari contenuti scritti, tra cui articoli, post sui social media, saggi, codice e e-mail, rendendolo uno strumento entusiasmante per programmatori di tutti i livelli.\u00a0<\/p>\n\n\n\n<p>Si tratta quindi di <strong>un modello che non ragiona<\/strong>, ma \u00e8 in grado di <strong>applicare in maniera molto efficace le regole che gli sono state insegnate durante il training<\/strong>. Questo significa che se gli diamo un <strong>input sbagliato<\/strong>, otterremo un <strong>output sbagliato<\/strong>, ma se diamo un input corretto, otterremo un <strong>output corretto.\u00a0<\/strong><\/p>\n\n\n\n<p>Allo stesso modo, se utilizziamo un LLM che ha utilizzato dei dataset con <strong>errori<\/strong>, di conseguenza avremo un <strong>output con errori.\u00a0<\/strong><\/p>\n\n\n\n<p>Oltre a questo i modelli tentano sempre di dare delle risposte e di conseguenza esiste una percentuale di risposte, pi\u00f9 o meno grandi,<strong> che saranno sempre sbagliate<\/strong>, inventate o comunque non corrette.\u00a0<\/p>\n\n\n\n<p>Fissato questo punto iniziale, il cui scopo \u00e8 quello di focalizzare il tipo di strumento che stiamo tentanto di utilizzare,<strong> proviamo a capire quali sono gli ambiti in cui la soglia d&#8217;errore \u00e8 pi\u00f9 alta<\/strong> e quali invece quelli in cui<strong> la soglia d&#8217;errore si abbassa e possiamo utilizzarlo con maggiore successo.\u00a0<\/strong><\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-8b27d161 gb-headline-text\">Gli LLM non sono pensati per risolvere problemi o indovinelli&nbsp;<\/h2>\n\n\n\n<p>Gli LLM sono stati creati <strong>per rispondere a domande, scrivere articoli, scrivere codice,<\/strong> ma <strong>non <\/strong>sono stati creati <strong>per risolvere problemi o indovinelli<\/strong>. Questo significa che <strong>se gli diamo un problema, non sapr\u00e0 risolverlo<\/strong>, ma se gli diamo un problema <strong>gi\u00e0 risolto<\/strong>, <strong>sapr\u00e0 darci la soluzione.<\/strong><\/p>\n\n\n\n<p>Ogni volta che vedo un video dove qualcuno si diverte a <strong>proporre un indovinello a ChatGPT e poi si stupisce che non riesca a risolverlo<\/strong>, mi viene da ridere, perch\u00e9 \u00e8 come chiedere ad un bambino di 5 anni di risolvere un problema di fisica quantistica: <strong>sono test che non tengono conto delle capacit\u00e0 dell&#8217;interlocutore e del modo col quale \u00e8 stato pensato<\/strong>. Non aggiungono nessun valore e non dicono che il modello sia inadeguato, ma piuttosto stanno dimostrando che il &#8220;creator&#8221; di turno non ha capito come utilizzare il modello.\u00a0<\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-fc6ebba3 gb-headline-text\">Limiti di conoscenza&nbsp;<\/h2>\n\n\n\n<p>Un altro punto importante da tenere in considerazione \u00e8 che gli LLM <strong>non hanno una conoscenza infinita,<\/strong> ma hanno una conoscenza <strong>limitata <\/strong>a quello che \u00e8 stato<strong> inserito nei dataset di training.<\/strong> Questo significa che se gli diamo un input che non \u00e8 presente nei dataset, non sapr\u00e0 rispondere.\u00a0<\/p>\n\n\n\n<p>Quando questa cosa accade spesso? Quando proviamo a chiedere a un LLM di darci informazioni rispetto a prodotti che non esistevano o erano appena usciti nel momento in cui il modello ha iniziato ad essere addestrato.&nbsp;<\/p>\n\n\n\n<p>Iniziano ad uscire delle mitigazioni a questo aspetto, come<strong> l&#8217;interrogazione in tempo reale della rete, il training continuo<\/strong>, ma sono tutte soluzioni che<strong> non risolvono il problema<\/strong>, ma al momento la mitigano, riuscendo in parte a dare delle risposte, ma in parte ancora maggiore ad inventarsele.\u00a0<\/p>\n\n\n\n<p>Non aspettatevi quindi di avere risposte da ChatGPT su prodotti che sono usciti da poco, su tecnologie che sono state rilasciate da poco, su eventi che sono accaduti da poco, perch\u00e9<strong> non sapr\u00e0 rispondervi o se lo far\u00e0 sar\u00e0 con delle risposte inventate o di bassa qualit\u00e0.\u00a0<\/strong><\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-6a3223c8 gb-headline-text\">Dove possiamo avere dei risultati migliori?&nbsp;<\/h2>\n\n\n\n<p>Esistono una serie di modelli che non si basano solo su prompt, ma che si basano su <strong>una serie di dati che vengono forniti al modello e che permettono di avere delle risposte migliori<\/strong>. Questi modelli sono in grado di dare delle risposte migliori, perch\u00e9 hanno una conoscenza pi\u00f9 ampia e pi\u00f9 dettagliata rispetto a quella che pu\u00f2 avere un modello basato solo su prompt.\u00a0<\/p>\n\n\n\n<p>Un esempio di questi modelli \u00e8<strong> GitHub Copilot<\/strong>, che \u00e8 in grado di dare delle risposte migliori rispetto a ChatGPT, perch\u00e9 ha una conoscenza pi\u00f9 ampia e pi\u00f9 dettagliata rispetto a quella che pu\u00f2 avere ChatGPT.\u00a0<\/p>\n\n\n\n<p>La conoscenza pi\u00f9 ampia \u00e8 data dal fatto che per generare un suggerimento viene analizzato il codice prima e dopo la posizione del cursore all&#8217;interno dell&#8217;editor, <strong>vengono utilizzati tutti i file aperti in quel momento dall&#8217;editor ed aggiungendo i repositori GitHub referenziati nel contesto.<\/strong> Tutti questi dati fanno parte dell&#8217;input inviato a Copilot e di conseguenza il codice suggerito non \u00e8 un semplice copia a incolla di qualcosa trovato nei dati di allenamento, ma \u00e8 codice che \u00e8 fortemente contestualizzato rispetto al contesto in cui viene utilizzato.\u00a0<\/p>\n\n\n\n<p>Facciamo un piccolo esempio, partendo da questo codice, che potrebbe essere scritto in qualsiasi linguaggio di programmazione:&nbsp;<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> int UNO = <span class=\"hljs-number\">1<\/span>; \n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> int DUE = <span class=\"hljs-number\">2<\/span>; \n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> int TRE = <span class=\"hljs-number\">3<\/span>;\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> int QUATTRO = <span class=\"hljs-number\">4<\/span>; \n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> int CINQUE = <span class=\"hljs-number\">5<\/span>; \n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> void main(String&#91;] args) { \n <span class=\"hljs-comment\">\/\/ Dato il parametro cerco la corrispondenza rispetto alle statiche } <\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Soffermiamoci sul commento, che potrebbe essere scritto in qualsiasi linguaggio di programmazione, ma che <strong>\u00e8 molto generico e non ci dice nulla di cosa si aspetta il programmatore<\/strong> che ha scritto il codice e non andrebbe bene se lo scrivessimo in un prompt per ChatGPT, perch\u00e9 non ci darebbe una risposta corretta.\u00a0<\/p>\n\n\n\n<p>In questo contesto invece <strong>Copilot \u00e8 in grado di capire che il commento \u00e8 riferito alle variabili statiche<\/strong> e di conseguenza ci suggerir\u00e0 <strong>un codice che fa esattamente quello che ci aspettiamo.<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">int parametro = Integer.parseInt(args&#91;<span class=\"hljs-number\">0<\/span>]); \n<span class=\"hljs-keyword\">switch<\/span> (parametro) { \n <span class=\"hljs-keyword\">case<\/span> UNO: \n System.out.println(<span class=\"hljs-string\">\"UNO\"<\/span>); \n <span class=\"hljs-keyword\">break<\/span>; \n <span class=\"hljs-keyword\">case<\/span> DUE: \n System.out.println(<span class=\"hljs-string\">\"DUE\"<\/span>); \n <span class=\"hljs-keyword\">break<\/span>; \n <span class=\"hljs-keyword\">case<\/span> TRE: \n System.out.println(<span class=\"hljs-string\">\"TRE\"<\/span>); \n <span class=\"hljs-keyword\">break<\/span>; \n <span class=\"hljs-keyword\">case<\/span> QUATTRO: \n System.out.println(<span class=\"hljs-string\">\"QUATTRO\"<\/span>); \n <span class=\"hljs-keyword\">break<\/span>; \n <span class=\"hljs-keyword\">case<\/span> CINQUE: \n System.out.println(<span class=\"hljs-string\">\"CINQUE\"<\/span>); \n <span class=\"hljs-keyword\">break<\/span>; \n <span class=\"hljs-keyword\">default<\/span>: \n System.out.println(<span class=\"hljs-string\">\"Nessuna corrispondenza\"<\/span>); \n} <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Capisco che a questo punto moltissimi di voi si staranno dicendo: <em>&#8220;il codice \u00e8 troppo semplice&#8221;<\/em>, <strong>&#8220;si poteva fare di meglio&#8221;<\/strong> e avete ragione, ma il punto non \u00e8 quello, il punto \u00e8 che <strong>Copilot \u00e8 in grado di capire il contesto e di dare una risposta corretta<\/strong>, mentre <strong>ChatGPT non sarebbe in grado di farlo<\/strong>, a meno di non scrivere un prompt molto pi\u00f9 esteso di quel commento minimale inserito all&#8217;interno del codice.\u00a0<\/p>\n\n\n\n<p>Contestualizzare la domanda o l&#8217;aiuto che si vuole ottenere da un enorme vantaggio rispetto a scrivere un prompt generico, <strong>perch\u00e9 permette al modello di capire meglio cosa si aspetta<\/strong> da lui e di conseguenza di dare una risposta migliore.\u00a0<\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-4468708b gb-headline-text\">Comprensione del codice&nbsp;<\/h2>\n\n\n\n<p>Spesso ci troviamo di fronte a <strong>codice che non abbiamo scritto noi e che non conosciamo,<\/strong> ma che dobbiamo modificare o estendere. In questi casi \u00e8 molto utile avere un modello che ci aiuti a <strong>capire cosa fa il codice e come funziona.\u00a0<\/strong><\/p>\n\n\n\n<p>Un <strong>programmatore senior<\/strong> normalmente non ha grossi problemi nella<strong> comprensione del codice, <\/strong>ma abbassando il livello a junior o semplicemente uscendo dalla confort zone del senior,<strong> ci si rende conto che non \u00e8 cos\u00ec scontato capire cosa fa un pezzo di codice scritto da qualcun altro.\u00a0<\/strong><\/p>\n\n\n\n<p>I modelli LLM ci possono aiutare in questa fase, <strong>perch\u00e9 sono in grado di analizzare il codice e di darci una spiegazione di cosa fa e come funziona.<\/strong> Questo ci permette di capire meglio il codice e di riuscire a modificarlo o estenderlo in modo pi\u00f9 efficace.\u00a0<\/p>\n\n\n\n<p>Anche in questo caso la contestualizzazione \u00e8 molto importante, ma proviamo comunque ad affrontare il problema con un prompt generico e vediamo cosa succede.&nbsp;<\/p>\n\n\n\n<p>Partiamo da questa funzione presa dal repository<a href=\" https:\/\/github.com\/jetty\/jetty.project\u00a0\"> https:\/\/github.com\/jetty\/jetty.project\u00a0<\/a><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-keyword\">static<\/span> boolean matchesURI(URI uri1, URI uri2) \n { \n <span class=\"hljs-built_in\">String<\/span> scheme = uri1.getScheme(); \n <span class=\"hljs-keyword\">if<\/span> (scheme.equalsIgnoreCase(uri2.getScheme())) \n { \n <span class=\"hljs-keyword\">if<\/span> (uri1.getHost().equalsIgnoreCase(uri2.getHost())) \n { \n <span class=\"hljs-comment\">\/\/ Handle default HTTP ports. <\/span>\n int thisPort = HttpClient.normalizePort(scheme, \nuri1.getPort()); \n int thatPort = HttpClient.normalizePort(scheme, \nuri2.getPort()); \n <span class=\"hljs-keyword\">if<\/span> (thisPort == thatPort) \n { \n <span class=\"hljs-comment\">\/\/ Use decoded URI paths. <\/span>\n <span class=\"hljs-keyword\">return<\/span> uri2.getPath().startsWith(uri1.getPath()); \n } \n } \n } \n <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>; \n } <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Proviamo ora a chiedere a Claude (ma sarebbe la stessa cosa con altri LLM) di spiegarci cosa fa questa funzione.\u00a0<\/p>\n\n\n\n<p><em>Mi descrivi questo codice: <br><\/em>&lt;codice> <\/p>\n\n\n\n<p>In risposta avremo:<\/p>\n\n\n\n<p><em>Questo codice definisce un metodo statico chiamato `matchesURI` che confronta due oggetti URI (Uniform Resource Identifier) per determinare se corrispondono secondo criteri specifici. Ecco una descrizione dettagliata del funzionamento: <\/em><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><em>Il metodo prende due parametri: `uri1` e `uri2`, entrambi di tipo URI.\u00a0<\/em><\/li>\n\n\n\n<li><em>Confronta prima gli schemi (protocolli) dei due URI:\u00a0<\/em>\n<ul class=\"wp-block-list\">\n<li><em>Estrae lo schema di `uri1`\u00a0<\/em><\/li>\n\n\n\n<li><em>Confronta gli schemi di `uri1` e `uri2` ignorando le maiuscole\/minuscole\u00a0<\/em><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><em>Se gli schemi corrispondono, procede a confrontare gli host:\u00a0<\/em>\n<ul class=\"wp-block-list\">\n<li><em>Confronta gli host di `uri1` e `uri2` ignorando le maiuscole\/minuscole\u00a0<\/em><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><em>Se anche gli host corrispondono, passa al confronto delle porte:\u00a0<\/em>\n<ul class=\"wp-block-list\">\n<li><em>\u00a0Utilizza un metodo `HttpClient.normalizePort()` per gestire le porte predefinite HTTP\u00a0<\/em><\/li>\n\n\n\n<li><em>\u00a0Confronta le porte normalizzate di entrambi gli URI\u00a0<\/em><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><em>Se le porte corrispondono, controlla infine i percorsi:\u00a0<\/em>\n<ul class=\"wp-block-list\">\n<li><em>\u00a0Verifica se il percorso decodificato di `uri2` inizia con il percorso decodificato di `uri1`\u00a0<\/em><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><em>Il metodo restituisce `true` se tutte queste condizioni sono soddisfatte, altrimenti restituisce `false`.\u00a0<\/em><\/li>\n<\/ol>\n\n\n\n<p><em>In sintesi, questo metodo considera due URI corrispondenti se hanno lo stesso schema, host, porta (considerando le porte HTTP predefinite) e se il percorso di `uri2` inizia con il percorso di `uri1`.\u00a0<\/em><\/p>\n\n\n\n<p>Capite che, in tutti i contesti dove ci troviamo di fronte a codice che non conosciamo, <strong>un LLM pu\u00f2 essere molto utile per capire cosa fa e come funziona.\u00a0<\/strong><\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-320cda6d gb-headline-text\">Creazione dei test\u00a0<\/h2>\n\n\n\n<p>Allo stesso modo ci troviamo spesso di fronte <strong>alla scrittura di test per il codice che abbiamo scritto o che dobbiamo scrivere.<\/strong> Scrivere test non \u00e8 sempre facile e richiede una certa esperienza e conoscenza delle best practice.\u00a0<\/p>\n\n\n\n<p>In questo caso un<strong> LLM pu\u00f2 esserci d&#8217;aiuto, perch\u00e9 \u00e8 in grado di generare dei test per il codice che abbiamo scritto o che dobbiamo scrivere<\/strong>. Questo ci permette di avere dei test di qualit\u00e0 e di coprire meglio il codice che stiamo scrivendo.\u00a0<\/p>\n\n\n\n<p>Chiaramente non si tratta di un prodotto finito, ma permette di velocizzare molto la scrittura, soprattutto in contesti dove dobbiamo scrivere molti test o dove non abbiamo molta esperienza nella scrittura dei test.&nbsp;<\/p>\n\n\n\n<p>Partendo sempre dall&#8217;esempio di qui sopra possiamo chiedere:<\/p>\n\n\n\n<p><em>Mi scrivi i test per questa funzione:<br><\/em>&lt;codice><\/p>\n\n\n\n<p>Sempre con Claude come modello, otterremo:<\/p>\n\n\n\n<p><em>Certamente, posso aiutarti a scrivere alcuni test per questa funzione. User\u00f2 JUnit, un framework di test ampiamente utilizzato per Java, per creare questi test. Ecco una serie di test che coprono diversi scenari:\u00a0<\/em><\/p>\n\n\n\n<p><em>Questi test coprono diversi scenari per la funzione matchesURI:\u00a0<\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>URI corrispondenti&nbsp;<\/li>\n\n\n\n<li>Schemi diversi&nbsp;<\/li>\n\n\n\n<li>Host diversi&nbsp;<\/li>\n\n\n\n<li>Corrispondenza con porta predefinita&nbsp;<\/li>\n\n\n\n<li>Porte diverse&nbsp;<\/li>\n\n\n\n<li>Percorsi non corrispondenti&nbsp;<\/li>\n\n\n\n<li>Insensibilit\u00e0 alle maiuscole\/minuscole per schema e host&nbsp;<\/li>\n\n\n\n<li>URI con query e frammento&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><em>Questi test dovrebbero fornire una buona copertura per la funzione matchesURI. Tuttavia, potresti voler aggiungere ulteriori test per casi limite o scenari specifici del tuo uso della funzione.<\/em><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><\/blockquote>\n<\/blockquote>\n\n\n\n<p><em>Di seguito riporto il pezzo di codice creato che rappresenta un&#8217;ottima base di partenza\u00a0:<\/em><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import org.junit.Test; \nimport <span class=\"hljs-keyword\">static<\/span> org.junit.Assert.*; \nimport java.net.URI; \n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">URIMatcherTest<\/span> <\/span>{ \n @Test \n <span class=\"hljs-keyword\">public<\/span> void testMatchingURIs() throws <span class=\"hljs-keyword\">Exception<\/span> { \n URI uri1 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com\/path\"<\/span>); \n URI uri2 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com\/path\/subpath\"<\/span>); \n assertTrue(URIMatcher.matchesURI(uri1, uri2)); \n } \n @Test \n <span class=\"hljs-keyword\">public<\/span> void testNonMatchingScheme() throws <span class=\"hljs-keyword\">Exception<\/span> { \n URI uri1 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com\/path\"<\/span>); \n URI uri2 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"https:\/\/example.com\/path\"<\/span>); \n assertFalse(URIMatcher.matchesURI(uri1, uri2)); \n } \n @Test \n <span class=\"hljs-keyword\">public<\/span> void testNonMatchingHost() throws <span class=\"hljs-keyword\">Exception<\/span> { \n URI uri1 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com\/path\"<\/span>); \n URI uri2 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.org\/path\"<\/span>); \n assertFalse(URIMatcher.matchesURI(uri1, uri2)); \n }<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"> @Test \n <span class=\"hljs-keyword\">public<\/span> void testMatchingWithDefaultPort() throws <span class=\"hljs-keyword\">Exception<\/span> { \n URI uri1 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com\/path\"<\/span>); \n URI uri2 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com:80\/path\/subpath\"<\/span>); \n assertTrue(URIMatcher.matchesURI(uri1, uri2)); \n } \n @Test \n <span class=\"hljs-keyword\">public<\/span> void testNonMatchingPort() throws <span class=\"hljs-keyword\">Exception<\/span> { \n URI uri1 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com:8080\/path\"<\/span>); \n URI uri2 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com:9090\/path\"<\/span>); \n assertFalse(URIMatcher.matchesURI(uri1, uri2)); \n } \n @Test \n <span class=\"hljs-keyword\">public<\/span> void testNonMatchingPath() throws <span class=\"hljs-keyword\">Exception<\/span> { \n URI uri1 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com\/path1\"<\/span>); \n URI uri2 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com\/path2\"<\/span>); \n assertFalse(URIMatcher.matchesURI(uri1, uri2)); \n } \n @Test \n <span class=\"hljs-keyword\">public<\/span> void testCaseInsensitiveSchemeAndHost() throws <span class=\"hljs-keyword\">Exception<\/span> { \n URI uri1 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"HTTP:\/\/EXAMPLE.COM\/path\"<\/span>); \n URI uri2 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com\/path\/subpath\"<\/span>); \n assertTrue(URIMatcher.matchesURI(uri1, uri2)); \n } \n @Test \n <span class=\"hljs-keyword\">public<\/span> void testWithQueryAndFragment() throws <span class=\"hljs-keyword\">Exception<\/span> { \n URI uri1 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com\/path\"<\/span>); \n URI uri2 = <span class=\"hljs-keyword\">new<\/span> URI(<span class=\"hljs-string\">\"http:\/\/example.com\/path\/subpath? \nquery=value#fragment\"<\/span>); \n assertTrue(URIMatcher.matchesURI(uri1, uri2)); \n } \n} <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Chiaramente<strong> il codice non \u00e8 da prendere come oro colato, ma come base di partenza per scrivere i test che ci servono<\/strong>. Sicuramente non ci dobbiamo aspettare che il modello ci dia dei test che coprano tutti i casi possibili e che sia in grado di farlo per qualsiasi parte di codice che abbiamo scritto, <strong>ma se manteniamo il nostro approccio al codice di tipo KISS (<\/strong><em>Keep It Simple Stupid<\/em><strong>) possiamo ottenere dei risultati molto buoni.\u00a0<\/strong><\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-75fc8a15 gb-headline-text\">Sicurezza&nbsp;<\/h2>\n\n\n\n<p>Un altro ambito in cui un LLM pu\u00f2 essere molto utile \u00e8 la <strong>sicurezza<\/strong>. Scrivere codice sicuro <strong>non \u00e8 sempre facile <\/strong>e richiede una certa esperienza e conoscenza delle best practice.\u00a0<\/p>\n\n\n\n<p>Esistono tool che aiutano in tutte le direzioni a scrivere codice migliore, ma poter<strong> avere qualcosa di integrato o alla peggio alimentabile a prompt<\/strong>, \u00e8 sicuramente un passo avanti.<\/p>\n\n\n\n<p>Per esempio, sempre partendo dal metodo che stiamo analizzando ho provato a chiedere<\/p>\n\n\n\n<p><em>\u00a0Mi dai dei suggerimenti per rendere il codice pi\u00f9 sicuro?<\/em><\/p>\n\n\n\n<p>E ho ottenuto qualcosa<strong> che mi ero gi\u00e0 chiesto mentre guardavo il metodo<\/strong>.<\/p>\n\n\n\n<p><em>Gestione dei null: <\/em><\/p>\n\n\n\n<p><em>Il metodo attuale non controlla se gli URI in input sono null. Aggiungi controlli all&#8217;inizio del metodo: <\/em><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">if<\/span> (uri1 == <span class=\"hljs-literal\">null<\/span> || uri2 == <span class=\"hljs-literal\">null<\/span>) { \n <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalArgumentException(<span class=\"hljs-string\">\"URIs cannot be null\"<\/span>); \n} <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In questo caso ho tagliato i suggerimenti dati: <strong>\u00e8 per\u00f2 importante notare che il modello \u00e8 in grado di dare dei suggerimenti molto utili<\/strong> per migliorare la <strong>sicurezza <\/strong>del codice e in questo caso si \u00e8 focalizato subito sulla normalizzazione dei parametri, oltre ad altri suggerimenti.\u00a0<\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-3b6bcc2e gb-headline-text\">Refactoring&nbsp;<\/h2>\n\n\n\n<p>Anche in caso di refactoring un LLM pu\u00f2 aiutarci:<strong> non \u00e8 detto che il risultato sia effettivamente pi\u00f9 efficiente rispetto al codice di partenza<\/strong>, ma avere delle idee su come migliorare il codice \u00e8 sempre utile.\u00a0<\/p>\n\n\n\n<p>In questo caso ho provato a chiedere a ChatGPT:<\/p>\n\n\n\n<p><em>Puoi fare un refactoring per velocizzare questo codice?\u00a0<\/em><\/p>\n\n\n\n<p>E ho ottenuto:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-keyword\">static<\/span> boolean matchesURI(URI uri1, URI uri2) { \n <span class=\"hljs-comment\">\/\/ Memorizza lo schema, l'host e la porta una sola volta. <\/span>\n <span class=\"hljs-built_in\">String<\/span> scheme1 = uri1.getScheme(); \n <span class=\"hljs-built_in\">String<\/span> scheme2 = uri2.getScheme(); \n  \n <span class=\"hljs-keyword\">if<\/span> (scheme1 == <span class=\"hljs-literal\">null<\/span> || !scheme1.equalsIgnoreCase(scheme2)) { \n <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>; \n } \n  \n <span class=\"hljs-built_in\">String<\/span> host1 = uri1.getHost(); \n <span class=\"hljs-built_in\">String<\/span> host2 = uri2.getHost(); \n  \n <span class=\"hljs-keyword\">if<\/span> (host1 == <span class=\"hljs-literal\">null<\/span> || !host1.equalsIgnoreCase(host2)) { \n <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>; \n }\n <span class=\"hljs-comment\">\/\/ Porta normalizzata una volta. <\/span>\n int port1 = HttpClient.normalizePort(scheme1, uri1.getPort()); \n int port2 = HttpClient.normalizePort(scheme2, uri2.getPort()); \n  \n <span class=\"hljs-keyword\">if<\/span> (port1 != port2) { \n <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>; \n } \n  \n <span class=\"hljs-comment\">\/\/ Confronta il percorso alla fine. <\/span>\n <span class=\"hljs-built_in\">String<\/span> path1 = uri1.getPath(); \n <span class=\"hljs-built_in\">String<\/span> path2 = uri2.getPath(); \n  \n <span class=\"hljs-keyword\">return<\/span> path2.startsWith(path1); \n} <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Probabilmente non abbiamo guadagnato nulla dal punto di vista prestazionale,<strong> ma dal punto della chiarezza il metodo ora \u00e8 molto pi\u00f9 chiaro e facile da leggere <\/strong>perch\u00e9 mette in fila tutti i controlli ed evita un codice innestato a tre livelli.\u00a0<\/p>\n\n\n\n<p>Anche in questo caso stiamo parlando di codice molto semplice, <strong>dove il guadagno non \u00e8 molto, <\/strong>ma in codice pi\u00f9 complesso il guadagno pu\u00f2 essere molto maggiore ed avere<strong> un codice pi\u00f9 chiaro potrebbe aiutarci<\/strong>, cos\u00ec come potrebbero aiutarci le riflessioni fatte dal modello rispetto a quanto scritto nel metodo che stiamo analizzando.\u00a0<\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-e7b34e79 gb-headline-text\">Boilerplate&nbsp;<\/h2>\n\n\n\n<p>Quanti di noi si sono trovati davanti a un nuovo progetto e hanno dovuto<strong> scrivere il boilerplate per farlo partire? <\/strong>Quanti di noi si sono trovati a dover scrivere <strong>il boilerplate per una nuova funzionalit\u00e0?<\/strong> Quanti di noi si sono trovati a dover scrivere il <strong>boilerplate per una nuova classe?\u00a0<\/strong><\/p>\n\n\n\n<p>Credo chiunque e ogni volta il passo iniziale richiede tempo e attenzione, perch\u00e9 dobbiamo stare <strong>attenti a non dimenticare nulla e a scrivere tutto correttamente.\u00a0<\/strong>Occorre quindi studiare, provare, sbagliare e spesso riscrivere<strong> pi\u00f9 volte fino a che non otteniamo il risultato che ci aspettiamo.\u00a0<\/strong><\/p>\n\n\n\n<p>Per questo motivo esistono raccolte di boilerplate, che ci permettono di avere un punto di partenza per scrivere il codice che ci serve. Un esempio<strong> \u00e8 questo progetto GitHub\u00a0<\/strong><a href=\"https:\/\/github.com\/melvin0008\/awesome-projects-boilerplates\">https:\/\/github.com\/melvin0008\/awesome-projects-boilerplates<\/a> che <strong>raccoglie molti esempi di progetti minimali dai quali partire.\u00a0<\/strong><\/p>\n\n\n\n<p>Anche in questo caso un LLM pu\u00f2 aiutarci a scrivere il boilerplate che ci serve, partendo da un prompt generico come:<\/p>\n\n\n\n<p><em>puoi scrivermi un progetto minimale VUE, composto da una prima maschera di login, che interroga il servizio https:\/\/reqres.in\/api\/login passando un json composto da due parametri &#8220;email&#8221; e &#8220;password&#8221; e in caso di risposta con codice 200 mi permetta di accedere ad un backend composto da: un pannello a sinistra con un menu e un pannello centrale nel quale visualizzare dei dati. <\/em><br><em>Nel pannello di sinistra deve essere riportato il tasto di logout<\/em><\/p>\n\n\n\n<p>Evito di scrivere qui tutta la risposta:<strong> ho incluso il risultato in un progetto Github\u00a0<\/strong><a href=\"https:\/\/github.com\/matteobaccan\/VUEdashboard.\">https:\/\/github.com\/matteobaccan\/VUEdashboard<\/a>.<\/p>\n\n\n\n<p>Quanto ottenuto \u00e8 primordiale, ma permette di partire avendo qualche idea in testa per i junior e permette di velocizzare il lavoro per i senior.\u00a0Nel mio caso ho preso quanto prodotto, creato un primo progetto VUE 3, adattato il codice e creato per un paio di problemi di nomenclatura ed ho pronto un esempio minimale col minimo dello sforzo.\u00a0<\/p>\n\n\n\n<p><strong>Questo \u00e8 un punto di partenza<\/strong>: ma quante volte ci siamo bloccato su questo punto? Quante volte abbiamo perso tempo a cercare di capire come fare partire un progetto? Quante volte abbiamo perso tempo a cercare di capire come fare partire una funzionalit\u00e0? I modelli LLM dovrebbero accellerare questa fase e permetterci di concentrarci su quello che ci serve veramente.\u00a0<\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-8eaf635b gb-headline-text\">La scrittura dei prompt&nbsp;<\/h2>\n\n\n\n<p>Si parla spesso di come scrivere i prompt per ottenere il risultato migliore, <strong>ma non sempre si capisce cosa significhi.<\/strong> Scrivere un prompt significa dare delle indicazioni chiare e precise su cosa ci aspettiamo dal modello e cosa vogliamo ottenere.\u00a0<\/p>\n\n\n\n<p>La prime e pi\u00f9 <strong>banali <\/strong>indicazioni che vengono date in questo senso sono:\u00a0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sii chiaro e conciso&nbsp;<\/li>\n\n\n\n<li>Sii specifico&nbsp;<\/li>\n\n\n\n<li>Includi il contesto e i dettagli necessari&nbsp;<\/li>\n\n\n\n<li>Definisci input e output<\/li>\n<\/ul>\n\n\n\n<p>Se ribaltiamo queste indicazioni nell&#8217;ambito della programmazione, si capisce ben presto che non \u00e8 cos\u00ec semplice come sembra.\u00a0<strong> Non \u00e8 semplice perch\u00e9 definire un prodotto software in modo chiaro, coinciso e specifico<\/strong> non \u00e8 semplice e richiede una certa esperienza e conoscenza delle best practice. Oltre a questo, <strong>pi\u00f9 il progetto software \u00e8 articolato e pi\u00f9 capiamo che non \u00e8 possibile definirlo in questo modo.\u00a0<\/strong><\/p>\n\n\n\n<p>Quante volte vi siete trovato di fronte a delle specifiche che sono variate nel tempo, che non erano chiare, che non erano specifiche e che non includevano il contesto e i dettagli necessari? Quante volte vi siete trovati a dover scrivere del codice senza sapere esattamente cosa si aspettava il cliente?&nbsp;<\/p>\n\n\n\n<p>In questo ambito <strong>poter chiedere a un LLM un risultato che sia quanto voluto dal cliente diventa una operazione impossibile.\u00a0<\/strong><\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-04b08928 gb-headline-text\">Quali prompt scrivere?&nbsp;<\/h2>\n\n\n\n<p>Abbiamo capito che un prompt gigante diventa un obiettivo impossibile da raggiungere,<strong> ma un prompt troppo piccolo non ci permette di ottenere il risultato che vogliamo<\/strong>. Quindi cosa fare?<\/p>\n\n\n\n<p>La soluzione \u00e8 quella di scrivere<strong> prompt che siano il pi\u00f9 possibile specifici e che includano il contesto e i dettagli necessari<\/strong>, ma che siano anche il pi\u00f9 possibile chiari e concisi.\u00a0Un esempio di prompt che potremmo scrivere per ottenere il risultato che vogliamo \u00e8:<\/p>\n\n\n\n<p><em>Scrivi una funzione C# per trovare il fattoriale di un numero dato.\u00a0<\/em><\/p>\n\n\n\n<p>In questo caso abbiamo<strong> specificato il linguaggio di programmazione<\/strong>, abbiamo specificato la funzionalit\u00e0 richiesta e abbiamo incluso il contesto e i dettagli necessari. Questo ci permette di ottenere il risultato che vogliamo in modo pi\u00f9 efficace e preciso.\u00a0<\/p>\n\n\n\n<p>Oltre a questi ricordiamoci che<strong> i modelli fanno tesoro di quanto appreso<\/strong>. Per questo motivo entrare in un contesto sicuramente affrontato da altri programmatori aumenta la probabilit\u00e0 di ottenere un risultato migliore.\u00a0<\/p>\n\n\n\n<p>Diversamente,<strong> pi\u00f9 il contesto \u00e8 specifico e pi\u00f9 \u00e8 probabile che il modello non sia in grado di dare una risposta corretta<\/strong>, pur avendo a disposizione tutti i dati necessari e una descrizione chiara e concisa.\u00a0<\/p>\n\n\n\n<p>In questo caso, pi\u00f9 che un LLM alimentato a prompt \u00e8 preferibile usare un <strong>Copilot<\/strong>, che \u00e8 in grado di analizzare il codice e di darci una risposta pi\u00f9 inerente al nostro contesto e alle nostre necessit\u00e0.\u00a0<\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-9fd93197 gb-headline-text\">Quanto \u00e8 fastidioso commentare il codice&nbsp;<\/h2>\n\n\n\n<p>Alzi la mano chi non ha scritto una o pi\u00f9 volte del codice senza inserire una riga di commento. Alzi la mano chi ha dovuto commentare del codice scritto da altri. Alzi la mano chi ha dovuto commentare del codice scritto da altri e non ha capito cosa facesse.&nbsp;<\/p>\n\n\n\n<p>Anche in questo caso un LLM<strong> pu\u00f2 aiutarci a commentare il codice<\/strong>, partendo da un prompt generico come:<\/p>\n\n\n\n<p><em>Aggiungi dei commenti al seguente codice<\/em>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">private <span class=\"hljs-built_in\">String<\/span> readFile(<span class=\"hljs-built_in\">String<\/span> fileName){  \n BufferedReader br;  \n <span class=\"hljs-keyword\">try<\/span> {  \n br = <span class=\"hljs-keyword\">new<\/span> BufferedReader(<span class=\"hljs-keyword\">new<\/span> FileReader(fileName));  \n final StringBuilder sb = <span class=\"hljs-keyword\">new<\/span> StringBuilder();  \n <span class=\"hljs-built_in\">String<\/span> line = br.readLine();  \n  \n <span class=\"hljs-keyword\">while<\/span> (line != <span class=\"hljs-literal\">null<\/span>) {  \n sb.append(line);  \n sb.append(System.lineSeparator());  \n line = br.readLine();  \n }  \n br.close();  \n <span class=\"hljs-keyword\">return<\/span> sb.toString();  \n } <span class=\"hljs-keyword\">catch<\/span> (IOException e) {  \n e.printStackTrace();  \n } \n <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"\"<\/span>;  \n}  <\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Come risultato avremo:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-comment\">\/** \n * Legge il contenuto di un file e lo restituisce come stringa. \n * <span class=\"hljs-doctag\">@param <\/span>fileName Il nome del file da leggere \n * <span class=\"hljs-doctag\">@return <\/span>Il contenuto del file come stringa, o una stringa vuota in caso di errore \n *\/<\/span> \nprivate <span class=\"hljs-built_in\">String<\/span> readFile(<span class=\"hljs-built_in\">String<\/span> fileName) { \n BufferedReader br; \n <span class=\"hljs-keyword\">try<\/span> { \n <span class=\"hljs-comment\">\/\/ Inizializza un BufferedReader per leggere il file <\/span>\n br = <span class=\"hljs-keyword\">new<\/span> BufferedReader(<span class=\"hljs-keyword\">new<\/span> FileReader(fileName)); \n  \n <span class=\"hljs-comment\">\/\/ Crea un StringBuilder per costruire il contenuto del file <\/span>\n final StringBuilder sb = <span class=\"hljs-keyword\">new<\/span> StringBuilder(); \n  \n <span class=\"hljs-comment\">\/\/ Legge la prima linea del file <\/span>\n <span class=\"hljs-built_in\">String<\/span> line = br.readLine(); \n  \n <span class=\"hljs-comment\">\/\/ Continua a leggere finch\u00e9 ci sono linee nel file <\/span>\n <span class=\"hljs-keyword\">while<\/span> (line != <span class=\"hljs-literal\">null<\/span>) { \n <span class=\"hljs-comment\">\/\/ Aggiunge la linea corrente al StringBuilder <\/span>\n sb.append(line); \n  \n <span class=\"hljs-comment\">\/\/ Aggiunge un separatore di linea del sistema <\/span>\n sb.append(System.lineSeparator()); \n  \n <span class=\"hljs-comment\">\/\/ Legge la prossima linea <\/span>\n line = br.readLine(); \n } \n  \n <span class=\"hljs-comment\">\/\/ Chiude il BufferedReader <\/span>\n br.close(); \n  \n <span class=\"hljs-comment\">\/\/ Restituisce il contenuto del file come stringa <\/span>\n <span class=\"hljs-keyword\">return<\/span> sb.toString(); \n } <span class=\"hljs-keyword\">catch<\/span> (IOException e) { \n <span class=\"hljs-comment\">\/\/ Gestisce eventuali errori di I\/O <\/span>\n e.printStackTrace(); \n } \n  \n <span class=\"hljs-comment\">\/\/ Restituisce una stringa vuota in caso di errore <\/span>\n <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"\"<\/span>; \n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In questo modo il codice ne risulta <strong>commentato e decisamente pi\u00f9 chiaro e comprensibile. <\/strong>L&#8217;esempio che ho preso \u00e8 molto semplice, ma il concetto di fondo \u00e8: avete un software che non conoscete e che dovete commentare?<strong> Chiedete a un LLM di farlo per voi e questo potrebbe trasformare la vostra codebase da un inferno a un paradiso.\u00a0<\/strong><\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-1645107b gb-headline-text\">Codereview sulle Pull Request&nbsp;<\/h2>\n\n\n\n<p>Allo stesso modo: <strong>immaginate di dover gestire le PR di un repository e volete velocizzare il lavoro. <\/strong>Su GitHub esistono una serie di action che possiamo creare per fare delle code review automatiche. Una di queste, ma ce ne sono molte altre simili, \u00e8\u00a0<a href=\"https:\/\/github.com\/magnificode-ltd\/chatgpt-code-reviewer\">https:\/\/github.com\/magnificode-ltd\/chatgpt-code-reviewer<\/a>.<\/p>\n\n\n\n<p>Questo action permette di fare una code review automatica delle PR, <strong>in modo ad indicare in modo pi\u00f9 preciso cosa contiene e come migliorare la singola PR.\u00a0<\/strong>Si tratta di un esempio, ma la cosa interessante <strong>\u00e8 che possiamo studiare delle nostre action<\/strong>, da attivarsi alle PR, che possono aiutarci a velocizzare il lavoro e a migliorare la qualit\u00e0 del codice.\u00a0<\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-8a4e357b gb-headline-text\">Analisi&nbsp;<\/h2>\n\n\n\n<p>Analizzare un progetto \u00e8 sempre un&#8217;operazione complessa e che richiede tempo e attenzione. Un tempo approcciavo questa fase con lo studio dei documenti di progetto e delle grandi ricerche su internet, nella speranza di trovare qualcosa che mi aiutasse a capire meglio il progetto.&nbsp;<\/p>\n\n\n\n<p>Queste ricerche mi portavano molte idee, anche se erano abbastanza dispersive: per quanto tu possa essere bravo a cercare, <strong>\u00e8 molto facile che ti perda in un mare di informazioni e che non riesca a trovare quello che cerchi.\u00a0<\/strong><\/p>\n\n\n\n<p>Ultimamente ho cambiato approccio: dopo una prima fase nella quale provo a inquadrare il progetto, <strong>inizio a farmi una chiacchierata vocale con ChatGTP.\u00a0<\/strong><\/p>\n\n\n\n<p>Chiacchierare con un LLM ha alcuni <strong>vantaggi<\/strong>:\u00a0<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u00e8 molto pi\u00f9 veloce rispetto alla ricerca su internet<\/strong>: gli argomenti sono molto focalizzati ed \u00e8 possibile ottenere delle risposte molto precise\u00a0<\/li>\n\n\n\n<li><strong>\u00e8 possibile fare brainstorming con il modello<\/strong>: la ricerca su libri o siti web, oltre ad essere dispendiosa, non riesce sempre a farti fare dei collegamenti orizzontali tra le informazioni: spesso occorre aprire un nuovo tab e partire con una nuova ricerca\u00a0<\/li>\n\n\n\n<li><strong>funziona anche in auto<\/strong>: a volte passo ore in macchina verso un cliente e parlare con un assistente virtuale, anche se non \u00e8 perfetto, \u00e8 molto meglio che stare in silenzio\u00a0<\/li>\n\n\n\n<li><strong>informazioni continue<\/strong>: mi porta informazioni continue che, anche se non posso immediatamente utilizzare, mi permettono di avere un discreto numero di nuove idee\u00a0<\/li>\n\n\n\n<li><strong>parlato vs lettura<\/strong>: ultimo, ma non meno importante, il parlato ad alta voce \u00e8 pi\u00f9 facile da memorizzare rispetto alla semplice lettura<\/li>\n<\/ul>\n\n\n\n<p>Da altri punti di vista, chi mi vede fermo al semaforo con la macchina che parla da sola, potrebbe pensare che sono pazzo, ma nella mia testa mi sento come Michael Knight che parla con KITT.&nbsp;<\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-b2e63e79 gb-headline-text\">Traduzioni&nbsp;<\/h2>\n\n\n\n<p>Una degli aspetti pi\u00f9 fastidiosi che possono capitare a un programmatore \u00e8 quello di <em>&#8220;tradurre&#8221; <\/em>la <strong>documentazione del progetto in un&#8217;altra lingua<\/strong>. Questo \u00e8 un lavoro noioso e che richiede tempo e attenzione, ma che<strong> \u00e8 necessario per far capire il progetto a chi non parla la nostra lingua.<\/strong>\u00a0<\/p>\n\n\n\n<p>Da qualche anno ho iniziato a seguire produrre tutto il materiale che mi serve in formato <strong>markdown<\/strong>.\u00a0Il markdown \u00e8 un <strong>formato di scrittura leggero <\/strong>che permette di scrivere documenti in modo <strong>semplice e veloce<\/strong>, senza dover preoccuparsi troppo della formattazione.\u00a0<\/p>\n\n\n\n<p>Questo mi permette di scrivere la documentazione <strong>in modo pi\u00f9 veloce<\/strong> e dalla documentazione estrarre velocemente delle slide con prodotti tipo Marp.\u00a0Oltre a questo<strong> \u00e8 molto semplice avere il diff fra versioni di documentazione<\/strong> e capire cosa \u00e8 variato da un momento all&#8217;altro.\u00a0<\/p>\n\n\n\n<p>Di conseguenza mi sono trovato, mesi fa,<strong> nella situazione di tradurre la documentazione di un progetto in inglese.<\/strong>\u00a0Fare una cosa del genere in modo <strong>manuale <\/strong>a colpi di copia e incolla da un file a un LLM e viceversa <strong>\u00e8 un lavoro noioso e che richiede tempo e attenzione.\u00a0<\/strong><\/p>\n\n\n\n<p>Stavo quasi per scrivermi un programma da solo,<strong> quando ho scoperto che esistono delle estensioni per GitHub in grado di automatizzare la traduzione <\/strong>della documentazione tramite semplici Action.\u00a0Sto parlando di GTP-Translate, <a href=\"https:\/\/github.com\/3ru\/gpt-translate\">https:\/\/github.com\/3ru\/gpt-translate<\/a>.<\/p>\n\n\n\n<p>Sono sicuro esistano altre estensioni di questo genere,<strong> ma questa si integrava perfettamente nel ciclo di vita dei progetti che gestisco<\/strong> e mi ha permesso di velocizzare il lavoro di traduzione della documentazione.\u00a0<\/p>\n\n\n\n<p>Tramite una semplice issue \u00e8 possibile attivare <strong>l&#8217;action di GTP translate <\/strong>e indicare quale documento markdown tradurre e in quale lingua. In risposta, viene prodotta una PR, col documento tradotto, che deve essere semplicemente approvata.\u00a0<\/p>\n\n\n\n<h2 class=\"gb-headline gb-headline-972d68a7 gb-headline-text\">Conclusioni&nbsp;<\/h2>\n\n\n\n<p>Quando si approccia un LLM <strong>\u00e8 importante capire che non si tratta di una bacchetta magica<\/strong> che risolve tutti i problemi, ma di uno strumento che <strong>pu\u00f2 aiutarci a velocizzare il lavoro e a migliorare la qualit\u00e0 del codice.\u00a0<\/strong>Scrivere un prompt e sperare che, per magia, quello che abbiamo nella nostra testa sia magicamente convertito in codice esattamente come serve a noi, \u00e8 qualcosa di <strong>impensabile<\/strong>.<\/p>\n\n\n\n<p>Allo stesso modo pensare che esista <strong>un solo strumento di AI che risolve tutti i nostri problemi, ad ora, \u00e8 qualcosa di sbagliato.\u00a0<\/strong><\/p>\n\n\n\n<p>Il modo migliore col quale in programmatore dovrebbe approcciare un LLM \u00e8 quello di capire <strong>quali sono i limiti dello strumento e quali sono i contesti in cui pu\u00f2 essere utilizzato<\/strong> <strong>con successo<\/strong> e iniziare a catalogare mentalmente questi ambiti in modo che per ognuno di essi esista una tecnica o uno strumento che possa essere utilizzato con successo.\u00a0<\/p>\n\n\n\n<p>Allo stesso modo \u00e8 impensabile poter riunire in un solo prompt un progetto:<strong> \u00e8 molto pi\u00f9 efficace dividere il progetto in parti e chiedere al modello di lavorare su queste parti<\/strong>, in modo da ottenere un risultato migliore e pi\u00f9 preciso.\u00a0<\/p>\n\n\n\n<p>Anche nei contesti nei quali un modello non \u00e8 in grado di generare del codice, <strong>\u00e8 molto probabile sia in grado di documentarlo, di commentarlo, di tradurlo<\/strong> e di fare molte altre operazioni che possono velocizzare il nostro lavoro.\u00a0<\/p>\n\n\n\n<p>Non siamo ancora in un momento storico in cui questi tool sono in grado di fare tutto in modo automatico, <strong>ma un programmatore che sa come utilizzarli pu\u00f2 ottenere dei risultati molto buoni<\/strong> e <strong>migliorare la qualit\u00e0 del suo lavoro.\u00a0<\/strong><\/p>\n\n\n\n<p>Migliorare la propria qualit\u00e0 vuol dire essere sempre <strong>pi\u00f9 efficaci<\/strong> e toglierci dalla testa il cappello da junior per metterci quello pi\u00f9 pesante e sgualcito di un programmatore senior.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cosa sia l&#8217;AI e cosa sia ChatGPT lo sappiamo tutti. Ognuno di noi ha scritto valanghe di prompt per ottenere risposte da ChatGPT, con risultati pi\u00f9 o meno soddisfacenti.\u00a0 Per capire al meglio come ChatGPT possa aiutarci a diventare programmatori senior, dobbiamo prima comprendere cosa sia l&#8217;ingegneria dei prompt e perch\u00e9 sia cos\u00ec importante e&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-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":[10261,10277],"tags":[10436,10486,10446],"collections":[],"class_list":{"0":"post-30638","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-intelligenza-artificiale","8":"category-machine-learning-it","9":"tag-carriere-tech","10":"tag-dev-senior","11":"tag-github-it","12":"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>Da programmatori junior a senior con ChatGPT<\/title>\n<meta name=\"description\" content=\"Come fare il salto da programmatore junior a senior grazie a strumenti come ChatGPT, Github copilot e altri 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\/it\/intelligenza-artificiale\/da-programmatori-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=\"Da programmatori junior a senior con ChatGPT\" \/>\n<meta property=\"og:description\" content=\"Come fare il salto da programmatore junior a senior grazie a strumenti come ChatGPT, Github copilot e altri LLM.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-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-18T12:04:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-18T12:04:29+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=\"19 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/\"},\"author\":{\"name\":\"Matteo Baccan\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/58743a83113a6ac22788ab19bea03ad1\"},\"headline\":\"Da programmatori junior a senior con ChatGPT\",\"datePublished\":\"2024-11-18T12:04:28+00:00\",\"dateModified\":\"2024-11-18T12:04:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/\"},\"wordCount\":4125,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-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\",\"keywords\":[\"carriere tech\",\"dev senior\",\"GitHub\"],\"articleSection\":[\"Intelligenza artificiale\",\"Machine learning\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/\",\"name\":\"Da programmatori junior a senior con ChatGPT\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-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-18T12:04:28+00:00\",\"dateModified\":\"2024-11-18T12:04:29+00:00\",\"description\":\"Come fare il salto da programmatore junior a senior grazie a strumenti come ChatGPT, Github copilot e altri LLM.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-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\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Intelligenza artificiale\",\"item\":\"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Da programmatori 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":"Da programmatori junior a senior con ChatGPT","description":"Come fare il salto da programmatore junior a senior grazie a strumenti come ChatGPT, Github copilot e altri 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\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/","og_locale":"en_US","og_type":"article","og_title":"Da programmatori junior a senior con ChatGPT","og_description":"Come fare il salto da programmatore junior a senior grazie a strumenti come ChatGPT, Github copilot e altri LLM.","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2024-11-18T12:04:28+00:00","article_modified_time":"2024-11-18T12:04:29+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":"19 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/"},"author":{"name":"Matteo Baccan","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/58743a83113a6ac22788ab19bea03ad1"},"headline":"Da programmatori junior a senior con ChatGPT","datePublished":"2024-11-18T12:04:28+00:00","dateModified":"2024-11-18T12:04:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/"},"wordCount":4125,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-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","keywords":["carriere tech","dev senior","GitHub"],"articleSection":["Intelligenza artificiale","Machine learning"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/","name":"Da programmatori junior a senior con ChatGPT","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-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-18T12:04:28+00:00","dateModified":"2024-11-18T12:04:29+00:00","description":"Come fare il salto da programmatore junior a senior grazie a strumenti come ChatGPT, Github copilot e altri LLM.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/da-programmatori-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\/it\/intelligenza-artificiale\/da-programmatori-junior-a-senior-con-chatgpt\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Intelligenza artificiale","item":"https:\/\/www.codemotion.com\/magazine\/it\/intelligenza-artificiale\/"},{"@type":"ListItem","position":3,"name":"Da programmatori 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":"Cosa sia l&#8217;AI e cosa sia ChatGPT lo sappiamo tutti. Ognuno di noi ha scritto valanghe di prompt per ottenere risposte da ChatGPT, con risultati pi\u00f9 o meno soddisfacenti.\u00a0 Per capire al meglio come ChatGPT possa aiutarci a diventare programmatori senior, dobbiamo prima comprendere cosa sia l&#8217;ingegneria dei prompt e perch\u00e9 sia cos\u00ec importante e&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/30638","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=30638"}],"version-history":[{"count":1,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/30638\/revisions"}],"predecessor-version":[{"id":30648,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/30638\/revisions\/30648"}],"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=30638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=30638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=30638"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=30638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}