laboratorio / percorso progressivo

Architettura del software

Dal codice che funziona al codice che si mantiene

Un laboratorio progressivo in 24 moduli per costruire un registro del laboratorio scolastico separando UI, casi d'uso, dominio e persistenza.

percorso del corso

Segui i moduli in ordine. Le lezioni vengono pubblicate dentro ogni modulo.

Apri prima lezione

Ore 0-20

Moduli 1-8

Checkpoint 20 ore Si avvia il registro, si fa emergere il disordine iniziale e si separano le prime responsabilita.
  1. 01
    2 ore 6/6 pubblicate

    Preparazione del laboratorio

    Preparare ambiente, repository e convenzioni minime.

    Output: Repository o cartella progetto, README iniziale, struttura minima.
  2. 02
    2 ore 6/6 pubblicate

    Partire da un programma fragile

    Far percepire il problema prima di introdurre architettura.

    Output: Piccolo registro funzionante ma fragile.
  3. 03
    2 ore 6/6 pubblicate

    Che cos'e l'architettura del software

    Capire responsabilita, confini e decisioni difficili da cambiare.

    Output: Mappa dei confini del sistema.
  4. 04
    3 ore 7/7 pubblicate

    Responsabilita, coesione e accoppiamento

    Riconoscere funzioni e file con troppe responsabilita.

    Output: Refactoring di funzioni troppo grandi.
  5. 05
    3 ore 7/7 pubblicate

    Requisiti, utenti e linguaggio del problema

    Tradurre il problema in parole condivise.

    Output: Glossario del dominio e lista requisiti.
  6. 06
  7. 07
  8. 08
    4 ore 9/9 pubblicate

    Primo taglio architetturale

    Separare Domain, Application, Infrastructure e Presentation.

    Output: Separazione base dei livelli e checkpoint 20 ore.

Ore 21-40

Moduli 9-16

Checkpoint 40 ore Si consolida il progetto con persistenza sostituibile, errori chiari, test, documentazione e diagramma minimo.
  1. 09
    4 ore 8/8 pubblicate

    Dipendenze, interfacce e inversione del controllo

    Cambiare archivio senza riscrivere i casi d'uso.

    Output: Interfaccia ArchivioStrumenti e implementazioni alternative.
  2. 10
    4 ore 9/9 pubblicate

    Infrastructure: file, localStorage, database e API

    Spostare il salvataggio fuori dalla logica.

    Output: Persistenza localStorage o JSON.
  3. 11
    4 ore 8/8 pubblicate

    Presentation: l'interfaccia come bordo del sistema

    Tenere la UI fuori dalle regole di dominio.

    Output: Interfaccia funzionante senza regole di dominio.
  4. 12
    3 ore 7/7 pubblicate

    Errori, validazione e messaggi

    Rendere gli errori comprensibili e separati dai dettagli tecnici.

    Output: Gestione errori piu chiara.
  5. 13
    4 ore 9/9 pubblicate

    Testare l'architettura

    Proteggere regole e casi d'uso.

    Output: Test su dominio, casi d'uso e archivi finti.
  6. 14
    3 ore 7/7 pubblicate

    Refactoring: migliorare senza ricominciare

    Cambiare struttura mantenendo il programma funzionante.

    Output: Refactoring controllato.
  7. 15
    3 ore 7/7 pubblicate

    Struttura del progetto, documentazione e diagrammi

    Rendere il progetto leggibile da fuori.

    Output: README completo, diagramma minimo, decisioni tecniche.
  8. 16
    4 ore 9/9 pubblicate

    Progetto finale completo

    Preparare un progetto completo e spiegabile.

    Output: Demo funzionante, README, test, spiegazione delle scelte.

Ore 41-60

Moduli 17-24

Checkpoint 60 ore Si chiude il laboratorio con variante infrastrutturale, sicurezza, prestazioni, logging, revisione e presentazione finale.
  1. 17
    4 ore 8/8 pubblicate

    Variante database o API

    Sostituire infrastruttura senza toccare dominio e casi d'uso.

    Output: Adapter alternativo.
  2. 18
    3 ore 7/7 pubblicate

    Sicurezza di base

    Riconoscere rischi comuni anche in un progetto piccolo.

    Output: Checklist sicurezza.
  3. 19
    3 ore 7/7 pubblicate

    Prestazioni e manutenzione

    Individuare colli di bottiglia senza ottimizzare troppo presto.

    Output: Piccola analisi dei colli di bottiglia.
  4. 20
    2 ore 5/5 pubblicate

    Logging e osservabilita minima

    Capire cosa e successo nel sistema.

    Output: Log tecnici separati dai messaggi utente.
  5. 21
    3 ore 7/7 pubblicate

    Revisione architetturale con Codex

    Usare Codex come revisore, non come autore cieco.

    Output: Report di revisione.
  6. 22
    4 ore 8/8 pubblicate

    Refactoring avanzato e varianti

    Migliorare il progetto senza riscriverlo.

    Output: Miglioramento incrementale del progetto.
  7. 23
    4 ore 8/8 pubblicate

    Preparazione del progetto finale

    Rendere il progetto pronto per una presentazione completa.

    Output: Progetto pronto per presentazione.
  8. 24
    4 ore 9/9 pubblicate

    Presentazione, valutazione e retrospettiva

    Spiegare scelte, limiti e prossimi passi.

    Output: Presentazione finale e autovalutazione.

Architettura del software

Dal codice che funziona al codice che si mantiene

Questo percorso parte da un programma volutamente fragile e lo trasforma, passo dopo passo, in una piccola applicazione organizzata. Il progetto è sempre lo stesso: un Registro del laboratorio scolastico per gestire strumenti, prestiti, guasti e salvataggio dei dati.

L’obiettivo non è studiare architettura in astratto. L’obiettivo è capire una cosa molto concreta: quando una regola deve stare nel dominio, quando una funzione diventa un caso d’uso, quando il salvataggio dei dati è solo un dettaglio tecnico e quando la UI sta facendo troppo.

Inizia qui

Lo studente non deve scegliere tra tre corsi. Deve seguire un solo percorso e fermarsi al checkpoint adatto al tempo disponibile.

I 24 elementi del percorso sono moduli, non per forza 24 lezioni singole. Un modulo è una tappa didattica da 2-4 ore: può contenere una lezione lunga, due lezioni brevi, un laboratorio guidato o una revisione in classe.

Nell’indice del percorso ogni modulo mostra sempre le lezioni previste. Una lezione con link è già pubblicata; una lezione senza link è pianificata e verrà sviluppata dopo.

  1. Parti dal modulo 1. Prepara repository, cartella progetto e README iniziale.
  2. Costruisci prima una versione fragile. Nei moduli 1-2 il codice può essere disordinato: serve a vedere il problema.
  3. Arriva al checkpoint 20 ore. Qui devi avere dominio minimo, casi d’uso principali e persistenza in memoria.
  4. Continua con i moduli 9-16. Aggiungi interfacce, adapter, localStorage o JSON, test più strutturati e documentazione.
  5. Chiudi con i moduli 17-24. Inserisci variante database o API, sicurezza di base, logging, revisione con Codex e presentazione finale.

Il primo obiettivo reale è quindi semplice: avviare il registro e far emergere il disordine iniziale. L’architettura viene introdotta dopo, quando serve davvero.

Apri la prima lezione: Preparazione del laboratorio

Struttura reale del corso

Tratto del percorsoOreCosa costruisciCheckpoint
Moduli 1-80-20Registro funzionante in memoria, dominio minimo, casi d’uso principali, livelli separati in modo semplice.Checkpoint 20 ore.
Moduli 9-1621-40Persistenza localStorage o JSON, interfacce, adapter, test, errori chiari, README e diagramma minimo.Checkpoint 40 ore.
Moduli 17-2441-60Variante database o API, sicurezza di base, prestazioni, logging, revisione con Codex e refactoring avanzato.Checkpoint 60 ore.

Il filo resta sempre lo stesso: stesso progetto, stesso dominio, più responsabilità separate a ogni fase.

A chi è rivolto

  • Studenti con basi di programmazione.
  • Classi di scuola superiore che hanno già scritto script, pagine web o piccole applicazioni.
  • Docenti che vogliono proporre un laboratorio di progettazione software concreto.
  • Principianti che sanno far funzionare un programma, ma iniziano a sentire il bisogno di organizzarlo meglio.
  • Studenti intermedi che vogliono capire test, refactoring e separazione tra regole e interfaccia senza entrare in architetture pesanti.

Prerequisiti

Prima di iniziare è utile conoscere:

  • variabili;
  • funzioni;
  • condizioni;
  • cicli;
  • array o liste;
  • oggetti o dizionari;
  • file separati o moduli;
  • basi di HTML e JavaScript se si lavora nel browser;
  • basi minime di Git, consigliate ma non obbligatorie.

Lo stack didattico principale usa JavaScript modulare o TypeScript leggero, browser e localStorage. Non servono framework complessi: l’obiettivo è vedere le responsabilità del codice, non nasconderle dentro strumenti troppo grandi.

Competenze in uscita

Alla fine del percorso lo studente deve saper:

  • separare interfaccia, casi d’uso, dominio e infrastruttura;
  • riconoscere responsabilità troppo grandi in una funzione, in un file o in un servizio;
  • modellare stati e regole del problema;
  • scrivere casi d’uso indipendenti dalla UI;
  • sostituire una persistenza in memoria con localStorage o JSON;
  • scrivere test sulle regole principali;
  • documentare la struttura del progetto;
  • spiegare una scelta architetturale con parole semplici.

Progetto guida: Registro del laboratorio scolastico

Il registro rappresenta strumenti o dispositivi usati in un laboratorio scolastico: notebook, sensori, kit Arduino, alimentatori, tablet, microscopi, cavi, adattatori o qualunque materiale prestabile.

Il progetto cresce per tappe. All’inizio basta un registro in memoria, con pochi dati e comandi essenziali. Poi si separano regole e casi d’uso. Più avanti si aggiungono persistenza, errori più chiari, test, documentazione e una variante infrastrutturale.

Le funzionalità progressive sono:

  • registrare strumenti o dispositivi;
  • cercare strumenti per nome, categoria o stato;
  • segnare strumenti come disponibili, in prestito, guasti o in manutenzione;
  • registrare prestiti;
  • chiudere prestiti;
  • aprire segnalazioni di guasto;
  • salvare dati prima in memoria, poi in localStorage o JSON, poi eventualmente in database o API nei moduli finali;
  • mostrare messaggi comprensibili all’utente;
  • testare regole e casi d’uso.

Esempio di stati:

const StatoStrumento = {
  DISPONIBILE: "disponibile",
  IN_PRESTITO: "in_prestito",
  GUASTO: "guasto",
  IN_MANUTENZIONE: "in_manutenzione",
};

Esempio di regola di dominio:

function puoEsserePrestato(strumento) {
  return strumento.stato === StatoStrumento.DISPONIBILE;
}

Questa regola non deve stare nel pulsante “Presta” della UI. Deve stare nel dominio, perché vale sempre: da una pagina web, da una CLI, da un test o da una futura API.

Architettura minima

Il laboratorio usa quattro livelli. Sono nomi tecnici, ma l’idea è semplice: ogni livello ha un lavoro preciso.

LivelloResponsabilitàEsempio nel registro
Presentation / UIMostra dati, riceve input, chiama i casi d’uso.Form per registrare uno strumento, lista dei risultati, pulsanti per prestito e chiusura.
ApplicationCoordina le operazioni del sistema.RegistraPrestito carica lo strumento, verifica la regola, crea il prestito e salva.
DomainContiene regole, concetti e invarianti.Strumento, Prestito, StatoStrumento, regole su guasti e prestiti.
InfrastructureSalva dati, legge file, usa localStorage, database, API o strumenti esterni.ArchivioStrumentiInMemoria, ArchivioStrumentiLocalStorage, adapter API.

Un esempio di flusso:

  1. La UI riceve il nome dello studente e l’id dello strumento.
  2. La UI chiama il caso d’uso RegistraPrestito.
  3. Il caso d’uso legge lo strumento dall’archivio.
  4. Il dominio verifica se lo strumento può essere prestato.
  5. L’infrastruttura salva il nuovo stato e il prestito.
  6. La UI mostra un messaggio comprensibile.

Il dominio non deve sapere se i dati stanno in memoria, in localStorage, in un file JSON o in un database. Questo confine è il cuore del percorso.

Come leggere il programma dettagliato

La tabella sotto serve a docenti e studenti per pianificare le lezioni. Non va letta come un elenco di argomenti teorici: ogni modulo produce un pezzo del progetto o una verifica concreta.

  • I moduli 1-8 portano al checkpoint 20 ore.
  • I moduli 9-16 consolidano il progetto.
  • I moduli 17-24 chiudono il laboratorio con revisione e presentazione.

La regola pratica è: non anticipare complessità. Prima si fa funzionare il registro, poi si separa meglio, poi si sostituisce l’infrastruttura.

Piano dettagliato per docenti

Questa parte non è la navigazione principale del corso. Serve a pianificare ore, attività e output. La sequenza da seguire resta quella del Percorso del corso sopra: modulo 1, poi modulo 2, poi modulo 3, fino ai checkpoint.

Ore 0-20: moduli 1-8

ModuloOreObiettivoAttività praticaOutput prodotto
1. Preparazione del laboratorio2Preparare ambiente e convenzioni minime.Creare cartella o repository, scegliere JavaScript modulare o TypeScript leggero, definire comandi base.Repository o cartella progetto, README iniziale, struttura minima.
2. Partire da un programma fragile2Far percepire il problema prima di introdurre architettura.Scrivere un piccolo registro funzionante ma disordinato, con dati, UI e regole nello stesso file.Piccolo registro funzionante ma fragile.
3. Che cos’è l’architettura del software2Capire architettura come responsabilità, confini e decisioni difficili da cambiare.Disegnare una mappa dei confini: utente, UI, regole, dati salvati.Mappa dei confini del sistema.
4. Responsabilità, coesione e accoppiamento3Riconoscere funzioni che fanno troppe cose.Smontare funzioni lunghe: una parte legge input, una decide, una salva, una mostra output.Refactoring di funzioni troppo grandi.
5. Requisiti, utenti e linguaggio del problema3Tradurre il problema in parole condivise.Elencare utenti, azioni, regole, vincoli e parole chiave del registro.Glossario del dominio e lista requisiti.
6. Dominio: regole e invarianti4Modellare concetti e regole che devono valere sempre.Definire Strumento, Prestito, StatoStrumento; implementare regole e invarianti.Modello di dominio.
7. Casi d’uso4Coordinare operazioni senza dipendere dalla UI.Scrivere RegistraStrumento, CercaStrumenti, RegistraPrestito, ChiudiPrestito, ApriSegnalazioneGuasto.Casi d’uso applicativi.
8. Primo taglio architetturale4Separare il progetto in livelli chiari.Dividere file e cartelle in Domain, Application, Infrastructure e Presentation.Separazione base dei livelli e checkpoint 20 ore.

Checkpoint 20 ore

Alla fine del modulo 8 deve essere pronto:

  • progetto avviato;
  • dominio minimo;
  • casi d’uso principali;
  • separazione base dei livelli;
  • persistenza in memoria;
  • almeno alcuni test sulle regole;
  • README iniziale.

Non è ancora richiesto:

  • database;
  • API;
  • sicurezza avanzata;
  • diagrammi dettagliati;
  • architetture complesse.

La domanda guida del checkpoint è: se cambio la UI, le regole principali restano valide e testabili?

Ore 21-40: moduli 9-16

ModuloOreObiettivoAttività praticaOutput prodotto
9. Dipendenze, interfacce e inversione del controllo4Cambiare archivio senza riscrivere i casi d’uso.Partire dalla domanda: “Come faccio a cambiare archivio senza riscrivere i casi d’uso?”. Definire ArchivioStrumenti.Interfaccia ArchivioStrumenti e implementazioni alternative.
10. Infrastructure: file, localStorage, database e API4Spostare il salvataggio fuori dalla logica.Passare da archivio in memoria a localStorage o JSON; introdurre DTO, mapping e adapter con esempi pratici.Persistenza localStorage o JSON.
11. Presentation: l’interfaccia come bordo del sistema4Tenere la UI fuori dalle regole di dominio.Costruire una UI semplice, CLI o pagina web che chiama i casi d’uso.Interfaccia funzionante senza regole di dominio.
12. Errori, validazione e messaggi3Rendere gli errori comprensibili e separati dai dettagli tecnici.Distinguere errore di input, dominio, applicazione e infrastruttura. Trasformare “Cannot read properties of undefined” in “Strumento non trovato”.Gestione errori più chiara.
13. Testare l’architettura4Proteggere regole e casi d’uso.Scrivere test su dominio, casi d’uso e archivi finti; introdurre fake e stub con esempi piccoli.Test su regole, casi d’uso e archivi finti.
14. Refactoring: migliorare senza ricominciare3Cambiare struttura mantenendo il programma funzionante.Ridurre funzioni lunghe, God Service, duplicazione e dipendenze nascoste con passi piccoli.Refactoring controllato.
15. Struttura del progetto, documentazione e diagrammi3Rendere il progetto leggibile da fuori.Scrivere README completo, diagramma minimo e decisioni tecniche; usare C4 in forma semplificata: contesto, container, componenti principali.README completo, diagramma minimo, decisioni tecniche.
16. Progetto finale completo4Preparare un progetto completo e spiegabile.Preparare demo, test, README e spiegazione delle scelte.Demo funzionante, README, test, spiegazione delle scelte.

Checkpoint 40 ore

Alla fine del modulo 16 deve essere pronto:

  • dominio stabile;
  • casi d’uso principali;
  • UI o CLI funzionante;
  • persistenza localStorage o JSON;
  • test su regole e casi d’uso;
  • errori gestiti;
  • README;
  • diagramma architetturale minimo;
  • presentazione finale.

La domanda guida del checkpoint è: se cambio il modo in cui salvo i dati, posso mantenere dominio e casi d’uso quasi intatti?

Ore 41-60: moduli 17-24

ModuloOreObiettivoAttività praticaOutput prodotto
17. Variante database o API4Sostituire infrastruttura senza toccare dominio e casi d’uso.Creare un adapter alternativo verso database leggero, API mock o servizio locale.Adapter alternativo.
18. Sicurezza di base3Riconoscere rischi comuni anche in un progetto piccolo.Lavorare su input non fidati, validazione, dati sensibili, errori troppo dettagliati, autorizzazioni minime e messaggi utente separati dai dettagli tecnici.Checklist sicurezza.
19. Prestazioni e manutenzione3Individuare colli di bottiglia senza ottimizzare troppo presto.Analizzare ricerca inefficiente, duplicazione dati, caricamento e salvataggio.Piccola analisi dei colli di bottiglia.
20. Logging e osservabilità minima2Capire cosa è successo nel sistema.Separare log tecnici e messaggi utente; decidere cosa registrare durante prestiti, errori e salvataggi.Log tecnici separati dai messaggi utente.
21. Revisione architetturale con Codex3Usare Codex come revisore, non come autore cieco.Far analizzare responsabilità eccessive, violazioni dei livelli, test mancanti, refactoring e regole finite nella UI.Report di revisione.
22. Refactoring avanzato e varianti4Migliorare il progetto senza riscriverlo.Applicare refactoring incrementale e confrontare varianti tecniche.Miglioramento incrementale del progetto.
23. Preparazione del progetto finale4Rendere il progetto pronto per una presentazione completa.Curare demo, test, README, diagramma, decisioni tecniche, problemi incontrati e miglioramenti futuri.Progetto pronto per presentazione.
24. Presentazione, valutazione e retrospettiva4Spiegare scelte, limiti e prossimi passi.Presentare livelli separati, regole di dominio, casi d’uso, persistenza, test e scelte da cambiare.Presentazione finale e autovalutazione.

Checkpoint 60 ore

Alla fine del modulo 24 deve essere pronto:

  • progetto completo;
  • variante infrastrutturale;
  • test più maturi;
  • gestione errori chiara;
  • documentazione tecnica;
  • revisione con Codex;
  • riflessione sulle scelte architetturali;
  • presentazione finale.

La domanda guida del checkpoint è: so spiegare perché il progetto è organizzato così e quali scelte cambierei in una versione reale?

Micro-sfide

Trova la responsabilità nascosta

  • Obiettivo: riconoscere una funzione che fa più lavori.
  • Attività: scegli una funzione lunga del registro e sottolinea tutte le responsabilità presenti: lettura input, validazione, regola, salvataggio, messaggio.
  • Vincolo: non riscrivere subito il codice.
  • Risultato atteso: elenco delle responsabilità e prima proposta di separazione.

Sposta una regola fuori dalla UI

  • Obiettivo: impedire che un pulsante contenga logica importante.
  • Attività: trova una regola scritta dentro un event listener e spostala nel dominio.
  • Vincolo: la UI deve solo chiamare un caso d’uso o una funzione di dominio.
  • Risultato atteso: stessa funzionalità, regola testabile senza browser.

Impedisci il prestito di uno strumento guasto

  • Obiettivo: modellare un’invariante di dominio.
  • Attività: implementa la regola per cui uno strumento guasto non può essere prestato.
  • Vincolo: la regola deve valere anche se il prestito viene richiesto da test o CLI.
  • Risultato atteso: caso d’uso rifiutato con errore di dominio comprensibile.

Cambia archivio senza modificare il caso d’uso

  • Obiettivo: capire interfacce e inversione delle dipendenze.
  • Attività: sostituisci ArchivioStrumentiInMemoria con ArchivioStrumentiLocalStorage.
  • Vincolo: il file del caso d’uso non deve cambiare.
  • Risultato atteso: stesso caso d’uso, persistenza diversa.

Trasforma un errore tecnico in messaggio utente

  • Obiettivo: distinguere errore interno e comunicazione all’utente.
  • Attività: intercetta un errore come “Cannot read properties of undefined” e trasformalo in “Strumento non trovato”.
  • Vincolo: non mostrare stack trace o dettagli tecnici nella UI.
  • Risultato atteso: messaggio chiaro per l’utente e dettaglio tecnico disponibile nei log.

Scrivi un test prima del refactoring

  • Obiettivo: proteggere il comportamento prima di cambiare struttura.
  • Attività: scegli una regola già funzionante e scrivi un test prima di spostare codice.
  • Vincolo: il refactoring non deve cambiare il risultato del test.
  • Risultato atteso: test verde prima e dopo la modifica.

Separa DTO e modello di dominio

  • Obiettivo: evitare che il formato salvato decida il modello interno.
  • Attività: crea un DTO per i dati in localStorage e una funzione di mapping verso Strumento.
  • Vincolo: il dominio non deve leggere direttamente il formato JSON salvato.
  • Risultato atteso: mapping esplicito tra dato esterno e modello interno.

Aggiungi un nuovo stato “in manutenzione”

  • Obiettivo: verificare quanto il modello è modificabile.
  • Attività: aggiungi lo stato in_manutenzione e aggiorna ricerche, prestiti e messaggi.
  • Vincolo: evita condizioni duplicate sparse in molti file.
  • Risultato atteso: nuovo stato gestito senza rompere gli stati esistenti.

Documenta una decisione tecnica

  • Obiettivo: spiegare una scelta architetturale.
  • Attività: scrivi nel README perché il dominio non usa direttamente localStorage.
  • Vincolo: massimo 10 righe, linguaggio comprensibile a un compagno.
  • Risultato atteso: decisione tecnica breve, motivata e leggibile.

Usa Codex per fare una revisione architetturale

  • Obiettivo: usare l’AI come revisore.
  • Attività: chiedi a Codex di controllare confini tra Presentation, Application, Domain e Infrastructure.
  • Vincolo: Codex non deve riscrivere il progetto al posto tuo.
  • Risultato atteso: report con problemi, rischi e prossimi refactoring.

Crea un archivio finto per i test

  • Obiettivo: testare un caso d’uso senza dipendere da localStorage.
  • Attività: implementa un fake repository in memoria usato solo dai test.
  • Vincolo: il fake deve rispettare la stessa interfaccia dell’archivio reale.
  • Risultato atteso: test più veloci e indipendenti dal browser.

Disegna il flusso di un caso d’uso

  • Obiettivo: rendere visibile il passaggio tra livelli.
  • Attività: disegna il flusso di RegistraPrestito con frecce e nomi dei livelli.
  • Vincolo: niente UML complesso; bastano caselle e frecce.
  • Risultato atteso: diagramma leggibile da uno studente esterno.

Uso di Codex nel laboratorio

Codex può essere utile quando aiuta a ragionare sul codice. In questo percorso va usato come revisore, compagno di analisi e generatore di alternative controllate, non come scorciatoia per produrre tutto senza capire.

Codex può essere usato per:

  • revisionare codice;
  • generare liste di test;
  • suggerire refactoring;
  • individuare violazioni architetturali;
  • spiegare codice esistente;
  • aiutare nella documentazione.

Codex non deve essere usato per:

  • generare tutto il progetto senza comprensione;
  • scegliere l’architettura al posto dello studente;
  • introdurre framework non richiesti;
  • nascondere errori dietro codice apparentemente corretto.

Prompt pronti per studenti e docenti:

  1. “Analizza questo file e indica se contiene troppe responsabilità. Non riscrivere il codice. Restituisci solo: responsabilità individuate, punti di accoppiamento, suggerimenti di separazione.”
  2. “Queste sono le regole di dominio del Registro del laboratorio. Genera una lista di test, non il codice dei test. Per ogni test indica nome, scenario, input e risultato atteso.”
  3. “Controlla se questo caso d’uso dipende dalla UI o dalla persistenza. Segnala solo le violazioni architetturali.”
  4. “Proponi un refactoring in massimo 5 passi. Ogni passo deve mantenere il programma funzionante. Non introdurre nuove librerie.”
  5. “Analizza questa struttura di cartelle e dimmi se i confini tra Presentation, Application, Domain e Infrastructure sono chiari.”
  6. “Leggi questo README e dimmi se uno studente esterno riuscirebbe a capire come è organizzato il progetto.”
  7. “Osserva questi test e dimmi quali regole importanti non sono ancora coperte. Non scrivere codice.”
  8. “Confronta queste due soluzioni di persistenza e indica pro, contro e rischi per un progetto didattico.”

Regola pratica: prima si prova a spiegare il problema con parole proprie, poi si chiede a Codex di controllare, criticare o proporre alternative.

Rubrica di valutazione

CriterioPesoInsufficienteBaseBuonoAvanzato
Dominio20%Regole sparse nella UI o nei salvataggi. Stati confusi o non modellati.Concetti principali presenti, ma con regole incomplete.Modello chiaro con stati, regole e invarianti principali.Dominio leggibile, testabile e semplice da estendere.
Casi d’uso20%Le operazioni sono solo event listener o funzioni legate alla UI.Alcuni casi d’uso esistono, ma dipendono ancora da dettagli esterni.Casi d’uso chiari che coordinano dominio e archivi.Casi d’uso piccoli, nominati bene, indipendenti da UI e persistenza.
Separazione dei livelli20%UI, regole e salvataggio sono mescolati.Cartelle separate, ma confini non sempre rispettati.Presentation, Application, Domain e Infrastructure sono riconoscibili.Dipendenze orientate bene e infrastruttura sostituibile.
Test15%Nessun test sulle regole principali.Pochi test manuali o automatici su casi semplici.Test automatici su dominio e casi d’uso principali.Test maturi con fake o stub e casi limite significativi.
Errori e messaggi10%Errori tecnici mostrati all’utente o ignorati.Alcuni messaggi sono comprensibili, ma la gestione è irregolare.Errori di input, dominio, applicazione e infrastruttura distinti.Messaggi utente chiari, dettagli tecnici separati e logging minimo.
Documentazione10%README assente o non spiega la struttura.README con avvio progetto, ma poca architettura.README, diagramma minimo e decisioni principali.Documentazione utile a uno studente esterno, con trade-off e limiti.
Presentazione finale5%Demo non spiegata o progetto non eseguibile.Demo base con spiegazione parziale.Presentazione chiara di livelli, casi d’uso, persistenza e test.Presentazione critica con scelte alternative e miglioramenti futuri.

Condizioni minime di sufficienza: il progetto non è sufficiente se:

  • le regole principali sono nella UI;
  • il salvataggio dati è mescolato ai casi d’uso;
  • non esiste nessun test sulle regole;
  • il README non spiega la struttura.

Checklist finale per studenti

  • Ho separato i livelli.
  • Le regole stanno nel dominio.
  • I casi d’uso non leggono direttamente dalla UI.
  • La persistenza è sostituibile.
  • Ho scritto test sulle regole importanti.
  • Gli errori utente sono comprensibili.
  • Il README spiega il progetto.
  • So spiegare almeno una scelta architetturale.
  • So indicare un limite del progetto attuale.
  • So dire cosa cambierei in una versione più grande.

Checklist per docenti

  • Prerequisiti verificati.
  • Progetto iniziale predisposto.
  • Micro-sfide assegnate.
  • Checkpoint a 20, 40 e 60 ore.
  • Criteri di valutazione condivisi.
  • Uso controllato di Codex.
  • Revisione finale dei progetti.
  • Tempo riservato a demo e retrospettiva.

Glossario essenziale

  • Architettura software: insieme di confini, responsabilità e decisioni che rendono un programma comprensibile e modificabile.
  • Responsabilità: compito preciso assegnato a una funzione, classe, modulo o livello.
  • Coesione: misura di quanto gli elementi di un modulo lavorano per lo stesso scopo.
  • Accoppiamento: dipendenza tra parti del sistema; se è alto, cambiare una parte rompe facilmente le altre.
  • Dominio: parte del codice che rappresenta il problema reale: strumenti, prestiti, stati, regole.
  • Invariante: regola che deve restare sempre vera, per esempio “uno strumento guasto non può essere prestato”.
  • Caso d’uso: operazione applicativa che coordina una richiesta, per esempio registrare un prestito.
  • Interfaccia: contratto che dice quali operazioni sono disponibili senza fissare come sono implementate.
  • Adapter: componente che collega il sistema a un dettaglio esterno, come localStorage, file, database o API.
  • DTO: oggetto usato per trasferire dati in un formato esterno o salvato.
  • Mapping: trasformazione tra DTO e modello di dominio.
  • Persistenza: modo in cui i dati vengono salvati e recuperati.
  • Refactoring: miglioramento della struttura del codice senza cambiare il comportamento osservabile.
  • Test: verifica ripetibile che controlla se una regola o un comportamento funziona come previsto.
  • Fake: implementazione semplificata usata nei test, per esempio un archivio in memoria.
  • Stub: oggetto o funzione che restituisce risposte predefinite durante un test.
  • Requisito non funzionale: vincolo di qualità, come sicurezza, prestazioni, leggibilità o manutenibilità.

Principi da ricordare

  • Prima capire il problema, poi scrivere codice.
  • La UI non deve contenere le regole importanti.
  • Il dominio non deve conoscere localStorage, database o API.
  • Un caso d’uso coordina, non mostra messaggi.
  • L’infrastruttura è un dettaglio sostituibile.
  • I test proteggono il refactoring.
  • L’architettura serve a cambiare il programma senza romperlo.
  • Codex aiuta a ragionare, ma lo studente deve verificare.

Conclusione

Questo percorso non serve a imparare una formula da copiare. Serve a costruire un modello mentale: quando il codice cresce, bisogna capire quali parti parlano con quali altre, dove vivono le regole, che cosa può cambiare e che cosa deve restare stabile.

Alla fine, il Registro del laboratorio scolastico non è importante solo perché funziona. È importante perché lo studente può leggerlo, modificarlo, testarlo e spiegarlo. Questo è il salto dal codice che parte al codice che si mantiene.