Você não pode saber o que é IC, a menos que saiba o que costumávamos fazer. Imagine um sistema com 3 partes. Há uma interface do usuário que reúne dados e os coloca no banco de dados. Existe um sistema de relatórios que faz relatórios a partir do banco de dados. E há algum tipo de servidor que monitora o banco de dados e envia alertas por email se determinados critérios forem atendidos.
Há muito tempo, isso seria escrito da seguinte maneira:
- Concorde com o esquema do banco de dados e com os requisitos - isso levaria semanas, pois precisava ser perfeito, pois em breve você verá por que
- Atribua 3 desenvolvedores, ou 3 equipes independentes de desenvolvedores, às 3 partes
- Cada desenvolvedor trabalhava em sua peça e a testava usando sua própria cópia do banco de dados, por semanas ou meses.
Durante esse período, os desenvolvedores não executariam o código um do outro, nem tentariam usar uma versão do banco de dados criada pelo código de outra pessoa. O redator do relatório apenas adicionaria manualmente um monte de dados de amostra. O gravador de alerta adicionaria manualmente registros que simulavam eventos de relatório. E o escritor da GUI examinaria o banco de dados para ver o que a GUI havia adicionado. Com o tempo, os desenvolvedores perceberiam que a especificação estava errada de alguma forma, como não especificar um índice ou ter um tamanho de campo muito curto e "corrigi-lo" em sua versão. Eles podem dizer aos outros, quem pode agir de acordo, mas geralmente essas coisas aparecem em uma lista para mais tarde.
Quando todas as três partes eram completamente codificadas e testadas por seus desenvolvedores, e algumas vezes até testadas pelos usuários (mostrando a eles um relatório, uma tela ou um alerta por email), chegava a fase de "integração". Isso costumava ser orçado em vários meses, mas ainda continuava. Essa alteração no tamanho do campo por dev 1 seria descoberta aqui e exigiria que os desenvolvedores 2 e 3 fizessem grandes alterações no código e possivelmente alterações na interface do usuário também. Esse índice extra causaria seu próprio caos. E assim por diante. Se um dos desenvolvedores foi instruído por um usuário para adicionar um campo e o fez, agora seria a hora dos outros dois também adicioná-lo.
Essa fase foi brutalmente dolorosa e praticamente impossível de prever. Então as pessoas começaram a dizer "temos que nos integrar com mais frequência". "Temos que trabalhar juntos desde o início". "Quando um de nós solicita uma mudança [é assim que conversamos] os outros precisam saber sobre isso." Algumas equipes começaram a fazer testes de integração mais cedo, continuando a trabalhar separadamente. E algumas equipes começaram a usar o código e a saída um do outro o tempo todo, desde o início. E isso se tornou integração contínua.
Você pode pensar que estou exagerando essa primeira história. Certa vez, trabalhei para uma empresa em que meu contato me incentivou a verificar algum código que sofria das seguintes falhas:
- uma tela em que ele não estava trabalhando tinha um botão que ainda não fazia nada
- nenhum usuário havia assinado o design da tela (cores e fontes precisas; a existência da tela, seus recursos e quais botões ele possuía nas especificações de 300 páginas).
A opinião dele era de que você não coloca as coisas no controle de origem até que elas sejam CONCLUÍDAS. Ele normalmente fazia um ou dois check-ins por ano. Tivemos um pouco de diferença de filosofia :-)
Além disso, se você achar difícil acreditar que as equipes sejam desconectadas em torno de um recurso compartilhado como um banco de dados, você realmente não acreditará (mas é verdade) que a mesma abordagem foi adotada para codificar. Você vai escrever uma função que eu possa chamar? Isso é ótimo, vá em frente e faça isso, apenas codificarei o que preciso enquanto isso. Meses depois, "integrarei" meu código para que ele chame sua API e descobriremos que ele explodirá se eu passar nulo, explodir se retornar nulo (e faz muito isso) retorna itens muito grandes para mim, não aguenta anos bissextos e milhares de outras coisas. Trabalhar de forma independente e depois ter uma fase de integração era normal. Agora parece loucura.