Un booleano che rispondeva a due domande
Scritta agosto 2026
Dal costruire da solo una piattaforma gestionale multi-tenant — una di quattro note su ciò che il lavoro ha insegnato davvero.
La piattaforma aveva una colonna sulla tabella dei workspace chiamata is_demo. Aveva raccolto due significati, e per anni niente ha rivelato che fossero due.
Il primo significato era i dati qui sono usa e getta — controllato prima che a un'esecuzione automatica fosse permesso scrivere alcunché, perché un test non potesse mai creare ed eliminare record dentro il workspace reale di qualcuno.
Il secondo era non toccare il mondo esterno — imposto su ogni funzione che manda una email, un SMS, un webhook o una fattura elettronica giuridicamente vincolante, ed è la ragione per cui un workspace dimostrativo trattiene le proprie integrazioni in uscita.
Per un workspace mostrato ai potenziali clienti sono vere entrambe insieme, quindi il sovraccarico non è mai emerso. È emerso il giorno in cui mi serviva un banco di prova: un workspace dentro il database di produzione contro cui guidare le esecuzioni end-to-end, perché un'esecuzione su un portatile dimostra il codice e non il rilascio.
Il banco ha bisogno di risposte opposte
Esiste esattamente per essere scritto e buttato via — primo significato, vero. E l'insieme dei comportamenti che non riusciva a dimostrare era esattamente l'insieme che il secondo significato blocca: posta in uscita, messaggistica, invio di webhook, trasmissione di fatture. Tutto ciò per cui avevo più bisogno di prove.
La correzione ovvia avrebbe sbloccato dieci superfici e, nella stessa istruzione, rotto ogni test che si era già guadagnato la propria etichetta.
Azzerare il flag era un solo UPDATE. Avrebbe però anche fatto sì che il risolutore dei workspace rifiutasse il banco, perché quel risolutore legge la stessa colonna per decidere dove è lecito scrivere — quindi ogni test di processo che si era guadagnato un'etichetta di maturità avrebbe smesso di essere ri-eseguibile. Una istruzione, una superficie sbloccata, tutte le prove invalidate.
Perciò è una separazione, non un update
La migrazione ha diviso la colonna in is_disposable e is_demo, e poi le ha impostate in modo indipendente: il workspace destinato ai prospect tiene entrambe, quello reale nessuna, il banco è usa e getta e non è una demo. Due domande, due colonne, e adesso ogni guardia legge quella che intendeva davvero.
La forma generale vale più del caso specifico. Un booleano che ha accumulato in silenzio un secondo significato è invisibile finché tutti i casi concordano, e il caso che discorda è di solito quello che hai costruito apposta per provare qualcosa. Quando un flag inizia a governare comportamenti che non hanno niente a che fare con il suo nome, non è un problema di nomi da risolvere con una rinomina. Sono due colonne che indossano un cappello solo.
Un poscritto, perché è costato più della migrazione. Un ramo che si era staccato prima che questa cosa atterrasse ha riscritto in blocco la documentazione circostante e si è fuso senza conflitti, così per novanta minuti il registro scritto descriveva la vecchia disposizione — quella che suonava più sicura — mentre lo schema si era già mosso. Un merge che si risolve senza conflitti non è un merge che ha conservato ciò che diceva l'altro ramo — e la metà sopravvissuta era quella falsa.