Baixe o app para aproveitar ainda mais
Prévia do material em texto
UNIDADE 1.1 - INTRODUÇÃO À ARQUITETURA DE SOFTWARE Apresentação Desde os tempos mais remotos, a arquitetura é uma ferramenta essencial para se obter uma qualidade melhor na construção de estruturas e sua utilização ajudou a garantir um melhor aproveitamento do espaço, dos recursos e da mão de obra. Na computação, especificamente no desenvolvimento de softwares e soluções, a necessidade de se ter alta qualidade e melhor aproveitamento de recursos e acabou criando uma demanda para que se houvesse uma metodologia e profissionais que suportassem e suprissem estas necessidades. Então, foi-se identificando, ao longo do tempo, modelos e padrões arquiteturais, que foram evoluindo e sendo acrescentados. Com a formalização do processo arquitetural e o aumento de sua utilização no ciclo de criação e desenvolvimento de software, algumas características foram se tornando a base do pensamento, servindo como guia para os profissionais desta área ao iniciarem o design e a construção da arquitetura de sistemas. Dessa forma, vemos todos os dias em todas as empresas, a importância e necessidade de se utilizar e aprimorar o processo de arquitetura de software, trazendo maturidade e qualidade para os processos arquiteturais. Objetivos • Apresentar o conceito de Arquitetura de Software; • Apresentar as principais estruturas e características da disciplina; • Apresentar o conceito de padrões arquiteturais; • Introduzir o leitor nos principais caminhos de utilização e definição da Arquitetura de Software. TÓPICOS DE ESTUDO Arquitetura de software // Requisitos não funcionais // O papel do arquiteto de software // Recuperação arquitetural de software // Erosão arquitetural Conectores arquiteturais Visões arquiteturais // A UML // Tipos de visão e suas utilizações Padrões arquiteturais de software // Cliente-servidor (client-server) // Arquitetura multi-camadas (multilayered) // Dutos e filtros (pipes and filters) // Microsserviços (Microservices) // Arquitetura orientada a Serviços (SOA) // Barramento de serviços (ESB) // Padrão do quadro negro (blackboard pattern) // Padrão ponto-a-ponto (peer-to-peer pattern) // Modelo MVC (mvc pattern) Arquitetura de software A arquitetura de software é um conceito que vem sendo muito discutido na última década pelo meio relacionado ao desenvolvimento de software, muito embora o conceito permeie os profissionais desta área bem antes disso. Muitas vezes, quando começamos o trabalho em uma aplicação legada, ou até mesmo quando utilizamos uma solução, sentimos alguns desconfortos com algumas de suas características. Esse sentimento se trata de um alerta natural que, muitas vezes, pode indicar uma falha arquitetural no software. A arquitetura de software tem como princípio a estruturação de soluções que possibilitam o atendimento de todos os requisitos técnicos e operacionais definidos pelo requerente. Tais requisitos buscam otimizar outras características importantes presentes nas soluções de software, representados, em sua maioria, pelos requisitos não funcionais (performance, segurança, disponibilidade, etc.). Além disso, a arquitetura de um software busca definir e agrupar o conjunto de decisões técnicas e estruturais que irão permear a confecção dos componentes de software. Junto a isto, utiliza-se um mapeamento do impacto que cada decisão terá na solução final. ASSISTA: Assista à palestra ministrada por André Paulovich, em um evento sobre Arquitetura de Software. Nesta palestra, ele fala sobre a importância de se pensar a arquitetura e sobre como a montagem e evolução da arquitetura no ciclo de vida de um software são importantes. REQUISITOS NÃO FUNCIONAIS Como vimos até este momento, podemos identificar a importância de se utilizar a arquitetura de software no desenvolvimento de softwares complexos e de grande porte. Essa importância é facilmente identificada em casos como o desenvolvimento de linhas de produção, nos quais um conjunto de estilos, prerrogativas arquiteturais e funcionalidades são utilizados como base nas arquiteturas de softwares. Entretanto, antes mesmo do design da arquitetura e de sua definição, temos um player importante a ser considerado, denominados requisitos não funcionais. Durante a fase de levantamento dos requisitos do sistema, o arquiteto de software utiliza seus conhecimentos e sua experiência para recuperar requisitos e identificar as características que não são consideradas diretamente funcionais, ou ligadas a uma funcionalidade de negócio. Basicamente, esse tipo de requisito não informa o que o sistema deve fazer, mas sim como ele deve realizar essas ações e funcionalidades. Alguns exemplos de requisitos não funcionais que são importantes em grande parte das soluções de software são: MANUTENBILIDADE É um dos conceitos mais entrelaçados com a arquitetura de um software, pois a definição da arquitetura impacta diretamente no nível de dificuldade que um sistema tem em ser corrigido em caso de um bug ou de uma nova implementação. COFIABILIDADE Este conceito abrange vários tipos de métricas que auxiliam a medir se o sistema é capaz de se manter em execução sem apresentar falha, dado um período de tempo definido. PERFORMANCE O conceito de performance é um dos mais importantes e normalmente está presente como requisito obrigatório em todos os softwares desenvolvidos. Sua principal característica é garantir que o software tenha um bom tempo de resposta/processamento nas funcionalidades do sistema, principalmente nas funcionalidades críticas. Dentre as métricas normalmente acompanhadas, estão: latência, capacidade de throughput, tempo de resposta e velocidade de processamento. USABILIDADE Este conceito envolve o trabalho em projetar um sistema/solução no qual o usuário tenha a facilidade de utilizá-lo, tornando agradável o seu uso. Outros requisitos não funcionais são muito importantes também, tais como segurança, interoperabilidade, testabilidade e outros. Outros requisitos não funcionais são muito importantes também, tais como segurança, interoperabilidade, testabilidade e outros. O PAPEL DO ARQUITETO DE SOFTWARE No desenvolvimento de softwares, é necessário levar em consideração três tipos de informações/requisitos para que se possa desenvolver uma solução de software: • Requisitos de negócio; • Requisitos de usuário; • Requisitos não funcionais. Pensando neste ponto, é necessário que haja um ou mais profissionais da área de desenvolvimento que tenha a capacidade e a expertise de trabalhar com todos os requisitos necessários. Esse papel é desempenhado pelo arquiteto de software. O arquiteto de software deve levar em consideração os três tipos de requisitos ao realizar o design da arquitetura e o mapeamento das decisões e tecnologias utilizadas. A Figura 1 demonstra a variação e o entrelaçamento desses requisitos. Figura 1. Entrelaçamento de requisitos. O arquiteto de software tem a responsabilidade de desenvolver uma arquitetura viva e evolutiva, com capacidade de suportar as necessidades do cliente. Desse modo, ele deve refletir bem sobre as decisões técnicas relacionadas ao hardware, componentes externos e outros recursos que possam ser importantes para o desenvolvimento da solução. Seguindo o processo evolutivo e incremental, o arquiteto de software pode criar sua primeira versão da estrutura arquitetural a ser utilizada, provendo detalhes de mais alto nível que, posteriormente, serão incrementados e detalhados. Ao final do trabalho do arquiteto de software, ele produz alguns artefatos importantes que irão permear o desenvolvimento do software, tais como: • Documentação arquitetural (em maior ou menor nível de detalhe, dependendo do projeto, metodologia e necessidade); • Definição dos atributos de qualidade a serem seguidos; • Requisitos de segurança; • Plano de implantação; • Documento de padrões técnicos de desenvolvimento; • Plano de testes.RECUPERAÇÃO ARQUITETURAL DE SOFTWARE Dentro da disciplina da arquitetura de software, vemos cenários dos quais é necessário extrair a arquitetura de um software legado para que se possa entender tanto sua estrutura quanto o modo como ele foi concebido. A recuperação de arquiteturas (ou arqueologia arquitetural) é um viés da disciplina de arquitetura de software que permite ao arquiteto realizar tal tarefa. Sua metodologia é composta por um conjunto de métodos para a extração de diversas informações arquiteturais, com representações da aplicação de mais baixo nível (como o código-fonte). Muitas vezes o processo de extração desses elementos arquiteturais envolve o agrupamento de partes do código-fonte em partes menores (subsistemas), seguindo um conjunto de definições e critérios que definem o escopo e tamanho de cada parte. Isso ocorre porque nesses sistemas legados normalmente a documentação arquitetural é ausente ou está desatualizada em relação ao que está implementado no sistema. Para realizar este tipo de análise e executar a recuperação da arquitetura, é utilizada, na maioria dos casos, a análise estática de sistemas (static analysis of systems), que consiste em realizar a análise do sistema sem executar a aplicação. A engenharia reversa e as métricas de software são formas de realizar essa análise estática. Outra forma de se realizar essa recuperação é utilizando análise dinâmica de sistemas (dynamic analysis of systems). Neste caminho, normalmente utilizado em sistemas baseados em orientação por objetos, a análise é realizada na execução da aplicação, observando seu comportamento durante este período. Alguns tipos de implementações da análise dinâmica são: • Cobertura de código (Code Coverage); • Detecção de erros de memória; • Erros de concorrência; • Análise de performance. Para todos os cenários, a utilização de ferramentas é necessária para a aquisição de dados e sua posterior análise. Um exemplo seria a utilização da ferramenta PurifyPlus, da Pure Software, para análise de memória, ou o Jmeter, para avaliação de performance. EROSÃO ARQUITETURAL Nesta parte da disciplina de arquitetura de software, o objetivo é identificar o gap entre o que foi inicialmente planejado e o que foi realizado em sua implementação. A erosão arquitetural ocorre quando a implementação viola as regras e decisões definidas no design da arquitetura ou na implementação parcial de algum requisito. Este gap identificado entre o planejado e o implementado é chamado de débito técnico (Technical Debt). Basicamente, podemos utilizar duas técnicas para identificar as violações arquiteturais: • Modelos de reflexão (Reflection Models): técnica que compara um modelo arquitetural disponibilizado pelo arquiteto de software com o código-fonte implementado; • Linguagens de domínio (Domain Languages): tipo de linguagem com abordagem específica para identificar as violações arquiteturais. Linguagens de domínio são específicas para um domínio de negócio, por exemplo: • MATLAB: linguagem para programação de matrizes; • MAPLE: linguagem para matemática simbólica; • SQL: linguagem para banco de dados relacionais. Como falado por De Silva & Balasubramaniam et. al., Essas abordagens, que incluem ferramentas, técnicas e processos, são principalmente classificadas em três categorias gerais que tentam minimizar, prevenir e reparar a erosão da arquitetura. Dentro dessas categorias amplas, cada abordagem é subdividida refletindo as estratégias de alto nível adotadas para combater a erosão. Estas são a conformidade com a arquitetura orientada a processos, gerenciamento de evolução de arquitetura, aplicação de projeto de arquitetura, arquitetura para implementar integração, técnicas de auto-adaptação e restauração de arquitetura, consistindo em recuperação, descoberta e reconciliação (DE SILVA; BALASUBRAMANIAM, 2012, tradução livre). Desse modo, é possível ver que vários diferentes tipos de abordagens foram propostos para auxiliar na solução de problemas e cenários relacionados à erosão de arquitetura de software. DICA Um dos melhores livros sobre arquitetura é o livro Software Architecture in Practice – 2nd Edition, do escritor Len Bass. Este livro também é conhecido como Yellow Book Of Software Architecture. Conectores arquiteturais Dentro do universo da arquitetura de software, temos a necessidade de realizar “conexões” com elementos externos a fim de garantir o fluxo da informação e das ações necessárias para que o sistema funcione corretamente. Neste contexto, utilizamos o conceito de conectores, que tem por definição a capacidade de realizar a transferência de controle e dados entre as partes. Com a utilização de conectores, os arquitetos podem realizar a integração entre elementos heterogêneos que fazem parte da macroarquitetura da solução, onde estas peças externas podem ter sido desenvolvidas em tecnologias e momentos diferentes. Desta forma, os conectores permitem aos arquitetos e ao sistema coexistirem com componentes legados e em diferentes tecnologias. Algumas características que indicam o que os conectores podem fazer são: • Realizar a distribuição de requisições entre componentes específicos; • Realizar o broadcast de notificações de eventos para componentes que possam escutar esse tipo de evento; • Realizar o controle transacional de processamento entre as partes, utilizando bloqueio síncrono (por meio de notificações de ACK) ou não; • Roteamento das requisições entre as partes; • Realizar o enriquecimento do contexto da requisição por meio de regras previamente definidas. Basicamente, podemos definir os conectores em simples e compostos. Os conectores simples normalmente fazem sua lógica utilizando dutos de comunicação simples entre as partes. Alguns componentes podem enriquecer esses conectores, introduzindo alguns controles de dados simples aos dutos. Os conectores mais complexos podem introduzir uma arquitetura interna para processamento e armazenamento mais elaborados da informação. Um exemplo que se pode utilizar é um conector de balanceamento de carga, que realiza o balanceamento da carga com base na utilização dos componentes. Os conectores simples disponibilizam apenas um tipo de serviço/funcionalidade, enquanto os conectores compostos podem agrupar outros conectores e componentes, proporcionando um poder maior para cumprir os requisitos e necessidades mais complexas. Os componentes compostos, devido à sua estrutura e complexidade, são disponibilizados como bibliotecas, ou até mesmo como frameworks. Um conector, independentemente de qual tipo, deve disponibilizar suas características por meio de serviços de interação. Os tipos disponíveis são: Comunicação Disponibilizam suporte à transmissão de dados entre componentes, utilizando blocos simples para a interação entre os componentes. Como exemplo podemos citar os dados simples de mensagens textuais e os resultados de processamento computacional; Coordenação Neste tipo de serviço, o suporte à transferência de controle entre os componentes é disponibilizada e a thread de execução é “trocada” entre as partes. As chamadas RPC são um exemplo deste tipo de serviço; Conversão Serviços deste tipo permitem a interação entre componentes heterogêneos que, inicialmente, não são compatíveis. As incompatibilidades são normalmente causadas por uma divergência no tipo, na ordem ou na estrutura dos dados. Um exemplo clássico é a utilização de conectores ETL ou de conectores que realizam wrappers de componentes legados. Facilitação Este tipo de serviço visa realizar a mediação entre os componentes que fazem a interação. Em alguns cenários, essa mediação é necessária para aprimorar a gestão dos dados e reduzir a interdependência entre as partes. Exemplo disto são os conectores de balanceamento de carga e de controle de processos. Dependendo da complexidade da ação e interação entre os componentes, a combinaçãode mais de um conector (ou serviço) pode ser necessária. Depois de entendermos os tipos de serviços disponibilizados pelos conectores, é necessário entendermos como os conectores são classificados da forma como os serviços são realizados. Os tipos utilizados para esta classificação são: • Procedure call; • Event; • Data Access; • Linkage; • Stream; • Arbitrator; • Adaptor; • Distributor. // Procedure call Estes tipos de conectores, realizam a modelagem do fluxo de controle entre os componentes (coordenação) e possuem a capacidade de realizar a transferência de dados entre os componentes através de parâmetros e valores de retorno (comunicação). São conhecidos como call-backs e são amplamente utilizados em componentes que realizam Remote Procedure Call (RPC). Diagrama 1. Conectores Procedure Call. Fonte: TAYLOR, 2009, p. 166. (Adaptado). // Events Neste caso, o fluxo de controle é disparado por um evento ocorrido, que é identificado pelo conector que irá gerar mensagens para os ouvintes. Este tipo de conector realiza a criação de “conectores virtuais”, que são gerados dinamicamente. Diagrama 2. Conectores Event. Fonte: TAYLOR, 2009, p. 167. (Adaptado). // Data access Neste tipo de conector, temos a possibilidade de interagir com componentes de armazenagem de dados (Data Stores), de forma temporária ou persistente. Diagrama 3. Conectores Data Access. Fonte: TAYLOR, 2009, p. 168. (Adaptado). // Linkage São conectores utilizados para unir componentes e mantê-los durante toda a duração de sua interação. Estes conectores criam canais de comunicação que são utilizados por outros tipos e conectores (facilitação). Diagrama 4. Conectores Linkage. Fonte: TAYLOR, 2009, p. 169. (Adaptado). // Stream Este tipo de conector é utilizado quando há a necessidade de se transferir uma grande quantidade de dados ou em transmissões de soluções cliente-servidor para entregar informações entre as partes. Um exemplo clássico são os pipes do UNIX e os sockets de comunicação TCP/UDP. Diagrama 5. Conector Stream. Fonte: TAYLOR, 2009, p. 170. (Adaptado). // Arbitrator Este conector tem a capacidade de resolver situações de conflito (facilitação) e de controle de fluxo (comunicação) em cenários nos quais a presença e outras partes são conhecidas por um componente, mas não há garantias sobre o estado das partes. Um exemplo comum deste tipo de conector são os balanceadores de carga e escalonamento. Diagrama 6. Conector Arbitrator. Fonte: TAYLOR, 2009, p. 171. (Adaptado). // Adaptor Esse tipo de conector tem uma finalidade muito clara: permitir a interação entre componentes que, originalmente, não são compatíveis ou não foram desenhados para serem convertidos. Um exemplo de conectores do tipo adapter são os frameworks ORM, ou os componentes de ETL em service bus. Diagrama 7. Conector Adaptor. Fonte: TAYLOR, 2003, p. 171. (Adaptado). // Distributor Estes tipos de conectores possuem a característica de mapeamento dos paths presentes na interação e o roteamento de informações de objetos durante o processo de comunicação (facilitação). Normalmente, esse tipo de conector coexiste com outros conectores, como Stream e/ou Procedure Call, para enriquecer seu funcionamento. Um exemplo clássico deste tipo de conector são os serviços de DNS. Diagrama 8. Conector Distributor. Fonte: TAYLOR, 2009, p. 172. (Adaptado). Visões arquiteturais Dentro do contexto da arquitetura de software, é necessário existir uma forma de representar a arquitetura para que ela seja compreensível e explicável. Pensando nessa necessidade, a arquitetura de software foi dividida em visões arquiteturais. Cada visão arquitetural irá lidar com um conjunto específico de informações e interesses envolvidos no processo de desenvolvimento. Basicamente, pode-se dizer que essas visões da arquitetura tentam capturar as principais decisões ligadas ao design, apresentando sua decomposição em componentes e a interação entre eles, utilizando conectores e formulários úteis. A UML Atualmente, existem algumas opções para representar essas visões a fim de facilitar sua confecção e compartilhamento entre as partes. Uma das formas mais utilizadas para isso é a linguagem de modelagem chamada UML (Unified Modeling Language). A UML é uma linguagem de notação que expressa, por meio de diagramas, as informações que se deseja expor. Esses diagramas podem ter relação entre si ou não. A UML é uma linguagem baseada nos princípios da orientação por objetos e utiliza essa prerrogativa para expor seus diagramas. A seguir, é possível conhecer alguns conceitos fundamentais do mundo orientado a objetos e utilizados na UML: Objetos Entidades dentro dos diagramas que são consideradas o bloco de construção básico a ser utilizado; Classes Representação visual de objetos dentro dos diagramas; Abstração Representa o comportamento de uma entidade no mundo real; Encapsulamento É uma forma de prover acesso a informações importantes, protegendo-as do acesso exterior; Herança Criação de novas classes utilizando comportamentos e propriedades já existentes em outras classes; Polimorfismo Permite que, dentro de uma hierarquia, classes em mais alto nível possam trocar seu comportamento à medida que sua instância interna (objeto carregado) referencie uma classe diferente. A UML se tornou um ativo importante na arquitetura de software, pois ela permite expressar as diversas visões de uma arquitetura por meio de diagramas. Os principais diagramas que podemos utilizar da UML e os tipos de modelagem suportados são: • Modelagem Estrutural • Diagrama de Classes – nesse diagrama são definidas as estruturas de classes e seus relacionamentos. Além disso, são mapeadas as propriedades e os métodos associados a cada classe a fim de melhorar o entendimento das informações. É o diagrama mais utilizado e serve como guia para outros diagramas. • Diagrama de Objetos – este diagrama funciona como um snapshot de um momento de execução de um determinado processo do software e seus valores armazenados pelos objetos. Ele funciona como um complemento do diagrama de classes. • Diagrama de Implantação – este tipo de diagrama traz para a arquitetura uma visão estrutural sobre as necessidades físicas (hardware) necessárias para o software. Com ele, conseguimos obter informações como protocolos utilizados, servidores e outros. • Diagrama de Componente – este tipo de diagrama proporciona uma visão geral dos componentes que serão implementados pelo sistema e como eles serão distribuídos em sua estrutura. Ele está fortemente ligado ao tipo de tecnologia utilizado. Além disso, ele apresenta a visão das interações entre os componentes e suas estruturas. • Modelagem Comportamental • Diagrama de casos de uso – o diagrama de casos de uso é, normalmente, um dos primeiros diagramas a serem construídos, pois são realizados nas fases de levantamento e análise de requisitos. Eles representam a visão das interações entre cenários e atores do sistema e servem de base para vários outros diagramas. • Diagrama de sequência – o diagrama de sequência é a representação temporal de um conjunto de eventos ocorridos em um determinado cenário do sistema, normalmente expresso inicialmente em um caso de uso. • Diagrama de colaboração – esse diagrama é um complemento do diagrama de sequência onde sua maior preocupação é com os eventos de vinculação entre os componentes e os tipos de mensagens trocadas entre eles durante o processo. • Diagrama de atividade – esse diagrama tem como principal objetivo mapear e demonstrar, de forma direta e simples, todos os passos necessários para que uma atividade do sistema seja executada. • Diagrama de estado – esse diagrama tem o foco é um determinado componente do sistema e visa demonstrar o conjunto de estados pelo qual este componente passa dentro do sistema. TIPOS DE VISÃO E SUAS UTILIZAÇÕES Uma das formasmais conhecidas de se representar as visões de uma arquitetura de software é a 4+1. Ela foi, inclusive, base do processo RUP e é muito utilizada nas definições, nas estruturas arquiteturais e nas documentações provenientes da criação da arquitetura de software. Este modelo de visão arquitetural, como o próprio nome indica, é dividido em 4 tipos de visões: lógica, processo, desenvolvimento e física. O que representa o “+1” é uma visão de sumarização, que ilustra de forma objetiva os cenários mais importantes e críticos, baseando-se em pequenos conjuntos de casos de uso. Essa última visão é muito utilizada para validação do design arquitetural e para um entendimento macro dos cenários mais críticos e/ou importantes. Figura 2. Visão "4+1". // Visão lógica (Logical View) Essa visão tem como objetivo primário representar os requisitos comportamentais. Em outras palavras, ela basicamente mostra os serviços fornecidos aos usuários finais. Os arquitetos de software ou os analistas de projetos decompõem o sistema em abstrações, baseando-se no conjunto de domínio do problema ou cenário. Essa visão, além de auxiliar na análise de negócio (funcional), permite a identificação de elementos dentro do projeto que podem se tornar comuns ao longo do ciclo de vida do sistema. Os diagramas UML associados a esta visão incluem: • Diagrama de classes; • Diagrama de estado; • Diagrama de objetos; • Diagrama de sequência; • Diagrama de colaboração/comunicação. // Visão de processo (Process View) Essa visão permite o entendimento de como os processos do sistema interagem com os componentes existentes, sua resiliência e tolerância a falhas. Neste tipo de visão, é possível identificar as possíveis threads de execução de um cenário e ver a interação entre o possíveis caminhos que irão ser executados. O diagrama UML que representa a visão de processo é o diagrama de atividades. // Visão de desenvolvimento (Development View) Essa visão foca na organização modular da aplicação, na qual os elementos são pequenas partes do software, podendo ser bibliotecas ou subsistemas, que poderão ser desenvolvidos por múltiplos profissionais. Além disso, ela proporciona a capacidade de avaliar o custo de produção, monitoração do progresso e visão da reutilização de código. Um dos diagramas que faz parte desta visão é o diagrama de componentes. // Visão física (Physical View) Essa visão possui uma integração maior com os requisitos não funcionais e com as características relacionadas à qualidade do software, mapeando os vários elementos identificados nas outras visões em nós de processamento. O diagrama UML que representa a visão deste processo é o diagrama de implantação. Padrões arquiteturais de software Os padrões arquiteturais são soluções já comprovadas e comumente utilizadas para problemas recorrentes no desenvolvimento de uma arquitetura de um software. Vários destes padrões arquiteturais se tornaram verdadeiros coringas nas mãos dos arquitetos de software, mas é importante analisar bem a aderência do padrão escolhido junto ao cliente. A escolha de um padrão arquitetural está entre uma das primeiras decisões a serem tomadas quando se está desenvolvendo uma arquitetura de software. Os padrões arquiteturais auxiliam o arquiteto de softwares a definir: • O possível conjunto de subsistemas; • Suas responsabilidades; • Suas regras de relacionamento e integração. Mesmo que os padrões se provem úteis e essenciais, eles não são responsáveis pela definição completa da arquitetura de um sistema. Os padrões devem ser utilizados como templates, moldes a serem utilizados e refinados no desenvolver da arquitetura da solução em questão. Dentre estes refinamentos, podemos incluir novos componentes e integrações, novos padrões de projetos e modelos de conversação. Ao se escolher um padrão de projeto, deve-se levar em consideração os seguintes fatores: • Requisitos não funcionais; • Perfil do sistema a ser desenvolvido; • Expertise da equipe de desenvolvimento. Neste caso, se torna interessante mapear algumas perguntas iniciais para auxiliar no entendimento. Alguns exemplos de perguntas são: • Quais são os principais requisitos não funcionais de acordo com a visão do cliente? • Qual a expertise técnica do time de desenvolvedores e testadores? • O sistema possui muitas interações externas? • O sistema deve suportar multithreading ou processamento distribuído? Atualmente, temos uma gama interessante de padrões de projeto já concretizados no mercado. A seguir, iremos falar dos principais deles e como eles podem ser úteis no desenvolvimento de uma arquitetura de software. CLIENTE-SERVIDOR (CLIENT-SERVER) Este é, provavelmente, o padrão mais conhecido dentre todas as opções disponíveis. Este padrão tem como característica a apresentação do relacionamento entre componentes (programas) dentro de uma aplicação. Neste caso, o componente servidor irá expor uma funcionalidade ou um tipo de serviço que será consumido por um ou mais componentes clientes. Neste tipo de padrão arquitetural, as funcionalidades são abstraídas entre o servidor e o cliente, de forma que o cliente não precisa saber como a funcionalidade é executada no servidor, ele precisa apenas interpretar o retorno da funcionalidade. Normalmente, o cliente e o servidor realizam a troca das mensagens por meio de um processo atômico chamado request-response message pattern. Um servidor tem a capacidade de suportar múltiplas conexões de vários clientes diferentes, mas isso é limitado pelo poder de processamento do computador/servidor que está hospedando a aplicação server side. Vendo este cenário, é muito comum que o servidor realize o controle da quantidade de clientes que podem interagir com ele, evitando, assim, a exaustão de recursos computacionais para o processamento server side e, posteriormente, a sua indisponibilidade. ARQUITETURA MULTICAMADAS (MULTILAYERED) Basicamente, podemos dizer que arquiteturas multicamadas são arquiteturas do tipo cliente-servidor nas quais as camadas de apresentação, aplicação e dados são fisicamente separadas. O uso mais comum e popular deste tipo de arquitetura se aplica em arquiteturas de 3 camadas ou n-camadas. Aplicações multicamadas se propõem a flexibilizar a criação de arquiteturas com maior propensão de reuso de seus componentes. Com a segregação da aplicação em camadas distintas, os profissionais de desenvolvimento têm a opção de trabalhar as camadas de forma independente, reduzindo o retrabalho em mudanças e implementações realizadas. Voltando a falar de aplicações que utiliza o padrão de três camadas, um dos pontos importantes que vale a pena ressaltar são as camadas que compõem este tipo de padrão: Camada de apresentação: É a camada que representa a interface gráfica da aplicação, ou GUI, responsável pela interação direta com o usuário e por onde as requisições dos usuários são realizadas. Camada de negócio: É responsável por realizar as regras de negócio que contemplam o núcleo do sistema, bem como as lógicas de direcionamento e tratamento de informações relacionadas ao negócio. Camada de dados: é responsável por receber as requisições oriundas da camada de negócio e persistir/recuperar as informações requisitadas de uma estrutura de dados persistente. Normalmente, esta estrutura de dados persistente é um banco de dados, mas podem ser utilizadas outras estruturas. DUTOS E FILTROS (PIPES AND FILTERS) Esse tipo de padrão de arquitetura é peculiar, pois sua estrutura é composta por uma cadeia de elementos de processamento, posicionados de forma que a saída de cada componente seja a entrada do próximo. Esse perfil de montagem traz a característica de rede para o processamento dos dados para quem adota este tipo de padrão arquitetural. Ainda neste tipo de padrão, os dutos (pipes) são os responsáveis por transportar a informação, enquanto os filtros (filters) se responsabilizam pelo processamentodesta informação e a direcionam para os próximos dutos do fluxo. Desta forma, conseguimos identificar que esse padrão é interativo e que a regra essencial é que um duto não pode se conectar a outro duto diretamente, apenas por meio dos filtros. A utilização desse tipo de padrão vem muito em conjunto com a ideia de segregação das funcionalidades de um sistema. Neste caso, a ideia é particionar processos mais complexos, em pedaços menores, em sequências de processamentos mais simples e reduzidos, conectados pelos dutos e filtros do padrão de arquitetura tratado nesta parte. MICROSSERVIÇOS (MICROSERVICES) Este padrão de arquitetura vem sendo cada vez mais comentado e adotado por arquitetos e empresas devido à sua estrutura. Neste tipo de arquitetura, ocorre a quebra da aplicação em uma coleção de serviços de baixo acoplamento, possibilitando serviços de granulagem fina e com protocolos de comunicação leves. Uma das grandes vantagens deste tipo de abordagem é que a quebra em serviços menores aumenta a modularidade do sistema. Dessa forma, a manutenção se torna mais fácil, os serviços são mais fáceis de entender e a adoção de implantação contínua se torna mais fácil. Ao se trabalhar com a arquitetura de microsserviços, é importante termos alguns guidelines para auxiliar no caminho a ser trilhado na utilização deste padrão arquitetural. Algumas ações importantes que podem ser consideradas são: • Tenha certeza que os serviços foram desenhados e desenvolvidos de modo que eles possam ser implantados individualmente, • Cada serviço desenvolvido deve atender apenas a uma funcionalidade, • A comunicação entre os microsserviços deve ser feita, preferencialmente, por servidores que não armazenam estado (stateless). Como todo padrão arquitetural, a estrutura de microsserviços possui suas vantagens e desvantagens. No quadro 1 é possível ver um comparativo entre estas características. ASSISTA Assista à apresentação de Martin Fowler, Microservices, sobre o padrão arquitetural dos microsserviços e veja quais são suas principais características e como é sua estrutura. Quadro 1. Vantagens e desvantagens dos microsserviços. ARQUITETURA ORIENTADA A SERVIÇOS (SOA) Esse tipo de arquitetura é baseado no conceito em que serviços são disponibilizados para outros componentes por meio de um protocolo de comunicação sobre uma rede. Os princípios básicos deste tipo de arquitetura é sua independência de provedor tecnológico e de produtos. Um serviço nada mais é do que uma unidade de implementação relacionada a uma funcionalidade que pode ser acessada remotamente e atualizada de forma independente. Basicamente, um serviço implementado neste padrão arquitetural, possui quatro propriedades, que seguem as definições da especificação SOA (BELL, 2008): • O serviço representa uma funcionalidade de negócio específica com uma resposta específica; • O serviço deve ser autocontido; • Para os clientes que o consome, sua estrutura é uma caixa-preta; • Internamente, ele pode ser composto de outros serviços para atender a funcionalidade requisitada. Figura 3. Estrutura SOA. Fonte: Shutterstock. Acesso em: 11/07/2019. O padrão arquitetural SOA visa promover a integração entre três partes fundamentais no desenvolvimento de software: o negócio, a tecnologia e os serviços. A adoção deste padrão pode trazer alguns benefícios, tais como: • Agilidade no atendimento de novas features a serem desenvolvidas; • Maior flexibilidade para a adequação às mudanças que podem ocorrer; • Redução dos custos, pois facilita a manutenibilidade; • Aumenta a possibilidade de reuso de componentes e serviços. BARRAMENTO DE SERVIÇOS (ESB) Dentro do padrão arquitetural SOA, uma das partes importantes é o ESB (Enterprise Service Bus). O ESB tem como funcionalidade atuar na intermediação de serviços expostos, provendo conectores e estruturas que permitam vários tratamentos e lógicas nas informações que serão intermediadas por ele, tais como: • Enriquecimento da informação; • Roteamento; • Transformação da informação (muito usado com ETL’s); • Validações. Um erro muito comum em relação aos ESBs é associar a sua existência ao SOA ou afirmar que apenas o fato de utilizar o software já utiliza o padrão orientado a serviços. O que ocorre com o barramento é que o mesmo possui em sua origem várias implementações e estruturas que, naturalmente, suportam um conjunto considerável de conceitos e funcionalidades do SOA. PADRÃO DO QUADRO NEGRO (BLACKBOARD PATTERN) Este é um tipo de padrão arquitetural que tem sua utilidade muito voltada para problemas nos quais nenhuma solução determinística foi encontrada. Sua utilização é muito comum nas seguintes situações: • Reconhecimento de fala necessário; • Identificação de tráfego em veículos; • Identificação de cadeias proteicas; • Interpretação autônoma de sinais de sonar. PADRÃO DO QUADRO NEGRO Blackboard: Memória global estruturada que mapeia todos os objetos usados na solução. Knowledge Source: Módulos especializados com suas próprias representações/implementações. Control Component: Responsável por selecionar, configurar e executar os módulos. PADRÃO PONTO-A-PONTO (PEER-TO-PEER PATTERN) Este padrão representa uma arquitetura distribuída que tem como princípio a quebra de tarefas ou atividades de trabalho entre os pontos da estrutura. Os pontos (peers) possuem um perfil de equivalência estrutural e são todos participantes da aplicação. Desse modo, é formada uma rede de nós de um ponto para outro. Uma rede ponto-a-ponto é definida a partir da noção de que todos os pontos devem ser equivalentes e devem funcionar como clientes e servidores ao mesmo tempo. Nesse sentido, o direcionamento da comunicação entre os nós se torna bidirecional. Figura 4. Estrutura Peer-to-Peer. Fonte: Shutterstock. Acesso em: 10/07/2019. A Figura 4 mostra que os nós dentro da rede ponto-a-ponto interagem entre si com pares, executando o papel de cliente e servidor ao mesmo tempo. Uma coisa importante dentro desta arquitetura é a forma como os nós são localizados. Neste contexto, é criada uma camada virtual de rede, chamada overlay network, sobre a camada física, e os nós usam uma estratégia de links para se identificarem e realizarem a comunicação. Esta overlay network é usada para indexar os nós e para descobrir os pontos disponíveis. MODELO MVC (MVC PATTERN) A arquitetura MVC (Model-View-Controller) é um padrão arquitetural que tem como maior característica definir uma clara separação entre as camadas de visão do usuário, controle e modelos utilizados. Como padrão arquitetural, seu uso é mais frequente no desenvolvimento de interfaces de usuários mais elaboradas, permitindo maior controle entre as informações internas utilizadas e as representações expostas ao usuário. Basicamente, esta abordagem realiza a separação destes componentes em três tipos: • Modelo (Model): são as regras de negócio, lógicas, funções e os dados da aplicação. • Visão (View): representação das visões para o usuário, como tabelas, diagramas ou formulários. • Controlador (Controller): lógica responsável pela mediação entre a camada de visão e a camada de modelo. Neste ponto, podemos ter ações de transformação e enriquecimento de dados. Diagrama 9. Estrutura MVC. VANTAGENS DO MODELO MVC: • Fácil manutenção, pois o MVC pode gerenciar várias visões com o mesmo modelo; • A aplicação é mais escalável, pois a separação flexibiliza isso; • Aumenta a reutilização do código; • Possibilita o desenvolvimento em paralelo e reduz a interdependência entre as partes; • Melhor performance, pois a separação de camadas reduz o peso de processamento e a quantidade de código nas camadas. DESVANTAGENS DO MODELO MVC: • Maior tempo para navegar no código e entender as ligações; • Maior especialização do profissional; • Com o aumento do tamanho do software e sua complexidade, aumenta também a complexidade da estruturaMVC, bem como dos arquivos relacionados a ele e suas pastas. Por fim, várias tecnologias implementam este modelo arquitetural em seus frameworks, a fim de aproveitar seus benefícios e características. Alguns exemplos são: • Java • Java Server Faces (JSF) • Spring MVC • VRaptor • .NET • ASP.NET MVC • PHP • Laravel • Symfony Agora é a hora de sintetizar tudo o que aprendemos nessa unidade. Vamos lá?! SINTETIZANDO Nesta unidade, tivemos a oportunidade de conhecer um pouco mais sobre as ferramentas de arquitetura de software com o objetivo de utilizá-las de forma efetiva e concisa no desenvolvimento de soluções. Aprendemos que a arquitetura é dividida em algumas partes e que suas visões possibilitam trabalhar diferentes pontos de vista em relação a sua estrutura e seudesign. Também vimos que dentro da arquitetura de software, há a opção de utilizar diferentes tipos de conectores para realizar a integração e a otimização de comunicação entre os diferentes tipos de componentes que compõem o ecossistema arquitetural. Entendemos que é necessário formas produtivas e simples de expressar as ideias e definições necessárias na arquitetura. Para isto, foi apresentado a UML, linguagem de notação que dispõe de uma série de diagramas realizadores deste trabalho de tradução das informações em um formato mais fácil e compreensível. Ainda dentro deste contexto arquitetural, foi possível visualizar a importância de se saber os tipos de padrões arquiteturais mais comuns. Assim sendo, vimos como a arquitetura de software é importante dentro do ciclo de vida de concepção e desenvolvimento de software e que sua utilização agrega, cada vez mais, qualidade e vantagens em sua adesão. REFERÊNCIAS BIBLIOGRÁFICAS ARQUITETURA DE SOFTWARE NUM CENÁRIO DE INCERTEZAS – ANDRÉ PAULOVICH. Postado por InfoQ. (44 min. 15 s.). son. color. port. Disponível em: <https://www.youtube.com/watch?v=bzUzndluD-M>. Acesso em: 16 jul. 2019. BASS, L.; CLEMENTS, P.; KAZMN, R. Software Architecture in Practice. 2. ed. Massachusetts: Editora Addison-Wesley Professional, 2003. BELL, M. Service-Oriented Modeling: Service Analysis, Design, and Architecture. Hoboken: Wiley & Sons, 2008. BOOCH, G; RUMBAUGH, J. UML – Guia do usuário. Rio de Janeiro: Editora Elsevier, 2006. BROOKS, J. F. The Mythical Man-Month – Essays on Software Engineering. Massachusetts: Addison-Wesley Professional, 1995. DE SILVA, L.; BALASUBRAMANIAM, D. Controlling software architecture erosion: A survey. Journal of Systems and Software, [s.l.], 2012, v. 85, n. 1, pp. 132-151. EBELING, C. E. An Introduction to Reliability and Maintainability Engineering. Boston: McGraw-Hill Companies, Inc, 1997. FOWLER, M. Patterns of Enterprise Application Architecture. Massachusetts: Addison-Wesley Professional, 2002. FOWLER, M.; & LEWIS, J. Microservices: a definition of this new architectural term. Martin Flower, 25 mar. 2014. Disponível em: <https://martinfowler.com/articles/microservices.html>. Acesso em: 05 jul. 2019. GOTO 2014 – MICROSERVICES – MARTIN FOWLER. Postado por GOTO Conferences. (26 min. 25 s.). eng. color. leg. Disponível em: <https://www.youtube.com/watch?v=wgdBVIX9ifA>. Acesso em: 16 jul. 2019. GUEDES, G. T. UML 2 - Uma Abordagem Prática. São Paulo: Editora Novatec, 2018. IEEE STANDARDS ASSOCIATION. IEEE Recommended Practice for Architectural Description. Nova Iorque: The Institute of Electrical and Electronics Engineers, Inc, 2000. Disponível em: <http://cabibbo.dia.uniroma3.it/ids/altrui/ieee1471.pdf>. Acesso em: 05 jul. 2019. KIWELEKAR, A. W. Architectural Connectors: Ph. D. Seminar Report. [s.l.], [s.d.]. Disponível em: <http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.99.9137&rep=rep1&type=pdf>. Acesso em: 05 jul. 2019. KRUCHTEN, P. The 4+1 view model of architecture. IEEE Software, [s.l.], v. 12, n. 6, 1995. NAUR, P.; RANDELL, B. Software Engineering – Report on a conference sponsored by the NATO SCIENCE COMMITTEE. Garmisch, Alemanha, out. 1968. Bruxelas: Scientific Affairs Division, 1969. Disponível em: <http://homepages.cs.ncl.ac.uk/brian.randell/NATO/nato1968.PDF>. Acesso em: 05 jul. 2019. NIELSEN, J. Usability 101: Introduction to Usability. NN/g Nielsen Norman Group, 04 jan. 2012. Disponível em: <https://www.nngroup.com/articles/usability-101-introduction-to-usability/>. Acesso em: 11/07/2019. PERRY, D. E.; WOLF, A. L. Foundations for the Study of Software Architecture. CM SIGSOFT Software Engineering Notes, Nova Iorque, 1992, v. 17. N. 4, pp. 40-42. TAYLOR, R. N.; Software Architecture: Foundations, Theory and Practice. [s.l.]: Editora Wiley, 2009. TERRA, R. et al. Recommending Refactorings to Reverse Software Architecture Erosion. In: 16th European Conference on Software Maintenance and Reengineering, Szeged, Hungria, 2012. Disponível em: gsd.uwaterloo.ca: <http://gsd.uwaterloo.ca/sites/default/files/Full%20Text.pdf>. Acesso em: 05 jul. 2019. TODINOV, M. Reliability and Risk Models: setting reliability requirements. Chichester: John Wiley & Sons, 2016. https://www.youtube.com/watch?v=bzUzndluD-M https://martinfowler.com/articles/microservices.html http://cabibbo.dia.uniroma3.it/ids/altrui/ieee1471.pdf http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.99.9137&rep=rep1&type=pdf http://homepages.cs.ncl.ac.uk/brian.randell/NATO/nato1968.PDF https://www.nngroup.com/articles/usability-101-introduction-to-usability/ http://gsd.uwaterloo.ca/sites/default/files/Full%20Text.pdf W3.ORG. Transport Message Exchange Pattern: Single-Request-Response. W3.org, 11 out. 2001. Disponível em: <https://www.w3.org/2000/xp/Group/1/10/11/2001-10-11-SRR-Transport_MEP>. Acesso em: 05 jul. 2019. WESCOTT, B. Every Computer Performance Book. [s.l.]: CreateSpace, 2013. https://www.w3.org/2000/xp/Group/1/10/11/2001-10-11-SRR-Transport_MEP UNIDADE 1.2 - MODELAGEM E ANÁLISE ARQUITETURAL OBJETIVOS DA UNIDADE • Falar sobre o que é e como realizar a modelagem de arquiteturas; • Apresentar os processos para realizar a modelagem de software e suas técnicas; • Apresentar o que é e como pode ser realizada a análise de arquiteturas; • Apresentar técnicas iniciais e princípios para a realização da análise arquitetural. TÓPICOS DE ESTUDO Modelagem de arquiteturas // Conceitos de modelagem // Modelagem complexa // Técnicas de modelagem Análise de arquiteturas // Conceitos e abordagem // Formalidade e automação // Tipo e técnicas MODELAGEM DE ARQUITETURAS Podemos assumir que todo software possui uma arquitetura, mesmo que não planejada. Sempre que um software é planejado e desenvolvido, algumas informações importantes sobre ele precisam, necessariamente, de registro, como: • Decisões arquiteturais; • Decisões técnicas; • Decisões de projeto. Normalmente, as decisões de projetos são capturadas e representadas em modelos arquiteturais e o processo que é executado para a captura dessas decisões e sua representação em modelos é chamado de modelagem arquitetural. Os modelos podem capturar as decisões arquiteturais em diferentes níveis de formalidade e rigor, permitindo que se tenha um melhor entendimento da arquitetura e que otimize a discussão em torno da visão, avaliação e evolução arquitetural. Dentro desse contexto de modelagem, são introduzidas as notações de modelagem arquitetural, que podem variar de linguagens mais informais e flexíveis (como a linguagem natural) até linguagens mais restritas e altamente formais. As notações podem ser utilizadas singularmente ou em conjunto com outras linguagens disponíveis, como a UML e a linguagem natural. CONCEITOS DE MODELAGEM Dentro do que foi introduzido sobre a modelagem arquitetural e sua utilização dentro do contexto da criação e desenvolvimento da arquitetura de software, podemos identificar alguns conceitos que permeiam e definem o funcionamento e as abordagens utilizadas nela. Os conceitos abordados são: • Conceitos arquiteturaisbásicos; • Modelagem dirigida a stakeholders; • Elementos de um estilo arquitetural; • Aspectos estáticos e dinâmicos; • Aspectos funcionais e não funcionais. // Conceitos arquiteturais básicos Dentro de uma arquitetura de software, existem diretrizes e conceitos básicos que devem ser identificados e levados em consideração na hora de realizar a modelagem arquitetural, seja ela de um novo software ou de um já existente. Nesse caso, podemos considerar os elementos a seguir como os centrais dentro de um projeto arquitetural. Componentes Blocos de construção que têm como objetivo encapsular pedaços de funcionalidades e informações do sistema e que expõem interfaces claras e bem definidas para acesso. Conectores Blocos que realizam a intermediação e a regulamentação entre os componentes. Interfaces São definidas como pontos externos de interação de componentes e conectores com os elementos externos à aplicação. Configurações São, normalmente, associações e definições específicas entre componentes e conectores. Rationale Este ponto representa o porquê de determinadas decisões arquiteturais serem tomadas e com qual propósito. Com esses conceitos, conseguimos ter um norte que oriente nos primeiros passos na modelagem arquitetural. Para a utilização desses conceitos, inicialmente, devemos usar notações que nos ajudem a representá-los de forma simples e objetiva, como gráficos de flowcharts (setas e retângulos). Com a natureza do sistema e a complexidade das regras de negócio e requisitos, a representação desses elementos pode se tornar mais difícil e mais demorada. // Modelagem dirigida a stakeholders Quando os arquitetos necessitam realizar a confecção da modelagem arquitetural, é preciso pensar e definir algumas diretrizes, como: • Decisões arquiteturais e técnicas; • Nível de detalhe a ser alcançado; • Nível de detalhe e de formalidade requeridos. Diante dessas diretrizes, o arquiteto de software e os stakeholders precisam incluir uma verificação entre o custo e o benefício de tomar as decisões e as diretrizes necessárias para a modelagem arquitetural. Normalmente, as características e as diretrizes mais importantes serão aquelas modeladas com mais detalhes e mais formalidade. Como todo processo ou atividade dentro de um ciclo de desenvolvimento de software, existem alguns passos básicos a serem seguidos. Na modelagem dirigida, a stakeholder não seria diferente. A seguir, temos as atividades básicas que podemos identificar nesse conceito: • Mapeamento das principais características do software a serem modelados; • Definição da importância dessas características e da categorização; • Definição e mapeamento de goals para cada característica principal ou crítica; • Definição das notações a serem utilizadas e criação dos modelos a serem implementados; • Utilização dos recursos de modelagem em consistência com os goals definidos. Os passos mencionados podem e devem ser executados de forma interativa e aplicados em uma arquitetura evolutiva. Normalmente, no início de um projeto, não temos todos os detalhes e goals necessários, mas podemos enriquecer esses dados à medida que a arquitetura amadurece e ganha robustez em sua confecção. // Elementos de um estilo arquitetural Um estilo arquitetural pode ser resumido em um conjunto de decisões arquiteturais que serão aplicadas em um determinado contexto de solução a ser desenvolvido. Os estilos, de uma forma geral, auxiliam na restrição e na definição do escopo das decisões do projeto, tornando mais direcionadas e específicas ao contexto desejado. Em adição à modelagem arquitetural, é muito útil e benéfico realizar a modelagem dos estilos que gerem a utilização desses componentes. Seguindo esse pensamento, os estilos arquiteturais também são baseados nas decisões tomadas no projeto, permitindo que possam ser modelados também. Veja algumas vantagens da modelagem dos estilos arquiteturais: • Maior visibilidade sobre o escopo arquitetural (o que é permitido e o que não é); • Nesse processo de modelagem, temos uma alta taxa de redução de desvio e erosão arquitetural; • Ajuda a classificar e identificar a causa das decisões arquiteturais e seu acompanhamento; • Cria um mapa evolutivo da arquitetura; • A modelagem do estilo arquitetural, em algumas situações, pode ser mais viável e útil que a modelagem arquitetural em si. Exemplo: sistemas dinâmicos; • Por trabalhar sobre os estilos e serem baseados em decisões de projetos que podem ser similares a outros projetos, facilita sua reutilização entre diversos projetos; • É uma forma centralizada de manter uma referência ao rationale e aos conceitos arquiteturais. Por se tratar de estilos arquiteturais que podem ser reutilizados em diversos projetos, as decisões que são utilizadas para defini-los tendem a ser mais abstratas e genéricas do que as decisões arquiteturais em si. Nessa linha de pensamento, podemos definir alguns conjuntos ou classificações desses tipos de decisões. São elas: Decisões por elementos específicos Neste contexto, o estilo pode demandar que componentes, conectores e interfaces sejam referenciados na arquitetura e utilizados em situações específicas. Para tornar esta modelagem mais fácil e mais legível, a utilização de templates é uma boa alternativa. Decisões baseadas em tipos de componentes, conectores ou interfaces Neste contexto, alguns elementos específicos podem ser proibidos, requeridos ou permitidos em uma determinada arquitetura. A maioria das abordagens de modelagem possui uma clara definição de tipos que podem ser utilizados, tornando esse tipo de mapeamento mais padronizado. Decisões por restrição de interação Neste contexto, as restrições de interação podem ser: // Temporais: componentes que iniciam a comunicação devem chamar a função de inicialização antes de qualquer outra ação; // Topológicas: apenas componentes da camada de cliente podem referenciar componentes da camada servidora; // Protocolares: definem o protocolo de interação (exemplo: FTP, HTTP etc.) ou especificação de comunicação (exemplo: diagrama de sequência, CSP etc.). CONTEXTUALIZANDO File Transfer Protocol (Protocolo de Transferência de Arquivos) é uma forma de transferir arquivos e permite duas maneiras de transferência de mensagens FTP: texto e código binário. Decisões por restrições comportamentais Neste contexto, as modelagens seguirão um escopo maior de atuação, podendo variar de regras mais simples a comportamentos mais complexos. Para a modelagem desse tipo de estilo, as notações devem suportar modelos lógicos e/ou formais como os autômatos. Decisões por restrições concorrentes Neste tipo de contexto, é necessário modelar a estratégia de concorrência entre os elementos e como a sincronização de recursos entre eles é realizada, bem como a utilização de recursos compartilhados. Neste tipo de modelagem, a notação deve suportar a representação temporal, como diagramas de sequência e de transição de estados. // Aspectos estáticos e dinâmicos Todo sistema possui aspectos estáticos e dinâmicos, que podem ser identificados e classificados. Os aspectos estáticos são aqueles que não estão relacionados ao comportamento do sistema durante sua execução. Por serem estáticos, são mais fáceis de modelar. Podemos usar como exemplos de aspectos estáticos os próprios componentes do software, conectores, configurações de redes e servidores. Os aspectos dinâmicos são o oposto dos estáticos e estão intrinsecamente relacionados ao comportamento do sistema durante sua execução. Por serem dinâmicos e possuírem maior volatilidade, seu mapeamento se torna mais complexo e difícil. Alguns exemplos que podem ser classificados nesse aspecto são os modelos de interação entre componentes, modelos de fluxo de dados e outros. Algumas características devem ser levadas em consideração quando são trabalhados os modelos dinâmicos, que podem aumentar a dificuldadeem utilizar esse tipo de modelo. Podemos considerar, nesses casos: • Os modelos dinâmicos são incorporados ao sistema em modelo de leitura e escrita, sendo que sua execução pode modificar o modelo em si; • Necessita de ferramentas próprias que possibilitem a sincronização entre o modelo e o sistema; • Devem ser construídos e armazenados com uma notação que seja legível para a máquina (machine-readable e machine-writable); • Devem conter correlação com os elementos da implementação; • A visualização dos modelos pode suportar mudanças em tempo real, devendo refleti-las automaticamente. // Conceitos arquiteturais básicos Neste contexto, é de extrema importância que se entenda as diferenças entre os aspectos funcionais e não funcionais. Para auxiliar nessa identificação, podemos assumir o seguinte: // Aspectos funcionais • Estão relacionados ao que o sistema faz e são descritos de forma declarativa, como em: “o sistema salva formulário de cadastro”; • Geralmente, são mais concretos, proporcionando maior facilidade na modelagem e na descrição; • Podem capturar o comportamento de componentes, conectores ou subsistemas; • Podem ser estáticos ou dinâmicos; • A maioria das notações disponíveis mapeia aspectos funcionais, diferindo apenas em quais e como estes aspectos são descritos. // Aspectos não funcionais • Dizem respeito ao que o sistema fará. Exemplo: “o sistema envia mensagens confidencialmente”; • Os aspectos não funcionais tendem a ser qualitativos e subjetivos; • Podem ter um perfil mais informal e menos rigoroso em sua apresentação em relação aos funcionais; • Em vários cenários, os aspectos funcionais são trabalhados para resolver os aspectos não funcionais. Exemplo: na descrição não funcional, o componente de processamento de fatura de cartão de crédito deve ser rápido. Já na descrição funcional, o componente de processamento de fatura de cartão de crédito irá utilizar cache e processamento em paralelo. Duas estratégias funcionais que buscam atingir o aspecto não funcional; • Importante implantar uma forma de suporte à rastreabilidade, permitindo aos arquitetos associarem os aspectos não funcionais às decisões. // Ambiguidade, exatidão e precisão Quando pensamos na arquitetura, em seu design e sua modelagem, é possível identificar que as arquiteturas são, por natureza, incompletas em relação ao todo do software. Isso ocorre porque a arquitetura, normalmente, reflete as decisões principais e as críticas do sistema, não todas as decisões. Pensando nesse aspecto, é fácil identificar porque, geralmente, torna-se uma tarefa quase impossível eliminar a ambiguidade em uma arquitetura. Quando se tem esse cenário, algumas ações que auxiliam nas tratativas dessa situação podem ser realizadas, como: • Apresentar e permitir as ambiguidades, desde que autorizadas pelos stakeholders; • Realizar um processo de avaliação contínua da arquitetura, mapeando e documentando os aspectos ambíguos identificados até que se encontre um nível de qualidade aceitável. Outros dois fatores importantes que devemos levar em conta nos modelos são as prerrogativas de exatidão e de precisão. Um modelo se torna exato se apresenta informações corretas sobre o sistema sendo modelado. Já um modelo preciso é aquele que contém informações detalhadas sobre o sistema. Normalmente, na modelagem, a balança tende a priorizar a exatidão sobre a precisão, pois ter as informações mais precisas é mais relevante no início do projeto que seu detalhamento, podendo ser obtido e melhorado durante as fases posteriores do projeto. MODELAGEM COMPLEXA Quando pensamos em modelos arquiteturais e em todas as características e elementos que os acompanham, vemos que eles são artefatos de alta complexidade que buscam mapear e identificar as decisões importantes e críticas para uma variedade considerável de stakeholders. Utilizando essa linha de pensamento, conseguimos visualizar que é meramente inviável para os stakeholders interagirem com todos os aspectos de uma só vez, por isso a importância de identificar os pontos mais importantes e críticos. Para nos auxiliar na melhor utilização das informações capturadas e apresentá-las para os stakeholders e outras partes envolvidas, podemos utilizar duas estruturas que nos ajudam muito. São elas: VIEW: Esse tipo de estrutura representa um conjunto de decisões de projetos que estão relacionadas por um interesse comum ou um conjunto destes interesses. VIEWPOINT: Esse tipo de estrutura define uma perspectiva em que se pode extrair uma view. Funciona como um filtro de informações. Podemos utilizar as views em vários momentos e em várias estruturas da arquitetura de software. Uma delas é a visão de implantação (deployment view), que pode ser representada da seguinte forma: https://sereduc.blackboard.com/courses/1/7.5099.80686/content/_5078757_1/scormcontent/index.html Diagrama 1. Visão de implantação. Fonte: Centro de Informática – UFPE. Acesso em: 28 ago. 2019. (Adaptado). Assim como as views, as estruturas de viewpoints também possuem um papel de extrema importância na apresentação dos aspectos capturados. A seguir temos alguns exemplos de viewpoints que frequentemente são identificados: • Logical viewpoint: realiza a captura das entidades lógicas do sistema e suas conexões. Diagrama 2. Exemplo de logical viewpoint. Fonte: The Open Group, 2013. Acesso em: 10/10/2019. (Adaptado). • Physical viewpoint: realiza a captura das entidades físicas do sistema e suas conexões. Diagrama 3. Exemplo de physical view. Fonte: The Open Group, 2013. Acesso em: 10/10/2019. (Adaptado). • Deployment viewpoint: realiza a captura do mapeamento das entidades lógicas em entidades físicas. Diagrama 4. Exemplo de deployment viewpoint. Fonte: The Open Group, 2013. Acesso em: 10/10/2019. (Adaptado). • Concurrency viewpoint: realiza a captura das formas de tratamento referentes à concorrência e ao multiprocessamento gerenciados pelo sistema. • Behavioral viewpoint: realiza a captura do comportamento (ou parte desse comportamento) esperado pelo sistema. Diagrama 5. Exemplo de behavioral viewpoint para um sistema de seguros. Fonte: The Open Group, 2013. Acesso em: 10/10/2019. (Adaptado). Tendo em vista as estruturas de views e viewpoints, é facilmente identificável o relacionamento existente entre elas e como podem interagir. Um ponto importante que vale a pena ressaltar é a possibilidade de se obter múltiplas views a partir de uma mesma viewpoint. Sempre que analisamos essas estruturas, vemos como elas são importantes. Alguns motivos pelos quais podemos pensar dessa forma: • Com essas estruturas, temos a possibilidade de limitar o escopo de visão da informação a um conjunto controlado e cognitivamente gerenciável da arquitetura; • Apresentam uma forma clara de exibir, às vezes simultaneamente, conceitos relacionados; • Possuem flexibilidade suficiente para se adaptarem às necessidades dos stakeholders; • Possuem flexibilidade para trabalhar as mesmas informações em níveis diferentes de abstração e apresentação. Claro que nem tudo é perfeito dentro desse contexto da modelagem arquitetural e da utilização de suas estruturas. Por conta disso, é necessário verificar algumas consistências para garantir a integridade das informações. Dentro dessa visão, existem alguns tipos de inconsistências que podemos identificar. // Inconsistência direta Neste tipo de inconsistência, temos o cenário em que duas views apresentam proposições diretamente contraditórias, podendo ser detectadas por mecanismos automáticos que utilizam regras específicas. Exemplo: uma view indica que o sistema deve ser executado em dois hosts versus outra view que determina que o mesmo sistema seja executado em três hosts. // Inconsistência de refinamento Neste tipo de inconsistência, temos o cenário com duas views de um mesmo sistema, mas com níveis de detalhamento diferentes, que apresentam proposiçõesque são diretamente contraditórias, podendo ser detectadas automaticamente, utilizando regras de consistência bem definidas. Sabe-se que para essas regras funcionarem adequadamente, é necessário que as views apresentem informações suficientes para suportá-las. Exemplo: uma view estrutural com nível mais alto apresentando um componente que não está presente na view estrutural das sub- arquiteturas. // Inconsistência de aspecto estático versus dinâmico Esses tipos de inconsistência são mais complexos de serem identificados. Basicamente, ocorrem quando uma view de aspecto estático se encontra em conflito com uma view de aspecto dinâmico. Um exemplo desse tipo de caso pode ocorrer quando demonstramos em uma sequência de mensagens (dinâmico) um componente que não possui representação em uma view do tipo estrutural (estático). Também podemos ter uma inconsistência entre duas views dinâmicas. Esse tipo de inconsistência é de extrema dificuldade de ser detectada de forma automática, pois requer extensas e mais complexas simulações de estados e cenários. // Inconsistência de aspecto funcional versus não funcional Esse tipo de inconsistência é mais comum de ocorrer, pois envolve um relacionamento/mapeamento tradicional identificado nas arquiteturas: o mapeamento funcional versus não funcional. Esse tipo de inconsistência ocorre quando temos uma propriedade não funcional, identificada em uma view não funcional, ausente nas views funcionais do projeto. Deve-se mapear e atender todas as propriedades não funcionais nas views funcionais, pois é uma forma de manter a consistência do design arquitetural. Um exemplo desse tipo de cenário pode ocorrer quando temos uma propriedade não funcional que define para um sistema uma alta taxa de disponibilidade e, ao realizar a view física do sistema, inclui-se apenas um servidor, quebrando a ideia de alta disponibilidade. Esse tipo de inconsistência é extremamente difícil de identificar automaticamente, pois esses cenários e views possuem uma natureza genérica e abstrata em relação às propriedades não funcionais. TÉCNICAS DE MODELAGEM Dentro do universo da modelagem arquitetural, os arquitetos de software têm à sua disposição um conjunto grande de opções de notação e técnicas de modelagem que permitem realizá-la em diversos aspectos arquiteturais e em estruturas de diversas complexidades. Devido a essa grande variedade, algumas abordagens apresentam uma amplitude considerável de aplicações e soluções de cenários que são extremamente úteis; mas mesmo contendo todas essas opções, é importante manter abertas as opções de utilização, não se prendendo apenas a uma técnica específica. Seguindo essa linha de pensamento, podemos separar esse conjunto da seguinte forma: // Técnicas genéricas • Linguagem natural • Gráficos informais • UML (Unified Modeling Language) // ADLs (Architecture Description Languages) • Darwin • Rapide • Wright • Koala • AADL (Architecture Analysis and Design Language) // Técnicas genéricas – linguagem natural Esse tipo de técnica busca realizar a descrição dos conceitos utilizando vocabulários extensivos e informais, podendo mapear qualquer tipo de conceito sem um detalhamento mais aprofundado. Trabalha tanto com conceitos estáticos quanto dinâmicos. Dentre as técnicas disponíveis, é a que introduz a maior quantidade de ambiguidades, podendo ocasionar dificuldades de entender as views definidas. Uma forma de reduzir as ambiguidades é a introdução de templates e dicionários de dados bem definidos. Esse mecanismo não disponibiliza nenhuma definição para automatização de verificação de inconsistência, sendo que essa deve ser realizada de forma manual e frequente. Esse tipo de técnica é muito útil na especificação de propriedades não funcionais (genéricas/abstratas) e como uma estrutura de suporte a outros tipos de linguagens mais formais e fechadas em que se deve expor maiores detalhes e mais rigor. // Técnicas genéricas – gráficos informais Essa técnica envolve a possibilidade de utilização de diagramas de tipos diferentes, compostos por elementos gráficos e textuais. Entre os elementos gráficos, podemos utilizar as formas geométricas, caixas de texto e outros. Por ser uma técnica que não está associada à semântica arquitetural, ela não possui a noção definida de aspectos estáticos e dinâmicos. Assim como a linguagem natural, também apresenta ambiguidades que podem ser controladas com a utilização de um dicionário controlado. Também não apresenta uma forma automatizada de testes e, portanto, as verificações relacionadas a inconsistências devem ser feitas de forma manual e frequente. // Técnicas genéricas – UML Nessas técnicas, temos a possibilidade de utilizar uma linguagem notacional com uma variedade considerável de diagramas e estruturas que auxiliarão os arquitetos de software a conseguirem expressar, de forma mais clara, todas as estruturas e os cenários que precisam ser contemplados na modelagem arquitetural. Essa notação possui uma estrutura de diagramas bem definida e com várias regras de criação e modelagem que trouxeram para a linguagem notacional o posto de principal linguagem utilizada na modelagem arquitetural. Basicamente, podemos dividir a UML em duas categorias: DIAGRAMAS ESTRUTURAIS São estruturas que representam aspectos estáticos da solução e que não levam em consideração a ação temporal sobre elas. DIAGRAMAS COMPORTAMENTAIS São estruturas que representam os aspectos dinâmicos da solução e como esses aspectos se relacionam no decorrer do tempo dentro da solução. Dentro dessa categoria, temos um subgrupo de diagramas chamado diagramas de interação, que auxilia na representação das interações dinâmicas entre os componentes. https://sereduc.blackboard.com/courses/1/7.5099.80686/content/_5078757_1/scormcontent/index.html Um dos principais motivos de a UML ter sido adotada como um dos padrões de representação de aspectos na modelagem arquitetural é o fato de ela não estar sob o domínio de uma empresa específica, mas de um consórcio aberto de empresas chamado Open Management Group ou OMG. Diagrama 6. Visão geral dos diagramas a partir da versão 2.4 da UML. Nesse contexto, podemos definir que os objetivos principais da linguagem notacional UML são: • Documentar; • Especificar; • Maior visualização lógica do sistema. Veja a seguir alguns exemplos dos principais diagramas da UML: Diagrama 7. Exemplo de diagrama de classes. Diagrama 8. Exemplo de diagrama de sequências. • ADL – Darwin (1ª geração): é um tipo de ADL de propósito geral que é, normalmente, utilizado em sistemas em que os componentes utilizam interfaces explícitas para se comunicarem. Possui uma representação em formato de texto que é possível descrever os componentes e suas interconexões, bem como uma representação gráfica.Possui elementos básicos que representam os componentes, os conectores (obrigatórios e os disponibilizados no sistema), as ligações e as composições hierárquicas. EXPLICANDO Apesar de suportar os elementos padrões, esse tipo de ADL não suporta modelagem dinâmica nem aspectos não funcionais e não possui, nativamente, nenhum suporte à consistência de views. • ADL – Rapid (1ª geração): esse tipo de ADL tem como principal característica a abordagem direta de aspectos dinâmicos da arquitetura, disponibilizando uma ferramenta de apoio para a simulação dos aspectos necessários. Apesar disso, a notação dessa ADL é muito precária e, dessa forma, impõe uma alta curva de aprendizado. • Em relação às verificações estruturais, esse tipo de ADL não possui recursos básicos para garantir que as implementações estejam em conformidade com as especificações. • ADL – Wright (1ª geração): essa ADL possui um alto overhead cognitivo e uma alta curva de aprendizado. Apesar disso, disponibiliza capacidades mais fortes e definidas de análise da arquitetura. Então, é possível ver que esse tipo de ADLé muito utilizado em sistemas com perfil do tipo safety-critical, pois demandam uma modelagem extensivamente formal. • Nessa ADL, há uma deficiência no suporte para realizar o refinamento das especificações arquiteturais definidas no sistema. • ADL – Koala: tem como escopo inicial capturar a estrutura, a configuração e as interfaces dos componentes existentes no contexto de sistemas embarcados em dispositivos eletrônicos. Nesta estrutura, essa ADL apenas captura as estruturas estáticas e as interfaces são modeladas. Embora os aspectos sejam definidos estaticamente, a seleção de variantes pode ser alterada em tempo de execução, proporcionando a possibilidade de ter uma flexibilização na sua utilização. Dentro dessa estrutura, a identificação de erros é relativamente fácil de identificar, pois os modelos gerados com o uso da ADL possuem regras e padrões de interconexão muito bem definidos. • ADL – AADL: tem como escopo principal a utilização de modelos multinível relacionados a elementos de hardware e software que possuem conexões. Dentro desses elementos, podem ser identificados componentes, como redes, barramentos, processos e outros. Nesse contexto, essa ADL não possui suporte explícito à modelagem dinâmica, mas permite a captura de propriedades não funcionais definidas pelo usuário, com o viés de não poder incluir esses tipos de propriedades em análises automáticas. Assim, esse tipo de ADL apresenta certa flexibilidade para suportar alguns determinados cenários. O Open Source ADDL Tool Environment (OSATE) possui diversos plug-ins para realizar análise e verificação de consistências. Análise de arquiteturas A análise arquitetural é uma etapa de muita importância dentro do ciclo de vida de desenvolvimento de um software, pois possibilita que propriedades significativas do sistema sejam identificadas, partindo-se das estruturas de modelagem disponíveis no contexto arquitetural do projeto. Com essas propriedades identificadas e corretamente documentadas dentro do processo arquitetural utilizado, o arquiteto de software tem a possibilidade de realizar importantes questionamentos e aferições sobre a solução a ser desenvolvida e como isso será feito no momento do desenvolvimento propriamente dito. Para isso, o arquiteto deve usar todas as ferramentas disponíveis para identificar propriedades importantes, como as metas a serem atendidas, o escopo a ser alcançado e os aspectos que devem ser considerados. Claro que, dentro desse contexto de análise arquitetural, outros conceitos e estruturas devem ser abordados e considerados, como veremos em nosso estudo. CONCEITOS E ABORDAGEM Para conseguirmos entender como aplicar e identificar os principais conceitos presentes na análise arquitetural, precisamos entender como eles funcionam e quais são suas principais características. Então, vamos começar pelos itens básicos que utilizamos na análise das arquiteturas. // Metas As metas são elementos que devem ser definidos pelo arquiteto de sistemas com os stakeholders para assegurar o direcionamento correto do projeto e das implementações que serão realizadas. No contexto das metas, podemos utilizar quatro tipos principais de categorias que auxiliam em sua identificação e em sua utilização na análise arquitetural. São elas: COMPLETUDE // Completude pode ser separada em externa e interna; // Completude externa visa a estabelecer se a arquitetura apresentada captura de forma correta todos os requisitos funcionais e não funcionais principais e críticos do sistema; // Completude interna visa a estabelecer se todos os elementos do sistema foram capturados integralmente em relação à modelagem e ao sistema que está sendo projetado. CONSISTÊNCIA // Neste conceito, identificamos e garantimos que diferentes elementos presentes no modelo não são contraditórios; // Ao realizar a captura dos detalhes dos projetos, podem ser identificadas ou introduzidas algumas inconsistências que podem ser identificadas como: Inconsistência de nome Esse tipo de inconsistência está relacionado aos nomes utilizados nos componentes, nos conectores e nas estruturas internas a esses elementos. Arquiteturas que possuem um perfil mais desacoplado, como arquiteturas baseadas em produtor/consumidor, possuem a característica de serem dinâmicas e adaptáveis, dificultando a detecção desses tipos de inconsistências. Inconsistência de interface Normalmente, nesta categoria, são identificadas todas as inconsistências de nome. Aqui, podemos dizer que o nome de um serviço sendo consumido ou disponibilizado pode conter o mesmo nome, mas deve possuir os parâmetros diferentes em sua quantidade e/ou seu tipo. O retorno também é considerado neste cenário. Inconsistência comportamental Ocorre entre componentes que expõem e consomem serviços nos quais as interfaces são compatíveis, mas o comportamento difere entre eles. Inconsistência de interação Ocorre quando temos uma violação nas restrições de interação entre operações de um componente. Um exemplo seria uma violação na ordem de execução de determinadas operações. Inconsistência de refinamento É mais complexo de ser identificado e mapeado, uma vez que sua ocorrência está vinculada ao fato de que as arquiteturas são capturadas em diferentes níveis de abstração. Para a identificação deste tipo de inconsistência, podemos levar em conta as seguintes diretrizes: // Elementos presentes no modelo de mais alto nível devem estar presentes no modelo de baixo nível; // As decisões principais mapeadas no modelo de alto nível não foram omitidas, modificadas ou violadas no modelo de baixo nível; // Novos detalhes introduzidos em modelos de baixo nível devem se manter consistentes com os detalhes no modelo de mais alto nível. Compatibilidade É verificado se o modelo arquitetural está em conformidade com todas as restrições e diretrizes definidas pela arquitetura de referência, pelo modelo arquitetural ou pela padronização arquitetural utilizada no projeto. Corretude É verificado se as decisões arquiteturais do projeto atendem de forma adequada às definições externas do sistema. https://sereduc.blackboard.com/courses/1/7.5099.80686/content/_5078757_1/scormcontent/index.html // Escopo O escopo é uma característica que nos auxilia na identificação das fronteiras arquiteturais que devemos definir para que possamos ter uma estrutura de modelagem e implementação adequada e aderente às necessidades do software a ser desenvolvido. Dentro da análise arquitetural, temos a possibilidade de quebrar os diferentes tipos de escopo em: componente-conector, sistema- subsistema, troca de dados, arquitetura em níveis e benchmark arquitetural. Componente-conector Neste tipo de escopo, é verificado se o serviço disponibilizado é o esperado pelo componente e/ou conector apresentado. Sistema-subsistema Neste tipo de escopo, deve-se verificar a relação entre o sistema principal e seus inter-relacionamentos internos com os subsistemas, a fim de garantir que sua composição esteja adequada e que o relacionamento esteja dentro das diretrizes definidas na modelagem arquitetural e nos aspectos capturados. Troca de dados Neste tipo de escopo, são verificados os elementos de dados em relação a: // Estrutura dos dados; exemplo: tipados versus não tipados; // Fluxo de dados no sistema; exemplo: ponto a ponto versus broadcast; // Propriedades da troca de dados; exemplo: latência e consistência dos dados. Arquitetura em níveis Este tipo de escopo sofre com os efeitos relacionados ao processo incremental que, normalmente, as arquiteturas sofrem ao longo de seu ciclo de vida. Nesse caso, a cada nível de evolução arquitetural, novas informações introduzidas podem causar modificações no escopo arquitetural. Dentre essas alterações, inconsistências podem ocorrer, demandando que o escopo seja redefinido e replanejado. Dessa forma, esse tipo de escopo auxilia a controlar as alterações arquiteturais,
Compartilhar