Non puoi sapere cos'è la CI se non sai cosa facevamo. Immagina un sistema con 3 parti. C'è un'interfaccia utente che raccoglie i dati e li inserisce nel database. Esiste un sistema di reporting che crea report dal database. E c'è una sorta di server che monitora il database e invia avvisi e-mail se vengono soddisfatti determinati criteri.
Molto tempo fa questo sarebbe stato scritto come segue:
- Concordare lo schema per il database e i requisiti: ciò richiederebbe settimane perché doveva essere perfetto poiché vedrai presto perché
- Assegna 3 sviluppatori o 3 team indipendenti di sviluppatori ai 3 pezzi
- Ogni sviluppatore avrebbe lavorato sul proprio pezzo e testato il proprio pezzo usando la propria copia del database, per settimane o mesi.
Durante questo periodo gli sviluppatori non eseguivano il codice a vicenda, né cercavano di utilizzare una versione del database che era stata creata dal codice di qualcun altro. Lo scrittore di report aggiungerebbe semplicemente un mucchio di dati di esempio. Il writer degli avvisi aggiungeva manualmente record che simulavano eventi di report. E il writer della GUI avrebbe esaminato il database per vedere cosa aveva aggiunto la GUI. Nel tempo, gli sviluppatori si sarebbero resi conto che la specifica era in qualche modo sbagliata, come non specificare un indice o avere una lunghezza del campo troppo breve, e "risolverlo" nella loro versione. Potrebbero dire agli altri, che potrebbero agire su di esso, ma di solito queste cose andrebbero in un elenco per dopo.
Quando tutte e tre le parti fossero completamente codificate, testate dai loro sviluppatori e talvolta anche testate dagli utenti (mostrando loro un rapporto, una schermata o un avviso via e-mail), sarebbe arrivata la fase di "integrazione". Questo è stato spesso iscritto in bilancio per diversi mesi, ma sarebbe comunque andato oltre. Quella modifica della lunghezza del campo da parte di dev 1 sarebbe scoperta qui e richiederebbe agli sviluppatori 2 e 3 di apportare enormi modifiche al codice e, eventualmente, anche modifiche all'interfaccia utente. Quell'indice in più causerebbe il suo stesso caos. E così via. Se a uno degli sviluppatori fosse stato detto da un utente di aggiungere un campo, e ora sarebbe arrivato il momento in cui anche gli altri due dovevano aggiungerlo.
Questa fase è stata brutalmente dolorosa e praticamente impossibile da prevedere. Quindi la gente ha iniziato a dire "dobbiamo integrarci più spesso". "Dobbiamo lavorare insieme dall'inizio." "Quando uno di noi solleva una richiesta di modifica [è così che abbiamo parlato allora] gli altri devono saperlo." Alcuni team hanno iniziato a fare test di integrazione in precedenza continuando a lavorare separatamente. E alcuni team hanno iniziato a utilizzare il codice reciproco e l'output tutto il tempo, fin dall'inizio. E quello è diventato l'integrazione continua.
Potresti pensare che sto esagerando quella prima storia. Ho lavorato un po 'per un'azienda una volta in cui il mio contatto mi ha tirato fuori per aver controllato un codice che soffriva dei seguenti difetti:
- uno schermo su cui non stava lavorando aveva un pulsante che non faceva ancora nulla
- nessun utente aveva firmato il progetto dello schermo (colori e caratteri precisi; l'esistenza dello schermo, le sue capacità e quali pulsanti aveva nelle specifiche di 300 pagine)
Era sua opinione che non si mettesse roba nel controllo del codice sorgente finché non è FATTA. In genere faceva uno o due check-in un ANNO. Abbiamo avuto un po 'di differenza filosofica :-)
Inoltre, se trovi difficile credere che i team sarebbero disconnessi attorno a una risorsa condivisa come un database, non crederai davvero (ma è vero) che lo stesso approccio è stato adottato per il codice. Hai intenzione di scrivere una funzione che posso chiamare? È fantastico, vai avanti e fallo, nel frattempo deciderò semplicemente ciò di cui ho bisogno. Mesi dopo "integrerò" il mio codice in modo che chiami la tua API e scopriremo che esplode se passo null, esplode se restituisce null (e lo fa molto) restituisce cose troppo grandi per me, non può sopportare anni bisestili e mille altre cose. Lavorare in modo indipendente e quindi avere una fase di integrazione era normale. Ora sembra follia.