INTRODUÇÃO À DEVOPS E CLOUD COMPUTING
MÓDULO 2 —
Principais Conceitos, Processos e Ferramentas
Aula 1 — Integração
contínua, entrega contínua e automação
Quando alguém começa a estudar DevOps, logo
encontra três ideias que aparecem o tempo todo: integração contínua, entrega
contínua e automação. À primeira vista, esses termos podem parecer
técnicos demais ou até parecidos entre si. E, de fato, muita gente os repete
sem realmente compreender o que significam na prática. O problema disso é que,
quando os conceitos são aprendidos só como jargão, eles perdem seu valor real.
Para entender essas ideias de verdade, o melhor caminho é voltar à pergunta
mais importante: que problema elas tentam resolver?
Durante muito tempo, em muitos times de
tecnologia, o desenvolvimento de software acontecia de forma lenta, acumulada e
desorganizada. Os programadores trabalhavam durante semanas ou meses em novas
funcionalidades, fazendo mudanças em seus próprios ambientes, sem integrar
essas alterações com frequência. Quando chegava o momento de juntar tudo e
publicar uma nova versão do sistema, os problemas apareciam de uma vez só. Um
recurso entrava em conflito com outro, um ajuste quebrava algo que antes
funcionava, erros surgiam perto da entrega e a equipe entrava em um ciclo de
estresse, retrabalho e urgência.
Esse modelo criava uma falsa sensação de
produtividade. Durante semanas, parecia que o trabalho estava avançando
normalmente. Mas, na prática, boa parte dos problemas ficava escondida até o
momento final, quando tudo precisava ser unido, testado e colocado em produção.
É como deixar para organizar uma mudança inteira de casa apenas no último dia:
empacotar tudo de uma vez, sem planejamento, aumenta muito a chance de
confusão. Com software, acontece algo parecido. Quanto mais mudanças ficam
acumuladas sem integração, maior tende a ser o risco.
Foi justamente para enfrentar esse tipo de
situação que a integração contínua, conhecida pela sigla CI
(Continuous Integration), passou a ganhar tanta importância. A ideia central da
integração contínua é relativamente simples: em vez de deixar alterações
acumularem por muito tempo, a equipe integra essas mudanças com frequência em
um repositório compartilhado e executa verificações automáticas para
identificar problemas o quanto antes. Em outras palavras, não se espera o caos
final para descobrir que as peças não se encaixam. O sistema vai sendo testado
ao longo do caminho.
A lógica por trás disso é muito sensata.
Quando um erro aparece logo após uma pequena alteração, fica mais fácil
descobrir sua causa e corrigi-lo. Já quando dezenas ou centenas de mudanças são
juntadas de uma vez, o trabalho para identificar o que deu errado se torna
muito mais difícil. Por isso, a integração contínua não é apenas uma técnica
para “trabalhar mais rápido”. Ela é uma forma mais inteligente de reduzir
incertezas, melhorar a visibilidade do processo e evitar surpresas
desagradáveis no fim.
Mas a integração contínua sozinha não
resolve tudo. Depois que o código é integrado e testado, ainda existe outra
etapa importante: a entrega. É aqui que entra a entrega contínua, ou CD
(Continuous Delivery), e, em alguns contextos, também o deploy contínuo.
Embora esses termos sejam próximos, eles não são exatamente a mesma coisa. A
entrega contínua significa deixar o sistema sempre em condições de ser
publicado com segurança, ou seja, a equipe organiza o processo para que novas
versões possam ser disponibilizadas com rapidez e previsibilidade. Já o deploy
contínuo vai além: ele automatiza a publicação em produção sempre que os
critérios definidos forem atendidos.
Para quem está começando, não vale a pena
travar em excesso na diferença entre um e outro. O mais importante é perceber a
lógica geral: a equipe deixa de trabalhar em grandes entregas raras e
arriscadas para passar a operar com mudanças menores, mais frequentes, mais bem
testadas e mais controladas. Isso reduz o peso de cada publicação e torna o
processo mais confiável. Em vez de tratar cada atualização como um evento
dramático, a ideia é transformar a entrega em algo mais natural, previsível e
sustentável.
Esse ponto é importante porque existe um
erro muito comum em empresas e equipes iniciantes: achar que publicar pouco é
mais seguro. Em alguns casos, parece intuitivo pensar assim. A lógica seria:
“se mexermos menos, corremos menos risco”. Só que, na prática, isso nem sempre
se confirma. Quando uma organização passa meses acumulando alterações e depois
tenta colocar tudo no ar de uma vez, o risco da mudança costuma aumentar. Há
mais complexidade, mais dependências, mais chance de conflito e menos clareza
sobre a origem dos problemas. Entregas menores e frequentes, quando bem
estruturadas, tendem a ser mais seguras justamente porque são mais fáceis de
testar, observar e corrigir.
É aqui que a automação assume um papel decisivo. Sem ela, manter integração e entrega contínuas de forma consistente seria muito mais difícil. Imagine uma
assume um
papel decisivo. Sem ela, manter integração e entrega contínuas de forma
consistente seria muito mais difícil. Imagine uma equipe que precisa testar
manualmente cada alteração, verificar todos os cenários importantes, preparar o
ambiente, validar dependências e publicar novas versões repetidamente. Além de
consumir muito tempo, esse modelo aumentaria bastante a chance de falha humana.
Pessoas se cansam, esquecem etapas, interpretam processos de forma diferente e
podem deixar passar detalhes importantes. A automação entra justamente para
tornar tarefas repetitivas mais rápidas, consistentes e confiáveis.
Automatizar, nesse contexto, não significa
substituir o pensamento humano. Esse é um mal-entendido comum. A automação não
existe para eliminar a necessidade de análise, planejamento ou decisão. Ela
existe para liberar pessoas de atividades repetitivas que podem e devem seguir
regras claras. Assim, a equipe pode concentrar energia no que realmente exige
raciocínio, avaliação crítica e tomada de decisão. Em vez de gastar tempo
repetindo processos manuais cansativos, os profissionais passam a atuar com mais
foco em melhoria, prevenção e qualidade.
No universo DevOps, a automação costuma
aparecer em várias etapas. Ela pode ajudar no controle de testes, na
verificação de qualidade do código, na criação de ambientes, na configuração de
infraestrutura, na publicação de aplicações e no monitoramento posterior.
Quanto mais um processo depende de repetição operacional, mais sentido faz
avaliar se ele pode ser automatizado com segurança. O ganho não é só
velocidade. É também previsibilidade.
Pense em uma padaria que produz centenas de
pães por dia. Se cada etapa fosse feita de forma totalmente improvisada,
variando a cada pessoa, o resultado seria inconsistente: alguns pães sairiam
bons, outros queimados, outros crus, outros atrasados. Quando existe
padronização e processo, a qualidade tende a ser mais estável. Na tecnologia,
automação cumpre papel parecido. Ela ajuda a garantir que certas etapas sigam
um fluxo confiável, reduzindo variações desnecessárias e aumentando a
consistência das entregas.
Outro ponto importante é que integração contínua, entrega contínua e automação não são práticas isoladas. Elas se fortalecem mutuamente. A integração contínua depende de verificações frequentes, e isso é facilitado por automação. A entrega contínua exige que o sistema esteja sempre em condições de ser publicado, e isso também depende de processos automatizados
e é que integração
contínua, entrega contínua e automação não são práticas isoladas. Elas se
fortalecem mutuamente. A integração contínua depende de verificações
frequentes, e isso é facilitado por automação. A entrega contínua exige que o
sistema esteja sempre em condições de ser publicado, e isso também depende de
processos automatizados e confiáveis. Quando essas práticas funcionam em
conjunto, a equipe ganha ritmo, reduz gargalos e melhora a capacidade de
responder rapidamente a mudanças sem perder controle.
Mas é preciso tomar cuidado com uma ilusão
muito comum: a de que basta instalar uma ferramenta para resolver tudo. Esse
pensamento é simplista e, francamente, bastante ingênuo. Há equipes que adotam
ferramentas modernas de integração e entrega, criam pipelines sofisticados e
mesmo assim continuam sofrendo com atrasos, erros e desorganização. Isso
acontece porque a ferramenta, por si só, não corrige processo ruim, comunicação
falha ou ausência de critério. Se o time não sabe o que está fazendo, a automação
só acelera a bagunça.
Por isso, o mais importante não é decorar
nomes de plataformas ou aprender comandos soltos. O ponto central é entender
por que essas práticas existem. Elas surgiram para enfrentar um problema real:
a dificuldade de integrar trabalho de várias pessoas, garantir qualidade de
forma contínua e tornar a entrega de software menos arriscada. Quando se perde
essa visão, a pessoa pode até aprender a usar ferramentas, mas continua sem
entender o raciocínio que sustenta o processo.
Também vale destacar que essas práticas
favorecem uma mudança de cultura. Em vez de enxergar a publicação de software
como um grande evento traumático, a equipe passa a tratá-la como parte natural
de um fluxo contínuo. Isso reduz tensão, melhora a comunicação e incentiva uma
postura mais preventiva. Em vez de apagar incêndios toda vez que uma nova
versão sai, o time começa a construir um caminho mais controlado para mudanças.
Não é perfeição. É maturidade operacional.
Na prática, isso traz ganhos muito concretos. Quando a integração é frequente, os problemas aparecem mais cedo. Quando a entrega é contínua, o sistema permanece mais preparado para mudanças. Quando a automação é bem aplicada, tarefas repetitivas se tornam mais rápidas e confiáveis. Tudo isso contribui para uma operação mais estável, menos dependente de improviso e mais alinhada com o que o negócio precisa. Em mercados em que a rapidez de resposta faz diferença, isso se torna uma vantagem
competitiva real.
Ao mesmo tempo, é importante manter os pés
no chão. Implementar essas práticas não significa que a equipe nunca mais terá
erro, falha ou retrabalho. Isso seria propaganda falsa. O que muda é a forma de
lidar com esses riscos. Em vez de trabalhar no escuro e descobrir problemas
tarde demais, a equipe passa a enxergar melhor o processo, detectar falhas com
mais antecedência e corrigir com mais agilidade. O objetivo não é eliminar
qualquer possibilidade de problema, mas tornar o sistema de trabalho muito mais
saudável e confiável.
Para quem está começando, talvez a melhor
forma de guardar essa aula seja esta: integração contínua é o hábito de juntar
e verificar mudanças com frequência; entrega contínua é a capacidade de manter
o software sempre pronto para ser publicado; automação é o apoio que torna esse
processo mais rápido, consistente e menos sujeito a falhas humanas. Quando
essas três dimensões se combinam, a entrega de software deixa de depender tanto
de sorte, esforço heroico e urgência permanente.
Em resumo, integração contínua, entrega contínua e automação são pilares fundamentais de uma operação mais madura em tecnologia. Elas surgiram como resposta à lentidão, ao acúmulo de erros, à publicação arriscada e à dependência excessiva de tarefas manuais. Mais do que técnicas isoladas, representam uma mudança na forma de pensar o trabalho: sair do improviso e caminhar para um modelo mais frequente, previsível e sustentável. Para quem está entrando na área, compreender essa lógica é muito mais importante do que decorar termos. É isso que começa a construir uma visão realmente sólida sobre DevOps.
Referências
bibliográficas
HUMBLE, Jez; FARLEY, David. Entrega
contínua: como entregar software de forma rápida e confiável. Porto Alegre:
Bookman, 2014.
KIM, Gene; DEBOIS, Patrick; WILLIS, John;
HUMBLE, Jez. Manual de DevOps: como obter agilidade, confiabilidade e
segurança em organizações tecnológicas. Rio de Janeiro: Alta Books, 2018.
KIM, Gene; BEHR, Kevin; SPAFFORD, George. O
Projeto Fênix: um romance sobre TI, DevOps e sobre ajudar o seu negócio a
vencer. Rio de Janeiro: Alta Books, 2019.
DAVIS, Jennifer; DANIELS, Ryn. DevOps
para leigos. Rio de Janeiro: Alta Books, 2017.
BASS, Len; WEBER, Ingo; ZHU, Liming. DevOps:
um conjunto de práticas complementares para entrega contínua, implantação e
operações. São Paulo: Novatec, 2016.
FOWLER, Martin. Refatoração:
aperfeiçoando o projeto de código existente. Porto Alegre: Bookman, 2020.
MARTIN, Robert C. Código limpo:
habilidades práticas do Agile Software. Rio de Janeiro: Alta Books, 2012.
PRESSMAN, Roger S.; MAXIM, Bruce R. Engenharia
de software: uma abordagem profissional. Porto Alegre: AMGH, 2016.
SOMMERVILLE, Ian. Engenharia de software.
São Paulo: Pearson, 2019.
Aula
2 — Infraestrutura como código e ambientes padronizados
Quando uma pessoa começa a estudar DevOps e
Cloud Computing, costuma prestar muita atenção no desenvolvimento de software,
nas entregas contínuas e nas ferramentas de automação. Isso é natural. Só que
existe uma parte fundamental dessa história que, por muito tempo, foi tratada
quase como bastidor: a infraestrutura. Servidores, redes, configurações,
permissões, ambientes de teste, ambientes de produção, sistemas operacionais e
dependências técnicas sempre foram peças essenciais para que qualquer aplicação
funcione de verdade. O problema é que, durante muitos anos, essa infraestrutura
foi montada e mantida de forma manual, improvisada e pouco previsível. E é
justamente aí que surgem alguns dos erros mais cansativos e mais caros do mundo
da tecnologia.
Um dos problemas mais comuns em equipes e
empresas é a diferença entre ambientes. O sistema funciona bem no computador do
desenvolvedor, mas falha quando vai para o servidor. Funciona no ambiente de
teste, mas quebra em produção. Um recurso está disponível em uma máquina, mas
não em outra. Um ajuste feito manualmente por alguém não foi documentado e
ninguém mais sabe reproduzir. Esse tipo de situação é tão frequente que virou
quase piada na área. A famosa frase “na minha máquina funciona” não nasceu por
acaso. Ela é o retrato de um ambiente mal padronizado.
O que essa frase revela, na prática, é um
problema de consistência. Quando cada ambiente é configurado de um jeito, cada
servidor recebe ajustes manuais diferentes e cada pessoa executa procedimentos
com suas próprias variações, a chance de erro aumenta muito. O sistema deixa de
depender apenas da qualidade do código e passa a depender também de uma série
de detalhes invisíveis e instáveis. Isso torna a operação frágil, difícil de
escalar e complicada de manter.
Foi justamente para enfrentar esse tipo de cenário que ganhou força a ideia de Infraestrutura como Código, conhecida pela sigla IaC, do inglês Infrastructure as Code. O nome pode assustar no começo, mas a lógica por traz dele é bastante clara. Em vez de criar, configurar e gerenciar infraestrutura manualmente, a proposta é definir essa
infraestrutura manualmente, a proposta é
definir essa infraestrutura por meio de arquivos, scripts e instruções
versionadas, que possam ser repetidas, revisadas e automatizadas. Em outras
palavras, a infraestrutura deixa de ser algo montado “na mão” e passa a ser
descrita de forma estruturada.
Essa mudança é muito mais importante do que
parece. Quando a infraestrutura é tratada como código, ela ganha
características que já são valorizadas no desenvolvimento de software: pode ser
documentada, versionada, revisada, testada, reaproveitada e reproduzida com
mais consistência. Isso reduz a dependência de memória individual, diminui
improvisos e cria um ambiente muito mais confiável para o trabalho das equipes.
Em vez de depender de alguém que “sabe fazer na prática”, a organização passa a
depender de processos mais claros e replicáveis.
Imagine, por exemplo, que uma empresa
precise criar três ambientes diferentes para a mesma aplicação: um de
desenvolvimento, um de testes e um de produção. Se tudo isso for feito
manualmente, há grande chance de surgirem diferenças entre eles. Um detalhe
mínimo já pode gerar dor de cabeça depois. Um pacote instalado a mais, uma
configuração esquecida, uma permissão aplicada de forma diferente, uma variável
errada: qualquer uma dessas falhas pode provocar comportamentos inesperados.
Agora imagine esse mesmo cenário com infraestrutura descrita em arquivos
padronizados, aplicados de forma consistente. A margem de erro cai muito.
É por isso que a Infraestrutura como Código
está tão ligada à ideia de ambientes padronizados. Padronizar, nesse
contexto, não significa engessar tudo de forma cega. Significa garantir que
aquilo que precisa ser igual realmente seja igual, e que as diferenças sejam
controladas e conscientes. Quando os ambientes seguem uma base comum, fica mais
fácil identificar problemas, reproduzir cenários, escalar aplicações e manter a
estabilidade do sistema.
Esse ponto é central porque, no fundo,
muita equipe sofre não por falta de tecnologia avançada, mas por excesso de
improviso acumulado. Um servidor foi ajustado rapidamente em um momento de
urgência. Outro recebeu uma configuração emergencial em uma madrugada. Um
terceiro foi criado por outra pessoa, com outra lógica, sem documentação
adequada. Quando o tempo passa, a empresa já não sabe exatamente o que tem em
cada ambiente. Nesse estágio, qualquer mudança vira um risco. A operação começa
a depender menos de método e mais de sorte.
A Infraestrutura como
Código surge como
resposta a essa fragilidade. Ela ajuda a transformar infraestrutura em algo
mais visível, mais controlável e menos artesanal. Isso não quer dizer que todo
processo vire simples automaticamente. Não vira. Mas muda muito o nível de
previsibilidade. E, em tecnologia, previsibilidade vale ouro.
Outra vantagem importante da IaC é a repetibilidade.
Esse é um conceito muito valioso e, ao mesmo tempo, bastante subestimado por
quem está começando. Repetibilidade significa conseguir recriar um ambiente de
forma consistente, sem depender de variações improvisadas. Se a empresa precisa
subir dez ambientes semelhantes, corrigir uma falha em larga escala ou
reconstruir uma infraestrutura depois de um incidente, a capacidade de repetir
o processo com segurança faz uma diferença enorme. Sem isso, cada nova configuração
pode virar um novo problema.
A repetibilidade também fortalece a
escalabilidade. Quando um sistema cresce, não basta que ele tenha mais usuários
ou mais demanda. A estrutura por trás dele precisa acompanhar esse crescimento
sem virar um caos operacional. Se cada expansão exigir intervenção manual
detalhada, a velocidade cai e os riscos aumentam. Quando a infraestrutura pode
ser reproduzida com base em código, a expansão tende a ser mais organizada,
mais rápida e menos vulnerável a falhas humanas.
Além disso, tratar infraestrutura como
código facilita o versionamento. Isso significa registrar mudanças,
acompanhar histórico, entender o que foi alterado e, em alguns casos, até
voltar atrás quando necessário. Esse é um ganho enorme em termos de controle.
Em ambientes tradicionais, uma mudança manual pode ser feita e esquecida. Dias
depois, ninguém lembra quem alterou, por que alterou e qual era o estado
anterior. Em ambientes versionados, a conversa muda. As mudanças deixam
rastros. Isso melhora a governança, a auditoria e a capacidade de análise.
Esse aspecto também se conecta com a
cultura DevOps. Uma das ideias centrais do DevOps é reduzir atritos entre
áreas, aumentar visibilidade e melhorar o fluxo de trabalho entre
desenvolvimento e operações. A Infraestrutura como Código contribui muito para
isso, porque torna a infraestrutura menos “misteriosa” e mais acessível como
objeto de colaboração. Em vez de ficar concentrada apenas na cabeça de poucas
pessoas, ela passa a poder ser discutida, revisada e evoluída em conjunto.
Mas é importante não idealizar demais. Muita gente escuta falar de IaC e imediatamente imagina que isso resolverá
todos os problemas de infraestrutura. Não vai. Se a empresa não tem clareza
sobre o que precisa, se os processos continuam desorganizados, se a equipe não
documenta o básico ou se as decisões são tomadas sem critério, a simples adoção
de ferramentas de IaC não cria maturidade do nada. Ferramenta boa em processo
ruim continua produzindo confusão. A diferença é que agora a confusão pode
acontecer mais rápido e em escala maior.
Por isso, a Infraestrutura como Código não
deve ser entendida apenas como técnica, mas também como disciplina. Escrever
arquivos de configuração é só uma parte. O mais importante é a lógica de
padronização, controle e previsibilidade que vem junto com essa prática. Quem
enxerga apenas o lado técnico perde o ponto principal. O valor real da IaC não
está em “ter scripts”, mas em reduzir inconsistências, facilitar reprodução de
ambientes e tornar a infraestrutura menos dependente de improviso.
A relação entre IaC e computação em nuvem
também merece destaque. A nuvem potencializou muito essa forma de trabalho
porque oferece ambientes mais flexíveis, que podem ser criados, alterados e
destruídos com rapidez. Em vez de depender de equipamentos físicos e mudanças
lentas, a equipe pode provisionar recursos de maneira muito mais dinâmica. Isso
combina perfeitamente com a lógica da Infraestrutura como Código. A nuvem
oferece velocidade e elasticidade; a IaC oferece organização e padronização.
Juntas, essas duas dimensões tornam a operação muito mais eficiente.
Pense em uma empresa que precisa preparar
rapidamente um ambiente para testes de uma nova aplicação. Em um cenário
tradicional, talvez fosse necessário solicitar equipamentos, aguardar
disponibilidade, fazer configuração manual e resolver diferenças entre
máquinas. Em um ambiente de nuvem com Infraestrutura como Código, esse processo
pode ser muito mais ágil e consistente. O ganho não é apenas operacional. Ele
afeta diretamente a capacidade de inovação, porque reduz o tempo entre a ideia
e a experimentação.
Também vale lembrar que ambientes
padronizados trazem benefícios para a segurança. Quando a infraestrutura é
construída com mais controle e repetibilidade, fica mais fácil aplicar regras
consistentes, corrigir falhas, revisar configurações e evitar ajustes feitos de
forma improvisada. Segurança não depende apenas de ferramentas específicas;
depende também de coerência operacional. E coerência operacional melhora quando
a infraestrutura deixa de ser montada de forma artesanal.
No
cotidiano das empresas, isso tudo
significa menos surpresas desagradáveis. Significa reduzir a quantidade de
situações em que ninguém sabe exatamente por que algo funciona em um ambiente e
falha em outro. Significa diminuir o peso do conhecimento informal e aumentar a
confiabilidade do processo. Significa criar uma base melhor para automação,
testes, entregas contínuas e crescimento sustentável. Em outras palavras,
Infraestrutura como Código não é um detalhe técnico periférico. É uma parte
importante da maturidade de ambientes modernos.
Para quem está começando, talvez a melhor
forma de guardar essa aula seja pensar assim: Infraestrutura como Código é
uma maneira de transformar a infraestrutura em algo organizado, reproduzível e
menos sujeito a improviso. Já os ambientes padronizados são o resultado
prático dessa mentalidade: menos diferenças escondidas, menos erros difíceis de
rastrear e mais consistência no trabalho das equipes. Quando isso é bem-feito,
o sistema ganha estabilidade, o time ganha confiança e a operação se torna
muito mais saudável.
Em resumo, a Infraestrutura como Código surgiu para enfrentar um problema antigo e recorrente: ambientes configurados manualmente, com diferenças ocultas, baixa previsibilidade e alto risco de erro. Ao descrever infraestrutura por meio de código, as equipes conseguem padronizar, repetir, versionar e automatizar processos essenciais. Isso fortalece a consistência dos ambientes, melhora a colaboração entre áreas e cria uma base mais sólida para práticas modernas de DevOps e Cloud Computing. Para quem está entrando nessa área, entender essa lógica é fundamental, porque ela ajuda a enxergar que infraestrutura não é apenas suporte técnico. Ela é parte central da qualidade e da confiabilidade de qualquer solução digital.
Referências
bibliográficas
KIM, Gene; DEBOIS, Patrick; WILLIS, John;
HUMBLE, Jez. Manual de DevOps: como obter agilidade, confiabilidade e
segurança em organizações tecnológicas. Rio de Janeiro: Alta Books, 2018.
HUMBLE, Jez; FARLEY, David. Entrega
contínua: como entregar software de forma rápida e confiável. Porto Alegre:
Bookman, 2014.
KIM, Gene; BEHR, Kevin; SPAFFORD, George. O
Projeto Fênix: um romance sobre TI, DevOps e sobre ajudar o seu negócio a
vencer. Rio de Janeiro: Alta Books, 2019.
DAVIS, Jennifer; DANIELS, Ryn. DevOps
para leigos. Rio de Janeiro: Alta Books, 2017.
BASS, Len; WEBER, Ingo; ZHU, Liming. DevOps: um conjunto de práticas complementares para entrega contínua,
implantação e
operações. São Paulo: Novatec, 2016.
TAURION, Cezar. Cloud Computing:
computação em nuvem: transformando o mundo da tecnologia da informação. Rio
de Janeiro: Brasport, 2009.
VERAS, Manoel. Cloud Computing: nova
arquitetura da TI. Rio de Janeiro: Brasport, 2012.
PRESSMAN, Roger S.; MAXIM, Bruce R. Engenharia
de software: uma abordagem profissional. Porto Alegre: AMGH, 2016.
SOMMERVILLE, Ian. Engenharia de software.
São Paulo: Pearson, 2019.
Aula
3 — Ferramentas e serviços mais comuns no universo DevOps e Cloud
Quando alguém começa a entrar no universo
de DevOps e Cloud Computing, uma das primeiras sensações costuma ser a de
excesso. Surgem muitos nomes, muitas siglas, muitas plataformas e uma impressão
quase sufocante de que é preciso aprender tudo ao mesmo tempo. Git, Docker,
Kubernetes, Jenkins, Terraform, AWS, Azure, Google Cloud, Prometheus, Grafana,
GitHub Actions, GitLab, Ansible e vários outros termos aparecem com tanta
frequência que muita gente trava antes mesmo de começar. E é aqui que vale
dizer algo de forma bem direta: quem tenta decorar ferramenta sem entender o
problema que ela resolve está estudando do jeito errado.
Esse é um erro muito comum entre
iniciantes. A pessoa vê listas de “ferramentas mais usadas do mercado”, tenta
memorizar nomes, assiste vídeos soltos e começa a repetir expressões técnicas
como se isso, por si só, fosse sinal de aprendizado. Não é. Ferramenta é meio,
não fim. Nenhuma plataforma tem valor isoladamente. Ela só faz sentido quando
está inserida em um processo claro, em uma necessidade real e em uma lógica de
trabalho minimamente organizada. Sem isso, o estudante vira um colecionador de
nomes e a empresa vira uma compradora de modismos.
Por isso, antes de falar de ferramentas
específicas, é importante entender uma ideia central: no ecossistema DevOps e
Cloud, existem categorias de ferramentas. Cada uma atende a uma parte do
processo. Algumas ajudam a controlar versões do código. Outras automatizam
testes e entregas. Outras empacotam aplicações. Outras organizam execução em
escala. Outras monitoram o comportamento do sistema. Outras oferecem a
infraestrutura em nuvem onde tudo isso acontece. Quando se enxerga o panorama
por categorias, tudo começa a ficar mais claro e menos assustador.
Uma das categorias mais importantes é a de controle de versão. Aqui entram ferramentas como Git, além de plataformas como GitHub, GitLab e Bitbucket. O controle de versão é fundamental porque permite
registrar alterações no código, acompanhar
histórico, trabalhar em equipe, revisar mudanças e recuperar versões anteriores
quando necessário. Em termos simples, ele ajuda a responder perguntas essenciais:
o que mudou, quem mudou, quando mudou e por que mudou. Sem isso, o
desenvolvimento de software vira um território de confusão, com arquivos
espalhados, versões desencontradas e pouca rastreabilidade.
Muita gente subestima essa etapa porque
imagina que controle de versão serve apenas para guardar código. Não serve só
para isso. Ele organiza o trabalho coletivo. Quando várias pessoas atuam em um
mesmo projeto, é necessário ter um mecanismo que permita colaboração sem
transformar cada alteração em uma guerra silenciosa entre arquivos e versões.
Além disso, o controle de versão também se conecta com outras práticas de
DevOps, porque muitas automações são disparadas a partir de mudanças
registradas nesses repositórios.
Outra categoria essencial é a de integração
contínua e entrega contínua, frequentemente associada a ferramentas como Jenkins,
GitHub Actions, GitLab CI/CD, CircleCI e outras soluções
semelhantes. Essas ferramentas ajudam a automatizar etapas como testes,
validações e preparação para publicação. O papel delas é reduzir o peso do
trabalho manual e tornar o fluxo de entrega mais consistente. Quando bem
configuradas, permitem que uma alteração feita no código dispare
automaticamente um conjunto de verificações, garantindo que problemas sejam
identificados cedo.
Esse tipo de ferramenta costuma chamar
atenção porque dá uma impressão de modernidade e eficiência. E, de fato, pode
trazer ganhos enormes. Mas aqui cabe um alerta importante: automatizar um
processo ruim não cria um processo bom. Se a equipe não tem clareza sobre o
que precisa testar, quais critérios usa para aprovar mudanças ou como organiza
seu fluxo de trabalho, a ferramenta pode até rodar comandos bonitos na tela,
mas continuará sustentando um processo mal pensado. A automação potencializa.
Se o processo é sólido, ela acelera qualidade. Se o processo é bagunçado, ela
acelera bagunça.
Uma terceira categoria muito presente nesse universo é a de containers, especialmente com a ferramenta Docker. Containers se tornaram populares porque ajudam a empacotar aplicações com tudo o que elas precisam para funcionar: bibliotecas, dependências, configurações e ambiente necessário. Isso reduz muitos problemas relacionados à diferença entre ambientes. Em vez de depender de montagens manuais que
variam de máquina para
máquina, a aplicação passa a rodar em um pacote mais padronizado e portátil.
Esse ponto é importante porque resolve uma
dor antiga da área de tecnologia: a inconsistência entre ambientes. Quando um
sistema funciona no computador de quem desenvolveu, mas falha em outro
ambiente, normalmente existe algum tipo de diferença escondida ali. Containers
ajudam a reduzir esse problema porque oferecem uma forma mais controlada de
empacotar e executar aplicações. Eles não eliminam toda complexidade, mas
ajudam bastante na padronização e na previsibilidade.
Quando os sistemas ficam maiores e mais
distribuídos, entra em cena outra categoria: a orquestração de containers,
sendo Kubernetes a referência mais conhecida nesse campo. O objetivo
aqui é organizar a execução de múltiplos containers em ambientes maiores,
distribuindo carga, mantendo disponibilidade, gerenciando réplicas, escalando
serviços e lidando com falhas. Para quem está começando, Kubernetes costuma
parecer complexo — e essa percepção não está errada. Ele realmente exige uma
base melhor para ser compreendido com profundidade. Por isso, não faz sentido
tentar começar por ele sem antes entender fundamentos mais simples de
infraestrutura, redes, containers e automação.
Esse ponto merece franqueza. Existe muito
modismo em torno do Kubernetes. Muita gente fala dele como se fosse a porta de
entrada obrigatória para DevOps. Não é. Para um iniciante, insistir em começar
pelo mais complexo só gera confusão. Primeiro se entende o básico. Depois se
sobe o nível. Querer pular essa ordem não é ambição inteligente; é só ansiedade
disfarçada de estudo.
Outra categoria essencial é a de monitoramento
e observabilidade. Aqui entram ferramentas como Prometheus, Grafana,
ELK Stack, Datadog, entre outras. O papel dessas soluções é
acompanhar o comportamento do sistema, coletar métricas, gerar alertas,
registrar logs e ajudar a equipe a enxergar o que está acontecendo em produção.
Esse ponto é decisivo porque, em operações modernas, não basta colocar um
sistema no ar e torcer para funcionar. É preciso observar desempenho, consumo
de recursos, erros, indisponibilidades, lentidão e impacto de mudanças.
O monitoramento é importante não apenas para reagir a falhas, mas também para aprender com o sistema em funcionamento. Quando uma equipe acompanha dados reais de uso e desempenho, consegue tomar decisões mais inteligentes. Pode identificar gargalos, antecipar problemas e entender melhor o efeito de uma
nova versão. Sem observabilidade, a gestão da
operação fica mais baseada em suposição do que em evidência. E suposição, em
tecnologia, costuma custar caro.
Também precisamos falar dos provedores
de nuvem, como Amazon Web Services (AWS), Microsoft Azure e Google
Cloud Platform (GCP). Esses provedores oferecem infraestrutura e uma grande
variedade de serviços que ajudam empresas a construir, hospedar, escalar e
operar aplicações sem depender exclusivamente de infraestrutura física própria.
Em vez de comprar servidores, manter datacenters e lidar com limitações mais
rígidas, a organização pode utilizar recursos sob demanda, ajustando a
capacidade de acordo com a necessidade.
A importância desses provedores não está
apenas no fato de “serem grandes empresas do mercado”. O ponto central é que
eles oferecem um conjunto de serviços que conversa muito bem com as
necessidades de ambientes modernos: armazenamento, redes, bancos de dados,
máquinas virtuais, containers, funções serverless, segurança, monitoramento,
inteligência artificial, automação e muito mais. Isso amplia bastante as
possibilidades das equipes, mas também exige critério. A quantidade de opções é
tão grande que muita gente se perde tentando conhecer tudo ao mesmo tempo.
Nesse cenário, uma armadilha comum é
acreditar que escolher uma ferramenta popular já basta para profissionalizar a
operação. Não basta. Ferramenta boa usada sem entendimento gera dependência,
erro e desperdício. É perfeitamente possível ver empresas usando ferramentas
caras e reconhecidas internacionalmente, mas mantendo processos ruins,
documentação fraca, testes insuficientes e pouca clareza sobre
responsabilidades. O nome da ferramenta não salva uma operação mal pensada.
Por isso, o mais inteligente para quem está
aprendendo é entender a função de cada grupo de ferramentas antes de
tentar dominar produtos específicos. Primeiro, compreenda que é preciso
versionar código. Depois, conheça uma ferramenta para isso. Primeiro, entenda
por que automatizar testes e entregas é importante. Depois, explore uma
plataforma que faça esse trabalho. Primeiro, compreenda o que significa
empacotar e padronizar uma aplicação. Depois, estude containers. Essa ordem é
muito mais eficiente do que sair colecionando nomes sem lógica.
Outra coisa importante: não existe ferramenta perfeita para todos os contextos. O mercado gosta de transformar tecnologia em torcida organizada, como se uma plataforma fosse universalmente superior à outra. Essa
mentalidade é infantil. Ferramenta precisa ser escolhida
com base em contexto, equipe, necessidade, custo, maturidade operacional e
integração com o restante do ambiente. O que funciona bem para uma startup
pequena pode não servir para uma empresa grande. O que faz sentido em um
projeto simples pode ser exagero em outro. Maturidade profissional inclui parar
de tratar tecnologia como religião.
No dia a dia, essas ferramentas costumam
atuar em conjunto. Um fluxo bastante comum pode começar com o código sendo
versionado em uma plataforma como GitHub ou GitLab. A partir de uma alteração,
uma ferramenta de CI/CD executa testes automáticos e prepara a aplicação. Essa
aplicação pode ser empacotada em container com Docker, implantada em ambiente
de nuvem e monitorada por ferramentas de observabilidade. Ou seja, cada peça
participa de uma parte da jornada. É esse conjunto articulado que forma o ecossistema
DevOps e Cloud.
Esse entendimento ajuda a desmontar outra
ilusão muito comum: a de que DevOps é apenas um conjunto de ferramentas. Não é.
Ferramentas ajudam, claro. São importantes e, em muitos casos, decisivas. Mas o
valor surge quando elas sustentam uma lógica de trabalho orientada por
colaboração, automação, visibilidade e melhoria contínua. Sem essa base, o
ecossistema vira só uma vitrine tecnológica.
Para quem está começando, a melhor postura
não é tentar abraçar tudo, mas construir repertório com método. Faz mais
sentido aprender uma ferramenta de versionamento, entender uma solução de
automação, experimentar o básico de containers e conhecer um provedor de nuvem
em nível introdutório do que tentar dominar dez tecnologias ao mesmo tempo.
Quem corre demais no começo geralmente não aprende melhor; só se confunde mais
rápido.
Em resumo, o universo DevOps e Cloud reúne várias ferramentas e serviços que ajudam a controlar código, automatizar fluxos, empacotar aplicações, operar ambientes em escala, monitorar sistemas e utilizar infraestrutura em nuvem. O mais importante, porém, não é decorar nomes, mas compreender a função que cada grupo cumpre dentro do processo. Ferramentas têm valor quando resolvem problemas reais, sustentam boas práticas e contribuem para uma operação mais confiável. Para um iniciante, esse é o ponto que realmente importa: aprender a pensar antes de apenas consumir tecnologia como moda.
Referências
bibliográficas
KIM, Gene; DEBOIS, Patrick; WILLIS, John; HUMBLE, Jez. Manual de DevOps: como obter agilidade, confiabilidade e segurança em
de DevOps: como obter agilidade, confiabilidade e
segurança em organizações tecnológicas. Rio de Janeiro: Alta Books, 2018.
KIM, Gene; BEHR, Kevin; SPAFFORD, George. O
Projeto Fênix: um romance sobre TI, DevOps e sobre ajudar o seu negócio a
vencer. Rio de Janeiro: Alta Books, 2019.
DAVIS, Jennifer; DANIELS, Ryn. DevOps
para leigos. Rio de Janeiro: Alta Books, 2017.
HUMBLE, Jez; FARLEY, David. Entrega
contínua: como entregar software de forma rápida e confiável. Porto Alegre:
Bookman, 2014.
BASS, Len; WEBER, Ingo; ZHU, Liming. DevOps:
um conjunto de práticas complementares para entrega contínua, implantação e
operações. São Paulo: Novatec, 2016.
VERAS, Manoel. Cloud Computing: nova
arquitetura da TI. Rio de Janeiro: Brasport, 2012.
TAURION, Cezar. Cloud Computing:
computação em nuvem: transformando o mundo da tecnologia da informação. Rio
de Janeiro: Brasport, 2009.
PRESSMAN, Roger S.; MAXIM, Bruce R. Engenharia
de software: uma abordagem profissional. Porto Alegre: AMGH, 2016.
SOMMERVILLE, Ian. Engenharia de software.
São Paulo: Pearson, 2019.
MARTIN, Robert C. Código limpo:
habilidades práticas do Agile Software. Rio de Janeiro: Alta Books, 2012.
Estudo de Caso — A empresa que quis
acelerar tudo, mas quase automatizou o próprio caos
A Nexa Delivery era uma empresa em
crescimento no setor de entregas urbanas. O aplicativo vinha conquistando novos
usuários, os pedidos aumentavam a cada mês e a equipe comemorava os resultados
como prova de que o negócio estava no caminho certo. Por fora, a empresa parecia
promissora. Por dentro, a operação tecnológica começava a dar sinais de
desgaste.
No início, o sistema havia sido construído
de forma simples. Poucos desenvolvedores, uma aplicação central, um banco de
dados e publicações feitas manualmente por alguém da equipe técnica. Enquanto o
volume era pequeno, isso parecia suficiente. O problema é que a empresa
cresceu, mas o modo de trabalhar continuou preso a um estágio improvisado. E
esse é um erro clássico: achar que um processo que funcionou em um momento
pequeno vai continuar funcionando quando a operação se torna mais complexa.
A equipe técnica já sentia isso no dia a dia. Cada nova funcionalidade demorava mais a entrar no ar. Pequenos ajustes causavam efeitos inesperados. Às vezes uma correção resolvia um problema e criava outro. O time estava sempre ocupado, mas quase sempre correndo atrás de urgências. O ambiente de desenvolvimento não era igual ao de produção, os testes eram feitos de
forma parcial e as publicações dependiam muito da atenção
manual de uma ou duas pessoas específicas. Era o tipo de estrutura que até
parece funcionar por um tempo, mas que começa a desmoronar assim que o ritmo de
crescimento aperta.
O primeiro grande erro da Nexa Delivery foi
negligenciar a integração contínua. Cada desenvolvedor trabalhava em
suas alterações durante dias, às vezes semanas, sem integrar o código com
frequência. Quando finalmente chegava a hora de juntar tudo, os conflitos
apareciam. Funções deixavam de conversar corretamente, alterações se sobrepunham
e o tempo que deveria ser usado para evoluir o produto era consumido tentando
resolver incompatibilidades. O problema não era só técnico. Era de método.
A empresa estava presa a uma falsa sensação
de produtividade. Cada profissional parecia avançar muito em sua própria parte
do sistema, mas o conjunto não evoluía com a mesma fluidez. Isso acontece
porque produzir isoladamente não é a mesma coisa que construir de forma
integrada. A falta de integração contínua fazia com que os erros fossem
descobertos tarde demais, quando corrigir já era mais caro, mais lento e mais
estressante.
Em uma semana especialmente crítica, a
empresa decidiu lançar uma nova funcionalidade para rastreamento em tempo real
com atualização mais rápida. A mudança parecia promissora e atendia a uma
demanda dos usuários. Só que o código foi integrado às pressas, sem testes
automáticos suficientes, e seguiu para produção com confiança excessiva. Horas
depois, começaram os problemas. O mapa travava, a atualização atrasava, o
aplicativo ficava instável em horários de pico e o suporte foi inundado por
reclamações.
Esse episódio escancarou o segundo erro da
empresa: confundir pressa com agilidade. Agilidade de verdade depende de
processo confiável. Pressa sem validação é só risco acelerado. A Nexa Delivery
não tinha uma rotina sólida de testes automatizados nem um fluxo maduro de
integração contínua. Na prática, a empresa estava lançando mudanças na base da
esperança. E esperança não é estratégia operacional.
Depois desse incidente, a equipe decidiu que precisava “modernizar tudo”. E foi aí que surgiu outro problema. Em vez de começar pelos fundamentos, a liderança técnica se empolgou com ferramentas. Implantou pipeline de automação, adotou novas plataformas, começou a falar em infraestrutura como código e containers, mas sem construir um raciocínio coerente antes. Isso é mais comum do que deveria. Muita empresa descobre
conceitos corretos, mas tenta aplicá-los como moda, sem critério e sem
maturidade.
A Nexa Delivery montou um pipeline de
integração e entrega contínua, mas sem definir bem quais testes eram realmente
necessários, quais critérios bloqueavam a publicação e quais etapas exigiam
revisão humana. O resultado foi quase cômico, se não fosse problemático: a
empresa automatizou partes do processo, mas manteve a desorganização de fundo.
Em alguns momentos, alterações passavam pelo pipeline e eram publicadas mesmo
sem validação adequada. Em outros, o pipeline travava por detalhes mal
configurados e ninguém sabia exatamente como corrigir. A automação, que deveria
gerar confiança, começou a gerar medo.
Esse foi o terceiro erro central: automatizar
antes de organizar. A automação não é mágica. Ela não transforma um
processo ruim em um processo bom. Ela apenas torna o processo mais rápido e
mais repetível. Se o processo é inteligente, ótimo. Se é bagunçado, o caos
passa a acontecer em velocidade profissional.
Além disso, a empresa sofria com um
problema clássico de infraestrutura. Os ambientes não eram padronizados. O
sistema rodava de um jeito no ambiente de testes, de outro em homologação e de
outro em produção. Certas bibliotecas estavam atualizadas em um servidor, mas
não em outro. Algumas configurações tinham sido feitas manualmente meses antes
e ninguém mais lembrava exatamente quais eram. Em reuniões, a frase “estranho,
aqui funcionou” começou a aparecer com frequência demais. E quando essa frase
vira rotina, o problema já deixou de ser pontual. Ele virou estrutural.
Foi então que a equipe percebeu a
importância de trabalhar com Infraestrutura como Código e ambientes
padronizados. Mas, mais uma vez, precisou aprender da forma difícil que não
bastava adotar a ideia em discurso. Não era suficiente usar uma ferramenta nova
e continuar com velhos hábitos. Foi preciso mapear configurações, revisar
dependências, documentar o que existia e transformar a infraestrutura em algo
mais reproduzível e menos artesanal.
Esse processo foi trabalhoso, mas trouxe um
ganho real. Aos poucos, a empresa começou a reduzir diferenças entre ambientes,
a registrar melhor suas configurações e a depender menos de intervenções
manuais escondidas. Isso diminuiu falhas difíceis de rastrear e tornou os
testes mais confiáveis. O que antes era um território cheio de exceções começou
a se tornar um ambiente mais previsível.
Mas a Nexa Delivery ainda carregava outro erro bem típico de empresas
em típico de empresas em transição: a escolha de ferramentas pelo
prestígio, e não pela necessidade. Em vez de avaliar o que fazia sentido
para o tamanho da equipe, para a complexidade do produto e para a maturidade
interna, a empresa começou a adotar ferramentas porque “todo mundo do mercado
usa”. Esse é um erro intelectualmente preguiçoso. Ferramenta não deve ser
escolhida como quem escolhe tendência de rede social.
Em determinado momento, por exemplo, a
equipe passou a discutir ferramentas complexas de orquestração e serviços
avançados de nuvem quando ainda não tinha resolvido de forma sólida o básico:
versionamento bem utilizado, testes automatizados consistentes, pipeline
confiável e ambientes padronizados. Estavam tentando parecer sofisticados antes
de se tornarem realmente organizados. Isso é vaidade técnica, não maturidade.
A virada começou quando a empresa parou de
tentar impressionar e começou a tentar funcionar melhor de verdade. Em vez de
abraçar tudo ao mesmo tempo, a equipe reorganizou prioridades. Primeiro,
fortaleceu o versionamento e a integração frequente. Depois, estruturou testes
automáticos mais relevantes. Em seguida, revisou o pipeline para que ele
refletisse um processo coerente, e não apenas uma sequência bonita de etapas.
Na parte de infraestrutura, passou a documentar melhor os ambientes e a
reproduzi-los com mais consistência. Só depois disso fez sentido discutir
ferramentas mais avançadas.
Com essa mudança de postura, os resultados
começaram a aparecer. As publicações deixaram de ser momentos de tensão
extrema. Os erros em produção não desapareceram completamente, mas passaram a
ser detectados mais cedo e corrigidos com mais rapidez. O tempo gasto com
retrabalho diminuiu. A equipe recuperou parte da confiança no próprio fluxo de
trabalho. E o mais importante: a empresa começou a perceber que maturidade
operacional não vem de discurso moderno, mas de processo bem construído.
Esse caso mostra com muita clareza os principais aprendizados do Módulo 2. Integração contínua não existe para enfeitar currículo; ela existe para evitar que problemas se acumulem até se tornarem caros e difíceis de resolver. Entrega contínua e automação não servem para acelerar irresponsavelmente; servem para tornar a entrega mais confiável, repetível e menos dependente de esforço heroico. Infraestrutura como Código não é uma moda técnica; é uma forma de reduzir improviso, inconsistência e dependência de memória informal. E as ferramentas não devem ser
escolhidas pelo brilho do nome, mas pela utilidade real dentro do
contexto da equipe.
Erros comuns
mostrados no caso
Um erro muito comum é deixar alterações se
acumularem por tempo demais antes de integrá-las. Isso cria conflitos, atrasa
correções e aumenta o risco de falhas grandes na hora da publicação. A melhor
forma de evitar isso é trabalhar com integração frequente, pequenas mudanças e
verificações constantes.
Outro erro recorrente é publicar
funcionalidades sem testes automáticos adequados, apostando mais na sorte do
que na validação. Esse tipo de prática pode até parecer mais rápida no curto
prazo, mas cobra um preço alto quando os problemas aparecem em produção. O
jeito certo de evitar isso é criar um fluxo em que mudanças sejam testadas de
forma previsível antes de chegarem ao usuário final.
Também aparece no caso a falha de
automatizar processos mal definidos. Isso é especialmente perigoso porque dá
uma sensação falsa de modernização. Automatizar algo desorganizado só faz o
erro viajar mais rápido. Antes de automatizar, é preciso entender o fluxo,
corrigir incoerências e definir critérios claros.
Outro erro clássico é manter ambientes
diferentes entre si, com configurações manuais mal documentadas. Isso faz com
que o sistema se comporte de formas diferentes conforme o lugar em que roda,
dificultando testes, correções e publicações. Para evitar isso, é fundamental
padronizar ambientes e tratar infraestrutura de forma reproduzível e
versionada.
Por fim, o caso mostra um erro que muita
gente prefere não admitir: escolher ferramenta por modismo. Isso normalmente
acontece quando a empresa quer parecer avançada sem ter resolvido o básico. A
prevenção aqui é simples no conceito, embora exija maturidade: antes de
escolher ferramenta, é preciso entender a necessidade real e o nível de
prontidão da equipe.
Como evitar esses
erros na prática
A primeira medida é trabalhar com mudanças
menores e integrações mais frequentes. Isso reduz conflitos e facilita a
identificação de erros. A segunda é estruturar testes automáticos úteis, que
realmente protejam partes importantes do sistema, em vez de apenas existir para
dizer que “há testes”.
A terceira medida é rever processos antes de automatizá-los. Automação deve ser consequência de clareza operacional, não substituto dela. A quarta é investir em padronização de ambientes, documentação e infraestrutura reproduzível. E a quinta é escolher ferramentas com critério, considerando contexto, equipe,
necessidade e capacidade de manutenção.
No fundo, a lógica é simples: primeiro organizar, depois automatizar; primeiro entender, depois escalar; primeiro resolver o básico, depois sofisticar.
Fechamento do
estudo de caso
A história da Nexa Delivery mostra que
crescer tecnicamente não é acumular ferramentas, e sim construir um fluxo de
trabalho mais estável, previsível e coerente. A empresa quase automatizou o
próprio caos porque confundiu modernização com adoção apressada de tecnologia.
O aprendizado central é duro, mas necessário: processo ruim com ferramenta
boa continua sendo processo ruim.
O que realmente mudou a trajetória da empresa não foi a chegada de nomes famosos ou soluções da moda. Foi o momento em que ela parou de perseguir aparência de maturidade e começou a construir maturidade de fato.
Acesse materiais, apostilas e vídeos em mais de 3000 cursos, tudo isso gratuitamente!
Matricule-se AgoraAcesse materiais, apostilas e vídeos em mais de 3000 cursos, tudo isso gratuitamente!
Matricule-se Agora