
Tech interview: come prepararti davvero (senza improvvisare)
Prepararsi a una tech interview non significa imparare risposte a memoria, ma arrivare con metodo, chiarezza e consapevolezza. In questa guida vediamo…
30/04/2026
21/05/2026 - 18 min di lettura

Se hai sentito parlare di DevOps senza mai capire esattamente di cosa si tratti, sei in buona compagnia. Il termine viene usato in modi molto diversi: a volte indica un ruolo professionale, a volte una cultura aziendale, a volte un insieme di strumenti. Spesso tutte e tre le cose insieme.
Questa guida parte da zero. Non presuppone che tu sappia già cosa sia una pipeline, un container o un deployment. L'obiettivo è darti una mappa chiara di tutto il ciclo DevOps: perché esiste, come funziona fase per fase, e come appare nella pratica, con esempi concreti e link per approfondire ogni argomento quando sei pronto.
DevOps nasce dalla fusione di due parole: Development (sviluppo software) e Operations (gestione dell'infrastruttura e dei sistemi). Ma non è semplicemente l'unione di due ruoli — è un cambiamento nel modo in cui i team lavorano insieme.
Per decenni, nelle aziende tecnologiche, sviluppatori e sistemisti hanno lavorato in silos separati con obiettivi spesso in conflitto. I developer volevano rilasciare funzionalità rapidamente. Gli Ops volevano stabilità e volevano evitare problemi. Il risultato era un muro invisibile: il codice veniva "lanciato oltre il muro" da un team all'altro, e quando qualcosa si rompeva in produzione, ognuno incolpava l'altro.
DevOps abbatte quel muro. Non assegnando a una singola persona tutti i compiti, ma creando un processo condiviso — culturale e tecnico — in cui sviluppo e operations collaborano lungo tutto il ciclo di vita del software: dall'idea iniziale fino al monitoraggio in produzione.
Il software non si consegna più "una volta". Le applicazioni moderne vengono aggiornate decine di volte al giorno. Gli utenti si aspettano zero downtime, nuove funzionalità continue, e che i bug vengano risolti in ore, non settimane.
Senza un processo DevOps strutturato, questa velocità di rilascio è impossibile da sostenere senza accumulare debito tecnico, bruciare il team, o rompere le cose in produzione con ogni deploy.
Il ciclo DevOps viene spesso rappresentato come un simbolo di infinito (∞), a indicare che non finisce mai — ogni ciclo alimenta il successivo. Le fasi principali sono:

Ogni fase ha uno scopo preciso, strumenti dedicati, e responsabilità chiare. E tutte sono collegate: saltare o trascurare una fase crea problemi a valle che costano sempre più del problema originale.
Vediamole una per una.
La fase di pianificazione è dove si definisce cosa costruire, perché, e come. In un contesto DevOps maturo, questa fase non coinvolge solo il product manager o i designer — include anche chi sviluppa e chi gestisce l'infrastruttura, fin dall'inizio.
La scoperta tardiva di un problema è sempre più costosa della scoperta precoce. Capire in fase di planning che una funzionalità richiede una nuova infrastruttura, o che ha implicazioni di sicurezza, o che interferisce con un sistema esistente — evita settimane di lavoro da rifare.
I team DevOps lavorano in cicli brevi chiamati sprint, tipicamente di una o due settimane. Il lavoro viene spezzato in unità piccole e tracciabili: storie utente, task, bug. Tutto è visibile a tutto il team.
Strumenti comuni per questa fase: Jira, Linear, GitHub Issues, Trello, Notion.
Esempio pratico:
Un team sta per sviluppare una funzionalità di notifiche email. In una sessione di planning che include developer, un sistemista e il product owner, emergono domande fondamentali: quale provider email usare? Come gestire i bounce? Cosa succede se il servizio email è down? Come monitoriamo il tasso di consegna? Rispondere a queste domande ora — prima di scrivere una riga di codice — evita di scoprirle in produzione alle 2 di notte.
Approfondisci: Agile e Scrum per principianti — Atlassian · Come scrivere user stories efficaci
La scrittura del codice è la fase che tutti conoscono. In DevOps, però, ci sono alcune pratiche che trasformano il "codice che funziona" in "codice che funziona, è testabile, è configurabile e può essere deployato in modo sicuro".
Il codice deve funzionare uguale su ogni ambiente — development, staging, produzione — senza dover essere modificato. Tutto ciò che cambia tra ambienti (URL di API, chiavi di servizi terzi, livelli di log) deve vivere in variabili d'ambiente, mai nel codice sorgente.
Questo approccio — codificato nella metodologia Twelve-Factor App — garantisce che il codice sia portabile, sicuro, e facile da deployare ovunque.
In un team che lavora su più funzionalità contemporaneamente, è fondamentale avere un modo strutturato di gestire le versioni del codice. Il modello più comune è il GitHub Flow:
La regola pratica: i branch devono essere brevi. Più a lungo un branch vive separato dal main, più il merge sarà doloroso.
Un feature flag (o feature toggle) è un meccanismo che permette di deployare codice in produzione tenendo una funzionalità "spenta" per gli utenti, per attivarla solo quando si è pronti — o solo per una parte degli utenti.
Questo permette di separare il momento del deploy (quando il codice arriva sul server) dal momento del release (quando la funzionalità è visibile agli utenti). Un'azienda come Facebook deploya codice centinaia di volte al giorno, ma attiva nuove funzionalità per milioni di utenti in modo graduale e controllato proprio grazie a questo meccanismo.
Approfondisci: Twelve-Factor App — metodologia completa · Feature Flags — Martin Fowler · Conventional Commits — come scrivere commit leggibili
La fase di build trasforma il codice sorgente in un artefatto deployabile: un eseguibile, un pacchetto, un'immagine Docker. L'obiettivo è produrre qualcosa di riproducibile — data la stessa versione del codice, la build deve produrre sempre lo stesso risultato.
"Funziona sul mio laptop" è una delle frasi più temute nello sviluppo software. Nasce dalla differenza tra l'ambiente locale dello sviluppatore (versione del linguaggio, dipendenze, configurazioni di sistema) e l'ambiente dove il software gira davvero.
Docker risolve questo problema alla radice. Permette di impacchettare un'applicazione insieme a tutto il suo ambiente di esecuzione — sistema operativo incluso — in un'immagine portabile. Chiunque esegua quell'immagine, su qualsiasi macchina, ottiene lo stesso ambiente identico.
Un Dockerfile è un file di testo che descrive come costruire l'immagine. È la "ricetta" dell'ambiente:
Con questo file, chiunque nel team può costruire l'immagine con docker build ed eseguirla con docker run — ottenendo esattamente lo stesso risultato, indipendentemente da cosa hanno installato sul proprio sistema.
Ogni artefatto prodotto dalla build deve essere versionato in modo univoco — tipicamente usando il commit SHA di Git. Questo garantisce la tracciabilità: se qualcosa va storto in produzione, sai esattamente quale versione del codice sta girando.
Approfondisci: Docker — tutorial ufficiale per principianti · Best practices per Dockerfile
I test automatizzati sono la rete di sicurezza che ti permette di modificare il codice con fiducia. Senza di essi, ogni modifica è potenzialmente rischiosa: non sai mai se hai rotto qualcosa che prima funzionava.
In DevOps, i test non sono un'attività separata che avviene "alla fine" — vengono eseguiti automaticamente a ogni commit, integrati nella pipeline.
Non tutti i test sono uguali in termini di costo, velocità e copertura. La piramide dei test guida come distribuirli:

Unit test: testano una singola funzione o classe in isolamento, senza dipendenze esterne. Sono veloci (millisecondi) e ne vuoi tanti.
Integration test: verificano che due o più componenti funzionino correttamente insieme — per esempio, che la tua applicazione scriva correttamente sul database, o che una chiamata API ritorni il formato atteso.
End-to-end test (E2E): simulano un utente reale che interagisce con l'applicazione attraverso il browser o un client. Sono potenti perché testano l'intero sistema, ma sono lenti e sensibili a cambiamenti minori dell'interfaccia. Usali per i flussi critici: login, checkout, operazioni irreversibili.
La copertura al 100% è un miraggio costoso e spesso controproducente. L'obiettivo reale è coprire la logica di business critica — i calcoli, le validazioni, le trasformazioni di dati — e i flussi principali dell'applicazione. Se puoi modificare il codice e vedere i test fallire quando rompi qualcosa di importante, stai facendo la cosa giusta.
Approfondisci: The Practical Test Pyramid — Martin Fowler · pytest — documentazione ufficiale · Jest — guida rapida
La fase di release è il ponte tra "il codice è pronto e testato" e "il codice è in produzione". Include tutti i passaggi di verifica finale, approvazione e preparazione al deploy.
Continuous Integration (CI): ogni volta che un developer integra del codice nel branch principale, un sistema automatico esegue build e test. L'obiettivo è scoprire i problemi il prima possibile, quando il costo della correzione è minimo. La regola d'oro della CI: se la pipeline è rossa, è la priorità assoluta del team. Nient'altro finché non torna verde.
Continuous Delivery (CD): il codice è sempre in uno stato tale da poter essere deployato in produzione in qualsiasi momento. Il deploy in produzione è una decisione umana consapevole, ma quando arriva quel momento, il processo è completamente automatizzato.
Continuous Deployment (variante più estrema): ogni commit che supera tutti i test automatici viene deployato in produzione automaticamente, senza alcun intervento umano. Adatto a team con test molto robusti e alta fiducia nel processo.
GitHub Actions è uno degli strumenti più diffusi per implementare CI. Una pipeline tipica:
Ogni pull request riceve automaticamente un feedback: la pipeline passa o fallisce. Il reviewer sa subito se il codice è tecnicamente integro, senza doverlo scaricare e verificare in locale.
Approfondisci: GitHub Actions — documentazione ufficiale · GitLab CI/CD — guida introduttiva · Continuous Delivery — libro fondamentale di Humble e Farley
Il deploy è il momento in cui il software aggiornato diventa disponibile agli utenti reali. È la fase che storicamente causava più ansia nei team — e con DevOps, l'obiettivo è renderla noiosa e routinaria.
Il codice non va mai direttamente dal laptop di uno sviluppatore alla produzione. Attraversa una serie di ambienti:
Development: ambiente condiviso dal team per integrare il lavoro di tutti. Può essere instabile — è accettabile.
Staging: replica fedele della produzione. Qui si fanno i test finali, le demo al cliente, la verifica QA. Nessun utente reale qui — ma l'ambiente deve essere identico alla produzione per avere valore.
Production: l'ambiente reale, con utenti reali. Ogni deploy qui deve essere pianificato, tracciato e reversibile.
Fare deploy senza causare downtime è un problema ingegneristico risolto in modi diversi a seconda del contesto:
Rolling deployment: le istanze dell'applicazione vengono aggiornate una alla volta. Finché almeno una è attiva, il servizio non si interrompe. È il comportamento predefinito di Kubernetes.
Blue/Green deployment: si mantengono due ambienti identici. Uno è attivo (blue), l'altro riceve la nuova versione (green). Quando green è pronto e verificato, si switcha il traffico in un istante. Il rollback è immediato: basta ripuntare su blue.
Canary deployment: la nuova versione riceve inizialmente una piccola percentuale del traffico reale (5-10%). Si osservano le metriche per un periodo definito. Se tutto va bene, si scala gradualmente fino al 100%. Se qualcosa non va, il rollback non ha impattato quasi nessuno.
Ogni deploy deve avere un piano di rollback chiaro e testato. "Come torniamo alla versione precedente?" è una domanda a cui rispondere prima del deploy, non durante un incidente.
Approfondisci: Kubernetes — deployment strategies · Blue/Green deployments spiegati · Canary deployments — guida pratica
Una volta in produzione, qualcuno deve assicurarsi che il sistema funzioni — sia scalato correttamente, sia sicuro, sia aggiornato. La fase di Operate riguarda la gestione quotidiana dell'infrastruttura e dei sistemi.
L'infrastruttura — server, reti, database, DNS, bucket di storage — viene definita in file di codice, versionati su Git esattamente come il codice applicativo. Questo approccio si chiama Infrastructure as Code.
I vantaggi sono concreti: l'infrastruttura è riproducibile (puoi ricreare l'ambiente da zero in minuti), tracciabile (ogni modifica ha un autore, una data, una motivazione), e reversibile (puoi fare rollback come con qualsiasi altro codice).
Vuoi aggiungere più storage? Apri una PR. Vuoi replicare l'ambiente in un'altra regione? Hai già tutto il codice. Vuoi sapere chi ha modificato la configurazione del database il mese scorso? È nella storia di Git.
Strumenti comuni: Terraform, Pulumi, AWS CloudFormation, Ansible.
Password, chiavi API, certificati non devono mai stare nel codice o in variabili d'ambiente non cifrate. Si usano sistemi dedicati come HashiCorp Vault o i secret manager dei cloud provider (AWS Secrets Manager, Google Secret Manager) che cifrano i segreti, tracciano ogni accesso, e permettono di ruotarli senza toccare il codice.
Approfondisci: Terraform — guida introduttiva · HashiCorp Vault — cos'è e come usarlo · SRE Book di Google — gratuito online
Il monitoring è la fase che chiude il ciclo e lo riapre. Senza visibilità su ciò che succede in produzione, ogni decisione è basata su intuizioni e speranze. Con il monitoring, hai dati.
Metriche: numeri nel tempo. CPU, utilizzo di memoria, latenza delle richieste, tasso di errori, numero di utenti attivi. Le metriche ti dicono cosa sta succedendo. Strumenti: Prometheus + Grafana, Datadog, New Relic.
Log: registro testuale degli eventi. Ogni operazione significativa del sistema produce un log. I log ti dicono cosa è successo in dettaglio. La differenza tra un log utile e uno inutile è la struttura:
Trace distribuiti: in sistemi composti da molti servizi, una singola richiesta utente attraversa decine di componenti. I trace distribuiti seguono quella richiesta attraverso tutto il sistema, mostrando dove ha passato il tempo e dove si sono verificati errori. Strumenti: Jaeger, Zipkin, Tempo.
Un buon sistema di alerting è chirurgico — notifica solo quando è necessaria un'azione umana. Troppi alert, e il team smette di prestarci attenzione. Troppo pochi, e i problemi restano nascosti.
La regola pratica: ogni alert deve avere un playbook associato — una procedura documentata che dice esattamente cosa fare quando quell'alert scatta. Se non sai cosa fare quando ricevi un alert, quell'alert non dovrebbe esistere.
Il concetto di SRE (Site Reliability Engineering), codificato da Google, porta il pensiero ingegneristico all'operations. Al centro di questo approccio ci sono gli SLO (Service Level Objectives): obiettivi misurabili sull'affidabilità del servizio.
Un SLO definisce: "il 99.5% delle richieste deve rispondere in meno di 200ms". Questo target genera automaticamente un error budget — la quantità di "errore" che ti sei concesso. Se il tuo SLO è 99.5%, hai un budget mensile di circa 3.6 ore di downtime. Puoi spenderlo per deploy rischiosi, per test in produzione, per manutenzione. Quando l'error budget è esaurito, smetti di fare release e ti concentri sulla stabilità.
Questo meccanismo trasforma una conversazione vaga ("stiamo abbastanza su?") in una decisione basata su dati ("abbiamo ancora 2 ore di budget questo mese").
Approfondisci: Prometheus — guida introduttiva · Grafana — dashboarding · SRE Book di Google — SLO chapter
Ogni fase ha valore da sola, ma il valore vero emerge quando tutte lavorano insieme. Ecco cosa succede quando si saltano delle fasi:
Senza Plan: si costruisce la cosa sbagliata, o si scopre tardi che serve un'infrastruttura che avrebbe richiesto settimane di preparazione.
Senza test sistematici: ogni deploy è una scommessa. I bug arrivano in produzione perché nessuno li ha trovati prima.
Senza CI: il codice di diversi developer si integra raramente e dolorosamente. I conflitti emergono tardi e costano molto.
Senza CD automatizzata: i deploy sono eventi rari, stressanti e manuali. Il team li teme invece di considerarli routine.
Senza monitoring: i problemi vengono scoperti dagli utenti, non dal team. L'azienda scopre che il sito era giù da ore tramite i social.
Senza IaC: l'infrastruttura è un "fiocco di neve" — unica, irriproducibile, comprensibile solo da chi l'ha costruita. Ricrearla dopo un disastro può richiedere giorni.
La potenza del ciclo DevOps è la sua natura retroattiva: il monitoring alimenta il planning, che migliora il codice, che rende i test più efficaci, che rende i deploy più sicuri, che permette di osservare meglio. Ogni giro del ciclo, il sistema diventa più robusto.
Per rendere concreto tutto questo, ecco come si svolge il lavoro in un team che ha adottato DevOps in modo maturo:
09:00 — Planning Il team si riunisce per il daily standup: 15 minuti. Ognuno condivide su cosa sta lavorando, se ci sono blocchi, cosa consegnerà oggi. Il board Jira è aperto, tutti vedono lo stato di ogni task.
09:20 — Code Sara inizia a lavorare su un bugfix critico: un errore di calcolo nello sconto fedeltà. Crea un branch fix/calcolo-sconto-fedeltà. Scrive prima il test che riproduce il bug, poi il fix che lo risolve. Commit.
09:35 — CI automatica Il push sul branch trigga automaticamente la pipeline CI. In 4 minuti: lint superato, 312 test passati, build riuscita. GitHub mostra un checkmark verde sulla PR che Sara ha appena aperto.
09:40 — Code review Marco riceve la notifica della PR. Legge il codice, vede il test che riproduce il bug originale, approva. Merge su main.
09:44 — Deploy automatico su staging Il merge su main trigga il deploy automatico su staging. In 3 minuti l'ambiente è aggiornato. Il QA verifica il comportamento corretto dello sconto sul suo browser.
10:05 — Deploy in produzione Il QA dà il via libera. Marco preme il bottone di deploy in produzione. La pipeline esegue un rolling deployment — le istanze si aggiornano una alla volta. Nessun downtime.
10:12 — Monitoring Grafana mostra che il tasso di errori è rimasto stabile. Sentry non ha ricevuto nuove eccezioni. L'alert configurato per "errori nel modulo pagamenti" non è scattato. Il fix è in produzione e funziona.
10:13 — Sara passa al prossimo task.
Dall'inizio del bugfix all'utente che non vede più il problema: 73 minuti. Automatizzato, tracciato, sicuro.
DevOps è un percorso, non una destinazione. Non esiste un team che "ha finito" di adottare DevOps — si migliora continuamente. Il punto di partenza dipende da dove sei ora.
Se non hai ancora nulla di automatizzato: Inizia con la CI. Aggiungi una pipeline che esegue i test a ogni push. È il passo singolo con il maggior impatto immediato sulla qualità. GitHub Actions ha un piano gratuito generoso.
Se hai già la CI ma il deploy è ancora manuale: Automatizza il deploy su almeno un ambiente non-produzione. Staging che si aggiorna automaticamente ad ogni merge su main è già un grande passo avanti.
Se hai CI/CD ma non vedi cosa succede in produzione: Aggiungi error tracking (Sentry è gratuito fino a una soglia ragionevole) e le metriche base dell'applicazione. Scoprirai problemi che non sapevi di avere.
Se vuoi migliorare la robustezza dell'infrastruttura: Inizia a versionare la configurazione dell'infrastruttura. Anche solo documentare in un file Terraform quello che già esiste è un primo passo verso l'IaC.
La chiave è non cercare di fare tutto subito. Ogni miglioramento al processo porta valore, anche in isolamento.
DevOps non è uno strumento, non è un ruolo, e non è qualcosa che si "installa". È un modo di lavorare che rende il software più affidabile, i team più efficaci, e il processo di rilascio meno stressante.
Il ciclo ha otto fasi — Plan, Code, Build, Test, Release, Deploy, Operate, Monitor — e ognuna contribuisce alla solidità del sistema complessivo. Saltarne una non risparmia tempo: lo sposta più avanti nel ciclo, dove il costo è sempre maggiore.
Il valore più grande di DevOps non è la velocità dei deploy. È la fiducia: sapere che quando premi il bottone di deploy, hai fatto tutto il possibile per assicurarti che funzioni. E sapere che se qualcosa va storto, lo scoprirai tu prima che lo scopra un utente.

Prepararsi a una tech interview non significa imparare risposte a memoria, ma arrivare con metodo, chiarezza e consapevolezza. In questa guida vediamo…
30/04/2026

Le matrici decisionali rappresentano uno strumento potente per trasformare le decisioni tecniche da scelte istintive a valutazioni consapevoli e docum…
13/02/2026

Disegnare architetture e flussi prima di sviluppare non è una fase opzionale. È il momento in cui il software prende forma prima di diventare codice.
16/01/2026

Guida Completa a Git: dal Terminale ai Meccanismi Interni. Git non è solo un sistema di versionamento. È un modello mentale per gestire la storia del …
12/01/2026