Pattern di Prompt Engineering per lo Sviluppo Software
Non tutti i prompt producono buon codice. Questi pattern collaudati ti aiuteranno a ottenere risultati migliori dagli assistenti AI ogni volta che apri una chat.
Il prompt engineering è diventata una delle competenze più preziose nello sviluppo software moderno. La differenza tra un prompt che produce codice funzionante e manutenibile e uno che genera un pasticcio rotto è spesso sottile — poche parole di contesto, un vincolo dichiarato all'inizio o un esempio che inquadra correttamente il problema. Questo articolo raccoglie i pattern che producono costantemente buoni risultati, organizzati per il tipo di attività che stai risolvendo.
Questi pattern non sono teorici. Sono distillati da migliaia di interazioni reali con assistenti AI di coding su codebase di produzione. Ogni pattern include un esempio concreto e una spiegazione del perché funziona, così puoi adattarlo ai tuoi strumenti e flussi di lavoro.
Pattern 1: Il Context Sandwich
L'errore più comune che gli sviluppatori commettono quando usano prompt per l'AI è fornire troppo poco contesto. Chiedono una funzione senza descrivere il sistema circostante, i vincoli o le convenzioni che si aspettano. L'AI fa quindi supposizioni ragionevoli ma sbagliate per il loro specifico codebase, e il risultato necessita di pesanti modifiche.
Il Context Sandwich risolve a questo strutturando ogni prompt in tre strati: cosa stai costruendo, quali vincoli si applicano e che aspetto ha il successo.
- Strato superiore — L'obiettivo: Descrivi cosa vuoi in una frase chiara. Questa è l'unica parte che la maggior parte degli sviluppatori include.
- Strato intermedio — I vincoli: Elenca i non negoziabili. Versioni delle librerie, convenzioni di stile, requisiti di performance, casi limite che devono essere gestiti.
- Strato inferiore — La verifica: Descrivi come saprai che il risultato è corretto. Un caso di test, un formato di output atteso o un comportamento specifico da confermare.
// Prompt debole
const result = await ai.generate("Write a function that sorts an array of users by name");
// Prompt Context Sandwich
const result = await ai.generate([
"Create a compare function for sorting an array of user objects by lastName, then firstName.",
"Constraints: case-insensitive, handles missing names, TypeScript, no external libraries.",
"Verify: users.sort(compare).map(u => u.lastName) should return ['Adams', 'adams', 'Brown'].",
].join("\n\n"));Il Context Sandwich funziona perché riduce l'ambiguità a ogni livello. L'AI sa cosa vuoi, cosa non accetterai e come valuterai il risultato. Questo singolo pattern elimina la maggior parte dei vai-e-vieni che fanno perdere tempo nello sviluppo assistito dall'AI.
Pattern 2: Il Vincolo Negativo
I modelli AI sono generalmente bravi a capire cosa vuoi. Faticano di più a capire cosa non vuoi. Un prompt come scrivi un modulo di login produrrà qualcosa di ragionevole, ma potrebbe includere regole di complessità delle password che il tuo design non usa o una casella ricordami che il tuo product manager ha rimosso l'ultimo sprint.
Il pattern del Vincolo Negativo dichiara esplicitamente ciò che l'AI dovrebbe evitare. È più efficace che sperare che il modello indovini correttamente le tue esclusioni.
// Senza vincoli negativi
"Build a user settings page with tabs for profile, security, and notifications."
// Con vincoli negativi
"Build a user settings page with tabs for profile, security, and notifications.
DO NOT include: email verification flows, password strength meters, or social login buttons."I vincoli negativi funzionano meglio quando sono posti alla fine del prompt, dopo la descrizione positiva. Questo rispecchia il modo in cui gli umani elaborano le istruzioni — abbiamo bisogno di capire cosa viene chiesto prima di poter capire cosa è escluso. L'AI segue lo stesso pattern: costruisce il modello mentale dalla descrizione positiva, poi applica le esclusioni come filtri sovrapposti.
Pattern 3: Il Template di Esempio
Quando hai bisogno di output consistenti attraverso più interazioni AI — generare documentazione, scrivere casi di test o formattare risposte API — dire all'AI cosa fare è meno efficace che mostrarglielo. Il pattern del Template di Esempio fornisce uno o due esempi completi dell'output desiderato e poi chiede altro nello stesso formato.
Questo è la cosa più vicina al few-shot learning disponibile attraverso interfacce chat. Un esempio ben scelto comunica formato, tono, livello di dettaglio e convenzioni implicite che richiederebbero paragrafi per essere descritte esplicitamente.
// Template di Esempio per generare messaggi di errore
const example = {
code: "ERR_AUTH_TOKEN_EXPIRED",
message: "Your session has expired. Please log in again.",
severity: "warning",
action: "redirect:/login",
};
const result = await ai.generate([
"Generate 5 more error objects in the same format as this example:",
JSON.stringify(example, null, 2),
"Cover: rate limiting, permission denied, not found, validation error, server error.",
].join("\n\n"));La chiave di questo pattern è scegliere l'esempio giusto. Dovrebbe essere rappresentativo ma non ricco di casi limite — vuoi che l'AI generalizzi dal tuo esempio, non che replichi le sue stranezze. Due esempi sono meglio di uno quando il formato di output ha molteplici variazioni, ma più di tre esempi raramente aggiungono valore e iniziano a consumare la tua finestra di contesto.
Pattern 4: Il Ciclo di Refinement Iterativo
Chiedere a un AI un risultato finale e perfetto in un solo prompt è come chiedere a uno sviluppatore junior di distribuire codice di produzione senza alcuna iterazione. A volte funziona, ma di solito produce qualcosa che necessita di sostanziali rilavorazioni. Il Ciclo di Refinement Iterativo tratta l'interazione con l'AI come una conversazione, partendo in largo e restringendo.
- Round 1 — Genera una soluzione ampia o uno scheletro. Non chiedere ancora dettagli.
- Round 2 — Rivedi l'output e dai indicazioni specifiche. Questa parte è buona, cambia quella parte, aggiungi questo caso.
- Round 3 — Rifinisci i dettagli. Gestione errori, casi limite, naming, documentazione.
Ogni round dà all'AI più contesto su cosa vuoi realmente, perché il tuo feedback è specifico per il codice che ha appena prodotto. Questo è molto più efficiente che cercare di anticipare ogni dettaglio nel primo prompt. L'AI ne trae anche beneficio perché può concentrarsi su un livello del problema alla volta — prima la struttura, poi i dettagli, poi la rifinitura.
Pattern 5: Il Prefisso di Ruolo
I modelli AI sono addestrati su testo proveniente da molti domini e possono adottare diverse personalità quando vengono sollecitati. Il pattern del Prefisso di Ruolo assegna esplicitamente un ruolo e una prospettiva all'AI prima di chiedere codice, preparandola a produrre output appropriato a quel contesto.
// Generico
"Review this function for security issues."
// Con prefisso di ruolo
"You are a security engineer reviewing a pull request. Focus on:
- Injection vulnerabilities in the SQL query construction
- Missing input validation on the user ID parameter
- Hardcoded credentials or secrets
Review this function:"Il pattern del Prefisso di Ruolo è particolarmente potente per attività di revisione, refactoring e generazione di documentazione. Quando hai bisogno di codice che segua gli standard di accessibilità, prefissa con Sei uno specialista di accessibilità. Quando stai ottimizzando per le performance, prefissa con Sei un ingegnere delle performance. L'AI adatta il suo ragionamento e output per corrispondere alla prospettiva che richiedi.
Pattern 6: Il Contratto di Output
Una delle esperienze più frustranti con il coding AI è ottenere una risposta che sembra corretta ma cambia sottilmente il formato di output, aggiunge testo esplicativo che non hai chiesto o omette parti critiche. Il pattern del Contratto di Output previene questo specificando esattamente cosa dovrebbe contenere la risposta e, altrettanto importante, cosa non dovrebbe contenere.
"Generate a React component for a file upload button.
Output contract:
- Return ONLY the component code in a single code block
- No explanation text before or after
- Include TypeScript props interface
- Include CSS module import
- Do NOT include usage examples or test files
- File name: FileUpload.tsx"Il Contratto di Output è particolarmente prezioso quando stai convogliando l'output dell'AI in un altro strumento o flusso di lavoro. Se la risposta segue sempre la stessa struttura, puoi analizzarla in modo affidabile. Questo pattern è il fondamento per costruire pipeline automatizzate assistite dall'AI che richiedono una formattazione consistente.
Pattern 7: Il Budget della Finestra di Contesto
Ogni modello AI ha una finestra di contesto limitata. Quando incolli troppo codice, documentazione o cronologia della conversazione, il modello inizia a dimenticare o ad allucinare. Il pattern del Budget della Finestra di Contesto tratta la finestra di contesto come una risorsa scarsa e la alloca deliberatamente.
- Alloca il 60 % del tuo budget al codice più rilevante e alla descrizione dell'attività.
- Alloca il 20 % a esempi e vincoli che chiariscono l'attività.
- Riserva il 20 % per lo spazio di risposta dell'AI — se la finestra è piena, l'output verrà troncato.
Quando hai più contesto di quanto la finestra possa contenere, dai priorità alle parti più specifiche e rilevanti. Un prompt focalizzato con un file accuratamente scelto è più efficace di un prompt ampio con cinque file solo vagamente correlati. L'AI può sempre chiedere più contesto se ne ha bisogno — dagli il permesso di farlo all'inizio della conversazione.
Un prompt focalizzato con un file accuratamente scelto supera costantemente un prompt sparso con cinque file che l'AI riesce a malapena a vedere.
Pattern 8: La Sequenza Scaffold-Poi-Dettaglio
Le funzionalità complesse hanno molte parti mobili. Chiedere a un'AI di generarli tutte in una volta produce un risultato aggrovigliato in cui la gestione dello stato, le chiamate API e il rendering dell'interfaccia sono difficili da separare. La sequenza Scaffold-Poi-Dettaglio suddivide il problema in due fasi.
Prima, chiedi all'AI di generare uno scaffold: le definizioni dei tipi, le interfacce e la struttura ad alto livello della funzionalità senza dettagli implementativi. Rivedi questo scaffold e conferma che corrisponda al tuo modello mentale. Solo allora chiedi all'AI di riempire i dettagli — implementazione, gestione errori, casi limite — un livello alla volta.
// Fase 1 — Scaffold
"Design the type structure for a multi-step checkout flow. List the interfaces, enums, and state machine transitions. Do not write implementation yet."
// Fase 2 — Dettaglio (dopo aver revisionato lo scaffold)
"Implement the checkout state machine from the types we agreed on. Include transition validation and error states."Questo pattern previene il tipo più costoso di rilavorazione: cambiare la struttura dopo che l'implementazione è stata completata. Concordando prima lo scaffold, ti assicuri che l'AI costruisca su fondamenta che corrispondono alla tua architettura, non a una immaginata.
Mettere insieme i pattern
Questi otto pattern funzionano meglio quando combinati. Una sessione tipica potrebbe iniziare con il Context Sandwich per inquadrare la richiesta, usare i Vincoli Negativi per escludere approcci indesiderati, seguire il Ciclo di Refinement Iterativo per convergere sulla soluzione giusta e chiudere con un Contratto di Output per ottenere un risultato pulito e analizzabile.
Più pratichi questi pattern, più diventano naturali. Entro pochi giorni, ti ritroverai a strutturare istintivamente i prompt come Context Sandwich e ad aggiungere Vincoli Negativi senza pensarci. È allora che lo sviluppo assistito dall'AI passa da uno strumento a volte utile a una parte costantemente affidabile del tuo flusso di lavoro.
Ogni interazione con un assistente AI è un investimento. Un prompt ben strutturato impiega trenta secondi extra da scrivere ma fa risparmiare ore di vai-e-vieni. In cento interazioni, quei trenta secondi si accumulano in giorni di tempo risparmiato — e la differenza tra frustrazione e flusso.
