Ciao, e benvenuto nella sesta puntata della ventiquattresima stagione. Nelle scorse puntate abbiamo capito il modello di Node: un solo lavoratore che non aspetta mai, con il codice asincrono. Oggi affrontiamo con onestà le conseguenze di questa scelta radicale, perché ogni scelta forte ha una forza e un limite, due facce inseparabili. Il filo singolo di Node lo rende straordinario per certe cose e inadatto per altre, e capire dove sta il confine è essenziale per usarlo bene. Oggi parliamo, con equilibrio, della forza e del limite del filo singolo.
Partiamo dalla forza, che è reale e notevole. Node, con il suo lavoratore unico che non aspetta mai, è incredibilmente efficiente proprio per il tipo di lavoro fatto di tante attese, quello tipico di un server web o di un servizio in rete. Ricordi la distinzione tra lavoro di attesa e lavoro di calcolo? Per il lavoro di attesa, chiedere dati a basi di dati, a dischi, ad altri servizi in rete, e aspettare, Node è nel suo elemento: gestisce migliaia di connessioni che aspettano, riempiendo i tempi morti, con pochissime risorse. Un server Node può servire un numero enorme di clienti simultanei, in modo leggero ed efficiente, proprio perché la maggior parte del loro tempo è attesa, e Node l'attesa la gestisce magnificamente. Per i servizi di rete che aspettano molto, è eccellente.
Voglio farti apprezzare quanto sia adatto Node al suo ambito. Pensa a un servizio che riceve tantissime richieste, ciascuna delle quali fa cose semplici ma con molte attese: chiedi un dato alla base di dati, aspetti, lo restituisci. Migliaia di richieste così, tutte insieme, sono il pane quotidiano di Node, che le serve con un solo lavoratore che non si ferma mai. È esattamente il lavoro per cui è stato pensato e in cui brilla: i servizi web, le interfacce di programmazione che fanno da tramite verso le basi di dati, i servizi in rete leggeri ma molto trafficati.
Ma ora, con altrettanta onestà, veniamo al limite, che è l'altra faccia inseparabile della stessa scelta, e voglio spiegartelo bene perché è cruciale. Il modello di Node funziona perché il lavoratore unico non si ferma mai. Ma cosa succede se gli dai un compito che non è attesa, bensì puro calcolo pesante, qualcosa che tiene occupato il processore a pensare intensamente per un tempo lungo? Ecco il problema: mentre il lavoratore unico è impegnato in quel calcolo pesante, non sta aspettando, sta lavorando davvero, e quindi non può occuparsi di nessun altro. Tutti gli altri clienti restano bloccati, in attesa che quell'unico lavoratore finisca il suo calcolo. L'intero ristorante si ferma, perché il cameriere unico è impegnato in un lungo lavoro da cui non può staccarsi.
Voglio rendere vivido questo limite con il ristorante. Il cameriere unico funziona benissimo finché ogni compito è breve o comporta attesa, perché può sempre passare a un altro tavolo. Ma immagina che a un tavolo gli chiedano di fare, di persona, un lungo e complicato lavoro di calcolo, che lo tiene occupato a lungo, senza pause. Mentre lo fa, non può servire nessun altro: tutti gli altri tavoli aspettano, il ristorante si paralizza. È esattamente ciò che accade a Node con un lavoro di puro calcolo intenso: il filo singolo, che è la sua forza per le attese, diventa il suo tallone d'Achille per il calcolo pesante.
Ne ricaviamo una lezione chiara e pratica, che riprende un tema ricorrente del podcast: Node è lo strumento giusto per certi lavori e sbagliato per altri. È eccellente per il lavoro fatto di tante attese e poco calcolo, i servizi web, le interfacce verso le basi di dati, i servizi in rete trafficati: lì è nel suo elemento. È invece una scelta poco adatta per il lavoro di puro calcolo intenso e prolungato, dove quel filo singolo diventa un collo di bottiglia. Sapere dove sta questo confine, tra lavoro di attesa e lavoro di calcolo, è la chiave per usare Node bene: sfruttarlo dove brilla, ed evitarlo, o usare altro, dove il suo modello va in crisi. Come sempre, si sceglie lo strumento in base al problema.
Voglio chiudere riprendendo il confronto con Go, perché illumina il senso di tutto. Ricordi come Go affronta la stessa sfida? Con tanti lavoratori leggeri, capaci di fare bene sia il lavoro di attesa sia quello di calcolo. Node, con il filo singolo, eccelle nell'attesa ma soffre nel calcolo pesante. Non è che uno sia migliore in assoluto: sono due compromessi diversi, adatti a esigenze diverse. È il bell'insegnamento di questo confronto: di fronte alla stessa sfida esistono soluzioni diverse, ciascuna coi suoi pregi e le sue debolezze, e la bravura sta nello scegliere quella giusta. Non esiste il vincitore assoluto, solo lo strumento adatto.
Per oggi ci fermiamo qui. Il filo singolo di Node ha una forza e un limite inseparabili. La forza: è straordinariamente efficiente per il lavoro fatto di tante attese, i servizi web e di rete, dove serve migliaia di clienti con pochissime risorse riempiendo i tempi morti. Il limite: se gli dai un compito di puro calcolo pesante, quel lavoratore unico si blocca su di esso e tutti gli altri clienti aspettano, come un ristorante paralizzato dal cameriere impegnato in un lungo lavoro. La lezione è scegliere lo strumento per il problema: Node dove ci sono tante attese, altro dove c'è calcolo intenso. È l'opposto complementare di Go. Nella prossima puntata vediamo come Node struttura il codice: i moduli. Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.