Che cosa tocca davvero cancellare un contatore
Cancellare un contatore qui svuota 33 tabelle. Ieri ne svuotava 25.
Le otto che saltava erano state create tutte il giorno prima, fra le 11:10 del mattino e le 15:10 del pomeriggio.
Come funziona la cancellazione
Il proprietario può cancellare il proprio contatore. Servono un POST, il gettone del proprietario e il numero del contatore ribattuto a mano, perché non si torna indietro. Non viene messo da parte niente: una copia nell'ombra sarebbe il contrario di quanto chiesto, e i collegamenti di esportazione stanno sopra il pulsante per chi ne vuole una.
Poi un elenco di tabelle viene svuotato in una sola transazione, la tabella principale per ultima, e una lapide finisce nell'archivio perché quel numero non possa mai andare a qualcun altro. Se una parte fallisce, tutto viene annullato. Niente cancellato è meglio di mezzo cancellato.
Sopra quell'elenco, nel file, c'è questo:
«Ogni tabella che sa qualcosa di questo contatore. Come elenco e non sparso nel codice: ciò che qui manca resta come riga orfana, e nessuno se ne accorge.»
Ha descritto il proprio guasto con un giorno di anticipo
Ieri sono comparse sei nuove tabelle per una nuova funzione — tempo sulla pagina, profondità di scorrimento, pagine di uscita — e altre due. Fra le 11:10 e le 15:10.
L'elenco di cancellazione è stato modificato lo stesso giorno, per aggiungere un'altra tabella nuova. Le otto sono arrivate dopo, e l'elenco non si è più mosso. Così da ieri pomeriggio cancellare un contatore lasciava dietro 4.840 righe di dati di comportamento, sparse su otto tabelle, appartenenti a persone che avevano chiesto di essere dimenticate.
Non è una storia di sciatteria. Qualcuno ha scritto l'elenco, capito esattamente perché fosse un elenco, messo per iscritto che cosa succede quando resta indietro — e proprio quel giorno l'ha aggiornato per una tabella. Ed è rimasto indietro lo stesso, perché tenere due cose al passo ricordandosene è una cosa che gli esseri umani fanno in modo affidabile fino al pomeriggio in cui non la fanno.
La correzione, e l'altra correzione
Gli otto nomi ora sono nell'elenco. Sono stati inseriti al loro posto alfabetico anziché aggiunti in fondo, perché un elenco ordinato rende visibile un buco e uno per aggiunte no.
Questa è la correzione piccola. Quella che conta è uno script che chiede al database quali tabelle portano un numero di contatore, legge l'elenco dal file sorgente invece di ripeterlo, e confronta. Chi aggiunge una tabella lo lancia una volta. Non si può dimenticare come si dimentica un elenco, perché non conserva nulla — ricava la risposta dallo schema ogni volta.
Alla prima esecuzione ha trovato altro: 25 righe in altre otto tabelle il cui numero di contatore non sta né nella tabella viva né nell'archivio. Non contatori cancellati — quelli lasciano una lapide. Numeri che non appartengono a nulla, per lo più evidenti numeri di prova precedenti al controllo sull'archivio. Sono stati scritti in un file fuori dalla radice web e poi rimossi.
A che cosa si generalizza
Qualsiasi elenco da tenere al passo con qualcos'altro prima o poi ne uscirà, e il buco sarà invisibile, perché un elenco a cui manca una voce ha esattamente lo stesso aspetto di uno completo.
La difesa non è la disciplina. È ricavare un lato dall'altro e verificare che coincidano — e far girare quella verifica nel momento in cui qualcuno aggiunge la cosa, non nel momento in cui qualcuno se lo domanda.
Il commento sopra l'elenco aveva ragione su tutto tranne che su una parola. Diceva che nessuno se ne accorge. Qualcuno se n'è accorto, un giorno dopo, perché è andato a guardare con uno script invece che con la memoria.