Dieci righe oggi, dieci mesi domani
Una funzione per applicare sconti può sembrare perfetta con il primo ordine, ma fallire quando riceve una virgola, uno sconto negativo o importi con centesimi. La brevità del codice non garantisce qualità.
Lo sviluppatore usa l’AI per tradurre esigenze in regole comprensibili e verificabili: prima specifica il contratto, poi chiede una soluzione semplice e soltanto dopo la integra nel progetto.
Devo realizzare una funzione per [scopo]. Prima di scrivere codice, fammi cinque domande su input, output, errori, casi limite e ambiente. Poi proponi una soluzione semplice e testabile. Non inventare requisiti.
I sei pilastri del codice pulito
Leggibilità, responsabilità chiara, prevedibilità, testabilità, manutenibilità e compatibilità con il contesto sono qualità diverse ma complementari.
Un nome espressivo riduce le ambiguità; una funzione con un solo compito è più facile da verificare; errori espliciti evitano risultati ingannevoli. Non introdurre astrazioni solo per sembrare sofisticato.
Valuta questa funzione secondo sei criteri: leggibilità, responsabilità, prevedibilità, testabilità, manutenzione e compatibilità. Per ogni criterio indica un problema concreto, se esiste, e una modifica minima. Codice: [incolla].
Domanda 1 · Quale risultato serve davvero?
Parti dal risultato osservabile: non «crea una funzione per gestire le scorte», ma «se un articolo scende sotto la soglia, restituisci un avviso senza modificare il magazzino».
Un requisito espresso in termini di comportamento permette di costruire esempi di accettazione prima ancora di scegliere il linguaggio.
Aiutami a trasformare questa esigenza in tre comportamenti verificabili, senza scrivere ancora codice: [descrizione]. Distingui risultato atteso, condizioni e vincoli.
Domanda 2 · Quali input sono ammessi?
Indica tipi, formati, unità, valori opzionali e intervalli. Una stringa con spazi non è automaticamente un numero e una data non è sempre un istante con fuso orario.
Quando il formato non è definito, l’AI deve chiedere chiarimenti invece di adottare conversioni implicite.
Definisci il contratto degli input per [funzione]. Elenca tipi, formati, valori obbligatori, intervalli, normalizzazione e casi da rifiutare. Non presumere conversioni non autorizzate.
Domanda 3 · Quale output e quali errori?
Una funzione può restituire un valore, un oggetto strutturato oppure segnalare un errore: sono scelte progettuali che devono essere coerenti con il chiamante.
Meglio un errore esplicito che un valore plausibile ma sbagliato. Se il sistema usa eccezioni o codici di errore, il contratto deve dichiararlo.
Progetta input, output e gestione degli errori per [funzione]. Fornisci esempi di successo, input non valido e caso limite. Non mescolare calcolo, stampa HTML e salvataggio.
Domanda 4 · Casi limite e regole di dominio
Valori vuoti, duplicati, importi negativi, fusi orari, arrotondamenti e operazioni concorrenti non sono dettagli da aggiungere alla fine.
Per importi monetari, la scelta della precisione e del momento dell’arrotondamento dipende dalle regole contabili applicabili; non si può improvvisare.
Elenca almeno otto casi limite per questa funzione: [descrizione]. Separa regole certe da decisioni da concordare e proponi risultati attesi prima di scrivere test.
Domanda 5 · Versioni e dipendenze
Una funzione può essere corretta in Python 3.12 e incompatibile con una versione precedente. Lo stesso vale per PHP, browser, database, librerie e sistemi operativi.
Chiedi sempre l’ambiente reale e non aggiungere pacchetti esterni quando la libreria standard è sufficiente.
Scrivi una soluzione compatibile esclusivamente con [linguaggio, versione, sistema e librerie disponibili]. Evita sintassi e API successive. Indica ogni dipendenza e come verificare la compatibilità.
Il laboratorio del libro · Sconti con Decimal
Nel caso didattico del PDF, prezzo e percentuale vengono convertiti in Decimal, verificati come numeri finiti e controllati rispetto ai limiti ammessi. La funzione restituisce un valore, senza stampare o accedere al database.
Il calcolo usa un arrotondamento esplicito a due decimali. In un gestionale reale le regole di sconti, imposte e arrotondamenti devono essere definite e verificate in modo indipendente.
Agisci come sviluppatore Python senior. Scrivi una funzione prezzo_scontato(prezzo, sconto_percentuale) usando Decimal, rifiutando valori non finiti, prezzi negativi e sconti fuori 0–100. Chiarisci prima le regole di arrotondamento. Mantieni la funzione pura, aggiungi docstring e test, e non dichiarare di averli eseguiti.
Test: normali, estremi e di errore
Nel PDF, 100 euro con sconto 20% deve produrre 80,00; 19,99 senza sconto deve restare 19,99; 50 con sconto 100% deve diventare 0,00.
Servono anche prove con sconto negativo, input non numerico, valori non finiti e importi ai confini. I test generati dall’AI vanno realmente eseguiti e confrontati con risultati indipendenti.
Scrivi una tabella di test per [funzione] con input, output atteso e motivo del test. Includi almeno tre casi normali, tre limiti e tre errori. Distingui test proposti da test effettivamente eseguiti.
Una responsabilità per funzione
Se una sola funzione legge un database, calcola prezzi, compone HTML e invia email, ogni cambiamento rischia di alterare parti non correlate.
Separare la logica pura dagli effetti esterni rende più semplice testare, riutilizzare e capire il codice. Non significa creare un’architettura eccessiva per compiti semplici.
Analizza questa funzione: [codice]. Identifica le responsabilità mescolate e proponi un refactoring incrementale con interfaccia pubblica invariata. Prima suggerisci test di regressione.
Sicurezza, riservatezza e autorizzazioni
Non incollare password, chiavi API, token o dati personali in un prompt. Sostituiscili con valori fittizi e verifica sempre i controlli lato server.
Per upload, autenticazione e dati sensibili, la qualità del codice dipende anche dalla configurazione, dai permessi e dalle procedure operative.
Prima di generare codice per [funzione], elenca minacce realistiche, autorizzazioni, validazioni lato server e dati da non esporre. Proponi verifiche sicure con dati fittizi.
Manutenzione e compatibilità del codice legacy
Modernizzare non significa riscrivere tutto. Occorre conservare il comportamento osservabile, controllare le versioni delle dipendenze e introdurre cambiamenti piccoli e reversibili.
Un piano di rollback e test prima/dopo sono particolarmente importanti quando una funzione serve pagine già pubblicate.
Devo aggiornare una funzione legacy da [versione] a [versione]. Mantieni firma e comportamento. Individua incompatibilità, proponi una modifica minima, test di regressione e piano di ripristino.
La qualità è anche saper scegliere quanto basta
Una conversione semplice può stare in poche righe; un sistema con pagamenti, dati personali o autorizzazioni richiede controlli più rigorosi. Il codice pulito non coincide con il codice più lungo.
Prima di considerare pronta una funzione, verifica requisiti, risultati, test, compatibilità e rischi residui. Non chiamare «superato» un test mai eseguito.
Valuta se questa soluzione è proporzionata al problema: [codice e requisiti]. Indica complessità superflua, rischi non gestiti e controlli indispensabili prima della pubblicazione.
14 casi pratici · Dalle funzioni quotidiane ai servizi professionali
Ogni caso spiega il risultato desiderato, propone un prompt copiabile e indica verifiche concrete. I primi sette sono accessibili a chi comincia; gli altri sette affrontano progetti più complessi.
Ordinare una lista di nomi
Eliminare soltanto duplicati secondo una regola dichiarata, senza confondere omonimi.
Crea in Python una funzione che riceva nomi, elimini duplicati esatti ignorando maiuscole e spazi ai margini e restituisca un elenco ordinato senza modificare l’originale. Spiega accenti e omonimi; includi test.
Come verificare. Liste vuote, accenti, nomi simili e valori non testuali.
Dividere una spesa condivisa
Ripartire quote e anticipi senza perdere centesimi.
Progetta una funzione Python per dividere una spesa tra N persone, considerando anticipi. Prima chiedi come distribuire centesimi residui e quali regole di ripartizione usare. Includi test.
Come verificare. Somma delle quote identica al totale, anticipi e arrotondamenti.
Validare un modulo di iscrizione
Dare messaggi utili nel browser, mantenendo la validazione anche sul server.
Scrivi una funzione JavaScript per verificare nome ed email obbligatori con messaggi comprensibili. Spiega quali verifiche vanno ripetute lato server e aggiungi test.
Come verificare. Campi vuoti, spazi, email inattese e invii ripetuti.
Convertire temperature
Usare una funzione pura con input finiti e risultati verificabili.
Crea una funzione JavaScript pura Celsius→Fahrenheit che accetti numeri finiti e rifiuti valori invalidi. Spiega la formula e aggiungi test con risultati attesi.
Come verificare. 0 °C = 32 °F; 100 °C = 212 °F; input non numerici.
Raggruppare una lista della spesa
Unire quantità soltanto se le unità sono compatibili.
Scrivi una funzione Python che raggruppi prodotti con nome, quantità e unità. Non sommare unità incompatibili senza una conversione definita. Gestisci dati incompleti e aggiungi test.
Come verificare. Duplicati, unità differenti e quantità mancanti.
Filtrare appuntamenti per giorno
Distinguere data civile, orario e fuso orario.
Crea una funzione che filtri appuntamenti per data ISO YYYY-MM-DD. Se sono presenti orari e fusi, chiedimi prima la regola da applicare. Includi esempi e test.
Come verificare. Giorni vuoti, date invalide e più eventi nello stesso giorno.
Generare token dimostrativi
Usare secrets invece di random per valori imprevedibili.
Crea in Python una funzione che generi token dimostrativi con secrets, lunghezza configurabile e limiti ragionevoli. Spiega differenze rispetto a random e aggiungi test.
Come verificare. Lunghezza, tipo e parametri non validi; non è un sistema completo di autenticazione.
Endpoint REST con responsabilità separate
Separare validazione, logica, persistenza e autorizzazioni.
Progetta un endpoint REST di prenotazione per [stack]. Separa validazione, logica applicativa e accesso ai dati. Chiedi prima schema e requisiti mancanti; includi errori, permessi e test.
Come verificare. Richieste valide, malformate, duplicate e non autorizzate.
Modernizzare una funzione legacy
Conservare interfaccia pubblica e risultati osservabili.
Modernizza questa funzione per [linguaggio e versione] mantenendo firma e comportamento. Identifica dipendenze, modifica minima, regressioni e rollback. Codice: [incolla].
Come verificare. Input/output prima e dopo e ambiente reale.
Leggere un CSV molto grande
Elaborare a flusso senza accumulare tutto in memoria.
Scrivi una funzione Python che legga un CSV riga per riga, controlli le colonne e produca un riepilogo. Gestisci codifica, righe malformate e memoria; non scartare errori in silenzio.
Come verificare. File vuoti, intestazioni mancanti, righe danneggiate e file grandi.
Retry limitati per API
Evitare duplicazioni nelle operazioni non idempotenti.
Progetta una funzione HTTP con timeout, retry limitati e backoff. Distingui errori temporanei e permanenti, e spiega come prevenire operazioni duplicate.
Come verificare. Timeout, 4xx, 5xx e numero massimo di tentativi.
Upload server-side sicuro
Non fidarsi di nomi e tipi dichiarati dal client.
Progetta un upload server-side per [stack] con autorizzazioni, limiti di dimensione, verifica del tipo reale, nomi sicuri e percorso controllato. Fornisci test e limiti.
Come verificare. File troppo grandi, nomi malevoli, tipi inattesi e utenti non autorizzati.
Cache con isolamento per utente
Definire chiave, scadenza e invalidazione senza mescolare dati.
Proponi una funzione di cache per [stack]. Definisci chiavi, TTL, invalidazione, isolamento per utente e casi in cui evitarla. Includi test.
Come verificare. Scadenza, invalidazione, concorrenza e autorizzazioni.
Refactoring di una funzione monolitica
Separare logica pura, database, HTML, email e log.
Analizza questa funzione [codice] e proponi refactoring incrementale. Separa logica pura, effetti esterni e dipendenze, conserva i risultati osservabili e prepara test prima delle modifiche.
Come verificare. Regressioni, effetti collaterali e risultati invariati.
Il contratto di uno sviluppatore attento alla manutenzione
Il prompt finale del libro parte dai requisiti mancanti e impone una soluzione compatibile, semplice e verificabile. Non accetta API inventate né test dichiarati come eseguiti senza prova.
Agisci come uno sviluppatore software senior, attento a leggibilità, sicurezza e manutenzione. Devo realizzare questa funzione: [descrizione]. Ambiente: [linguaggio, versione, framework, sistema]. Prima di scrivere codice, individua fino a cinque requisiti essenziali mancanti e chiedimi chiarimenti. Poi definisci input, output, errori, vincoli e casi limite. Proponi la soluzione più semplice con nomi chiari, responsabilità separate, commenti utili e nessuna dipendenza superflua. Aggiungi esempi, test normali e di errore, considerazioni di sicurezza e istruzioni per verificare. Non inventare API o compatibilità e non dichiarare test eseguiti se non li hai realmente eseguiti.
🔎 Prima e dopo · Quattro esempi inediti
Quattro richieste trasformate in specifiche di sviluppo controllabili. Seleziona il caso e copia il prompt pronto.
Fammi una funzione che conta i costumi.
La funzione riceve una lista di capi con identificativo e stato. Restituisce quanti sono disponibili, senza modificare l’elenco; segnala stati sconosciuti e verifica lista vuota e identificativi duplicati.
Progetta in Python una funzione pura che conti i costumi disponibili da una lista di record. Prima chiarisci stati ammessi e politica sui duplicati. Non modificare l’input. Fornisci firma, docstring, test normali e di errore.
🛠️ Sviluppatore Lab · Crea il tuo prompt
Descrivi la funzione e il contesto. Il laboratorio compone un prompt strutturato da copiare in ChatGPT: non genera codice automaticamente, non invia dati e non richiede API.
🧠 Quiz finale · Capitolo 35
Tre domande. Dopo la correzione comparirà soltanto ✓ o ✗ accanto alla risposta selezionata.
1. Che cosa rende una funzione manutenibile?
2. Come vanno gestiti i requisiti mancanti?
3. Quando si può affermare che i test sono superati?
Rispondi alle tre domande per vedere il punteggio.
I progressi del quiz sono salvati su questo dispositivo.