{"id":93885,"date":"2020-09-10T19:42:23","date_gmt":"2020-09-10T17:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov"},"modified":"2020-09-10T19:42:23","modified_gmt":"2020-09-10T17:42:23","slug":"continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","title":{"rendered":"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/ed8a32ae63b8dccfc8b4893ab27f1527.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Discutiamo perch\u00e9 gli strumenti CI e CI sono completamente due cose diverse.<\/p>\n<p><\/p>\n<p>Quale problema ci si propone di risolvere con CI, da dove \u00e8 nata l'idea, quali sono le ultime conferme che funziona, come capire che avete davvero una pratica, e non solo un Jenkins installato.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>L'idea di fare una presentazione sulla Continuous Integration \u00e8 nata un anno fa, quando stavo facendo colloqui per cercare lavoro. Ho parlato con 10-15 aziende e solo una ha potuto spiegare in modo chiaro cosa sia il CI e come hanno capito di non averlo. Gli altri, invece, parlavano di Jenkins in modo confuso \ud83d\ude42 Beh, noi abbiamo Jenkins, fa le build, CI! Nella mia presentazione cercher\u00f2 di spiegare cos'\u00e8 realmente la Continuous Integration e perch\u00e9 Jenkins e strumenti simili hanno un rapporto molto debole con essa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/a57813a652c0d788e5a927dc8a7130ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quindi, cosa viene in mente quando si parla di CI? Alla maggior parte delle persone verr\u00e0 in mente Jenkins, Gitlab CI, Travis, ecc.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c9799c11ba7bb7bbdb2048c2f314b22a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Anche se facciamo una ricerca su Google, ci appariranno questi strumenti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/028ef088b28b73e7905b1666d9d53d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se chiedete a qualcuno se li conosce, subito dopo aver elencato gli strumenti, vi diranno che il CI \u00e8 quando nel vostro Pull Request sul commit avviene la build e l'esecuzione dei test.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/f37ba8f985c10900f669540e063c5e43.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La Continuous Integration non riguarda gli strumenti, non riguarda le build con i test in un ramo! La Continuous Integration \u00e8 una pratica di integrazione molto frequente di nuovo codice e per applicarla non \u00e8 affatto necessario costruire Jenkins, GitLab, ecc.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c3a12b4a875050550b42714607e787c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prima di capire come appare un CI completo, immergiamoci prima nel contesto delle persone che l'hanno ideato e sentiamo il dolore che cercavano di risolvere.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/2ab9c0f4dba2887fed5744c8b021b424.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E risolvevano il problema del lavoro di squadra!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/11a5f3b1075f8b8d0f169fe07adf6c91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Diamo un'occhiata agli esempi delle difficolt\u00e0 che i programmatori affrontano nello sviluppo di squadra. Abbiamo un progetto, un ramo master in git e due sviluppatori.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/8138a52376e87239ff5f7b0af5cd8fee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E hanno iniziato a lavorare come sono abituati da tempo. Hanno preso un compito su Jira, hanno creato un ramo per la funzione, e scrivono codice.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/54720c40d9bbd9631b411a2a26c4083f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uno ha completato la funzione prima e l'ha unita al master.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/4593dc3cf33a44bf3a4d8166be9bc5da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>L'altro ha impiegato pi\u00f9 tempo, ha unito dopo e ha ricevuto un conflitto. Ora, invece di scrivere le funzionalit\u00e0 necessarie per il business, lo sviluppatore sta sprecando tempo ed energie per risolvere conflitti.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c947601fb1dd3b3dd64bac455dc6691a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pi\u00f9 \u00e8 complesso unire la tua funzionalit\u00e0 al master generale, pi\u00f9 tempo ci mettiamo. E questo \u00e8 solo un esempio piuttosto semplice. \u00c8 un caso in cui ci sono solo 2 sviluppatori. E immagina se ci fossero 10, 15 o 100 persone in azienda che scrivono in un unico repository. Impazziresti a risolvere tutti questi conflitti. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/16c6b8b51ae462f1e0acb966a93c0ae5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'\u00e8 un caso leggermente diverso. Abbiamo un master e diversi sviluppatori che stanno facendo qualcosa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/21b78ad8d0cb7cb5bded6ef9d49707c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hanno creato un ramo ciascuno.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/b85d8aa0080f08c1ad8ad83f3a9ab084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Uno si \u00e8 fuso, tutto bene, ha consegnato il compito.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/e96d4fd52c39089e3377ed85adeeb591.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nel frattempo, il secondo sviluppatore ha consegnato il proprio compito. Supponiamo che lo abbia inviato per la revisione. In molte aziende esiste la pratica della revisione. Da un lato, \u00e8 una pratica utile e positiva, dall'altro ci rallenta in molti casi. Non approfondiamo, ma ecco un ottimo esempio di cosa pu\u00f2 portare una storia tortuosa con la revisione. Hai inviato una richiesta di pull per la revisione. Allo sviluppatore non resta nulla da fare. Cosa inizia a fare? Inizia a prendere altri compiti. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/7b8e121be99432606056acf11e20f518.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nel frattempo, il secondo sviluppatore ha fatto ancora qualcosa. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/ceaa5ba5b3b5014fad527362f5794e94.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il primo ha completato il terzo compito. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/9c27663e63bb9489ecffc5a1f73abb87.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E dopo un certo periodo di tempo, la sua revisione \u00e8 stata provata e lui cerca di fondersi. E cosa succede? Si ritrova con un enorme numero di conflitti. Perch\u00e9? Perch\u00e9 mentre la sua richiesta di pull era in revisione, nel codice sono gi\u00e0 cambiate molte cose. <\/p>\n<p><\/p>\n<p>Oltre alla questione dei conflitti, c'\u00e8 la questione delle comunicazioni. Finch\u00e9 il tuo ramo \u00e8 in revisione, mentre aspetta, mentre stai lavorando a lungo su una funzionalit\u00e0, smetti di monitorare cosa sta cambiando nel codice della tua base di servizio. Forse quello che stai cercando di risolvere adesso \u00e8 gi\u00e0 stato risolto ieri e puoi riutilizzare un qualche metodo. Ma non lo vedrai, perch\u00e9 stai sempre lavorando con un ramo obsoleto. E questo ramo obsoleto porta sempre a dover risolvere conflitti di merge. <\/p>\n<p><\/p>\n<p>Quindi, se lavoriamo in squadra, ovvero non c'\u00e8 una sola persona che si occupa del repository, ma ci sono 5-10 persone, pi\u00f9 a lungo non aggiungiamo il nostro codice al master, pi\u00f9 soffriamo perch\u00e9 alla fine dobbiamo unire qualcosa. E pi\u00f9 conflitti abbiamo, e pi\u00f9 lavoriamo con una versione vecchia, pi\u00f9 problemi avremo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/55c070f65a4d3838fb8c02bb9684c76b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Fare qualcosa insieme \u00e8 doloroso! Ci infastidiamo sempre a vicenda. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/b914c50aad6f3c9f97edcad7e71ba627.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo problema \u00e8 stato notato oltre 20 anni fa. La prima menzione della pratica di Continuous Integration l'ho trovata nella programmazione estrema.<\/p>\n<p><\/p>\n<p>La programmazione estrema \u00e8 il primo framework agile. La pagina \u00e8 apparsa nel '96. L'idea era di utilizzare alcune pratiche di programmazione, pianificazione e altro, affinch\u00e9 lo sviluppo fosse il pi\u00f9 flessibile possibile, per poter reagire pi\u00f9 rapidamente a cambiamenti e richieste dei nostri clienti. E 24 anni fa hanno iniziato a confrontarsi con il fatto che, se si lavora a lungo e in modo isolato, si spende pi\u00f9 tempo, perch\u00e9 si creano conflitti. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/93a80838bdb3b297557dbf2ac7587965.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ora analizzeremo l'espressione \"Continuous Integration\" parola per parola. Se la traduciamo letteralmente, risulta essere integrazione continua. Ma non \u00e8 molto chiaro quanto sia continua, \u00e8 piuttosto interrotta. Non \u00e8 nemmeno chiaro quanto sia integrazione. <\/p>\n<p><\/p>\n<p>E quindi vi porto ora delle citazioni dalla programmazione estrema. Analizzeremo entrambe le parole separatamente. <\/p>\n<p><\/p>\n<p>Integrazione \u2014 Come ho gi\u00e0 detto, miriamo a far s\u00ec che ogni ingegnere lavori con l'ultima versione del codice, e che il suo codice venga aggiunto il pi\u00f9 spesso possibile al ramo principale, in modo che questi siano rami piccoli. Perch\u00e9 se sono grandi, possiamo rimanere bloccati per una settimana con conflitti di merge. Soprattutto se abbiamo un ciclo di sviluppo lungo come il waterfall, dove lo sviluppatore si allontana per un mese a lavorare su una grande funzionalit\u00e0. E durante l'integrazione potrebbe rimanere bloccato a lungo. <\/p>\n<p><\/p>\n<p>Integrazione \u2014 \u00e8 quando prendiamo il nostro ramo e lo integriamo con il master, facciamo il merge. C'\u00e8 una versione estrema, in cui siamo transbase developer, dove miriamo a scrivere direttamente nel master senza rami superflui.<\/p>\n<p><\/p>\n<p>In sintesi, l'integrazione consiste nel prendere il proprio codice e portarlo nel master. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/8950103e6a59ed7132ec321ac6abe600.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Cosa si intende qui con la parola \u00abcontinuous\u00bb, cosa si intende per continuit\u00e0? La pratica implica che lo sviluppatore cerchi di integrare il proprio codice il prima possibile. Questo \u00e8 il suo obiettivo nell'affrontare qualsiasi compito: far s\u00ec che il suo codice arrivi nel master il prima possibile. In un mondo ideale, gli sviluppatori farebbero questo ogni poche ore. Cio\u00e8 prendi un piccolo compito, lo unisci al master. Tutto fantastico. Questo \u00e8 ci\u00f2 a cui aspiri. E devi farlo in modo continuo. Appena fai qualcosa, lo metti subito nel master. <\/p>\n<p><\/p>\n<p>E lo sviluppatore che fa qualcosa \u00e8 responsabile di ci\u00f2 che ha fatto affinch\u00e9 funzioni e non rompa nulla. Qui di solito emerge la questione dei test. Vogliamo eseguire alcuni test sul nostro commit, sul nostro merge, per assicurarci che funzioni. E qui Jenkins pu\u00f2 davvero aiutarti.<\/p>\n<p><\/p>\n<p>Ma con storie come: facciamo in modo che le modifiche siano piccole, facciamo in modo che i compiti siano piccoli, facciamo in modo che facciamo un compito e subito proviamo a unirlo al master \u2013 qui nessun Jenkins pu\u00f2 aiutare. Perch\u00e9 Jenkins ti aiuta esclusivamente a eseguire i test. <\/p>\n<p><\/p>\n<p>Puoi fare a meno di loro. Questo non ti ostacola affatto. Perch\u00e9 l'obiettivo della pratica \u00e8 unire il codice il pi\u00f9 frequentemente possibile, cos\u00ec da non perdere un'enorme quantit\u00e0 di tempo su eventuali conflitti futuri. <\/p>\n<p><\/p>\n<p>Immaginiamo di trovarci nel 2020 senza internet, per qualche motivo. E lavoriamo localmente. Non abbiamo Jenkins. Va bene. Puoi comunque prendere e fare un branch locale. In esso hai scritto del codice. Hai completato il compito in 3-4 ore. Ti sei spostato su master, hai eseguito git pull, hai unito il tuo branch. Fatto. Se lo fai spesso \u2013 congratulazioni, hai Continuous Integration!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/1f2117b65994b940edb04e0e119f6e8a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Quali prove esistono nel mondo moderno sul fatto che valga la pena investire energie in questo? Perch\u00e9 in generale \u00e8 difficile. Se provi a lavorare in questo modo, capirai che dovrai affrontare un certo tipo di pianificazione, dovrai dedicare pi\u00f9 tempo alla scomposizione dei compiti. Perch\u00e9 se fai man\u2026, non potrai unire rapidamente e, di conseguenza, finirai nei guai. Non avrai pi\u00f9 pratiche. <\/p>\n<p><\/p>\n<p>E sar\u00e0 costoso. Non sar\u00e0 possibile lavorare da domani con il Continuous Integration. Dovrete abituarvi a lungo, sar\u00e0 un processo lungo abituarsi a decomporre i compiti, a lungo abituarvi a rivedere le pratiche di revisione, se ne avete. Perch\u00e9 il nostro obiettivo \u00e8 che tutto venga fuso oggi. E se la vostra revisione richiede tre giorni, allora avete un problema e il Continuous Integration non funziona. <\/p>\n<p><\/p>\n<p>Ma abbiamo delle prove attuali proprio ora che ci dicono che ha senso investire in questa pratica?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/2026a8f1d72fb05613511e7bab57e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La prima cosa che mi \u00e8 venuta in mente \u00e8 il State of DevOps. \u00c8 uno studio che i ragazzi conducono da 7 anni. Ora lo fanno come organizzazione indipendente, ma sotto Google.<\/p>\n<p><\/p>\n<p>E la loro ricerca nel 2018 ha mostrato una correlazione tra le aziende che cercano di utilizzare rami a vita breve, che si integrano rapidamente e frequentemente, e i loro indicatori di prestazioni IT migliori.<\/p>\n<p><\/p>\n<p>Quali sono questi indicatori? Sono 4 metriche che raccolgono da tutte le aziende nei loro questionari: frequenza di distribuzione, tempo di attesa per le modifiche, tempo di ripristino del servizio, tasso di errore delle modifiche.<\/p>\n<p><\/p>\n<p>E, prima di tutto, c'\u00e8 questa correlazione, sappiamo che le aziende che si fondono spesso hanno metriche molto migliori. Hanno anche una suddivisione delle aziende in diverse categorie: aziende lente, che producono lentamente, performer medi, performer di alto livello e elite. L'elite sono Netflix, Amazon, che sono super veloci, fanno tutto rapidamente, bene e in modo qualitativo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/4fd98ef48a5cffdd6ae2ceea93dbb0bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>La seconda storia \u00e8 successa appena un mese fa. Nel Technology Radar \u00e8 apparso un articolo notevole su Gitflow. Gitflow si differenzia da tutti gli altri in quanto i suoi rami vivono a lungo. Ci sono rami di rilascio che vivono a lungo, rami di funzionalit\u00e0 che vivono anch'essi a lungo. Questa pratica nel Technology Radar \u00e8 stata spostata in HOLD. Perch\u00e9? Perch\u00e9 le persone si trovano a dover affrontare il dolore dell'integrazione. <\/p>\n<p><\/p>\n<p>Se hai un ramo che vive molto a lungo, si inceppa, scade, cominciamo a spendere pi\u00f9 tempo per apportare una modifica. <\/p>\n<p><\/p>\n<p>E recentemente l'autore di Gitflow ha affermato che se aspiri a Continuous Integration, se desideri integrare il tuo lavoro il pi\u00f9 frequentemente possibile, allora Gitflow \u00e8 una cattiva idea. Ha anche aggiunto in un articolo che se hai un backend in cui puoi fare questo, allora Gitflow \u00e8 superfluo per te, poich\u00e9 Gitflow ti rallenter\u00e0 e ti provoquer\u00e0 problemi di integrazione. <\/p>\n<p><\/p>\n<p>Questo non significa che Gitflow sia cattivo e che non debba essere usato. \u00c8 utile in altri casi. Ad esempio, quando hai bisogno di supportare pi\u00f9 versioni di un servizio, di un'applicazione, ossia quando devi fornire supporto per un periodo prolungato di tempo. <\/p>\n<p><\/p>\n<p>Ma se parli con persone che supportano tali servizi, sentirai molte lamentele riguardo al fatto che questa versione era la 3.2, risalente a 4 mesi fa, e che non conteneva questa correzione e ora, per apportarla, devono fare un sacco di modifiche. E cos\u00ec si ritrovano di nuovo bloccati, e passano una settimana a cercare di prendere e unire qualche nuova funzionalit\u00e0. <\/p>\n<p><\/p>\n<p>Come ha giustamente fatto notare Aleksandr Kovalev nella chat, la correlazione non \u00e8 la stessa cosa della causalit\u00e0. \u00c8 cos\u00ec. Ossia, non c'\u00e8 un legame diretto che se hai Continuous Integration, tutte le metriche saranno fantastiche, no. Ma c'\u00e8 una correlazione positiva, che se c'\u00e8 una cosa, probabilmente ci sar\u00e0 anche l'altra. Non \u00e8 un dato di fatto, ma \u00e8 probabile. \u00c8 solo una correlazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration come pratica, e non Jenkins. Andrey Aleksandrov\" src=\"\/wp-content\/uploads\/2020\/09\/d5fc050550b0e9f86a1fdf85fff32fa5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sembrerebbe che stiamo gi\u00e0 iniziando a fare qualcosa, che ci stiamo gi\u00e0 integrando, ma come possiamo capire se abbiamo veramente Continuous Integration, se stiamo integrando abbastanza frequentemente?<\/p>\n<p><\/p>\n<p>Jez Humble \u00e8 l'autore del Handbook, Accelerate, del sito Continuous Delivery e del libro \"Continuous Delivery\". Propone un test di questo tipo:<\/p>\n<p><\/p>\n<ul>\n<li>Il codice degli ingegneri viene integrato nel master ogni giorno. <\/li>\n<li>Per ogni commit esegui i test unitari.<\/li>\n<li>La build nel master \u00e8 fallita, ed \u00e8 stata riparata in circa 10 minuti.<\/li>\n<\/ul>\n<p><\/p>\n<p>Propone di utilizzare questo test per assicurarti che la pratica sia effettivamente in atto. <\/p>\n<p><\/p>\n<p>L'ultima parte la trovo un po' discutibile. Cio\u00e8, se puoi risolvere il problema in 10 minuti, significa che hai Continuous Integration; suona un po' strano, secondo me, ma ha senso. Perch\u00e9? Perch\u00e9 se fai spesso merge, significa che le modifiche sono piccole. Se una piccola modifica causa un errore nella build principale, potrai trovare l'errore rapidamente, poich\u00e9 la modifica \u00e8 piccola. Ecco, c'era stato un piccolo merge e sono state cambiate 20-30 righe. E, di conseguenza, puoi capire rapidamente quale fosse il problema, perch\u00e9 le modifiche sono minuscole, hai un'area di ricerca molto ristretta. <\/p>\n<p><\/p>\n<p>E anche se dopo il rilascio il production crolla, se abbiamo una pratica di Continuous Integration, \u00e8 molto pi\u00f9 facile agire, perch\u00e9 le modifiche sono minuscole. S\u00ec, questo influenzer\u00e0 la pianificazione. Sar\u00e0 doloroso. E, probabilmente, la cosa pi\u00f9 difficile in questa pratica \u00e8 abituarsi a suddividere i compiti, cio\u00e8 come fare per prendere qualcosa e realizzarlo in poche ore e, nel contempo, passare la revisione, se c'\u00e8. La revisione \u00e8 un doloroso affare a parte. <\/p>\n<p><\/p>\n<p>I test unitari sono solo un aiuto che ti permette di capire se la tua integrazione \u00e8 andata a buon fine, se nulla si \u00e8 rotto. A mio avviso, questo non \u00e8 un punto necessariamente obbligatorio, perch\u00e9 il senso della pratica non sta in questo. <\/p>\n<p><\/p>\n<p>Questo \u00e8 un breve accenno al Continuous Integration. Questo \u00e8 tutto ci\u00f2 che c'\u00e8 in questa pratica. Sono pronto per le domande. <\/p>\n<p><\/p>\n<p>In breve, voglio solo riassumere:<\/p>\n<p><\/p>\n<ul>\n<li>Il Continuous Integration non \u00e8 Jenkins, non \u00e8 Gitlab.<\/li>\n<li>Non \u00e8 uno strumento, \u00e8 una pratica che implica che uniamo il nostro codice nel master il pi\u00f9 spesso possibile. <\/li>\n<li>Lo facciamo per evitare un enorme dolore che si verifica con i merge in futuro, cio\u00e8 proviamo una piccola sofferenza ora, per non dover affrontare una maggiore in futuro. Questo \u00e8 il senso di tutto. <\/li>\n<li>C'\u00e8 comunicazione attraverso il codice, ma raramente la vedo; \u00e8 stata pensata anche per questo.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Domande<\/strong><\/p>\n<p><\/p>\n<p><em>Cosa fare con i task non decomponibili?<\/em><\/p>\n<p><\/p>\n<p>Decomporli. Qual \u00e8 il problema? Puoi fare un esempio di un compito che non pu\u00f2 essere decomposto?<\/p>\n<p><\/p>\n<p><em>Ci sono compiti che non possono essere decomposti, nel senso che richiedono un'esperienza molto profonda e che possono realmente essere risolti solo dopo un mese fino a un risultato accettabile.<\/em> <\/p>\n<p><\/p>\n<p>Se ho capito bene, c'\u00e8 un compito grande e complesso il cui risultato sar\u00e0 visibile solo tra un mese?<\/p>\n<p><\/p>\n<p><em>S\u00ec, esatto. S\u00ec, potremo valutare il risultato non prima di un mese.<\/em> <\/p>\n<p><\/p>\n<p>Va bene. In generale, non \u00e8 un problema. Perch\u00e9? Perch\u00e9 in questo caso, quando parliamo di branch, non parliamo di un branch con una feature. Le feature possono essere grandi e complesse. Possono coinvolgere un gran numero di componenti. E, forse, non possiamo completarle tutte in un solo branch. \u00c8 normale. Dobbiamo semplicemente suddividere questa storia. Se la feature non \u00e8 pronta fino in fondo, non significa che alcuni pezzi del suo codice non possano essere fusi. Hai aggiunto, ad esempio, una migrazione e all'interno della feature ci sono alcuni passaggi. Hai, ad esempio, un passaggio \u2013 fare la migrazione, aggiungere un nuovo metodo. E puoi gi\u00e0 unire queste cose quotidianamente. <\/p>\n<p><\/p>\n<p><em>Va bene. Qual \u00e8 il senso di questo?<\/em><\/p>\n<p><\/p>\n<p>Qual \u00e8 il senso di unire piccole cose quotidianamente?<\/p>\n<p><\/p>\n<p><em>S\u00ec.<\/em><\/p>\n<p><\/p>\n<p>Se qualcosa si rompe, lo vedi subito. Hai un piccolo pezzo che ha rotto qualcosa, \u00e8 pi\u00f9 facile sistemarlo. Il senso \u00e8 che unire un piccolo pezzo ora \u00e8 molto pi\u00f9 semplice che unire qualcosa di grande dopo alcune settimane. E il terzo senso \u00e8 che altri ingegneri lavoreranno con una versione attuale del codice. Vedranno che ci sono state alcune migrazioni aggiunte e che \u00e8 comparso un metodo che potrebbero anche voler utilizzare. Tutti vedranno cosa sta succedendo nel tuo codice. \u00c8 per queste tre cose che viene praticato. <\/p>\n<p><\/p>\n<p><em>Grazie, domanda chiusa!<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg Soroka) Posso aggiungere qualcosa? Hai detto tutto giusto, voglio solo aggiungere una frase.<\/em><\/p>\n<p><\/p>\n<p>Va bene.<\/p>\n<p><\/p>\n<p><em>Con l'integrazione continua, il codice viene unito al branch principale non quando la feature \u00e8 completamente pronta, ma quando il build ha smesso di rompersi. E puoi tranquillamente fare commit nel master quante volte vuoi al giorno. Il secondo aspetto \u00e8 che se per qualche motivo non riesci a suddividere un compito di un mese in compiti almeno da tre giorni, e io taccio su tre ore, hai un enorme problema. E il fatto che non hai integrazione continua \u00e8 il minore di questi problemi. Significa che hai problemi con l'architettura e le pratiche ingegneristiche sono a zero. Perch\u00e9 anche se si tratta di ricerca, in ogni caso deve essere formulata sotto forma di ipotesi o cicli.<\/em> <\/p>\n<p><\/p>\n<p><em>Abbiamo parlato di 4 metriche che distinguono le aziende di successo da quelle in ritardo. Prima di arrivare a queste 4 metriche, bisogna sopravvivere. Se in media un compito richiede un mese, ti suggerirei di concentrarti prima su questa metrica. Abbassala a 3 giorni. Solo dopo comincia a pensare al Continuous.<\/em><\/p>\n<p><\/p>\n<p>Ho capito bene che pensi che investire nelle pratiche ingegneristiche non abbia senso se ogni compito richiede un mese?<\/p>\n<p><\/p>\n<p><em>Hai Continuous Integration. E l\u00ec c'\u00e8 un concetto per cui in 10 minuti puoi correggere un errore o ripristinare. Immagina di farlo. Inoltre, hai anche il continuous deployment, lo hai rilasciato in produzione e solo dopo ti sei accorto che qualcosa \u00e8 andato storto. Devi ripristinarlo, ma hai gi\u00e0 effettuato la migrazione del database. La schema del database \u00e8 gi\u00e0 alla versione successiva, e di pi\u00f9, anche un backup \u00e8 stato eseguito, e vi sono gi\u00e0 stati scritti dei dati.<\/em><\/p>\n<p><\/p>\n<p><em>Qual \u00e8 la tua alternativa? Se ripristini il codice precedente, non pu\u00f2 pi\u00f9 funzionare con questo database aggiornato.<\/em><\/p>\n<p><\/p>\n<p>Il database si muove solo avanti, s\u00ec. <\/p>\n<p><\/p>\n<p><em>Le persone che hanno una cattiva pratica ingegneristica probabilmente non hanno nemmeno letto un grande libro su ... cosa fare con i backup? Se ti ripristini da un backup, significa che perdi i dati accumulati nel frattempo. Ad esempio, hai lavorato per tre ore con la nuova versione del database, e gli utenti si sono registrati. Torni al vecchio backup, perch\u00e9 con la nuova versione la schema non funziona, quindi hai perso quegli utenti. E loro sono scontenti, stanno protestando.<\/em><\/p>\n<p><\/p>\n<p><em>Per padroneggiare l'intero spettro delle pratiche che supportano l'Integrazione Continua e la Consegna Continua, non basta semplicemente imparare a scrivere .... In primo luogo, potrebbero diventare molte, e questo sarebbe impraticabile. Inoltre, ci sono molte altre pratiche, come quelle Scientifiche. C'\u00e8 una pratica che GitHub ha reso popolare, un tempo. \u00c8 quando esegui sia il codice vecchio che quello nuovo contemporaneamente. \u00c8 quando lavori su una funzionalit\u00e0 incompleta, ma pu\u00f2 restituire un valore: sia come funzione, sia come API Rest. Esegui sia il codice nuovo che quello vecchio, confrontando le differenze tra di loro. E se ci sono differenze, le registri. In questo modo sai che la tua nuova funzionalit\u00e0 \u00e8 pronta per essere distribuita sopra la vecchia, se non ci sono state discrepanze tra questi due per un certo periodo di tempo.<\/em> <\/p>\n<p><\/p>\n<p><em>Ci sono centinaia di queste pratiche. Proporrei di iniziare con lo sviluppo transbase. Non \u00e8 100 % basato sull'Integrazione Continua, ma le pratiche sono le stesse, uno senza l'altro vive male.<\/em> <\/p>\n<p><\/p>\n<p>Hai citato lo sviluppo transbase come esempio, dove si possono osservare le pratiche, o stai suggerendo alle persone di iniziare a utilizzare lo sviluppo transbase?<\/p>\n<p><\/p>\n<p><em>Osservare, poich\u00e9 non saranno in grado di usarlo. Per utilizzarle, \u00e8 necessario leggere molto. E quando a una persona viene chiesto: \"Cosa fare con una funzionalit\u00e0 che richiede un mese,\" significa che non ha letto riguardo allo sviluppo transbase. E non lo consiglier\u00f2 ancora. Consiglierei di concentrarsi esclusivamente sul tema di come suddividere architettonicamente grandi compiti in compiti pi\u00f9 piccoli. Questo \u00e8 il vero significato della decomposizione.<\/em><\/p>\n<p><\/p>\n<p><em>La decomposizione \u00e8 uno degli strumenti dell'architetto. Iniziamo sempre con un'analisi, poi la decomposizione, poi la sintesi, poi l'integrazione. In questo modo tutto si compone. E per arrivare all'Integrazione Continua dobbiamo prima crescere attraverso la decomposizione. Le domande sorgono nella prima fase, mentre noi stiamo gi\u00e0 parlando della quarta fase, cio\u00e8 pi\u00f9 spesso facciamo integrazione, meglio \u00e8. \u00c8 ancora troppo presto per farla, sarebbe meglio prima rifinire il proprio monolite.<\/em> <\/p>\n<p><\/p>\n<p><em>\u00c8 necessario disegnare un certo numero di frecce e quadrati in uno schema. Non puoi dire che ora mostrer\u00f2 lo schema architettonico della nuova applicazione e mostrare un quadrato, all'interno del quale c'\u00e8 un pulsante verde per l'applicazione. In ogni caso ci saranno pi\u00f9 quadrati e frecce. In qualsiasi schema che ho visto, ce ne erano pi\u00f9 di uno. E la decomposizione anche a livello di rappresentazione grafica \u00e8 gi\u00e0 in atto. Quindi i quadrati possono essere resi indipendenti. Se no, ho grandi dubbi sull'architetto.<\/em> <\/p>\n<p><\/p>\n<p>C'\u00e8 una domanda dalla chat: \u00abSe la revisione \u00e8 obbligatoria e dura a lungo, un giorno o pi\u00f9?\u00bb.<\/p>\n<p><\/p>\n<p>Hai problemi con la pratica. Non dovrebbe durare una revisione un giorno o pi\u00f9. \u00c8 la stessa storia della domanda precedente, solo un po' pi\u00f9 delicata. Se una revisione dura un giorno, significa che probabilmente si tratta di una revisione di un cambiamento molto grande. Quindi, bisogna farne meno. Nello sviluppo di transbase, che Oleg ha raccomandato, c'\u00e8 una storia che si chiama revisione continua. L'idea \u00e8 che facciamo richieste di pull cos\u00ec piccole intenzionalmente, perch\u00e9 miriamo a unire costantemente e poco per volta. E quindi la richiesta di pull modifica un'astrazione o 10 righe. Grazie a ci\u00f2, la revisione ci richiede qualche minuto. <\/p>\n<p><\/p>\n<p>Se una revisione richiede un giorno o pi\u00f9, significa che qualcosa non va. Innanzitutto, potrebbe esserci qualche problema con l'architettura. Oppure si tratta di un grande pezzo di codice, ad esempio di 1.000 righe. Oppure hai un'architettura cos\u00ec complessa che una persona non riesce a capirla. Questo \u00e8 un problema secondario, ma anche questo dovr\u00e0 essere risolto. Potrebbe non essere affatto necessaria la revisione. Su questo bisogna riflettere. La revisione \u00e8 quella cosa che ti sta rallentando. Porta i suoi vantaggi in generale, ma bisogna capire perch\u00e9 lo stai facendo. \u00c8 un modo veloce per comunicare informazioni, \u00e8 un modo per stabilire degli standard interni o che altro? Perch\u00e9 ti serve? Perch\u00e9 la revisione deve essere fatta o molto velocemente, o annullata del tutto. \u00c8 come lo sviluppo di transbase: una storia molto bella, ma solo per ragazzi maturi. <\/p>\n<p><\/p>\n<p>Riguardo le 4 metriche, consiglio di toglierle comunque, per capire a cosa portano. Guardare i numeri, vedere l'immagine, quanto \u00e8 tutto male. <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Sono pronto a discutere di questo con te. I numeri e le metriche sono fantastici, le pratiche sono fantastiche. Ma bisogna capire se sono necessari per il business. Ci sono aziende che non hanno bisogno di una tale rapidit\u00e0 di cambiamento. Conosco aziende in cui non possono apportare cambiamenti ogni 15 minuti. Non perch\u00e9 siano cattive, ma \u00e8 un ciclo di vita. E per implementare funzionalit\u00e0 come branches e toggle, sono necessarie conoscenze approfondite.<\/em> <\/p>\n<p><\/p>\n<p>\u00c8 complicato. Se vuoi leggere di pi\u00f9 sulla funzionalit\u00e0 toggle, te la consiglio vivamente. <noindex><a rel=\"nofollow\" href=\"https:\/\/trunkbaseddevelopment.com\/\">https:\/\/trunkbaseddevelopment.com\/<\/a><\/noindex>. E c'\u00e8 un ottimo articolo di Martin Fowler sulle funzionalit\u00e0 toggle: sui diversi tipi, sui cicli di vita, ecc. La funzionalit\u00e0 toggle \u00e8 complessa. <\/p>\n<p><\/p>\n<p><em>E tuttavia non hai risposto alla domanda: \"Jenkins \u00e8 necessario o no?\"<\/em><\/p>\n<p><\/p>\n<p>Jenkins non \u00e8 necessario in nessun caso, in realt\u00e0. Se vogliamo essere seri, strumenti come Jenkins e Gitlab ti offriranno comodit\u00e0. Vedrai se la build \u00e8 andata a buon fine o meno. Possono aiutarti, ma non forniscono pratiche. Possono darti solo un cerchietto \u2013 Ok o non Ok. E questo solo se stai scrivendo test, perch\u00e9 senza test \u00e8 quasi inutile. Quindi \u00e8 necessario perch\u00e9 \u00e8 pi\u00f9 comodo, ma in generale puoi vivere anche senza di esso, non perderai molto. <\/p>\n<p><\/p>\n<p><em>Cio\u00e8, se hai pratiche, significa che non ti serve?<\/em><\/p>\n<p><\/p>\n<p>Esattamente. Ti consiglio il test di Jez Humble. Ho un'opinione ambivalente sull'ultimo punto. Ma in generale, se hai tre cose: ti unisci costantemente, esegui test sui commit nel ramo master, ripari rapidamente la build nel master, allora forse non ti serve altro. <\/p>\n<p><\/p>\n<p><em>Mentre aspettiamo domande dai partecipanti, ho una domanda. Abbiamo parlato di codice di prodotto. Hai mai utilizzato per il codice infrastrutturale? \u00c8 lo stesso tipo di codice, segue gli stessi principi e ha lo stesso ciclo di vita, oppure ci sono altri cicli di vita e principi? Di solito, quando si parla di Continuous Integration e Development, si dimentica che c'\u00e8 anche il codice infrastrutturale. E ultimamente ce n'\u00e8 sempre di pi\u00f9. Dovremmo applicare tutte queste regole anche l\u00ec?<\/em><\/p>\n<p><\/p>\n<p>Non solo dovremmo, sarebbe fantastico, perch\u00e9 in questo modo si semplificherebbe sicuramente la vita. Non appena lavoriamo con codice, non con script bash, ma abbiamo codice normale.<\/p>\n<p><\/p>\n<p><em>Aspetta, aspetta, uno script bash \u00e8 comunque codice. Non toccare il mio vecchio amore.<\/em> <\/p>\n<p><\/p>\n<p>Va bene, non calpester\u00f2 i tuoi ricordi. Ho un'avversione personale nei confronti di bash. Si rompe in modo brutto e spaventoso tutto il tempo. E si rompe spesso in modo imprevedibile, quindi non lo gradisco. Ma va bene, supponiamo che tu abbia codice in bash. Forse davvero non capisco e l\u00ec ci sono framework normali per il testing. Non sono affatto aggiornato. E otteniamo gli stessi vantaggi.<\/p>\n<p><\/p>\n<p>Appena iniziamo a lavorare con l'infrastruttura come se fosse codice, ci troviamo di fronte agli stessi problemi degli sviluppatori. Qualche mese fa, mi sono trovato in una situazione in cui un collega mi ha inviato una pull request di 1.000 righe in bash. E tu rimani bloccato nella revisione per 4 ore. I problemi sono gli stessi. \u00c8 ancora codice. E ancora collaborazione. Rimaniamo bloccati con la pull request e ci impantaniamo con la risoluzione degli stessi conflitti di merge dello stesso bash, per esempio. <\/p>\n<p><\/p>\n<p>Attualmente sto seguendo con molta attenzione questa cosa sul programmazione bella dell'infrastruttura. Ho appena introdotto Pulumi nell'infrastruttura. \u00c8 puro programming. \u00c8 ancora pi\u00f9 carino, perch\u00e9 ho tutte le possibilit\u00e0 del linguaggio di programmazione; quindi ho creato dei toggle carini con gli if in un attimo e tutto va bene. Cio\u00e8, la mia modifica \u00e8 gi\u00e0 nel master. \u00c8 gi\u00e0 visibile a tutti. Altri ingegneri ne sono a conoscenza. Ha gi\u00e0 avuto un certo impatto. Ma si \u00e8 attivata non per tutte le infrastrutture. Si \u00e8 attivata per i miei ambienti di test, per esempio. Quindi, rispondendo di nuovo alla tua domanda, \u00e8 necessario. Ci semplifica la vita come ingegneri che lavorano con il codice. <\/p>\n<p><\/p>\n<p><em>Se qualcuno ha altre domande?<\/em> <\/p>\n<p><\/p>\n<p>Ho una domanda. Voglio continuare la discussione con Oleg. In generale, penso che tu abbia ragione: se un compito richiede un mese, hai un problema di architettura, un problema di analisi, scomposizione, pianificazione, ecc. Ma ho la sensazione che se inizi a vivere secondo il Continuous Integration, inizierai a risolvere i problemi di pianificazione, perch\u00e9 non puoi sfuggire a questa realt\u00e0. <\/p>\n<p><\/p>\n<p><em>(Oleg) S\u00ec, \u00e8 tutto vero. In termini di lavoro, questa pratica \u00e8 paragonabile a qualsiasi altra pratica seria che cambia la cultura. La cosa pi\u00f9 difficile nel superare questo \u00e8 l'abitudine, soprattutto le cattive abitudini. E se per implementare questa pratica \u00e8 necessaria una seria modifica delle abitudini delle persone intorno a te: sviluppatori, management, production manager, ti aspettano delle sorprese.<\/em> <\/p>\n<p><\/p>\n<p><em>Quali sorprese possono esserci? Diciamo che hai deciso di effettuare integrazioni pi\u00f9 frequentemente. E con le integrazioni hai legato altre cose, ad esempio, artefatti. E nella tua azienda, ad esempio, c'\u00e8 una politica secondo cui ogni artefatto deve essere in qualche modo registrato in un certo sistema di archiviazione degli artefatti. Questo richiede un certo tempo. \u00c8 necessario che qualcuno segni che, come release manager, ha verificato che questo artefatto \u00e8 pronto per essere rilasciato in produzione. Se questo richiede 5-10-15 minuti, ma tu effettui un rilascio una volta alla settimana, dedicare mezz'ora a questo ogni settimana non \u00e8 un grande prezzo.<\/em> <\/p>\n<p><\/p>\n<p><em>Se fai Continuous Integration 10 volte al giorno, devi moltiplicare 10 per 30 minuti. E questo supera la quantit\u00e0 di tempo lavorativo di quel release manager. Si stanca semplicemente di farlo. Ci sono costi costanti per alcune pratiche. E basta.<\/em> <\/p>\n<p><\/p>\n<p><em>E devi o annullare questa regola, in modo da non dover pi\u00f9 occuparti di queste cose, cio\u00e8 non assegni manualmente il grado di conformit\u00e0 di qualcosa a qualcosa. Ti affidi totalmente a una serie di test automatizzati di prontezza.<\/em> <\/p>\n<p><\/p>\n<p><em>E se hai bisogno di un'approvazione da qualcuno affinch\u00e9 il principale firmi, e non entri in produzione senza che Vasya abbia detto che va bene, ecc. \u2013 tutta questa burocrazia ostacola le pratiche. Perch\u00e9 se ci sono attivit\u00e0 collegate come un onere, tutto aumenta di 100 volte. Pertanto, il cambiamento sar\u00e0 spesso percepito con meno entusiasmo. Perch\u00e9 \u00e8 difficile correggere le abitudini delle persone.<\/em> <\/p>\n<p><\/p>\n<p><em>Quando una persona svolge un lavoro abituale, lo fa praticamente senza pensarci. Il suo carico cognitivo \u00e8 pari a zero. Esegue semplicemente il compito, la sua mente ha gi\u00e0 un checklist, lo ha fatto mille volte. E non appena arrivi e gli dici: \u201cAnnulliamo questa pratica e da luned\u00ec ne implementiamo una nuova\u201d, per lui diventa un notevole carico cognitivo. E ci\u00f2 si verifica immediatamente per tutti.<\/em> <\/p>\n<p><\/p>\n<p><em>Pertanto, la cosa pi\u00f9 semplice, anche se non tutti possono permettersi questo lusso, \u00e8 proprio ci\u00f2 che faccio sempre. Quando inizia un nuovo progetto, di solito vengono subito inglobate tutte le pratiche non testate. Finch\u00e9 il progetto \u00e8 giovane, non rischiamo molto. Non c'\u00e8 ancora produzione, non c'\u00e8 nulla da distruggere. Quindi possiamo utilizzarlo come allenamento. Questo approccio funziona. Ma non tutte le aziende hanno la possibilit\u00e0 di avviare progetti come questi frequentemente. Anche se \u00e8 un po' strano, perch\u00e9 ora si parla di trasformazione digitale, tutti devono avviare esperimenti per stare al passo con i concorrenti.<\/em> <\/p>\n<p><\/p>\n<p>Qui ti scontri con il fatto che devi avere prima una comprensione di cosa devi fare. Il mondo non \u00e8 perfetto, n\u00e9 la produzione \u00e8 perfetta. <\/p>\n<p><\/p>\n<p><em>S\u00ec, queste cose sono collegate.<\/em><\/p>\n<p><\/p>\n<p>Anche le aziende non hanno sempre chiaro che devono andare in una certa direzione. <\/p>\n<p><\/p>\n<p><em>Ci sono situazioni in cui nessun cambiamento \u00e8 possibile. Questa \u00e8 una situazione in cui il team \u00e8 sotto una pressione maggiore. Il team \u00e8 gi\u00e0 abbastanza provato. Non ha tempo di riserva per esperimenti. Lavorano tutto il giorno per sviluppare funzionalit\u00e0. E la direzione richiede sempre pi\u00f9 funzionalit\u00e0. In una tale situazione, nessun cambiamento \u00e8 possibile. Allo staff pu\u00f2 solo essere detto che domani faremo come ieri, dobbiamo solo fare qualche funzionalit\u00e0 in pi\u00f9. Nessuna transizione a pratiche diverse \u00e8 possibile in questo senso. Questa \u00e8 una situazione classica in cui non c'\u00e8 tempo per affilare l'ascia, bisogna abbattere gli alberi, quindi si abbattono con un'ascia smussata. Non ci sono consigli facili qui.<\/em> <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Legger\u00f2 un chiarimento dalla chat: \u00abMa \u00e8 necessario avere una vasta copertura di test a diversi livelli. Quanto tempo \u00e8 dedicato ai test? \u00c8 un po' costoso, richiede molto tempo\u00bb.<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg) Questo \u00e8 un malinteso classico. Ci devono essere abbastanza test affinch\u00e9 voi stessi siate sicuri. L'Integrazione Continua non \u00e8 una cosa in cui inizi prima con il 100% di test e solo poi inizi a praticarla. L'Integrazione Continua riduce il carico cognitivo su di voi, dato che ogni cambiamento che vedete \u00e8 cos\u00ec ovvio che capite se romper\u00e0 qualcosa o meno, anche senza test. Potete testarlo mentalmente rapidamente, perch\u00e9 sono piccole modifiche. Anche se avete solo tester manuali, \u00e8 pi\u00f9 semplice per loro. Avete rilasciato e detto:<\/em><\/p>\n<p><\/p>\n<p>Qui hai, ovviamente, esagerato. <\/p>\n<p><\/p>\n<p><em>(Dmitry) Qui non sono d'accordo. Esiste una pratica - lo sviluppo tramite test - che vi salver\u00e0 proprio da questo.<\/em> <\/p>\n<p><\/p>\n<p><em>(Oleg) Ecco, non ci ero ancora arrivato. La prima illusione \u00e8 che bisogna scrivere esattamente il 100% dei test o che non si debba affatto praticare l'Integrazione Continua. Non \u00e8 vero. Sono due pratiche parallele. E non dipendono direttamente l'una dall'altra. La vostra copertura dei test deve essere ottimale. Ottimale significa che voi stessi siete sicuri che la qualit\u00e0 del master, rimasta dopo il commit, vi permetta di premere il pulsante \"Distribuisci\" con sicurezza venerd\u00ec sera, mentre siete ubriachi. Come ci riuscite? Attraverso revisioni, copertura e un buon monitoraggio.<\/em> <\/p>\n<p><\/p>\n<p><em>Un buon monitoraggio \u00e8 indistinguibile dai test. Se eseguite i test una sola volta su pre-produzione, controllano solo una volta tutti i vostri scenari utente e poi basta. Se li eseguite in un ciclo infinito, allora \u00e8 il vostro sistema di monitoraggio esteso che testando tutto in continuazione - \u00e8 caduto o non \u00e8 caduto. In questo caso, la differenza sta solo nell'unicit\u00e0 o molteplicit\u00e0. Un insieme molto buono di test, ...lanciato indefinitamente, \u00e8 monitoraggio. E un corretto monitoraggio deve essere proprio cos\u00ec.<\/em> <\/p>\n<p><\/p>\n<p><em>E quindi, come raggiungerete esattamente lo stato in cui venerd\u00ec sera vi distribuite e andate a casa, \u00e8 un'altra questione. Forse siete solo un temerario.<\/em> <\/p>\n<p><\/p>\n<p>Torniamo un po' indietro al Continuous Integration. Siamo scivolati in un'altra pratica complessa. <\/p>\n<p><\/p>\n<p><em>E la seconda illusione \u00e8 che l'MVP, si dice, debba essere fatto rapidamente, quindi i test non servono affatto. Non \u00e8 del tutto cos\u00ec. La questione \u00e8 che quando scrivi una user story in un MVP, puoi svilupparla o senza scrupoli, cio\u00e8 hai sentito che c'\u00e8 una certa user story e subito inizi a codificare, oppure lavorare secondo TDD. E con TDD, come dimostra la pratica, non ci si impiega di pi\u00f9, cio\u00e8 i test sono un effetto collaterale. La pratica del TDD non riguarda solo il testare. Nonostante si chiami Test Driven Development, qui si parla in realt\u00e0 di architettura. \u00c8 un approccio su come scrivere esattamente ci\u00f2 di cui hai bisogno e non scrivere ci\u00f2 che non serve. Questa pratica \u00e8 focalizzata sulla prossima iterazione del tuo sviluppo in termini di creazione dell'architettura dell'applicazione.<\/em> <\/p>\n<p><\/p>\n<p><em>Perci\u00f2 non \u00e8 cos\u00ec semplice liberarsi da queste illusioni. MVP e test non si escludono a vicenda. Anzi, \u00e8 piuttosto l'opposto: se sviluppi l'MVP seguendo la pratica TDD, lo farai meglio e pi\u00f9 velocemente rispetto a farlo senza alcuna pratica e senza una logica.<\/em><\/p>\n<p><\/p>\n<p>\u00c8 un pensiero molto non ovvio e complesso. Quando senti dire che adesso scriver\u00f2 anche i test e nel frattempo far\u00f2 qualcosa di pi\u00f9 velocemente, suona assolutamente inadeguato. <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Qui molte persone, quando parlano di MVP, si \u00e8 pigri a scrivere qualcosa di normale. E queste sono comunque due cose diverse. Non bisogna trasformare l'MVP in una cosa brutta che non funziona.<\/em> <\/p>\n<p><\/p>\n<p>S\u00ec, hai ragione.<\/p>\n<p><\/p>\n<p><em>E poi, all'improvviso, l'MVP in produzione.<\/em><\/p>\n<p><\/p>\n<p>Per sempre. <\/p>\n<p><\/p>\n<p>E TDD suona molto insolito quando senti che scrivi test e sembri fare pi\u00f9 lavoro. Questo suona molto strano, ma in realt\u00e0 ci si riesce pi\u00f9 velocemente e meglio. Quando scrivi un test, gi\u00e0 nella tua testa stai pensando molto a quale codice e come sar\u00e0 chiamato, e anche quale comportamento ci aspettiamo da esso. Non stai solo dicendo che ho scritto una certa funzione e che fa qualcosa. Prima hai pensato che avesse determinate condizioni, che sarebbe stata chiamata in un certo modo. Copri questo con i test e da questo capisci come appariranno le interfacce all'interno del tuo codice. Questo influisce notevolmente sull'architettura. Il tuo codice diventa automaticamente pi\u00f9 modulare, perch\u00e9 prima cerchi di capire come lo testerai e solo dopo lo scrivi. <\/p>\n<p><\/p>\n<p>Con TDD \u00e8 successo che a un certo punto ho assunto un mentore per Ruby, quando ero ancora un programmatore Ruby. E lui dice: \u00abFacciamo che tu farai TDD\u00bb. E io penso: \u00abCavolo, devo scrivere ancora qualcosa\u00bb. Cos\u00ec ci siamo messi d'accordo che avrei scritto tutto il codice lavorativo in Python seguendo il TDD per due settimane. Dopo due settimane ho capito che non volevo tornare indietro. Provando ad applicarlo ovunque per due settimane, ti rendi conto di quanto sia diventato pi\u00f9 semplice anche solo pensare. Ma non \u00e8 ovvio, quindi consiglio a tutti che, se avete l'impressione che il TDD sia difficile, lungo e superfluo, provate a seguirlo per sole due settimane. A me sono bastate due settimane per rendermene conto.<\/p>\n<p><\/p>\n<p><em>(Dmitrij) Possiamo approfondire questo concetto dal punto di vista dell'utilizzo dell'infrastruttura. Prima di avviare qualcosa di nuovo, eseguiamo il monitoraggio, e poi lanciamo. In questo caso il monitoraggio diventa un vero e proprio test. E c'\u00e8 uno sviluppo attraverso il monitoraggio. Ma quasi tutti dicono che \u00e8 lungo, che \u00e8 noioso, ho fatto una bozza temporanea. Se abbiamo fatto un buon monitoraggio, comprendiamo lo stato del sistema CI. E nel sistema CI ci sono molti monitoraggi. Comprendiamo lo stato del sistema, capiamo cosa accade al suo interno. E durante lo sviluppo ci assicuriamo di portare il sistema allo stato desiderato.<\/em> <\/p>\n<p><\/p>\n<p><em>Queste pratiche sono conosciute da tempo. Ne parlavamo circa 4 anni fa. Ma in 4 anni praticamente nulla \u00e8 cambiato.<\/em> <\/p>\n<p><\/p>\n<p><em>Ma su questa nota propongo di concludere la discussione ufficiale.<\/em><\/p>\n<p><\/p>\n<p>Video (inserito come elemento multimediale, ma per qualche motivo non funziona):<\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/zZ3qXVN3Oic\">https:\/\/youtu.be\/zZ3qXVN3Oic<\/a><\/noindex><br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/518406\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0431\u0441\u0443\u0434\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443 CI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 CI \u2013 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u043e\u0435. \u041a\u0430\u043a\u0443\u044e \u0431\u043e\u043b\u044c CI \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0442\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Jenkins. \u041c\u044b\u0441\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e Continuous Integration \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0435\u0449\u0435 \u0433\u043e\u0434 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u044f \u0445\u043e\u0434\u0438\u043b \u043f\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u0441\u043a\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443. \u041f\u043e\u043e\u0431\u0449\u0430\u043b\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":93886,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-93885","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Continuous Integration \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 Jenkins. \u0410\u043d\u0434\u0440\u0435\u0439 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-10T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-10T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Continuous Integration come pratica, non Jenkins. Andrey Alexandrov | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Continuous Integration \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 Jenkins. \u0410\u043d\u0434\u0440\u0435\u0439 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432 | ProHoster","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-10T17:42:23+00:00","article:modified_time":"2020-09-10T17:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"93885","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:37:31","updated":"2022-09-27 15:57:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/93885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=93885"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/93885\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/93886"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=93885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=93885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=93885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}