glossario operativo

Glossario del Debugging

107 termini raccolti nel corso. Ogni voce rimanda alla lezione dove viene introdotta.

Fondamenta

bug

Scostamento misurabile tra ciò che il programma promette di fare e ciò che fa davvero.

→ Che cos'è un bug e che cosa non lo è

Vedi anche: specifica, limitazione

limitazione

Comportamento sgradevole ma documentato e accettato. Non è un bug se la documentazione lo dichiara.

→ Che cos'è un bug e che cosa non lo è

richiesta di funzionalità

Qualcosa che il programma non fa e mai ha promesso di fare. Va trattata come nuova feature, non come fix.

→ Che cos'è un bug e che cosa non lo è

malinteso d'uso

Il programma fa esattamente ciò che è stato chiesto, ma l'utente si aspettava altro. Serve migliorare UX, non codice.

→ Che cos'è un bug e che cosa non lo è

compile-time (parse-time)

Momento in cui il codice viene tradotto, analizzato o caricato. Errori che bloccano l'avvio.

→ Compile-time, runtime, logico: tre famiglie di errori

runtime

Ambiente che esegue il codice (browser, Node.js, JVM). Anche: momento in cui il programma viene eseguito.

→ Compile-time, runtime, logico: tre famiglie di errori

errore logico (semantico)

Il programma gira senza protestare ma produce un risultato sbagliato. Silenzioso, scoperto solo da test o occhio umano.

→ Compile-time, runtime, logico: tre famiglie di errori

DevTools

Pannello del browser per ispezionare, profilare e debuggare. Console, Sources, Network, Application, Performance, Memory.

→ Setup dell'ambiente di laboratorio

linter

Programma che segnala errori e cattive pratiche nel codice mentre scrivi. Es. ESLint per JavaScript.

→ Setup dell'ambiente di laboratorio

Memoria ed esecuzione

stack

Pila delle chiamate in corso (LIFO). Funzione corrente in cima, chiamanti sotto.

→ Glossario operativo del debugger

Vedi anche: stack trace, heap

heap

Zona di memoria capiente e disordinata dove vivono oggetti e dati a vita lunga.

→ Glossario operativo del debugger

garbage collector (GC)

Meccanismo che libera memoria automaticamente quando nessuno trattiene riferimenti agli oggetti.

→ Memory leak e risorse non rilasciate

heap snapshot

Fotografia dell'heap in un istante. Si confronta con un secondo snapshot per scoprire chi cresce.

→ Memory leak e risorse non rilasciate

memory leak

Memoria mai rilasciata. Listener non rimossi, timer pendenti, sottoscrizioni store aperte.

→ Memory leak e risorse non rilasciate

Errori e stack trace

stack trace

Pila delle chiamate al momento dell'errore. Si legge dall'innermost (in alto) al chiamante più esterno.

→ Stack trace: da dove arriva davvero il problema

TypeError

Stai usando un valore in modo incompatibile col suo tipo. Es. `null.x`, `arr is not a function`.

→ Anatomia di un messaggio di errore

RangeError

Valore fuori range. Es. array negativo, ricorsione infinita.

→ Anatomia di un messaggio di errore

SyntaxError

Codice non valido a parse-time. Spesso senza stack utile.

→ Anatomia di un messaggio di errore

ReferenceError

Stai usando un nome non definito nello scope.

→ Anatomia di un messaggio di errore

Error.cause

Proprietà per concatenare errori: l'errore alto preserva la causa originaria.

→ Anatomia di un messaggio di errore

async stack trace

Stack che attraversa await e promise mostrando la catena logica, non solo quella tecnica.

→ Stack trace: da dove arriva davvero il problema

source map

File `.map` che collega bundle minificato a sorgente originale. Senza, errori in produzione illeggibili.

→ Service Worker, cache aggressiva, source map

Riproduzione e indagine

bug report

Scheda strutturata: titolo, ambiente, passi, atteso, osservato, evidenze, severità.

→ Dal lamento al bug report

passi (steps to reproduce)

Sequenza esatta di azioni per riprodurre il bug.

→ Dal lamento al bug report

severità

Impatto tecnico/utente del bug. Da non confondere con priorità.

→ Dal lamento al bug report

Vedi anche: priorità

priorità

Urgenza di lavorarci. Decisione business, separata dalla severità tecnica.

→ Issue triage: severità, priorità, proprietario

regressione

Comportamento che funzionava in una versione precedente e ora non funziona più.

→ Tassonomia: regressione, bug nuovo, limitazione, flaky

flaky bug

Difetto intermittente, senza causa scatenante chiara. Richiede stabilizzazione prima dell'indagine.

→ Tassonomia: regressione, bug nuovo, limitazione, flaky

caso minimo riproducibile (MCVE/MRE)

Versione più piccola del problema che conserva il difetto. Risultato della bisezione su codice e dati.

→ Costruire un caso minimo riproducibile

taccuino di laboratorio

Registro cronologico della sessione di debug: ora, ipotesi, prova, esito.

→ Atteso, osservato, frequenza, taccuino di laboratorio

ipotesi falsificabile

Spiegazione che può essere dichiarata sbagliata da una prova specifica. Cuore del metodo scientifico applicato al debug.

→ Una ipotesi alla volta, anche al duck

rubber duck

Pratica di spiegare il problema a voce alta (anche a un peluche) per esplicitare assunzioni nascoste.

→ Una ipotesi alla volta, anche al duck

delta debugging (ddmin)

Algoritmo di Andreas Zeller che minimizza automaticamente un input che produce un bug.

→ Delta debugging e riduzione automatica

git bisect

Strumento Git per ricerca binaria nella cronologia dei commit. Trova in log₂(N) passi il commit colpevole.

→ Ricerca binaria nel codice e nei commit

feature flag

Interruttore booleano che abilita/disabilita una funzionalità. Utile per indagine reversibile e per kill switch.

→ Riduzione, feature flag e disattivazione selettiva

Osservazione

log strutturato

Log in JSON con campi chiave-valore. Filtrabile, aggregabile, machine-readable.

→ Log strutturati, metriche, trace, SLO

breakpoint

Punto del codice dove il debugger ferma l'esecuzione per ispezionare.

→ Breakpoint, logpoint, watch expression

breakpoint condizionato

Si attiva solo se una condizione è vera. Risparmia ore in cicli grandi.

→ Breakpoint, logpoint, watch expression

logpoint

Come un breakpoint, ma stampa senza fermare. Permette console.log senza toccare i sorgenti.

→ Breakpoint, logpoint, watch expression

watch expression

Espressione la cui valutazione si aggiorna ad ogni step del debugger.

→ Breakpoint, logpoint, watch expression

throttling

Rallentamento volontario (rete, CPU) per simulare condizioni reali o osservare meglio.

→ Network: richiesta, payload, risposta

payload

Corpo del messaggio HTTP (request body o response body).

→ Network: richiesta, payload, risposta

Correzione

fix minimo

Modifica più piccola che corregge il bug e niente altro. Senza refactor opportunistici.

→ Fix minimo e fix cosmetico

test di regressione

Test scritto per impedire al bug di tornare. Deve fallire prima del fix e passare dopo.

→ Test di regressione che fallisce prima del fix

fixture

Dato di prova fissato, riproducibile, usato per produrre sempre lo stesso comportamento.

→ Quando il bug è nei dati

boundary value analysis

Tecnica di testing che si concentra sui confini del dominio (0, vuoto, max, min).

→ Quando il bug è nei dati

equivalence partitioning

Divisione del dominio in classi che si comportano uguale. Una fixture per classe.

→ Quando il bug è nei dati

fix-forward

Applicare un nuovo commit che corregge, senza tornare indietro.

→ Fix-forward, revert, hotfix branch

git revert

Comando Git che crea un nuovo commit annullando l'effetto di un commit precedente. Non distrugge la storia.

→ Fix-forward, revert, hotfix branch

hotfix branch

Branch dedicato che parte dalla release in produzione, riceve solo il fix urgente, viene rilasciato fuori dal ciclo normale.

→ Fix-forward, revert, hotfix branch

Conventional Commits

Convenzione che struttura il messaggio: `<tipo>(<scope>): <subject>`. Tipi: fix, feat, refactor, docs, ecc.

→ Commit, messaggio e nota tecnica

regola 50/72

Subject del commit max 50 caratteri, body max 72 colonne per riga. Garantisce leggibilità ovunque.

→ Commit, messaggio e nota tecnica

Collaborazione

handoff

Passaggio di contesto da una persona all'altra. Include bug report, riproduzione, ipotesi escluse, stato attuale.

→ Chiedere aiuto senza scaricare il problema

issue triage

Classificazione dei ticket per severità, priorità, owner e SLA.

→ Issue triage: severità, priorità, proprietario

pair debugging

Debug in due con ruoli (driver, navigator, scriba) e rotazione a timer.

→ Pair debugging e ruoli

blameless postmortem

Retrospettiva che si concentra su sistemi e processi, non su persone. Nome usato anche solo `blameless`.

→ Retrospettiva blameless e lezione appresa

5 whys

Tecnica di Toyota: chiedi 'perché?' cinque volte fino ad arrivare alla causa radice.

→ Retrospettiva blameless e lezione appresa

causa radice (root cause)

Fattore profondo che ha reso possibile il bug, non solo il sintomo immediato.

→ Retrospettiva blameless e lezione appresa

Asincronia

event loop

Meccanismo single-threaded che alterna esecuzione di task, microtask e rendering.

→ Event loop, microtask, macrotask

microtask

Task ad alta priorità (Promise, queueMicrotask, MutationObserver). Eseguito tra macrotask.

→ Event loop, microtask, macrotask

macrotask

Task normale (setTimeout, eventi DOM, fetch response). Eseguito dopo le microtask.

→ Event loop, microtask, macrotask

Promise

Oggetto che rappresenta un valore futuro. Stati: pending, fulfilled, rejected.

→ Promise, async/await ed errori silenziosi

unhandled rejection

Rejection di una Promise senza catch. Catturabile con `unhandledrejection` (browser) o `process.on` (Node).

→ Promise, async/await ed errori silenziosi

race condition

Due eventi competono, l'ordine non garantisce coerenza. Esempi: doppio submit, stale closure, setState dopo unmount.

→ Race condition e AbortController

AbortController / AbortSignal

Meccanismo standard per cancellare fetch, listener e altre operazioni asincrone.

→ Race condition e AbortController

stale closure

Closure che cattura un valore vecchio. Bug ricorrente in hook React con dipendenze sbagliate.

→ Race condition e AbortController

debounce

Aspetta che la sorgente di eventi si fermi N ms prima di chiamare il callback.

→ Race condition e AbortController

throttle

Limita a una chiamata ogni N ms indipendentemente dalla frequenza degli eventi.

→ Race condition e AbortController

Service Worker

Script che intercetta le richieste della pagina. Spesso causa di cache aggressiva nei bug 'la vecchia versione torna'.

→ Service Worker, cache aggressiva, source map

Backend, dati, integrazioni

contratto API

Accordo esplicito tra producer e consumer di un'API: nomi, tipi, valori, formati.

→ Contratti API e schema dei dati

JSON Schema

Descrizione formale della struttura di dati JSON. Validabile a runtime con librerie come ajv.

→ Contratti API e schema dei dati

OpenAPI

Standard di descrizione di API REST. Genera client tipizzati e validazione automatica.

→ Contratti API e schema dei dati

401 Unauthorized

'Non so chi sei'. Token mancante, scaduto o invalido. Non confondere con 403.

→ Autenticazione, sessioni, JWT e CORS

403 Forbidden

'So chi sei ma non puoi'. Il ruolo non ha permessi per questa operazione.

→ Autenticazione, sessioni, JWT e CORS

JWT (JSON Web Token)

Token firmato in tre parti (header.payload.signature). Claim standard: sub, iat, exp, aud, iss.

→ Autenticazione, sessioni, JWT e CORS

CORS

Meccanismo che limita richieste cross-origin lato browser. Risolto con header `Access-Control-*` lato server.

→ Autenticazione, sessioni, JWT e CORS

preflight OPTIONS

Richiesta automatica del browser prima di una chiamata cross-origin non semplice. Verifica permessi.

→ Autenticazione, sessioni, JWT e CORS

SameSite cookie

Flag che limita l'invio cross-origin dei cookie. Valori: Strict, Lax, None.

→ Autenticazione, sessioni, JWT e CORS

EXPLAIN

Comando SQL che mostra il piano di esecuzione di una query. Strumento di base per query lente.

→ Query, migrazioni e dati sporchi

migrazione

Modifica strutturale del database (nuova colonna, indice, vincolo). Da fare in due fasi per evitare downtime.

→ Query, migrazioni e dati sporchi

UTC

Coordinated Universal Time. Fuso 'zero' di riferimento. Regola: salva sempre in UTC, mostra sempre in locale.

→ Timezone, encoding e locale

ISO 8601

Formato standard per date: `2025-05-16T14:30:00Z`. Universalmente parsabile.

→ Timezone, encoding e locale

idempotenza

Ripetere l'operazione produce lo stesso risultato del farla una volta. Critica per retry sicuri.

→ Idempotenza, retry, DLQ e integrazioni

Idempotency-Key

Header HTTP che identifica una richiesta univoca. Permette retry sicuri senza creare duplicati.

→ Idempotenza, retry, DLQ e integrazioni

backoff esponenziale

Pausa tra retry che cresce esponenzialmente (es. 300, 600, 1200 ms) con jitter casuale.

→ Idempotenza, retry, DLQ e integrazioni

dead letter queue (DLQ)

Coda dove finiscono messaggi non processabili dopo tutti i retry. Si indaga e reprocessa con calma.

→ Idempotenza, retry, DLQ e integrazioni

lock file

File (`package-lock.json`, `yarn.lock`, `Cargo.lock`) che fissa versioni esatte di tutte le dipendenze.

→ Config, dipendenze e ambienti

Performance e osservabilità

LCP (Largest Contentful Paint)

Tempo di rendering dell'elemento principale del viewport. Target < 2.5s.

→ Profilare tempi, rendering, rete e Core Web Vitals

INP (Interaction to Next Paint)

Latenza tra interazione utente e prossimo paint. Target < 200ms.

→ Profilare tempi, rendering, rete e Core Web Vitals

CLS (Cumulative Layout Shift)

Somma degli spostamenti di layout inattesi. Target < 0.1.

→ Profilare tempi, rendering, rete e Core Web Vitals

TTFB (Time To First Byte)

Tempo dal click al primo byte di risposta. Target < 800ms.

→ Profilare tempi, rendering, rete e Core Web Vitals

User Timing API

`performance.mark` e `performance.measure` per marcare e misurare blocchi di codice.

→ Profilare tempi, rendering, rete e Core Web Vitals

Lighthouse

Strumento di audit di performance, accessibilità, SEO. Misura simulata, non utenti reali.

→ Profilare tempi, rendering, rete e Core Web Vitals

flamegraph

Visualizzazione di stack di chiamata in cui la larghezza = tempo. Rivela hot path.

→ Profiling backend e flamegraph

hot path

Percorso di codice dove si concentra il tempo di esecuzione. Bersaglio dell'ottimizzazione.

→ Profiling backend e flamegraph

sampling profiler

Profiler che registra lo stack ad intervalli regolari. Leggero ma statistico.

→ Profiling backend e flamegraph

OpenTelemetry

Standard per log, metriche e trace distribuiti. Supportato da molti vendor (Jaeger, Honeycomb, Datadog).

→ Log strutturati, metriche, trace, SLO

correlation id (trace id)

Id univoco che lega log, metriche e trace di una stessa richiesta. Indispensabile in sistemi distribuiti.

→ Log strutturati, metriche, trace, SLO

RED

Rate, Errors, Duration. Tre metriche di base per ogni servizio.

→ Log strutturati, metriche, trace, SLO

USE

Utilization, Saturation, Errors. Tre metriche di base per ogni risorsa (CPU, RAM, disco).

→ Log strutturati, metriche, trace, SLO

SLI (Service Level Indicator)

Misura concreta della qualità di servizio (es. `% richieste < 500ms`).

→ Log strutturati, metriche, trace, SLO

SLO (Service Level Objective)

Target dell'SLI in un periodo (es. `99% richieste < 500ms in 30 giorni`).

→ Log strutturati, metriche, trace, SLO

error budget

Margine di errore tollerato dato lo SLO. Esauritо → si ferma il rilascio di feature e si lavora su stabilità.

→ Log strutturati, metriche, trace, SLO

incident commander

Persona che coordina la war room durante un incidente. Non scrive codice, prende decisioni.

→ Incidenti, comunicazione e postmortem

status page

Pagina pubblica dello stato del servizio. Stati: Investigating, Identified, Monitoring, Resolved.

→ Incidenti, comunicazione e postmortem

MTTR (Mean Time To Recovery)

Tempo medio di recupero da un incidente. Metrica aggregata di processo.

→ Incidenti, comunicazione e postmortem

postmortem

Documento scritto dopo un incidente. Timeline, cause, lezioni, azioni correttive.

→ Incidenti, comunicazione e postmortem