Quando un'applicazione non funziona, è l'ultima cosa che si desidera sentire dai colleghi la frase «il problema è dalla vostra parte». Alla fine, sono gli utenti a soffrire – e a loro non importa quale parte del team sia responsabile per il guasto. La cultura DevOps è nata proprio per unire sviluppo e supporto e combinarli attorno a una responsabilità comune per il prodotto finale.
Quali pratiche rientrano nel concetto di DevOps e a cosa servono? Di cosa si occupano gli ingegneri DevOps e quali competenze devono avere? A queste e ad altre domande rispondono gli esperti di EPAM: Kirill Sergeev, ingegnere di sistema e evangelista DevOps, e Igor Boiko, ingegnere di sistema senior e coordinatore di uno dei team DevOps dell'azienda.

A cosa serve DevOps?
Un tempo esisteva una barriera tra sviluppatori e supporto (cioè operations). Sembra paradossale, ma avevano obiettivi e KPI diversi, anche se svolgevano un lavoro comune. L'obiettivo dello sviluppo era implementare il prima possibile i requisiti di business e integrarli nel prodotto funzionante. Il supporto era responsabile del fatto che l'applicazione funzionasse in modo stabile, mentre qualsiasi cambiamento metteva a rischio tale stabilità. C'era un conflitto di interessi: DevOps è emerso per risolverlo.
Che cos'è DevOps?
La domanda è buona – e controversa: nel mondo non si è ancora giunti a un accordo definitivo su questo. In EPAM si ritiene che DevOps unisca tecnologie, processi e cultura di interazione all'interno del team. Questa integrazione è mirata a una consegna continua di valore agli utenti finali.
Kirill Sergeev: «Gli sviluppatori scrivono codice, i tester lo verificano, mentre gli amministratori installano il prodotto finale nell'ambiente di produzione. Per lungo tempo queste parti del team sono state piuttosto disgiunte, poi è sorto il concetto di unirle tramite un processo comune. Così sono nate le pratiche DevOps».
È giunto il giorno in cui gli sviluppatori e gli ingegneri di sistema si sono interessati al lavoro degli altri. La barriera tra produzione e supporto si è andata assottigliando. Così è nato DevOps, che comprende pratiche, cultura e ordine di interazione nel team.

Qual è l'essenza della cultura DevOps?
La responsabilità per il risultato finale ricade su ciascuno dei membri del team. La parte più interessante e complessa della filosofia DevOps è comprendere che una persona specifica non è solo responsabile per la sua fase lavorativa, ma si fa carico di come funzionerà l'intero prodotto. Il problema non è di qualcuno in particolare: è comune, e ogni membro del team contribuisce a risolverlo.
La posizione più importante della cultura DevOps è risolvere il problema, non semplicemente applicare le pratiche DevOps. Inoltre, queste pratiche non sono implementate "da qualche parte", ma in tutto il prodotto. Il progetto non ha bisogno solo di un ingegnere DevOps, ha bisogno di una soluzione al problema, e il ruolo dell'ingegnere DevOps può essere distribuito tra più membri del team con diverse specializzazioni.
Quali sono le pratiche DevOps?
Le pratiche DevOps coprono tutte le fasi del ciclo di vita del software.
Igor Bojko: "Il caso ideale è quando iniziamo a utilizzare le pratiche DevOps già all'avvio del progetto. Insieme agli architetti, pianifichiamo quale sarà il paesaggio architettonico dell'applicazione, dove sarà localizzata e come sarà scalabile, scegliamo la piattaforma. Ora è di moda l'architettura a microservizi: per essa scegliamo un sistema di orchestrazione: dobbiamo essere in grado di gestire ogni elemento dell'applicazione singolarmente e aggiornarlo in modo indipendente dagli altri. Un'altra pratica è 'infrastruttura come codice'. Questo approccio prevede che l'infrastruttura del progetto venga creata e gestita tramite codice, invece che attraverso interazioni dirette con i server.
Dopo di che passiamo alla fase di sviluppo. Qui una delle pratiche più importanti è la costruzione di CI/CD: dobbiamo aiutare gli sviluppatori a integrare rapidamente le modifiche nel prodotto, in piccole porzioni, più frequentemente e senza problemi. CI/CD copre sia la verifica del codice, sia il caricamento del master nel codice sorgente, sia il dispiegamento dell'applicazione negli ambienti di test e produttivi.
Nelle fasi di CI/CD, il codice passa attraverso i quality gates. Questi vengono utilizzati per verificare che il codice, una volta uscito dalla workstation dello sviluppatore, soddisfi i criteri di qualità stabiliti. Qui si aggiungono i test unitari e UI. Per un dispiegamento rapido, indolore e mirato del prodotto, è possibile scegliere il tipo di deployment più adatto.
Le pratiche di DevOps hanno un ruolo anche nella fase di supporto del prodotto finale. Vengono utilizzate per il monitoraggio, il feedback, la sicurezza e l'implementazione di modifiche. Tutte queste attività vengono affrontate da DevOps con l'ottica di miglioramenti continui. Minimizziamo le operazioni ripetitive, automatizzandole. Questo include migrazioni, espansione dell'applicazione e supporto al funzionamento.
Quali sono i vantaggi delle pratiche DevOps?
Se dovessimo scrivere un manuale sulle pratiche DevOps moderne, nella sua prima pagina ci sarebbero tre punti: automazione, accelerazione dei rilasci e veloce feedback dagli utenti.
Kirill Sergeev: "Il primo è l'automazione. Possiamo automatizzare tutte le interazioni nel team: scriviamo il codice – lo rilasciamo – verifichiamo – installiamo – raccogliamo feedback – torniamo all'inizio. Tutto questo avviene automaticamente.
Il secondo è l'accelerazione del rilascio e persino la semplificazione dello sviluppo. È sempre importante per il cliente che il prodotto venga lanciato sul mercato il prima possibile e inizi a portare benefici prima dei concorrenti. Il processo di consegna del prodotto può essere migliorato continuamente: riducendo i tempi, aggiungendo ulteriori checkpoint e affinando il monitoraggio.
Il terzo è l'accelerazione del feedback dell'utente. Se ha osservazioni, possiamo subito apportare correzioni e aggiornare immediatamente l'applicazione."

Come si relazionano i concetti di "ingegnere di sistema", "ingegnere di build" e "ingegnere DevOps"?
Si sovrappongono, ma appartengono a sfere leggermente diverse.
L'ingegnere di sistema in EPAM è una posizione. Possono essere di diversi livelli: da junior a chief specialist.
L'ingegnere di build è più un ruolo che può essere svolto in un progetto. Oggi ci si riferisce a persone responsabili per CI/CD.
Un ingegnere DevOps è un professionista che implementa le pratiche DevOps nel progetto.
Se sommiamo tutto questo, otteniamo circa il seguente risultato: una persona in posizione di ingegnere di sistema svolge nel progetto il ruolo di ingegnere di build e si occupa dell'implementazione delle pratiche DevOps.
Di cosa si occupa esattamente un ingegnere DevOps?
Gli ingegneri DevOps raccolgono insieme tutte le parti di cui è composto un progetto. Conoscono le specificità del lavoro di programmatori, tester e sistemisti, e aiutano a semplificare il loro lavoro. Comprendono le esigenze e i requisiti del business, il suo ruolo nel processo di sviluppo, e costruiscono il processo tenendo conto degli interessi del cliente.
Abbiamo parlato molto di automazione: è la principale occupazione degli ingegneri DevOps. Questo è un punto molto importante, che include, tra l'altro, la preparazione dell'ambiente.
Kirill Sergeev: «Prima di implementare aggiornamenti nel prodotto, devono essere testati in un ambiente esterno. Gli ingegneri DevOps si occupano della sua preparazione. Sono anche quelli che instaurano la cultura DevOps nel progetto: implementano pratiche DevOps a tutti i livelli dei loro progetti. Questi tre principi: automazione, semplificazione, accelerazione – li portano ovunque possano arrivare».
Cosa deve sapere un ingegnere DevOps?
In linea di massima, deve avere conoscenze in vari ambiti: programmazione, lavoro con sistemi operativi, database, sistemi di build e configurazione. A questo si aggiunge la capacità di lavorare con infrastrutture cloud, sistemi di orchestrazione e monitoraggio.
1. Linguaggi di programmazione
Gli ingegneri DevOps conoscono alcuni linguaggi di base per l'automazione e possono, ad esempio, dire a un programmatore: «Perché non fai l'installazione del codice non manualmente, ma utilizzando il nostro script che automatizza tutto? A questo prepareremo un file di configurazione, che sarà comodo da leggere sia per te che per noi, e potremo modificarlo in qualsiasi momento. In aggiunta, vedremo chi, quando e perché apporta modifiche».
Un ingegnere DevOps può imparare uno o più di questi linguaggi: Python, Groovy, Bash, Powershell, Ruby, Go. Non è necessario conoscerli a un livello profondo: è sufficiente una comprensione dei fondamenti della sintassi, dei principi della programmazione orientata agli oggetti, e la capacità di scrivere script semplici per l'automazione.
2. Sistemi operativi
Un ingegnere DevOps deve comprendere su quale server sarà installato il prodotto, in quale ambiente sarà eseguito e con quali servizi interagirà. Può specializzarsi su sistemi Windows o Linux.
3. Sistemi di controllo versione
Senza una conoscenza dei sistemi di controllo versione, un ingegnere DevOps non può andare avanti. Git è uno dei sistemi più popolari al momento.
4. Provider cloud
AWS, Google, Azure – specialmente se parliamo di un'area Windows.
Kirill Sergeev: «I fornitori di cloud ci offrono server virtuali, che si integrano perfettamente nei processi CI/CD.
L'installazione di dieci server fisici richiede circa un centinaio di operazioni manuali. Ogni server deve essere avviato, installato e configurato manualmente con il sistema operativo necessario, installare la nostra applicazione su questi dieci server e poi verificare tutto dieci volte. I servizi cloud sostituiscono questa procedura con dieci righe di codice, e un buon ingegnere DevOps deve saperli utilizzare. Così risparmia tempo, forze e denaro – sia per il cliente che per l'azienda».
5. Sistemi di orchestrazione: Docker e Kubernetes
Kirill Sergeev: «I server virtuali sono suddivisi in contenitori, in ciascuno dei quali possiamo installare la nostra applicazione. Quando ci sono molti contenitori, è necessario gestirli: accenderne uno, spegnerne un altro, eseguire backup in vari punti. Diventa un compito abbastanza complesso, per il quale è necessaria una sistema di orchestrazione.
In passato, ogni applicazione era gestita da un server separato – qualsiasi modifica nel suo funzionamento poteva influenzare la corretta operatività dell'applicazione. Grazie ai contenitori, le applicazioni diventano isolate e vengono eseguite separatamente – ognuna sulla propria macchina virtuale. Se si verifica un guasto, non è necessario perdere tempo a cercare la causa. È più semplice eliminare il vecchio contenitore e aggiungere uno nuovo».
6. Sistemi di configurazione: Chef, Ansible, Puppet
Quando è necessario gestire un intero parco di server, bisogna eseguire molte operazioni simili. È lungo e complesso, e il lavoro manuale aumenta il rischio di errore. Qui entrano in gioco i sistemi di configurazione. Con il loro aiuto, si crea uno script che è facile da leggere sia per i programmatori, sia per gli ingegneri DevOps, sia per gli amministratori di sistema. Questo script aiuta a eseguire le stesse operazioni sui server in modo automatico. Di conseguenza, si riducono le operazioni manuali (e, quindi, gli errori).
Quale carriera può costruire un ingegnere DevOps?
È possibile svilupparsi sia orizzontalmente che verticalmente.
Igor Bojko: «Dal punto di vista dello sviluppo orizzontale, gli ingegneri DevOps hanno attualmente le prospettive più ampie. Tutto cambia continuamente, e si possono acquisire competenze in molteplici direzioni: dal controllo delle versioni al monitoraggio, dalla gestione delle configurazioni ai database.
Si può diventare architetto di sistema se un dipendente è interessato a comprendere come funziona un'applicazione in tutte le fasi del suo ciclo di vita - dalla progettazione al supporto.
Come diventare un ingegnere DevOps?
- Leggi i libri "Progetto 'Fenice'" e DevOps Handbook. Sono vere e proprie pietre miliari della filosofia DevOps, con il primo che è un romanzo.
- Studia le tecnologie dall'elenco sopra: da solo o tramite corsi online.
- Unisciti a un progetto open source come ingegnere DevOps.
- Pratica e proponi pratiche DevOps nei tuoi progetti personali e lavorativi.
Fonte: habr.com
