Desenvolvimento de software é cada vez mais relevante. É difícil imaginar qualquer atividade, em qualquer empresa, em qualquer segmento, que não seja suportada, direta ou indiretamente, por algum tipo de sistema digital. Software bem-feito é, cada vez mais, premissa para a competitividade. Logo, mesmo empresas que não se declaram tecnológicas, tem a tecnologia como competência essencial. Nesse contexto, arquitetura de software ganha relevância, bem como a atuação do arquiteto.
Como TI é percebida em sua empresa? TI passou, em poucos anos, de fonte de custo a fonte diferencial competitivo. Isso implicou em ajustes na forma como ela é gerenciada, sobretudo por novos e crescentes objetivos estratégicos.Nesse episódio, falamos sobre as várias percepções para a área de TI que encontramos em empresas de todos os portes. Também indicamos o que deveria estar sendo feito. |
Todo software tem sua arquitetura. Algumas emergem de forma não supervisionada e, por isso, têm qualidade questionável, implicando em software também de qualidade questionável. Boas arquiteturas dificilmente acontecem sem a atuação de alguém competente como responsável.
Software não desgasta, mas deteriora. Pressman |
Empresas de varejo, com frequência, contratam pessoas técnicas que tenham experiência atuando no varejo, por exemplo. Essa “preferência” se justifica pela intimidade com aspectos arquiteturais específicos.
Como um projeto de software pode ter um “atraso” de mais de um ano? … Um dia de cada vez. Frederick P. Brooks Jr. |
O que é arquitetura de software
Arquitetura de software pode ser definida como a organização fundamental de um sistema, seus componentes, as relações entre eles e o ambiente que guia seu design e evolução. IEEE Standard 1471 |
Software Architecture in Practice, 4th edition Um verdadeiro clássico, agora revisado e ampliado. Trata-se de “leitura obrigatória” para quem deseja realizar uma abordagem séria e mais formal as práticas de arquitetura de software. |
A arquitetura de software de um programa ou sistema computacional é a estrutura ou estruturas do sistema que abrange os componentes de software, as propriedades externamente visíveis desses componentes e as relações entre eles. Bass, Clements e Kasman |
A arquitetura de um software não é um conjunto de diagramas, produzidos por alguém, frequentemente desatualizados. Os diagramas, aliás, são apenas um modelo, uma representação, da arquitetura real que está ou estará implementada no software.
A “estratégia” na arquitetura de software
Estratégia é um padrão coerente para tomada de decisões. Ou seja, quando todas as pessoas de um grupo tomam decisões seguindo um mesmo padrão coerente, obedecendo um conjunto estável de critérios, diz-se que estão alinhados a uma mesma estratégia – mesmo quando, eventualmente, as decisões em si sejam diferentes.
Na prática, isso significa, por exemplo, que qual framework utilizar no frontend, por exemplo, é menos relevante, sob a perspectiva da arquitetura, que os critérios que foram utilizados para adotar tal tecnologia.
Considerações sobre os objetivos do negócio
Dos objetivos de negócio infere-se tanto o modelo de negócios como do modelo operacional que será suportado pelo software que se pretende desenvolver e manter.
O modelo de negócios compreende respostas para as perguntas “Quais são os produtos ou serviços oferecidos? Para quem?” e “Quanto é cobrado pelos benefícios gerados? De quem? Como?”. Já o modelo operacional implica em respostas para “Como a empresa gera seus produtos e serviços? Em que escala? Em que escopo? Como aprende?”
A transformação digital não começa na área de tecnologia Transformação Digital e Ágil Transformação digital e ágil são temas quentes. Nesse capítulo, mostro que elas, diferente do que se possa entender, não começam, de fato na área de tecnologia. Além disso, explico um pouco melhor os conceitos de “Modelo de negócios” e “Modelo Operacional”. |
As respostas de todas as perguntas indicadas tensionam o contexto, demandando a introdução ou revisão de novas restrições e atributos de qualidade.
Considerações sobre Atributos de Qualidade e Restrições
Atributos de qualidade e restrições são os fundamentos para as tomadas de decisão arquitetônicas. Os atributos de qualidade são aprimorados ou danificados por essas decisões, enquanto as restrições incluem ou excluem diretamente partes da arquitetura (por exemplo, os componentes lógicos ou tecnologias).
Uma lista, não exaustiva, porém comum de atributos de qualidade incluem:
- Desempenho, indicando quanto rapidamente um sistema consegue executar uma determinada atividade;
- Escalabilidade, determinando a capacidade de um sistema de lidar com mais usuários, requisições, dados, mensagens, etc.
- Disponibilidade, com relação ao percentual de requisições que um sistema consegue responder dentro de uma expectativa de performance.
- Segurança, talvez o mais essencial dos atributos, indicando a capacidade de um sistema de preservar confidencialidade, integridade e disponibilidade frente a tentativas de desestabilizar o sistema.
- Flexibilidade, indicando suporte a ampliação de escopo de features ou a capacidade de um sistema de permitir que uma mesma ação seja executada de mais de uma forma
- Extensibilidade, permitindo a adição de features ou dados além dos planejados e implementados “no código”
- Manutenabilidade, com vistas a estabilizar custos para manter
- Evolvability, combinando a capacidade de um software evoluir, tanto em tecnologia quanto em features, sem sacrificar a manutenabilidade.
- i18n e l10n
Uma lista não exaustiva de restrições, inclui:
- Prazo e orçamento;
- Listas de tecnologias aprovadas;
- Necessidade de preservar retrocompatibilidade e gestão de legado;
- Plataformas operacionais que precisam ser suportadas;
- Relacionamento com vendors
- Tamanho e skills do time
Definição: 'Arquitetura de Software' (Proposta)
Arquitetura de software trata das decisões relacionadas ao design de um software – seus componentes, as responsabilidades destes componentes e como se relacionam – bem como a estratégia que governará sua evolução, de forma a atender os objetivos do negócio, respeitando restrições técnicas e não técnicas, atendendo atributos de qualidade, sempre buscando minimizar custo ou risco.
A relação de arquitetura com design de software
Quando falamos sobre arquitetura, invariavelmente falamos sobre design de software. Entretanto, o oposto não é verdadeiro. As decisões sobre design que são parte da arquitetura de um software são aquelas que tem relação direta com o atendimento dos objetivos do negócio, respeito a restrições e atendimento dos atributos de qualidade.
A decisão de isolar acesso ao banco de dados em uma “classe repositório”, por exemplo, é uma decisão de design, mas, dificilmente será uma decisão de arquitetura. Afinal, dificilmente será fundamento para atendimento dos objetivos de negócio, respeito a restrições e atributos de qualidade. Por outro lado, a adoção de um cache é, quase sempre, uma decisão de arquitetura pois, este componente pode ser a resposta para atender atributos de qualidade como disponibilidade e performance.
Construir um software cloud-ready também é uma decisão de arquitetura, bem como adotar um ou outro fornecedor de nuvem. Aliás, as escolhas do banco de dados, das linguagens de programação, dos frameworks tanto para frontend quando backend também são exemplos de resoluções arquiteturais pois, certamente, terão implicações relevantes para a continuidade do software, logo, condições para atender o negócio e implicações sobre o orçamento (uma das restrições mais comuns).
A maioria das decisões de design são individuais, em conformidade com os acordos estabelecidos pelo time de desenvolvimento e acontecem o tempo todo. Algumas decisões de design relacionadas com a arquitetura, por outro lado, têm impacto maior e são menos frequentes. Decisões arquiteturais raramente são produtos do trabalho individual.
Finalmente, decisões de arquitetura geralmente são mais difíceis e custosas de revisitar. Daí, talvez, venha a definição vaga de Ralph Johnson que utilizei na citação de abertura.
Arquitetura de software como descoberta
A prática da arquitetura de software é, então, também, uma prática de descoberta. Primeiro, do que se entende dos objetivos de negócio, restrições e atributos de qualidade. Estas informações, aliás, quase nunca evidentes e frequentemente incompletas inicialmente. Depois, de alternativas propositivas de design compatíveis.
De muitas formas, o método de trabalho para a prática de arquitetura de software assemelha-se a resolução de problemas Sudoku. Afinal, em ambos, no Sudoku e na prática de arquitetura, tudo começa com um conjunto incompleto de informações e a solução é encontrada interativamente, a partir do preenchimento de espaços em branco de acordo com aquilo que se sabe para, etapa por etapa, substituir possibilidades por certezas.
As distinções entre Sudoku e arquitetura, entretanto, começam no entendimento de que enquanto para problemas Sudoku há uma única solução possível. Enquanto isso, problemas arquiteturais, geralmente existem múltiplas alternativas viáveis.
Arquitetura de software como resolução de tensões
Entre as informações disponíveis inicialmente, geralmente está uma visão superficial dos objetivos de negócio desejados, imposições de orçamento e normativas (restrições) e sinalizações sobre atributos de qualidade relacionados. Assim como em problemas Sudoku, a partir dessas informações, faz-se inferências para clarificação contextual a partir destes elementos tensores.
De muitas formas, a prática de arquitetura de software equilibra forças e alivia tensões entre objetivos de negócio, restrições e atributos de qualidade.
Por exemplo, em um sistema que suporta prestadores de serviço, pode ser um objetivo de negócio a capacidade de processar recebimentos. Daí, infere-se a necessidade da observação de segurança como atributo de qualidade, que implica na restrição de apartar redes que hospedam serviços internos (controlados) daquelas que hospedam serviços externos através de uma DMZ.
Seguindo o exemplo anterior, o entendimento de segurança como atributo de qualidade, eventualmente implicará, também no atendimento de confidencialidade, integridade e disponibilidade. Na sequência, restrições associadas, como, por exemplo, adoção de tecnologias certificadas são inferidas e, dado o custo, obrigam a ampliação e descoberta de novos objetivos de negócio que “façam a conta fechar”.
Eventualmente, novas restrições externas podem ser impostas (como novas instruções normativas), tensionando o contexto, impactando nos objetivos de negócio e em atributos de qualidade. Nesses casos, novas inferências precisam ser feitas de forma a equilibrar as tensões e dissolver conflitos.
A relação de arquitetura com engenharia de software
A disciplina de engenharia de software contempla não apenas a escrita de código, mas todas as ferramentas e processos que uma organização usa para construir e manter o software ao longo do tempo. Winters, Manshreck e Wright |
Arquitetura de software é uma das disciplinas da engenharia. Não mais, não menos!
Quanto mais explícitas forem as condições atuais (AS-IS) e mais explícitas forem as expectativas para o futuro (TO-BE), mais fácil será planejar a evolução arquitetural através de “arquiteturas intermediárias”.
A arquitetura de software deve considerar e respeitar as outras disciplinas de engenharia ou, pelo menos, tê-las em consideração.
O projeto da Torre de Babel falhou por falta de comunicação, e por causa dessa falta, a organização falhou. Frederick P. Brooks Jr. |
A relação da arquitetura de software com a estrutura organizacional
Organizações que desenvolvem sistemas de software tendem a produzir sistemas que são cópia das estruturas de comunicação dessas empresas. Melvin Conway |
A estrutura dos componentes de um software impacta na formação dos times que vão desenvolver o software. Não há, por exemplo, chances de implementar arquiteturas baseadas em microsserviços em estruturas organizacionais com times monolíticos. Se o time for indivisível, o software também o será!
Team Topologies Um “novo clássico”! Team Topologies aborda de maneira clara e direta as complicações e oportunidades resultantes da Lei de Conway. |
A lei de Conway Quais são os impactos da lei de Conway para a arquitetura de software? Essa é a temática desse vídeo – parte de uma playlist que preparamos para apresentar fundamentos das práticas arquiteturais. |
As práticas da arquitetura de software
As práticas de arquitetura de software maximizam a produtividade. Ou seja, a relação entre o valor obtido (desempenho) e o esforço dispensado (empenho). De maneira análoga, boa arquitetura maximiza o resultado, otimizando o investimento. Em termos simples, boa arquitetura de software colabora para melhorar o ROI de iniciativas de desenvolvimento e reduzir o TCO.
A fórmula da produtividade No meio corporativo é comum falar sobre o “desafio da produtividade”. Mas, você já parou para pensar no que ser mais produtivo, de fato, significa? Nós costumamos explicar a produtividade utilizando uma fórmula simples. Entendemos que produtividade é definida pela proporção do desempenho (o resultado que se busca obter) e do empenho (o esforço ou custo necessário para gerar o desempenho). |
As melhores práticas de arquitetura de software invariavelmente acionam as partes interessadas (stakeholders) para explicitar e atualizar os objetivos do negócio que precisam ser atingidos, focando nos resultados e não na forma. Elas também devem diagnosticar, até o último momento responsável, as restrições que devem ser observadas e assegurar que elas sejam respeitadas. Finalmente, também devem inferir os atributos de qualidade que garantem a eficiência no atendimento do negócio e das restrições.
A abrangência da arquitetura de software
As decisões arquiteturais impactam, obviamente, nas atividades de desenvolvimento, mas também tem relação com a manutenção, atualização, entrega (deploy) e operação do software. Por isso, arquitetura de software é parte do esforço de engenharia, que é mais amplo.
A boa engenharia de software, conforme a Google, contempla todas as atividades que habilitam um sistema a suportar as mudanças de escala, ao longo do tempo, sem sacrificar a eficiência. Seguramente, as decisões arquiteturais são parte crucial para o sucesso da engenharia.
Software Engineering at Google Como a Google, uma das maiores empresas de tecnologia do mundo, trata engenharia de software? Quais foram as lições aprendidas pela companhia ao longo de sua jornada? Essa é a temática desse livro fantástico. |
A decisão de adotar microsserviços, por exemplo, transfere parte da complexidade de desenvolver um software para sua operação. Há mais o que operar e monitorar e obrigam a adoção de abordagens mais modernas e automatizadas. Não raro, microsserviços é uma tentativa de resolver um problema criando outro pior!
O arquiteto de software
Todo software tem uma arquitetura. Nem sempre, entretanto, ela é suportada por boas práticas arquiteturais.
Há quem defenda que as boas práticas arquiteturais devem ser reforçadas por todo o time de desenvolvimento e eu concordo com isso. Entretanto, também entendo que algo que é responsabilidade de todos, acaba recebendo cuidados de ninguém. O arquiteto de software, em um time de desenvolvedor de software, é o responsável por garantir que boas práticas de arquitetura sejam adotadas.
O arquiteto apoia os esforços de engenharia de software, tomando decisões que facilitem a gestão do ciclo de vida de um produto tecnológico.
Em um mundo onde especialistas sabem cada vez mais sobre cada vez menos, não se pode esperar que uma única pessoa seja capaz de tomar todas as decisões importantes relacionadas com a arquitetura. Entretanto, parece coerente ter alguém preocupado e responsável por garantir que essas decisões sejam tomadas – este é o papel do arquiteto.
O arquiteto de software é, idealmente, um orquestrador. Ele garante que todas as partes interessadas sejam ouvidas e suas ponderações sejam levadas em conta na formulação da arquitetura. Para isso, elabora e mantém artefatos abrangentes que facilitam o engajamento.
O arquiteto de software deve, de tempos em tempos, revisar a estrutura de componentes e suas relações de um software para garantir que os objetivos do negócio serão atingidos, as restrições obedecidas e os atributos de qualidade atendidos. Além de tudo isso, o arquiteto deve adotar postura “provocativa” para verificar se a entrega está maximizada frente ao melhor custo.
The Software Architect Elevator Quais são as funções e responsabilidades do arquiteto de software? O que muda conforme o tamanho das organizações? Greg Hohpe apresenta uma visão madura e bem fundamentada para essas questões neste livro espetacular. |
O arquiteto não é, necessariamente, um “dev sênior-sênior”
Em minha experiência, não conheci nenhum arquiteto de software que não tenha sido, também, excelente desenvolvedor. Entretanto, embora exista correlação, não consigo identificar causalidade.
O arquiteto de software precisa de soft skills suficientes para poder interagir com os diferentes stakeholders de maneira qualificada. Além disso, deve ter capacidade de abstração suficiente para representar componentes complexos de maneira compreensível. Finalmente, precisa ter “sensibilidade técnica” para identificar falhas arquiteturais e acionar as pessoas certas para que as decisões sejam as mais assertivas.
A alocação de uma pessoa em atividades de arquitetura pode variar significativamente conforme a complexidade ou os riscos do software que está sendo desenvolvido. Em muitos cenários, o arquiteto tem tempo para escrever código. Outras vezes, as atividades de orquestração podem ser demandantes ao ponto de que não sobre tempo para escrever código em quantidade relevante.
Importante, porém, destacar que hard skills nunca serão um problema, muito pelo contrário!Definição: 'Arquiteto de Software' (Proposta)
O arquiteto de software é o responsável por garantir (não necessariamente executar) que as práticas de arquiteturais sejam executadas. Tem perfil “técnico” com excelentes essential skills, capaz de discutir desde com “escovadores de bits” até “altos executivos”.
As atividades de arquitetura durante a elaboração do design
Importante destacar que no “centro” das atividades do arquiteto estão os objetivos de negócio, as restrições e os atributos de qualidade. Finalmente, a definição da função de avaliação da arquitetura que será o custo ou risco.
Just enough software architecture Qual é o rigor necessário na execução das atividades de arquitetura? George Fairbanks defende que depende dos “riscos” envolvidos em cada projeto. Quanto maior o risco, maior a necessidade de rigor nas práticas! |
Não raro, medidas para melhorar dois ou mais atributos de qualidade, respeitar restrições ou atender objetivos de negócio são conflitantes. Ou seja, não podem ser adotadas juntas. Há também cenários onde ações que favorecem a alguns dos objetivos arquiteturais prejudicam outros. Nessas horas, ocorre um trade-off.
É papel do arquiteto de software orquestrar interações entre todos os stakeholders para eliminar trade-offs.
As atividades de arquitetura para continuidade
Uma vez selecionada uma proposição de design, seguem atividades de implantação, operação e evolução, governadas por um conjunto de fitness functions que expressam, principalmente, objetivos de negócio e atributos de qualidade.
Em algum momento, a medida que ocorrem mudanças significativas de escala ou escopo, anomalias ocorrem e, na ocorrência, implicam em retomada de descobertas de objetivos de negócio, restrições e atributos de qualidade.
Quatro configurações de trabalho para o “arquiteto”
Todo sistema de software possui uma arquitetura. Entretanto, ela nem sempre é planejada, tampouco idealizada por alguém que responde, pelo menos oficialmente, como arquiteto.
Gregory Hohpe ensina que há pelo menos quatro configurações possíveis para a atividade de arquitetura.
O arquiteto como “Ditador Benevolente”
Nessa configuração, cabe ao arquiteto definir o que precisa ser feito e ao time executar o que o arquiteto definir.
No médio-longo prazo, times com uma cabeça, a do “ditador benevolente”, e diversos braços, o restante do time, são insustentáveis por promover comportamento medíocre.
Arquiteto como “membro do time”
Nessa configuração, o arquiteto assume a posição de orquestrador para as decisões mais importantes. Ele explicita e consolida opções com o time verificando sempre o atendimento dos objetivos do negócio, respeito a restrições e atendimento dos atributos de qualidade.
Arquitetura sem arquitetos
Nessa configuração, as atividades de arquitetura são diluídas entre os diversos membros do time, que assumem responsabilidade compartilhada pelos resultados.
Esse tipo de configuração só é possível em times com senioridade extremamente elevada, onde há consciência da natureza e da importância das atividades arquiteturais.
Arquitetura “implícita”
Nessa configuração, as atividades de arquitetura simplesmente não são executadas e a mesma “emerge organicamente” durante o processo de desenvolvimento. É comum em times alegadamente ágeis que acham práticas arquiteturais desnecessárias.
O resultado comum desse tipo de configuração é ver o time “fazendo outra fez” software que já fez no passado. Ou seja, reproduzindo soluções de projetos anteriores para problemas propostos no projeto atual.
Qual é o jeito certo?
Este é o início de uma longa jornada…
Gosto muito da ideia de dar passos consistentes na direção certa, o tempo todo. Nesta introdução, tentei consolidar impressões sobre arquitetura de software, suas práticas e as atribuições de um arquiteto. Nos próximos capítulos, vou apresentar algumas “boas práticas” de arquitetura que tenho vivenciado como arquiteto e consultor.
// TODO
Antes de avançar para o primeiro capítulo, recomendo as seguintes atividades:
- Reflita sobre as práticas de arquitetura de software que você tem presenciado. O que tem funcionado? O que não tem gerado os resultados esperados?
- Você consegue relacionar os principais componentes do software que está desenvolvendo, suas responsabilidades e a forma como estes se relacionam?
- Você consegue relacionar os objetivos de negócio que precisam ser atingidos usando o software que está ajudando a desenvolver? Conhece as principais restrições? Saberia explicitar os atributos de qualidade?
Não compreendi muito bem essa frase, qual relação a entre aumento de custo e troca de produto tecnológico?
O desenho com início e fim, pode remeter por engano ao processo de desenvolvimento em cascata. Será que não seria melhor um desenho em forma de fluxo contínuo? Como no PDCA?
Podemos entender que as 3 primeiras atividades condicionais são sobre “O que” e a última sobre “Como”?
Elaborando sobre: “O que” seriam os requisitos a serem atendidos pela arquitetura para que as Business Demands, Constraints e Quality Attributes sejam atendidos. Permitindo após essa definição, que sejam trazidas diferentes abordagens para a implementação. Dando então espaço ao “Como”, que irá apresentar sugestões de implementações da arquitetura de forma que se possa comparar apenas custo e risco.