Sobre as práticas de arquitetura de software

Este capítulo possui uma versão mais recente:

Arquitetura de software são as coisas importantes de um software. O que quer que isso seja.
Ralph Johnson (não Martin Fowler)

Desenvolvimento de software é atividade 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.

Todo software tem sua arquitetura. Algumas “emergiram” de forma não supervisionada e, por isso, têm qualidade questionável. Software bem-feito tem boa arquitetura e é difícil que isso aconteça sem a atuação de alguém competente como responsável.

Eventualmente, bons sistemas são desenvolvidos a partir das “cicatrizes” do time. Ou seja, utilizando arquiteturas de sistemas desenvolvidos com êxito no passado como referência para uma nova solução. Entretanto, isso não é indicativo de que conhecimentos relacionados a arquitetura sejam menos importantes, apenas indica que decisões arquiteturais podem, eventualmente, serem requentadas para resolver cenários com problemas de negócio, restrições ou atributos de qualidade similares.
0
Você concorda com essa afirmação? Há algo a ponderar aqui?x

Há também, sistemas que evoluem suas arquiteturas com base em modismos, influências de terceiros ou preferências difíceis de justificar. Nestes cenários, prejuízos acabam sendo percebidos mais tarde e por muito tempo. Geralmente, no longo prazo, tais soluções se convertem em “colchas de retalhos” com custo crescente de manutenção.
1
Você concorda com essa afirmação? Há algo a ponderar aqui?x

As oportunidades são muitas e os riscos são cada vez maiores. Ter ciência da importância de desenvolver sistemas com boas arquiteturas deve fazer parte, cada vez mais, da proposição competitiva da organizações. Profissionais com habilidades em conceber e implementar tais arquiteturas serão cada vez mais valorizados, independente do título que se dê a posição que ocupam.
0
Você concorda com essa afirmação? Há algo a ponderar aqui?x

O que é arquitetura de software

Embora não exista consenso absoluto sobre o conceito, alguns aspectos são amplamente aceitos. Qualquer discussão madura sobre a arquitetura de um software aborda, de maneira mais ou menos qualificada, seus componentes, a responsabilidade destes e a forma como eles se relacionam. Aliás, isto está alinhado com a definição proposta pelo IEEE, que é uma das mais mencionadas.

Arquitetura de software pode ser definida como a organização fundamental de um sistema, seus componentes, a relações entre eles e o ambiente que guia seu design e evolução. (IEEE Standard 1471)

Indiretamente, a referência a componentes, relacionamentos e responsabilidades também está presente na definição proposta no excelente “Software Architecture in Pactice“. 
0
Qual sua opinião sobre essa definição?x

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.

As melhores arquiteturas, geralmente, tem componentes com baixo acoplamento. Ou seja, que funcionam e evoluem de maneira independente, com pouco impacto nos demais, tanto na manutenção quanto na operação, além do ganho em testabilidade (que é um ganho mais amplo, de engenharia).
0
Você concorda que 'testes' é um tema de engenharia?x
Por outro lado, arquiteturas ruins geralmente tem componentes fracamente delimitados, com forte sobreposição, difíceis de manter e, sobretudo, caros para evoluir.

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).

Especificidades sobre injeção de dependências, composição ou agregação de classes, nomes de métodos e variáveis e, até mesmo princípios SOLID, quando relacionados a aspectos diretamente ligados ao código, são bons exemplos de design, mas não de arquitetura.
0
Você concorda com essa lista? Alguma outra proposição?x

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.

As práticas da arquitetura de software

As decisões de design que tem relação com a arquitetura são tão importantes que, idealmente, devem ser tomadas obedecendo algumas boas práticas. Ou seja, replicando os comportamentos comuns adotados por times eficientes que produzem software de boa qualidade, que atendem os objetivos do negócio, respeitando restrições a atingindo atributos de qualidade.

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.

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.

As melhores práticas de arquitetura resolvem de maneira mais leve os principais trade-offs – direções conflitantes que precisam ser observadas – que emergem no levantamento dos objetivos e das restrições. Por exemplo, disponibilidade – um atributo de qualidade – conflita com segurança – uma restrição, afinal, disponibilidade implica em adição de componentes que ampliam a “superfície de ataque”.
1
Você pode apontar outros exemplos de trade-offs?x

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.

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!

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.

Quando um time de desenvolvimento adota boas práticas de arquitetura, seus membros seguem uma estratégia comum para suas escolhas e isso é extremamente importante. Afinal, para cada problema tecnológico há uma continuidade crescente de respostas viáveis – com prós e contras – que dificultam o consenso. A alternativa selecionada deve ser aquela que for mais aderente aos objetivos de negócio, restrições e atributos de qualidade.

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.

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.

Há, certamente, muitos times de tecnologia que tem sucesso em fazer entregas sem ninguém ocupando, formalmente, a posição de arquitetura. Entretanto, esses times são compostos ou, pelo menos, liderados por desenvolvedores muito experientes. Nesses casos, esses desenvolvedores tem cicatrizes relacionadas a decisões arquiteturais semelhantes as que são necessários para o projeto em que estão trabalhando, diminuindo o risco da ausência do pensamento arquitetural mais especializado. Há ainda, claro, pessoas executando o ‘papel de arquiteto’, sem o devido reconhecimento formal.
1
Você concorda com essa afirmação? Há algo a ponderar aqui?x

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.

Muito da confusão do arquiteto com um “dev sênior-senior” surge da incapacidade das empresas de ajustarem um plano de carreira adequado para times de tecnologia. Não raro, a posição do arquiteto de software é ofertada como uma promoção (um próximo passo natural) para um desenvolvedor e este não é o caso.
0
Você concorda com essa afirmação? Há algo a ponderar aqui?x

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!
1
Você concorda com essa afirmação? Há algo a ponderar aqui?x

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?

Referências bibliográficas

WIKIPEDIA. IEEE 1471. Disponível em: https://en.wikipedia.org/wiki/IEEE_1471. Acesso em: 6 abr. 2021.

FOWLER, Martin. Software Architecture Guide. 2019. Disponível em: https://martinfowler.com/architecture/. Acesso em: 6 abr. 2021.

BASS, Len; CLEMENTS, Paul; KASMAN, Rick. Software Architecture in Practice. 3. ed. Old Tappan, Nj: Pearson Education, 2012. (The SEI Series in Software Engineering).

Compartilhe este capítulo:

Compartilhe:

Comentários

Participe da construção deste capítulo deixando seu comentário:

Inscrever-se
Notify of
guest
6 Comentários
Oldest
Newest Most Voted
Feedbacks interativos
Ver todos os comentários
Andrew Bezerra
Andrew Bezerra
2 anos atrás
Feedback no conteúdo deste capítulo Há, certamente, muitos times de tecnologia que tem sucesso em fazer entregas sem ninguém ocupando, formalmente, a posição de arquitetura.…" Ler mais »

“A integridade conceitual é essencial à qualidade do produto. Ter um arquiteto do sistema é o passo individual mais importante para alcançar a integridade conceitual.” (O Mítico Homem-Mês, Cap. 19, p. 249. parag. 2)

Andrew Bezerra
Andrew Bezerra
2 anos atrás
Feedback no conteúdo deste capítulo Há também, sistemas que evoluem suas arquiteturas com base em modismos, influências de terceiros ou preferências difíceis de justificar. Nestes…" Ler mais »

“Ninguém ama o portador de más notícias” SÓFOCLES
Citação de introdução do Cap 14 – Incubando uma Catástrofe em O Mítico Homem-Mês.

Andrew Bezerra
Andrew Bezerra
2 anos atrás
Feedback no conteúdo deste capítulo As melhores práticas de arquitetura resolvem de maneira mais leve os principais trade-offs - direções conflitantes que precisam ser observadas…" Ler mais »

“Cada bala tem seu alvo.” Guilherme III da Inglaterra – Príncipe de Orange.

Andrew Bezerra
Andrew Bezerra
2 anos atrás
Feedback no conteúdo deste capítulo Importante, porém, destacar que hard skills nunca serão um problema, muito pelo contrário!" Ler mais »

“Na minha experiência, muitas das complexidades que são encontradas no trabalho em sistemas são sintomas de problemas organizacionais. Tentar modelar essa realidade com programas igualmente complexos é, na realidade, preservar a desordem em vez de resolver problemas.” Lars Sodahl da MYSIGMA Sodahl and Partners

Antonio Nascimento
Antonio Nascimento
2 anos atrás
Responder para  Andrew Bezerra

Muito boa essa citação!

Andrew Bezerra
Andrew Bezerra
2 anos atrás

Sobre o paragrafo: “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.”

“O projeto da Torre de Babel falhou por falta de comunicação, e por causa dessa falta, a organização falhou.” O Mítico Homem-Mês Capitulo 7 – Por que a Torre de Babel Falhou?

Fundador e CEO da EximiaCo, atua como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Mentoria

para arquitetos de software

Imersão, em grupo, supervisionada por Elemar Júnior, onde serão discutidos tópicos avançados de arquitetura de software, extraídos de cenários reais, com ênfase em systems design.

Consultoria e Assessoria em

Arquitetura de Software

EximiaCo oferece a alocação de um Arquiteto de Software em sua empresa para orientar seu time no uso das melhores práticas de arquitetura para projetar a evolução consistente de suas aplicações.

ElemarJúnior

Fundador e CEO da EximiaCo, atua como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

+55 51 99942-0609 |  contato@eximia.co

+55 51 99942-0609  contato@eximia.co

6
0
Quero saber a sua opinião, deixe seu comentáriox
()
x