Ciao, e benvenuto nella quinta puntata della cinquantasettesima stagione. Oggi affrontiamo il problema più famoso, più subdolo e più istruttivo di tutti i mappatori, quello che colpisce prima o poi ogni sviluppatore e che spiega, meglio di qualunque discorso, perché non puoi ignorare cosa c'è sotto. Oggi parliamo del flagello delle interrogazioni nascoste.
Partiamo dalla scena del delitto, perché è ingannevolmente innocente. Immagina di dover mostrare una pagina con cento utenti, e accanto a ciascuno il nome della sua azienda. Scrivi un codice pulito e ovvio: prendi la lista dei cento utenti, poi per ognuno leggi il nome della sua azienda e lo stampi. Guardi il codice e ti sembra un'unica operazione, semplice e lineare. Nulla, assolutamente nulla, ti fa pensare che ci sia qualcosa che non va. Eppure hai appena scritto, senza saperlo, uno dei disastri di prestazioni più comuni al mondo.
Voglio dirti cosa succede davvero, perché è il cuore della puntata. Dietro le quinte, il mappatore fa così. Prima lancia un'interrogazione per prendere i cento utenti: una. Poi, quando nel tuo ciclo chiedi l'azienda del primo utente, lui lancia una seconda interrogazione per andarla a prendere. Per il secondo utente, un'altra interrogazione. Per il terzo, un'altra ancora. Cento utenti, cento interrogazioni per le aziende, più quella iniziale per la lista. Centouno interrogazioni al database, dove ne sarebbero bastate due. Il tuo codice sembrava chiedere una cosa sola, e invece ne ha chieste centouno. La pagina rallenta, il database fatica, e nel tuo codice non c'è una sola riga che sembri sbagliata.
Voglio darti il nome, perché lo incontrerai ovunque. Questo problema ha un nome, e vale la pena impararlo: si chiama il problema dell'uno più enne. Una interrogazione iniziale per prendere la lista, più una interrogazione aggiuntiva per ciascuno degli enne elementi della lista. Sembra banale con cento utenti; diventa devastante con decine di migliaia. È il singolo motivo più frequente per cui un'applicazione costruita con un mappatore diventa misteriosamente lenta. E la ragione per cui è così insidioso è precisamente quella che ripetiamo tutta la stagione: il mappatore ha nascosto le interrogazioni così bene che il disastro è diventato invisibile.
Voglio darti l'immagine che rende chiara questa idea, perché la fissa. Pensa a un assistente che deve recuperare cento pratiche dall'archivio. Il modo intelligente è andare in archivio una volta e tornare con tutte e cento le pratiche in un colpo solo. Il modo del flagello è andare in archivio, tornare con l'elenco dei cento nomi, e poi fare cento viaggi separati, uno per ogni singola pratica. Stesso risultato finale, ma cento viaggi invece di uno. L'assistente non è stupido: sta solo eseguendo alla lettera quello che, senza accorgertene, gli hai chiesto di fare. Il flagello non è un errore del mappatore. È il mappatore che fa esattamente quello che gli hai detto, solo che tu non sapevi cosa gli stavi dicendo.
Voglio darti la cura, perché per fortuna c'è. La soluzione è dire al mappatore, in anticipo, che quando prendi gli utenti vuoi anche le loro aziende, tutte insieme. Con una sola istruzione in più, lui capisce e va a prendere tutto in due sole interrogazioni, non centouno. Ogni mappatore ha un modo per dirlo, un comando che significa: caricali insieme. Ma, e qui sta il punto cruciale, per sapere che quel comando ti serve, devi prima sapere che il flagello esiste. E per accorgerti che sta succedendo, devi essere capace di guardare le interrogazioni che il mappatore genera davvero, sotto la superficie del tuo codice pulito.
Voglio darti la lezione, perché è il cuore di tutta la stagione. La lezione è netta: non puoi usare bene un mappatore senza saper leggere il linguaggio del database che genera. L'astrazione ti regala codice pulito e leggibile, ed è meraviglioso. Ma quando l'astrazione perde, e prima o poi perde sempre, l'unica salvezza è saper sollevare il coperchio e guardare la macchina sotto. Chi conosce il database vede il flagello e lo risolve in un minuto. Chi si è affidato ciecamente alla magia lo subisce, senza nemmeno capire da dove arrivi la lentezza. La comodità non ti esonera dalla comprensione: la premia.
Per oggi ci fermiamo qui. Abbiamo visto il flagello delle interrogazioni nascoste. Un codice pulito e ovvio, cento utenti e le loro aziende, nasconde un disastro: il mappatore lancia una interrogazione per la lista, e poi una per ciascun utente, centouno invece di due. Si chiama il problema dell'uno più enne, ed è il motivo più comune per cui un'applicazione col mappatore diventa lenta. Come un assistente che fa cento viaggi in archivio invece di uno. La cura c'è, un comando che dice caricali insieme, ma per usarla devi sapere che il flagello esiste, e devi saper guardare le interrogazioni generate sotto il tuo codice. La lezione: non usi bene il mappatore senza leggere il linguaggio del database. Nella prossima puntata: pigro o impaziente, quando caricare i dati collegati. Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.