Performance
Qualidade de Software
Engenharia
Observabilidade
Arquitetura

Prestazioni del software: cosa insegnano i casi reali sulla qualità

Le prestazioni non sono un lusso ingegneristico, rappresentano la differenza tra un prodotto in grado di crescere e uno che spreca silenziosamente denaro.

Ogni squadra ha vissuto la scena. Il prodotto funziona perfettamente nella demo, supera i test, soddisfa il cliente. Tre mesi dopo, con il traffico reale, l'applicazione inizia a soffocare. Le pagine richiedono tempo. Il supporto è pieno di lamentele. E nessuno sa esattamente dove sia il problema.

Le prestazioni raramente si interrompono tutte in una volta. Si degrada poco a poco, nascosto dietro parametri che sembravano comodi quando il sistema aveva cento utenti e diventavano insostenibili con centomila. Il pericolo non è il picco evidente, è l'erosione silenziosa.

Voglio utilizzare questo articolo per esaminare la performance per quello che è realmente: una decisione di qualità che ha conseguenze dirette sul flusso di cassa, sulla reputazione e sulla capacità di crescita. Non come un problema di “ottimizzazione del codice”, ma come sintomo di maturità ingegneristica.

La prestazione è qualità, non abbellimento

Esiste una cultura pigra che separa il "farlo funzionare" dal "farlo velocemente", come se il secondo fosse un passaggio facoltativo per dopo. Questa separazione è falsa. Un sistema lento è un sistema difettoso, solo che il guasto si manifesta con l'abbandono dell'utente, non con una schermata di errore.

La tesi che difendo è semplice: la prestazione è un requisito non funzionale che deve essere trattato con lo stesso rigore di un requisito funzionale. Se la tua definizione di "pronto" non include il comportamento sotto carico, la tua definizione di pronto è incompleta.

L'ho visto dolorosamente nei prodotti governativi digitali. Un portale di servizi pubblici può essere tecnicamente corretto e tuttavia fallire il giorno in cui scade il termine di registrazione o dichiarazione. Quel giorno l'accesso di punta è la regola, non l'eccezione. Ed è proprio in quel giorno che si conquista o si perde la fiducia dei cittadini.

Caso 1: il collo di bottiglia era nella banca, non nel codice

Un team ha trascorso settimane a riscrivere il livello dell'applicazione convinto che il problema fosse la lingua. Hanno cambiato librerie, rifattorizzato le funzioni, combattuto con il framework. La latenza è scesa leggermente.

Quando finalmente hanno strumentato le query, è emersa la verità: una singola query senza indice scansionava l'intera tabella con ciascuna richiesta. Il problema non è mai stata l'applicazione. Era il famoso N+1 sotto mentite spoglie, moltiplicato per ogni voce di una lista che cresceva ogni mese.

La lezione non è tecnica, è culturale. Senza osservabilità, metriche, tracce, log strutturati, non ottimizzi, immagino. E le congetture sono costose. Il team ha trascorso settimane nel posto sbagliato perché non aveva modo di vedere dove veniva effettivamente impiegato il tempo.

La regola resta: misurare prima di spostarsi. L’ottimizzazione senza misurazione è superstizione.

Caso 2: la cache che ha mentito

Un altro prodotto ha risolto i tuoi problemi di caricamento con un caching aggressivo. Ha funzionato magnificamente, finché i dati non hanno iniziato a diventare obsoleti. Gli utenti vedevano vecchi equilibri, stati già cambiati, informazioni che non corrispondevano alla realtà.

Le prestazioni sono state ottenute a scapito della correttezza. E la correttezza, nei sistemi che hanno a che fare con il denaro o con le decisioni dei cittadini, non è negoziabile.

L'apprendimento qui riguarda i compromessi espliciti. La cache è uno degli strumenti più potenti disponibili, ma ogni cache è una scommessa sul fatto che i dati potrebbero invecchiare leggermente. Questa scommessa deve essere una decisione consapevole e documentata, con una chiara strategia di invalidazione, non una patch applicata sotto pressione.

L'errore comune è considerare la cache come una magia. Quando il team non capisce esattamente cosa viene messo in cache, per quanto tempo e perché, il caching smette di essere un'ottimizzazione e diventa una fonte di bug difficili da riprodurre.

Caso 3: il sistema che si è scalato verticalmente fino a non poter più funzionare

C'è uno schema classico di un'azienda in crescita: il traffico aumenta, la risposta è noleggiare una macchina più grande. Funziona una, due, tre volte. Fino al giorno in cui non esisterà una macchina più grande, o costerà assurdamente.

Un caso che ho seguito aveva esattamente questo limite. Il sistema era monolitico, con lo stato archiviato nella memoria locale, il che impediva l'esecuzione di più istanze in parallelo. Il ridimensionamento orizzontale ha richiesto la riscrittura del modo in cui l'applicazione salvava le sessioni.

La correzione non è stata eroica. Stava esternalizzando lo Stato, rendendo l’applicazione veramente apolide e mettendo in primo piano un sistema di bilanciamento. Da quel momento in poi, la crescita è diventata una questione di aggiunta di istanze, qualcosa che l’infrastruttura cloud risolve quasi automaticamente.

La visione strategica: l’architettura fissa il limite di crescita molto prima del codice. Le decisioni prese nella fase iniziale, quando il prodotto è piccolo, determinano quanto costoso sarà espanderlo quando sarà grande.

Cosa hanno in comune questi casi

Nessuno di questi problemi era, in origine, un problema linguistico o strutturale. Erano tutti problemi di diagnosi, compromesso e architettura. I team maturi non sono quelli che scrivono il codice più velocemente, sono quelli che capiscono dove viene impiegato il tempo e prendono decisioni ponderate su dove investire gli sforzi.

Tre principi attraversano i tre casi:

  • Misura prima di ottimizzare. Senza dati, correggi il posto sbagliato.
  • I compromessi devono essere espliciti. Ogni ottimizzazione scambia una cosa con un'altra. Scopri cosa stai scambiando.
  • L'architettura è il destino. Il costo della scalabilità è definito da decisioni strutturali, non da dettagli di implementazione.

La trappola dell'ottimizzazione prematura e tardiva

C'è un detto ben noto in ingegneria secondo cui l'ottimizzazione prematura è la radice di molti mali. È vero, ma è diventata una scusa. I team usano questa frase per ignorare le prestazioni finché il problema non esplode nella produzione.

Il punto corretto è nel mezzo. Non ottimizzare ciò che nessuno usa. Ma stabilisci tempestivamente limiti di tempo di risposta accettabili e misurati in base ad essi. Non è necessario ottimizzare tutto, è necessario sapere quando qualcosa ha superato il limite dell'inaccettabile.

La riflessione critica onesta è questa: la maggior parte dei disastri prestazionali non deriva da una mancanza di conoscenza tecnica. Deriva da una mancanza di visibilità e di cultura. I team che non misurano, che non parlano del carico previsto, che non esaminano le query più pesanti, ripeteranno gli stessi errori indipendentemente dallo stack che utilizzano.

Prestazioni come vantaggio aziendale

Per chi guida vale la pena invertire la logica. Le prestazioni non sono un costo di ingegneria, sono una leva aziendale. Un prodotto veloce converte di più, conserva di più e costa meno da gestire. Un sistema scalabile senza riscrittura lascia al team la libertà di costruire invece di spegnere gli incendi.

Nel settore pubblico il discorso è ancora più diretto: un servizio digitale in grado di gestire i picchi di domanda è un servizio che adempie alla sua funzione. Quello che cade nel giorno più importante distrugge la fiducia che ci sono voluti anni per costruire.

La qualità del software, alla fine, è la somma di tante piccole decisioni prese sul serio. La performance è uno degli aspetti più visibili e uno degli aspetti che distingue maggiormente i prodotti che crescono da quelli che semplicemente sopravvivono.

Se la tua organizzazione sta sperimentando un degrado delle prestazioni senza comprenderne la causa, il primo passo non è quasi mai cambiare la tecnologia, ma acquisire visibilità. Ci sono altri articoli sul blog su qualità, architettura e scalabilità che approfondiscono questo percorso. Se questo è un problema che ti tiene sveglio la notte, vale la pena parlarne.

Leggi anche