Dall'esperienza passata con una base di codice Big Ball Of Mud che si è evoluta naturalmente nel corso degli anni per mano di molti sviluppatori junior senza supervisione, vorrei sottolineare cosa succede quando non si pratica la CI con quegli sviluppatori.
Modifica / Aggiorna : come da commento di RubberDuck; questa risposta presuppone che l'obiettivo di unione per l'integrazione sia un ramo di sviluppo piuttosto che un ramo di valutazione o di rilascio.
- Ovviamente è necessario un maggiore controllo sul codice per il rilascio e la distribuzione live; se non esiste un ramo di produzione separato, varrebbe la pena prendere in considerazione una modifica alla strategia di diramazione / fusione per eseguire un ramo di sviluppo principale (che viene utilizzato per i test di integrazione e mai per il rilascio) insieme al ramo di rilascio principale. Ciò mantiene tutti i vantaggi di CI e fusioni frequenti senza rischiare di rompere il codice di produzione.
1. Gli sviluppatori junior hanno meno probabilità di comunicare con i loro colleghi o supervisori
L'integrazione continua non è semplicemente una questione di fusione nel codice, è un momento nel quale uno sviluppatore è costretto a interagire con altre parti interessate.
La comunicazione è importante e senza voler esagerare con la generalizzazione, tende ad essere un'abilità appresa che arriva in modo meno naturale agli sviluppatori inesperti rispetto a quelli che sono abituati a lavorare in un ambiente di squadra.
Se si consente agli sviluppatori junior di sedersi nel proprio cubicolo e scappare via al codice per settimane senza che vengano richiesti rapporti / recensioni frequenti, è più probabile che evitino del tutto la comunicazione.
2. È probabile che il codice che stanno producendo necessiti di una revisione più rigorosa
Hai mai recensito qualcosa di così brutto da desiderare di averlo raccolto prima e di non averlo mai scritto? Questo succede molto.
Non è possibile impedire la scrittura di codice errato, ma è possibile limitare il tempo perso. Se ti impegni a frequenti revisioni e fusioni, riduci al minimo l'ambito per perdere tempo.
Lo scenario peggiore è che potresti lasciare uno sviluppatore junior da solo per diverse settimane nel suo progetto in miniatura e quando sono finalmente pronti per la revisione del codice, semplicemente non c'è abbastanza tempo rimanente per buttare tutto il casino via e ricominciare da zero.
Molti progetti diventano una grande palla di fango semplicemente perché un intero carico di codice errato è stato scritto quando nessuno prestava attenzione fino a quando non era troppo tardi.
3. Dovresti essere meno sicuro che uno sviluppatore junior o un altro nuovo membro del team abbia compreso i requisiti
A volte uno sviluppatore potrebbe creare la soluzione perfetta al problema sbagliato; questo è triste perché di solito si tratta di semplici equivoci che sarebbero così facili da evitare se solo qualcuno avesse posto le domande giuste in precedenza nel processo.
Ancora una volta, questo è un problema che ha maggiori probabilità di influenzare gli sviluppatori inesperti che hanno maggiori probabilità di accettare requisiti "cattivi" al valore nominale invece di respingere e mettere in discussione la saggezza del requisito.
4. È probabile che abbiano meno familiarità con i modelli comuni, con l'architettura del codice esistente e con strumenti e soluzioni noti
A volte uno sviluppatore trascorre un sacco di tempo reinventando inutilmente la ruota semplicemente perché non sapeva che esisteva una soluzione migliore. Oppure potrebbero passare giorni cercando di martellare un piolo quadrato in un buco rotondo senza rendersi conto di ciò che stanno facendo di sbagliato.
Ancora una volta, questo genere di cose è più probabile che accada a sviluppatori inesperti e il modo migliore per affrontare il problema è garantire revisioni regolari.
5. Lunghi periodi tra commit e fusioni del codice rendono più difficile identificare e correggere i difetti
Quando un bug emerge immediatamente dopo molte settimane di modifiche al codice sono state unite nel ramo principale, la sfida di identificare quale modifica potrebbe aver causato il bug diventa più difficile.
Ovviamente qui entra in gioco anche la tua strategia di ramificazione generale; idealmente tutti i tuoi sviluppatori lavoreranno nei loro rami o all'interno di rami funzione (o entrambi) e non funzioneranno mai direttamente dal master / trunk.
Ho visto situazioni in cui interi team lavorano tutti direttamente nel master / trunk allo stesso tempo, e questo è un ambiente terribile per CI, ma fortunatamente la soluzione di allontanare tutti dal master / trunk in genere fornisce abbastanza stabilità per il lavoro individuale articoli / biglietti / etc.
Dovrebbe sempre essere "OK" per qualsiasi sviluppatore rompere il ramo master / trunk, con la consapevolezza che la fusione dovrebbe avvenire su una base così regolare, che la rottura di cambiamenti e difetti dovrebbe essere identificata più rapidamente e quindi risolta anche più rapidamente. I difetti peggiori sono in genere quelli che rimangono inosservati per mesi o addirittura anni.
In sintesi; i principali vantaggi dell'integrazione continua / implementazione continua sono:
- La comunicazione tra il tuo team migliora
- La qualità del codice è generalmente mantenuta a uno standard più elevato
- È meno probabile che i requisiti vengano persi o male interpretati
- I problemi di architettura e design dovrebbero essere rilevati più rapidamente,
- È più probabile che i difetti vengano rilevati e risolti in una fase precedente
Quindi, se non stai praticando CI con i tuoi sviluppatori junior, stai accettando molti rischi non necessari significativi, poiché questi sono i membri del tuo team che ne hanno bisogno più degli altri.
it is more scary to wait a week to deploy all micro services at once to make sure that everything works together, than to strictly enforce api versioning, write lots of automatic tests (...), and auto deploy to production as soon as your commit passes as tests on stage
- basato sull'opinione;) IMHO è molto più difficile garantire il successo con l'implementazione di servizi indipendenti piuttosto che con un approccio monolitico: softwareengineering.stackexchange.com/a/342346/187812 . E con un vero elemento della configurazione (nessun ramo funzionalità / integrazione) non dovresti aspettare una settimana.