Olá! Sejam bem-vindos ao curso de Arquitetura de Software da Alura. Meu nome é Jeferson Rodrigues da Silva.
Audiodescrição: Jeferson é um homem branco, com cabelo preto, sem barba, e está vestindo uma camiseta preta.
Trabalho com arquitetura de software há alguns anos e irei orientá-los neste curso, que é destinado a pessoas desenvolvedoras em Java que já atuam na área de desenvolvimento e desejam compreender melhor o papel de arquiteto de software e os padrões arquiteturais. Este curso também é indicado para quem está começando na arquitetura de software e quer se aprofundar mais sobre o tema.
Neste curso, exploraremos o papel de uma pessoa arquiteta de software em uma empresa, incluindo as habilidades interpessoais e de comunicação necessárias para exercer essa função. Abordaremos introduções a padrões arquiteturais, como o padrão de microsserviços e o padrão monolítico.
Discutiremos como desenvolver uma arquitetura evolutiva e utilizaremos fitness functions (funções de adequação) para permitir a evolução contínua ao longo do tempo. Além disso, estudaremos o DDD (Domain-Driven Design ou Design Orientado a Domínio), que é uma abordagem que nos auxilia significativamente na arquitetura de software.
Para aproveitar ao máximo este curso, recomendamos o uso dos fóruns, a realização de todas as atividades extras e a participação ativa, pois isso contribui para uma melhor absorção do conhecimento. Vamos começar?
Olá, hoje vamos discutir o papel do arquiteto de software. Antes disso, vamos recapitular e entender a evolução dos sistemas ao longo das décadas, para compreender o aumento da complexidade no desenvolvimento de novas funcionalidades e a importância desse novo papel nas empresas: o arquiteto de software.
Nos anos 90 e 2000, as aplicações na web estavam surgindo e eram mais simples. Utilizávamos uma arquitetura chamada monolítica, que atendia principalmente sites simples e algumas aplicações. Essa arquitetura ainda conseguia ser algo mais consolidado e simples.
Nos anos 2000 e 2010, com o crescimento da web, surgiram aplicações cada vez mais complexas, com novas funcionalidades. O e-commerce começou a se fortalecer, e o conceito de e-banking na web nasceu. Para atender a essas novas necessidades, a arquitetura monolítica não era mais suficiente, e começaram a surgir outros tipos de arquitetura, como o Service-Oriented Architecture (SOA), que é uma arquitetura orientada a serviços.
Nos anos 2010 e 2020, a computação em nuvem, ou cloud computing, começou a se desenvolver, trazendo novas arquiteturas, como os microsserviços. Nessa abordagem, cada serviço tem sua própria responsabilidade, e a aplicação monolítica é decomposta em vários pequenos serviços com responsabilidades específicas. Também surgiu o conceito de DevOps, que une o desenvolvimento de software à operação.
Atualmente, em 2020 e nos dias de hoje, temos sistemas distribuídos cada vez mais complexos. O edge computing, que é a computação nos dispositivos nas bordas, está em ascensão. Temos sistemas de streaming com alta disponibilidade de vídeos, baixa latência e milhões de usuários acessando 24 horas por dia, sete dias por semana. O conceito de serverless também surgiu, onde não precisamos mais nos preocupar com o servidor; simplesmente solicitamos a execução de uma função, e a nuvem fornece o servidor, aloca o recurso e executa a função.
Com todas essas inovações, não substituímos uma tecnologia por outra; ao contrário, convivemos com todas elas. Independentemente do tamanho da empresa, é necessário lidar com todas essas tecnologias simultaneamente, tornando a arquitetura de software algo muito trabalhoso. Apenas o time de desenvolvimento não é suficiente para atender a essa necessidade. É essencial ter alguém responsável por uma visão mais holística da arquitetura da empresa. Daí a importância do papel do arquiteto de software, que vamos explorar mais a fundo.
Nos cenários atuais, temos sistemas globais com milhões de usuários simultâneos, infraestrutura multi-cloud com uma arquitetura híbrida, combinando sistemas on-premise com sistemas rodando em nuvens públicas. Às vezes, alguns sistemas operam em ambas as nuvens ao mesmo tempo, tanto on-premise quanto no provedor público de cloud.
Com o aumento dos problemas de segurança, é mais comum enfrentar ataques cibernéticos, onde hackers tentam explorar vulnerabilidades e brechas de segurança. Além disso, existem leis que regulamentam os dados e exigem maior cuidado com os dados dos clientes. As auditorias também são cada vez mais frequentes, exigindo que os sistemas estejam em conformidade com essas leis e auditorias.
Portanto, enfrentamos um cenário com tecnologia legada, tecnologia atual, múltiplos provedores de cloud, milhões de usuários acessando 24 horas por dia, sete dias por semana, e requisitos de segurança e conformidade com auditorias. Tudo isso torna a arquitetura de software extremamente complexa, e essa complexidade continua a crescer. Assim, enfrentamos desafios técnicos muito elevados.
Quando temos uma arquitetura fragmentada, enfrentamos inconsistência de dados e impactos organizacionais. Arquiteturas complexas afetam a entrega de novas funcionalidades, resultando em um time to market mais lento e perda de espaço para os competidores. Além disso, há um custo elevado para suportar toda a infraestrutura. A curva de aprendizado para as pessoas desenvolvedoras dessa arquitetura é longa, o que retarda a produção e entrega de novas funcionalidades.
Outro problema em arquiteturas complexas são as dependências ocultas. Ao realizar o deploy ou a entrega de uma funcionalidade em um sistema, como o sistema A, podemos, por vezes, causar problemas ou incidentes no sistema B. Isso leva as empresas a questionarem como minimizar essas dificuldades, enquanto continuam lançando novas funcionalidades e mantendo seus sistemas legados, que são muito importantes.
Surge, então, a necessidade de ter alguém responsável exclusivamente por observar a arquitetura de software como um todo. Essa pessoa não se limitará a desenvolver, mas também analisará a arquitetura, considerando novas funcionalidades, roadmap, problemas atuais e uma visão a médio e longo prazo. Como arquitetos de software, planejamos a arquitetura para os próximos cinco a dez anos, além do presente. Buscamos aumentar a velocidade de entrega dos produtos, minimizar custos, evitar incidentes e problemas em produção, garantir a consistência de dados, estar em conformidade com auditorias e proteger contra ataques cibernéticos. Tudo isso faz parte do papel do arquiteto de software.
Como arquitetos de software, temos uma visão holística de tudo que ocorre na empresa. Observamos os sistemas legados, novos e futuros que ainda serão desenvolvidos. Precisamos também equilibrar trade-offs. Um trade-off é um conceito comum na arquitetura de software, pois não existe uma solução única que resolva todos os problemas. Cada decisão traz benefícios e malefícios. Seja uma arquitetura de microsserviços ou monolítica, ambas têm prós e contras. Cabe ao arquiteto de software equilibrar esses trade-offs, ou seja, os benefícios e malefícios de cada decisão tomada na empresa.
Como arquitetos de software, frequentemente nos deparamos com situações em que gerentes ou stakeholders solicitam a entrega de funcionalidades específicas. Precisamos avaliar se, ao cumprir um prazo, teremos que abrir mão de outras questões. Essas questões podem ser problemas ou decisões arquiteturais que impactem o negócio a longo prazo. Também é necessário gerenciar débitos técnicos, o que faz parte do papel do arquiteto de software.
Além da parte técnica, é importante que o arquiteto de software auxilie os gestores de TI e os líderes da área. Com uma visão holística da empresa e de toda a arquitetura, ele pode identificar os melhores padrões para atender a empresa. Isso inclui definir padrões arquiteturais a serem seguidos pelas equipes de desenvolvimento, critérios de aceitação de entregas, tecnologias a serem usadas, design patterns de arquitetura a serem aplicados, entre outros. É essencial que o arquiteto de software também tenha um lado mais gestor, ajudando no roadmap, no planejamento das entregas e em todos os projetos da empresa.
O papel do arquiteto de software envolve a estruturação de sistemas, garantindo a comunicação e integração entre eles, além de lidar com sistemas legados e planejar novos sistemas. O arquiteto também é responsável por assegurar a qualidade dos requisitos não funcionais, que incluem segurança, consistência dos dados, disponibilidade, resiliência e performance. Esses requisitos são fundamentais para criar uma arquitetura que forneça um ambiente seguro para que as pessoas desenvolvedoras entreguem software com segurança. Um ambiente seguro é aquele que sabe lidar com falhas e é resiliente, além de garantir a segurança contra ciberataques.
Outro aspecto importante é a evolução arquitetural. O arquiteto deve planejar a arquitetura de software considerando o passado, o status atual e o futuro, incluindo o número de clientes e novas funcionalidades. Para isso, é essencial estar próximo da equipe de negócios e dos stakeholders para entender a direção da empresa e planejar uma arquitetura que atenda às suas necessidades. É importante definir padrões de arquitetura, critérios e documentações para garantir que os resultados esperados sejam alcançados. O arquiteto deve ter métricas e dados para analisar se a arquitetura está funcionando bem ou se precisa ser reestruturada.
Ao longo do tempo, mudanças podem ocorrer, como alterações no comportamento dos usuários, desafios técnicos ou débitos técnicos. O arquiteto deve acompanhar as métricas e resultados dos projetos para garantir que a arquitetura planejada está sendo seguida e que os resultados estão de acordo com o esperado. Além disso, o arquiteto deve pensar nos pilares da arquitetura de software, como a decomposição de domínios em módulos, interfaces, critérios de qualidade, segurança e resiliência.
O arquiteto de software também desempenha um papel organizacional, fazendo mentoria e preparando outras pessoas desenvolvedoras para se tornarem arquitetas. Ele deve motivar a equipe a seguir os padrões propostos e alinhar os stakeholders de negócios e tecnologia com a equipe de desenvolvimento e operações. O arquiteto é um elo entre as áreas de negócios, engenharia e técnica.
Em termos de estratégia, o arquiteto deve pensar a longo prazo, planejando o roadmap do projeto, que é o planejamento do produto ao longo do tempo. Ele deve avaliar novas tecnologias e seus benefícios e malefícios, considerando os trade-offs ao adotar novas abordagens arquiteturais. A gestão de riscos e débitos técnicos também é uma responsabilidade do arquiteto, que deve trabalhar junto com o gerente de projetos para identificar e avaliar esses aspectos.
O arquiteto de software deve ter habilidades comportamentais (soft skills), além das habilidades técnicas (hard skills). Ele deve saber negociar, comunicar-se de forma adaptativa com públicos técnicos e não técnicos, e influenciar positivamente a equipe de desenvolvimento. A liderança colaborativa é essencial, trabalhando junto com líderes e gestores para gerar uma liderança positiva.
Em resumo, o arquiteto de software é responsável por diversos aspectos, desde a estruturação técnica até a comunicação e liderança dentro da empresa, garantindo que a arquitetura de software atenda às necessidades do negócio e dos clientes.
Uma liderança eficaz deve ser uma referência para seus liderados e possuir uma visão estratégica sobre como as coisas se encaixam e se comunicam dentro da empresa. É importante identificar os papéis responsáveis, suas funções e os gaps existentes. Mentoria e feedback são fundamentais para acompanhar o desenvolvimento de pessoas desenvolvedoras e outros gestores, sempre fornecendo feedbacks construtivos. Devemos basear nossas decisões em dados e métricas reais, evitando o achismo ou sentimentos subjetivos, pois essa é a melhor forma de argumentar.
Existem alguns pilares dos soft skills que são essenciais. A inteligência emocional é crucial em ambientes de crise, incidentes e estresse. Por exemplo, em uma reunião com diretores executivos, precisamos explicar atrasos em projetos sem culpar indivíduos ou equipes específicas. Em situações de war room, que são reuniões para resolver problemas específicos como incidentes de produção ou ataques cibernéticos, é necessário lidar com o estresse e a pressão, ouvir diferentes opiniões e se comunicar de forma proativa sem ofender os outros. A teoria da comunicação envolve saber ouvir e ter empatia, especialmente em reuniões online. Entender as dinâmicas de grupos e como as empresas se organizam é importante, assim como a teoria dos jogos e a prática deliberada baseada em dados e métricas.
Podemos agrupar esses conceitos em quatro grandes grupos para facilitar o raciocínio: comunicação, liderança, influência e negociação, e pensamento crítico. A comunicação deve ser adaptada à audiência. Ao falar com um grupo técnico, usamos jargões técnicos; com pessoas não técnicas, preparamos um storytelling (narrativa) com início, meio e fim, abordando soluções e concluindo com dados e métricas. Documentação eficaz e atualizada é essencial para a comunicação.
Na liderança, é importante oferecer mentoria, treinamentos e workshops, além de gerir conflitos. Como arquiteto de software, podemos nos deparar com situações em que dois times não concordam sobre um contrato de APIs, por exemplo. Precisamos usar princípios de comunicação e empatia para ouvir os dois lados e encontrar um consenso. A influência e negociação envolvem persuadir grupos ou áreas, sempre baseando argumentos em dados. A construção de consenso deve ser uma decisão coletiva, não ditatorial.
O pensamento crítico é necessário para questionar se uma decisão é a melhor possível, considerando os trade-offs (benefícios e malefícios) e pensando fora da caixa para resolver problemas. A comunicação por audiência requer saber falar com diferentes níveis, como executivos, pessoas de produtos e desenvolvedores, adaptando o foco e a linguagem conforme necessário.
A comunicação é complexa e requer treino e prática. Devemos sempre pedir feedback para evoluir. É importante pensar em comunicação em camadas, adaptando-a ao público-alvo. Visualizações de dados devem ser claras e impactantes, evitando tabelas e preferindo gráficos. Criar um glossário compartilhado ajuda a evitar confusões com jargões. O modelo C4, com desenhos de diagramas padronizados, é útil no dia a dia.
Um sumário executivo deve ser orientado a valor, conciso e quantificável, focando no impacto do problema ou solução para o negócio. Devemos alinhar objetivos estratégicos e quantificar benefícios financeiros, evitando jargões técnicos e detalhes de implementação. A documentação deve ter propósito e clareza, evitando ser extensa e sem sentido.
Para uma narrativa técnica eficaz, devemos ser claros e objetivos, com uma estrutura lógica e contextualização do problema. Evidências devem ser baseadas em dados e métricas, apresentadas de forma visual. Um exemplo de narrativa técnica eficaz é descrever um sistema de pagamento que processa 10 mil transações por minuto, identificando problemas de latência e propondo soluções para melhorar a experiência do usuário.
O curso Fundamentos da Arquitetura de Software Moderna possui 285 minutos de vídeos, em um total de 38 atividades. Gostou? Conheça nossos outros cursos de Java em Programação, ou leia nossos artigos de Programação.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
2 anos de Alura
Matricule-se no plano PLUS 24 e garanta:
Jornada de estudos progressiva que te guia desde os fundamentos até a atuação prática. Você acompanha sua evolução, entende os próximos passos e se aprofunda nos conteúdos com quem é referência no mercado.
Mobile, Programação, Front-end, DevOps, UX & Design, Marketing Digital, Data Science, Inovação & Gestão, Inteligência Artificial
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você participa de eventos exclusivos, pode tirar dúvidas em estudos colaborativos e ainda conta com mentorias em grupo com especialistas de diversas áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
2 anos de Alura
Todos os benefícios do PLUS 24 e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Para estudantes ultra comprometidos atingirem seu objetivo mais rápido.
2 anos de Alura
Todos os benefícios do PRO 24 e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.
Conecte-se ao mercado com mentoria individual personalizada, vagas exclusivas e networking estratégico que impulsionam sua carreira tech para o próximo nível.