modulo 04 / lezione 21
Isolare la causa
Riduzione, feature flag e disattivazione selettiva
Spegnere parti del sistema con feature flag o commenti chirurgici senza introdurre nuovi bug e senza perdere il sintomo.
In parole semplici
Quando un sistema è grande, il bug può vivere in tanti posti. Strategia: spegni parti finché il bug non scompare, poi riaccendi finché non riappare. Il punto di transizione è il tuo indagato principale.
Strumenti: commenti chirurgici, feature flag, mock di moduli, branch sperimentali.
Parole nuove
- disattivazione selettiva: spegnere temporaneamente una parte del sistema.
- feature flag: interruttore booleano che abilita/disabilita una funzionalità.
- mock: sostituzione di un modulo con uno semplificato per testarne il resto.
- kill switch: feature flag con effetto immediato pensato per spegnere in emergenza.
Cosa impari
- Spegnere componenti in modo reversibile.
- Introdurre feature flag temporanee per indagine.
- Tornare allo stato iniziale al termine senza lasciare traccia.
La regola d’oro: reversibilità
Ogni disattivazione deve essere reversibile. Se per spegnere modifichi 30 righe, ricordartele tutte al ritorno è impossibile.
Strumenti che garantiscono reversibilità:
- Branch git dedicato: tutto vive lì, non tocchi
main. git stashprima di toccare: puoi recuperare lo stato originale.- Commenti commenti
// TODO ROLLBACKsui punti modificati. - Feature flag in un file di config che torni a
falsecon una riga.
Disattivazione con feature flag
Esempio: sospetto bug nel nuovo carrello.
// config.js
export const FLAGS = {
carrelloV2: true, // accendiamo/spegniamo qui
};
// app.js
import { FLAGS } from "./config.js";
import { CarrelloV1 } from "./carrelloV1.js";
import { CarrelloV2 } from "./carrelloV2.js";
const Carrello = FLAGS.carrelloV2 ? CarrelloV2 : CarrelloV1;
Per indagare: passi a false. Se il bug sparisce, il problema è nel V2.
Vantaggi:
- Un solo punto da cambiare.
- Si attiva/disattiva senza redeploy in molti sistemi.
- Resta come strumento operativo anche dopo l’indagine.
Disattivazione con commento chirurgico
function processaOrdine(o) {
validaOrdine(o);
// calcolaSconto(o); // ROLLBACK: disattivato per indagine #142
inviaConferma(o);
}
Veloce ma rischioso: se ti dimentichi il commento, finisce in produzione.
Mitigazione:
// FIXME-INDAGINE-142: ripristinare prima del merge
Più un grep FIXME-INDAGINE prima di ogni PR.
Mock di un modulo
A volte non vuoi spegnere, vuoi sostituire.
// fetchUtenti.js originale fa una chiamata API
// fetchUtentiMock.js ritorna array statico
import { fetchUtenti } from "./fetchUtenti.js"; // ← commenta
// import { fetchUtenti } from "./fetchUtentiMock.js"; // ← scommenta
Se il bug sparisce con il mock, il problema è nella chiamata reale (rete, server, parsing) e non nella logica a valle.
Disattivazione “a bisezione”
Combinazione con il modulo 1: tagli a metà.
Esempio: una pagina con 6 sezioni mostra un bug. Spegni 3 sezioni alla volta:
- Spegni 1-3, mantieni 4-6. Bug? Sì → è in 4-6.
- Mantieni 4-5, spegni 6. Bug? No → è in 6.
- Indagine concentrata su sezione 6.
Tre disattivazioni hanno ridotto lo spazio del 5/6.
Quando NON disattivare
- Sistemi distribuiti in produzione: spegnere senza coordinamento può causare incident.
- Codice di sicurezza: non spegnere check di autenticazione o validazione input per “vedere se va meglio”. Diventerebbe un bug di sicurezza.
- Cose che fanno I/O lato server: un “lo spengo un attimo” può lasciare dati incoerenti.
In questi casi, indagine su ambienti di staging con dati di prova.
Kill switch in produzione
Versione adulta dei feature flag: un interruttore disponibile in produzione, manovrato da un sistema di gestione (LaunchDarkly, Unleash, GrowthBook, Statsig, oppure tabella su database).
Quando il fix completo è lontano, il kill switch ferma l’effetto del bug. Si studia con calma. Poi si rimuove.
Esercizio guidato
Riprendi una piccola app che usi (anche giocattolo). Identifica due funzionalità che potresti mettere dietro un flag:
- Aggiungi un oggetto
FLAGSin un file di config. - Avvolgi le due funzionalità con
if (FLAGS.x) { ... }. - Cambia il flag, ricarica, verifica che davvero la funzionalità sparisce.
- Documenta la procedura nel taccuino: come accendere, come spegnere, come ripristinare.
Errori frequenti del principiante
- Spegnere troppo in una volta. Il bug sparisce ma non sai quale spegnimento ha funzionato.
- Spegnere e dimenticarsi. Il fix temporaneo va in produzione e diventa scelta.
- Disattivare cose già rotte e dichiarare “sistemato”. Non hai indagato, hai nascosto.
- Mock di modulo per “fingere che funzioni”. I mock servono per isolare, non per bypassare.