La conversazione che sopravvive alle interruzioni
Un telefono perde il collegamento con il server molto più spesso di quanto si creda: una galleria, il passaggio dal wifi alla rete mobile, un segnale debole. L'app si riconnette da sola, in pochi secondi. Ma fino al 19 maggio tornava da ogni interruzione senza il filo degli ultimi minuti, perché quel filo viveva nel collegamento stesso. Da allora, la conversazione in corso appartiene alla persona, non al cavo: una riconnessione entro mezz'ora la ritrova intatta, cronologia e interlocutore compresi. E nemmeno un errore passeggero dal lato del server la cancella più.
Dieci secondi di galleria
Giulia è in treno, sta organizzando il fine settimana. « Segna che Matteo arriva venerdì sera, dorme da noi. » L'app conferma, la scheda è creata. « E ricordami di tirare fuori il letto in più giovedì. » Nuova conferma, poi una domanda di rimando: « per una notte o per due? ». Il treno entra in una galleria. In alto sullo schermo, il puntino che segnala il collegamento passa dal verde al rosso. Dieci secondi. Il treno esce, il puntino torna verde. Giulia risponde: « due ».
Prima del 19 maggio, il seguito era imbarazzante. « Due cosa? » O peggio: una risposta che ripartiva dalla memoria lunga, ritrovava la scheda di Matteo e ci ricamava intorno, senza più sapere che una domanda era appena stata posta. I ricordi c'erano tutti. Il nome di Matteo, la data, il letto in più, niente era andato perduto. Quello che mancava era il minuto prima.
Questo difetto ha una particolarità: si vede solo su un telefono in movimento. In treno, in ascensore, uscendo di casa, il collegamento si rompe di continuo, ed è proprio lì che viene voglia di parlare invece di scrivere.
Cosa significa un'interruzione per un telefono
Il telefono e il server si parlano attraverso un canale che resta aperto per tutta la sessione. È ciò che permette alla voce di circolare nei due sensi senza ristabilire una connessione a ogni frase. Ma un canale aperto ha una fragilità: dipende dalla rete che lo sostiene, e un telefono cambia rete in continuazione.
Varchi la porta di casa: il wifi molla, la rete mobile prende il testimone, e il canale non sopravvive al passaggio. Attraversi una zona di segnale debole: un apparecchio da qualche parte tra il telefono e il server dichiara morto il canale, senza che nessuno abbia deciso niente. Resti in silenzio qualche minuto: alcune reti chiudono una linea che non dice nulla. Nessuno di questi eventi è un guasto. È la vita normale di un dispositivo che si porta in tasca.
L'app sa riprendersi, e lo fa da sola. Quando il canale cade, prova a riaprirlo dopo un secondo. Se fallisce, riprova dopo due secondi, poi quattro, poi otto, senza mai superare un tetto di quindici secondi tra due tentativi. Nel frattempo, il puntino in alto sullo schermo passa al rosso, all'arancione per la durata di un tentativo, poi torna al verde. È tutto ciò che si vede, ed è voluto: una riconnessione non deve essere un evento.
Quando il canale è riaperto, il server comincia con un saluto: un primo messaggio che contiene un identificativo di conversazione. Tutta la faccenda sta in quell'identificativo. Se è nuovo, la conversazione riparte da zero. Se è lo stesso di prima della galleria, il filo è ritrovato.
Prima: un filo legato al cavo
Dal lato del server, ciò che riceve le tue frasi, fa lavorare il modello, esegue i suoi strumenti e ti rimanda la risposta è una specie di direttore d'orchestra. È lui che tiene la conversazione in corso: gli ultimi scambi, in una finestra scorrevole che copre abbondantemente qualche decina di turni; la persona dichiarata come chi tiene il telefono, quando non sei tu a parlare; e l'elenco delle schede create dall'inizio della conversazione, quelle che un tocco sotto la risposta riapre.
Fino al 19 maggio, un direttore d'orchestra veniva costruito per ogni canale. Un canale, un direttore, una conversazione. Finché il canale viveva, tutto andava bene. Ma ogni galleria fabbricava un canale nuovo, quindi un direttore nuovo, quindi una conversazione vuota. Il server vedeva arrivare un identificativo sconosciuto e faceva ciò che fa con uno sconosciuto: ripartiva dal nulla, con la sola memoria lunga.
C'era di peggio. La chiusura del canale veniva presa per la fine della conversazione: in quell'istante veniva riassunta, archiviata nella memoria lunga e tolta dalla memoria viva. La galleria di Giulia non si limitava a cancellare la domanda sul letto in più, chiudeva la conversazione, come se lei avesse salutato.
Da qui i sintomi. Un « sì » lanciato dopo un'interruzione riceveva « sì a cosa? ». Una richiesta formulata in due tempi, la prima metà prima della galleria e la seconda dopo, non aveva più la prima metà. E un telefono prestato tornava a essere, senza preavviso, il telefono del suo proprietario, con il rischio di archiviare sotto il nome sbagliato ciò che la persona di passaggio aveva appena detto.
Da allora: il filo appartiene alla persona
La correzione del 19 maggio è uno spostamento. C'è un solo direttore d'orchestra per tutto il server, ed è lui che custodisce tutte le conversazioni in corso, una per persona, indipendentemente dai canali che vanno e vengono. Ciò che dipendeva dal canale, lo schermo a cui inviare una scheda da mostrare, il modo di programmare un promemoria per quel telefono preciso, gli viene consegnato a ogni turno, invece di essere sigillato nella sua costruzione.
Accanto, il server tiene una piccola tabella: per ogni persona, la conversazione in corso e l'ora della sua ultima attività. « Persona » ha un senso preciso. Se hai un account, è l'account. Se usi l'app senza account, è il dispositivo, riconosciuto dall'identificativo che porta. In entrambi i casi, la chiave non cambia quando cambia il canale.
Quando un canale si apre, il server guarda quella tabella. Se la persona aveva una conversazione attiva meno di trenta minuti fa, le restituisce lo stesso identificativo, e il direttore d'orchestra ritrova tutto: la cronologia, l'interlocutore dichiarato, le schede della sessione. Altrimenti ne crea uno nuovo. Nei registri del server, questo dà una riga per apertura: « conversazione ripresa, età 9 s », oppure « nuova conversazione ». La galleria di Giulia è diventata una riga del primo tipo.
E « due » torna a essere una risposta. Il modello ha la domanda sotto gli occhi, sa a cosa risponde la parola, aggiusta il promemoria. Niente di spettacolare: è esattamente ciò che sarebbe successo senza galleria.
Perché trenta minuti
La cifra non è caduta dal cielo. È la stessa della regola del telefono prestato, imparata quella stessa mattina: dopo mezz'ora di silenzio, l'app considera che il dispositivo sia tornato al suo proprietario. Una conversazione obbedisce alla stessa logica. Trenta minuti senza una parola non sono più un'interruzione, sono una pausa, e una pausa di quella lunghezza è il segnale naturale che si è passati ad altro.
Un dettaglio conta nel calcolo. L'ora dell'ultima attività viene aggiornata nel momento in cui arriva la tua frase, prima che il modello si metta al lavoro, non dopo. Una risposta lunga, una ricerca sul web, una catena di strumenti che si prende il suo tempo, non può quindi spingerti fuori dalla finestra mentre aspetti.
Ciò che supera i trenta minuti non è perduto per questo. La conversazione viene archiviata, ed è un altro meccanismo a prendere il testimone: gli scambi passati, letti così com'erano e datati, vengono consegnati al modello all'inizio della conversazione successiva. È ciò che risponde a « di cosa parlavamo l'ultima volta? », ed è l'argomento di un altro articolo, dello stesso giorno. Due meccanismi, due scale di tempo: la sopravvivenza all'interruzione copre il minuto, il richiamo delle conversazioni passate copre i giorni.
Andarsene non è essere interrotti
Bisogna distinguere due cose che il server non distingueva. Essere interrotti è qualcosa che si subisce: la galleria, il wifi che molla, la linea chiusa dalla rete. Andarsene è qualcosa che si decide: esci dall'app per aprirne un'altra, o torni alla schermata iniziale.
Quando te ne vai davvero, l'app avvisa il server che la conversazione è finita. Viene archiviata, e la prossima apertura riparte con una conversazione nuova, con i riassunti delle precedenti a portata di mano. È una scelta: una conversazione che si è lasciata è una conversazione conclusa, e riprenderla parola per parola un'ora dopo sarebbe più disorientante che utile.
Ma « andarsene davvero » è più stretto di quanto sembri. Aprire la tastiera, tirare giù la tendina delle notifiche, veder comparire una finestra di sistema: niente di tutto questo è un andarsene, e l'app ha dovuto imparare a non prenderli più per tali. Conta solo il passaggio completo in secondo piano. Il resto, gallerie comprese, non è una tua decisione, e il filo regge.
Una fine che non è più una porta che si chiude
Se la chiusura del canale non significa più la fine della conversazione, serve un altro momento per archiviarla, altrimenti compaiono due problemi. Le conversazioni abbandonate, quelle in cui la persona ha semplicemente posato il telefono, non raggiungerebbero mai la memoria lunga. E la memoria viva del server si riempirebbe di conversazioni che nessuno verrà a cercare.
Il server passa quindi in rassegna, ogni cinque minuti, la sua tabella delle conversazioni in corso. Quelle la cui persona tace da più di trenta minuti vengono archiviate, come lo sarebbero state un tempo alla chiusura del canale, e poi tolte dalla memoria viva. Una conversazione abbandonata finisce quindi comunque nel database, con un riassunto, e niente si accumula. L'archiviazione non arriva più nel secondo in cui il canale cade, ma alla fine della finestra: per la persona che riprende, è proprio lo scopo; per quella che non riprende, non cambia nulla.
L'altra interruzione, quella che non viene dalla rete
Lo stesso pomeriggio ha riparato una seconda famiglia di interruzioni, invisibili queste, perché avvengono tra il server e i servizi da cui dipende. La rete di Giulia è perfetta, il puntino è verde, eppure l'app risponde come se avesse perso il filo.
Il primo caso è quello del modello stesso. Capitava che il servizio remoto restituisse una risposta vuota alla prima chiamata di un turno, un sovraccarico travestito da successo. Il server lo prendeva per un guasto, e tu sentivi la frase di riserva, quella che annuncia un problema tecnico. Quella prima chiamata viene ora ritentata una volta, dopo una breve pausa, prima di rinunciare. Una volta sola, e solo la prima chiamata del turno. Nel mezzo di una catena di strumenti, ripetere una chiamata vorrebbe dire eseguire due volte ciò che è già stato fatto: due schede, due promemoria. Una risposta mancata si può riparare. Una scheda doppia no, non senza che qualcuno se ne accorga.
Il secondo caso è quello della memoria consegnata al modello. Viene assemblata a partire da più fonti interrogate insieme, e bastava una sola fonte in ritardo per svuotare l'insieme. Il modello riceveva allora una memoria bianca e rispondeva, in buona fede, di non ricordare. La regola è diventata « tutto ciò che risponde viene tenuto », e il dettaglio di questo cambiamento è raccontato nell'articolo vicino. Quello che conta qui è la parentela: una fonte che tossisce e una galleria producono la stessa frase in bocca all'app, e meritavano di essere trattate lo stesso giorno.
Infine, a ogni turno, il server annota nei suoi registri ciò che ha davvero consegnato al modello: conversazioni recenti, ricordi di ogni livello, regole, e la dimensione del tutto. Prima, « ha dimenticato » era una segnalazione impossibile da istruire. Ora si può dire se il filo c'era ed è stato letto male, oppure se mancava.
Ciò che non sopravvive ancora
Quel giorno ha fissato un quadro, non ha risolto ogni caso, ed è meglio dire quali restano aperti.
Una frase pronunciata durante quei dieci secondi non parte. Se il puntino è rosso nel momento in cui rilasci l'orbe, l'app non può inviare la tua frase, e la ridici quando è tornato verde. Il filo è intatto, ma quel turno è da rifare. Mettere quelle frasi in attesa per inviarle al ritorno della rete è un cantiere a parte.
Un riavvio del server si porta via le conversazioni non ancora archiviate, dato che vivono nella memoria viva tra due archiviazioni. Scrivere ogni turno nel database man mano, perché un riavvio costi al massimo una frase, è il seguito logico, e aspetta che questo abbia dato prova di sé.
Oltre i trenta minuti, è una nuova conversazione, ed è voluto. E la risposta stessa ha bisogno della rete: capire la tua voce, riflettere, risponderti a voce alta, tutto questo avviene sul server. Ciò che sopravvive all'interruzione è il filo. Non la possibilità di parlare dentro la galleria.
Per Giulia, la giornata si riassume semplicemente. Può tenere una conversazione in treno, e il treno ha il diritto di entrare in una galleria. Quando ne esce, la domanda posta prima è ancora posta, la persona che parlava parla ancora, e « due » vuol dire due notti. È poca cosa da enunciare. Era la differenza tra un'app che si usa da seduti e un'app che si usa camminando.
