Essere uno studente di Ingegneria Informatica e lavorare come sviluppatore web significa una cosa sola: il tempo è la risorsa più scarsa dell'Universo.
Ogni mattina cerco di incastrare lo studio con le task del lavoro. E ogni mattina, la mia giornata inizia con una lezione pratica di programmazione e termodinamica: preparare il caffè.
Sembra un'azione banale, ma nasconde uno dei concetti più importanti dello sviluppo software moderno.
Sincrono vs Asincrono: Questione di Attese
Immaginate la scena. Vado in cucina, riempio la moka, accendo il fuoco e... resto immobile a fissarla. Non parlo, non preparo la colazione, non accendo il PC. Fisso la moka per 5 minuti finché il caffè non è pronto.
Questo è il codice sincrono. Il programma esegue un'istruzione alla volta e, se un'operazione richiede tempo, tutto il resto si blocca. Se i nostri siti web funzionassero così, ogni volta che caricate una foto, l'intera pagina rimarrebbe freezata finché il download non è completato.
Fortunatamente, nella vita reale siamo esseri asincroni. Metto la moka sul fuoco (avvio il processo) e, mentre l'acqua si scalda, io accendo il PC, apro gli appunti dell'università e preparo l'editor di codice.
Il Mio Primo "Fango" con le API
Ricordo il mio primo vero scontro con l'asincronia in JavaScript. Stavo imparando React e volevo creare un widget che chiamasse l'API pubblica della NASA per mostrare l'Astronomy Picture of the Day (APOD).
Scrivo la mia funzione, faccio la fetch, salvo il risultato in una variabile e, alla riga esattamente successiva, cerco di passare l'URL dell'immagine al tag <img />.
Risultato? Schermata bianca e un inesorabile Cannot read properties of undefined in console. L'interfaccia aveva provato a renderizzare il DOM prima ancora che i server della NASA avessero il tempo di far viaggiare la risposta fino al mio router.
In pratica, stavo cercando di bere il caffè un millisecondo dopo aver acceso il fuoco sotto la moka. Tazza vuota e codice rotto.
La Soluzione: Promesse e Attese
In JavaScript (e in molti altri linguaggi), risolviamo questo problema "promettendo" al sistema che il dato arriverà, ma permettendogli di fare altro nel frattempo.
L'errore comune agli inizi è usare await bloccando subito il processo. Se vogliamo ottimizzare il tempo, avviamo la richiesta e la aspettiamo solo quando ci serve davvero:
async function iniziaGiornata() {
console.log("1. Accendo il fuoco sotto la moka (Chiamata API alla NASA)...");
// Lancio la richiesta, ma NON metto 'await' qui! Ottengo una Promise.
const promessaFoto = fetch('https://api.nasa.gov/planetary/apod');
console.log("2. Intanto apro gli appunti di Analisi 1...");
// Il thread non è bloccato! Posso eseguire il rendering del resto della UI.
// Ora che ho caricato il layout, mi fermo e aspetto i dati
const response = await promessaFoto;
const datiSpaziali = await response.json();
console.log("3. Dati arrivati! Mostro l'immagine di:", datiSpaziali.title);
}
await iniziaGiornata();
Se eseguite mentalmente questo codice, l'ordine delle azioni nella console sarà 1, poi 2 (mentre i dati viaggiano in background), e infine 3.
Il Takeaway
Che voi stiate studiando per un esame difficile o progettando un'applicazione web, la regola d'oro è non bloccare mai il "thread principale".
Avviare i compiti lunghi, non restare bloccati a fissare lo schermo aspettando che un processo termini da solo (come la latenza di rete) e continuare a fare progressi sulle altre piccole task. È il primo passo per mantenere fluida un'applicazione, e decisamente anche la nostra vita da studenti.