A arquitetura de um software existe independente dela ser projetada ou documentada. No entanto, ao deixarmos a arquitetura simplesmente “emergir” a partir do software, ou seja, evoluir ao longo do processo de desenvolvimento sem projeto ou documentação, corremos o risco de não tirar proveito dos benefícios que ela proporciona.
Por outro lado, apenas realizar o design arquitetural e não documentá-lo (ou documentá-lo de forma precária), pode minimizar as vantagens a serem obtidas pela arquitetura. Isto pode ocorrer porque documentar a arquitetura, além de auxiliar o próprio processo de design, também proporciona:
- uma ferramenta de comunicação entre os stakeholders;
- a integridade conceitual ao sistema e ao processo de desenvolvimento;
- um modelo para análise antecipada do sistema; e
- uma ferramenta de rastreabilidade entre os requisitos e os elementos do sistema.
Auxílio ao Processo de Design
Apesar de dividirmos conceitualmente o processo de design do processo de documentação, é comum que ambos aconteçam em paralelo na prática. Quando isto ocorre, a documentação ajuda no design, principalmente no sentido de separação de preocupações.
Ao documentarmos visões arquiteturais diferentes separadamente, preocupamo-nos separadamente com o design de diferentes aspectos do software. Entre os diversos aspectos de um software, podemos citar os aspectos funcionais, de dados, de concorrência, de desenvolvimento, de implantação e operacionais. Esta separação se torna benéfica porque há diferentes linguagens, que podem ser gráficas ou textuais, que melhor se encaixam à descrição de cada aspecto, ajudando não só numa melhor representação, como também numa melhor modelagem e avaliação em relação aos objetivos.
A seguir, vemos dois exemplos que ilustram a documentação de algumas decisões arquiteturais relacionadas a aspectos diferentes do SASF. No Paragraph 8, podemos observar como o SASF está dividido em grandes módulos funcionais e, assim, podemos inferir quais são suas principais funcionalidades e algumas de suas relações entre si. Podemos dizer que as decisões arquiteturais do exemplo são apresentadas sob o ponto de vista funcional do sistema, constituindo uma visão funcional do software. Note também que esta não é a melhor forma de representar, por exemplo, que o desenvolvimento do cadastro dos usuários será terceirizado ou ainda que o serviço de transmissão de vídeos deve executar em 7 servidores durante dias úteis e em 15 servidores nos finais de semana e feriados, quando demanda aumenta.
Exemplo 1
[Decisão Arquitetural 001] O SASF é dividido em cinco grandes módulos funcionais. Cada módulo é responsável por prover um conjunto de funcionalidades relacionadas entre si. Os grandes módulos do SASF são:
- Locadora de Filmes;
- Transmissor de Filmes;
- Motor de Sugestões;
- Cadastro de Usuários;
- Cadastro de Filmes.
As principais funcionalidades providas por cada módulo e suas relações de uso estão descritas no diagrama representado na Figura 1.
![]() |
Objetivos: A divisão em módulos funcionais possibilita a divisão da implementação entre os times de desenvolvimento de acordo com a especialidade de cada time.
Motivação: As diversas funções a serem providas pelo SASF foram agrupadas em preocupações comuns (cadastro de dados, locação e transmissão de filmes, e sugestões ao usuário). O cadastro deve ser especializado em dois tipos para dividir o esforço de desenvolvimento: cadastro de filmes e de usuários. O motor de sugestões deve ser alimentado com dados de histórico de locações do usuário e informações sobre a base de filmes no sistema.
No Exemplo 2, mostramos o SASF sob um ponto de vista de implantação. Neste exemplo, podemos observar informações de configuração para implantação de serviços para executar o SASF – informações que estavam ausentes no exemplo anterior.
Exemplo 2
[Decisão Arquitetural 002] A implantação do módulo que implementa as funcionalidades do serviço de transmissão de filmes deve depender apenas de um parâmetro:
- endereços.servidores.configuração: lista de endereços IP dos servidores que constituem o serviço de configuração do SASF.
Os outros parâmetros de configuração devem ser obtidos a partir da comunicação com o serviço de configuração.
Objetivos: Facilitar a operabilidade do sistema.
Motivação: O serviço de configuração do SASF, que é descrito em detalhes na [Decisão Arquitetural 011], é um centralizador da configuração do sistema. Nele, o operador do sistema insere endereços de serviços para que estejam disponíveis para a configuração de uma nova instância. Quando a instância do serviço de transmissão de filmes é iniciada, ela faz requisições ao serviço de configuração pelos endereços dos serviços de cadastro e dos serviços de armazenamento de filmes, por exemplo.
Exemplo 3
[Decisão Arquitetural 002] A implantação do módulo que implementa as funcionalidades do serviço de transmissão de filmes deve depender apenas de um parâmetro:
- endereços.servidores.configuração: lista de endereços IP dos servidores que constituem o serviço de configuração do SASF.
Os outros parâmetros de configuração devem ser obtidos a partir da comunicação com o serviço de configuração.
Objetivos: Facilitar a operabilidade do sistema.
Motivação: O serviço de configuração do SASF, que é descrito em detalhes na [Decisão Arquitetural 011], é um centralizador da configuração do sistema. Nele, o operador do sistema insere endereços de serviços para que estejam disponíveis para a configuração de uma nova instância. Quando a instância do serviço de transmissão de filmes é iniciada, ela faz requisições ao serviço de configuração pelos endereços dos serviços de cadastro e dos serviços de armazenamento de filmes, por exemplo.
Ferramenta de Comunicação
Já sabemos que diferentes stakeholders demonstram diferentes preocupações sobre diferentes aspectos do sistema. Como a documentação da arquitetura versa sobre as muitas preocupações dos stakeholders, ela serve de ferramenta para comunicação, uma vez que provê um vocabulário comum sobre o sistema, além de registrar as relações entre as preocupações e de que forma os eventuais conflitos foram ou devem ser resolvidos.
Note que para servir de ferramenta de comunicação, o documento arquitetural deve ser construído de forma que respeite o conhecimento e as necessidades dos stakeholders. Para que isto seja possível, deve-se conhecer para quem o documento está sendo escrito. Portanto, devemos escrever a arquitetura de forma que possua partes que interessem aos usuários, aos clientes, aos desenvolvedores, aos testadores, ao gerente de projeto ou a outros stakeholders envolvidos no processo.
Por exemplo, os usuários buscam pelas funcionalidades, capacidades e comportamento do sistema, não como ele foi dividido em módulos, como os módulos se comunicam entre si ou se eles foram desenvolvidos do zero ou tiveram partes reutilizadas de outros sistemas. Clientes e gerentes têm alguns interesses semelhantes, como custos de desenvolvimento ou cronograma de lançamento. No entanto, os clientes também se preocupam com o alinhamento do software ao seu negócio, enquanto o gerente procura como minimizar os custos para se adequar ao orçamento, ou como as tarefas de implementação serão divididas entre seu time de desenvolvimento. Finalmente, desenvolvedores e testadores estão interessados em aspectos técnicos do design, por exemplo, qual a divisão em módulos do sistema, quais as alternativas de design disponíveis ou como os atributos de qualidade (desempenho, escalabilidade, tolerância a faltas, etc.) devem ser implementados, cada um motivado pelo seu papel no processo de desenvolvimento.
Integridade Conceitual
Por outro lado, o documento precisa demonstrar consistência entre os diversos aspectos do design da arquitetura para que haja comunicação e integridade conceitual. A consistência é necessária porque, apesar da separação de preocupações ser uma ferramenta poderosa de design, as soluções para as diferentes preocupações trabalham interligadas durante a implementação, ou seja, quando resolvem o problema. Assim, precisamos de integridade em dois níveis: entre os stakeholders e entre os diversos aspectos do documento de arquitetura.
A integridade conceitual entre stakeholders é a defendida por Brooks, em The Mythical Man-Month, porque facilita o sucesso no desenvolvimento de sistemas de software. Se os stakeholders – e principalmente os desenvolvedores – não têm em mente o mesmo design que se transformará em produto, são poucas as garantias de que o produto implementado será o projetado. Por isso, no processo, o documento de arquitetura serve para restringir eventuais “deslizes conceituais” em relação ao design arquitetural e prevenir futuras discordâncias entre stakeholders, inclusive de interesses similares. O Exemplo 4 ilustra um caso de restrição aos desenvolvedores, mas que é benéfica por proporcionar a integridade conceitual entre times de desenvolvimento. Este caso é a definição das interfaces entre dois serviços presentes no sistema.
Exemplo 4
No SASF, se dividirmos os desenvolvedores em mais vários times, é comum que haja uma maior interação entre os membros de um mesmo time do que entre times diferentes. Vamos considerar que delegamos a um time a implementação do serviço responsável pelas funcionalidades do módulo Cadastro de Filmes, já apresentado no Exemplo 1, e a outro time o módulo Transmissor de Filmes. Para que a implementação dos dois módulos possa ser paralelizada e para que sejam evitadas suposições errôneas ou desnecessárias por parte de cada time sobre outros módulos (e, portanto, seja menos custosa a integração), devemos definir cuidadosamente as interfaces dos módulos, sejam os métodos disponíveis, a forma de comunicação e os tipos de dados usados como parâmetros ou retorno.
A integridade conceitual também se mostra necessária durante a inclusão de novos membros à equipe de desenvolvimento e ao longo da evolução e manutenção do software. Novos membros precisam de uma descrição da arquitetura porque normalmente são inseridos ao time sem qualquer conhecimento prévio do design. Já ao longo da evolução e manutenção do software, o conhecimento das regras de design a serem seguidas se faz necessário para que os requisitos de qualidade permaneçam implementados, mesmo durante mudanças. O exemplo a seguir ilustra uma regra de design para que um software de manipulação de imagens continue exercendo alta portabilidade.
Exemplo 5
O software de manipulação de imagens ImageJ1 desempenha bem dois atributos de qualidade: a extensibilidade e a portabilidade. Sua extensibilidade é garantida por ter sua arquitetura ser baseada no uso de plugins. Com isso, ele é composto de um núcleo de funcionalidades básicas e provê meios para que novas funcionalidades sejam adicionadas em tempo de execução. Já sua portabilidade é garantida por ele ter seu núcleo e plugins implementados usando a linguagem de programação Java, permitindo sua execução em qualquer ambiente que disponha da máquina virtual Java.
Como o código-fonte do ImageJ é de domínio público, qualquer programador pode baixá-lo, usá-lo e escrever novos plugins para ele. Inclusive, é possível usar o mecanismo Java Native Interface (JNI) para realizar chamadas a bibliotecas escritas em outras linguagens. No entanto, se o programador deseja manter o alto grau de portabilidade do ImageJ, ele deve respeitar a regra de design do software que é de nunca realizar chamadas nativas durante a implementação de novas funcionalidades.
Existe também a integridade entre os diversos aspectos da arquitetura no documento ou, em outras palavras, a integridade entre as visões da arquitetura. Este tipo de integridade deve ser mantido para que as partes do design funcionem em conjunto e que, portanto, o design seja passível de implementação. A consistência entre visões se faz necessária por que, apesar da separação de preocupações e de elementos arquiteturais facilitar o design, é em conjunto que eles são construídos e executados. Portanto, se há no documento mais de uma visão sobre os mesmos elementos do sistema, é essencial que na documentação dessas visões exista um mapeamento entre as diferentes representações desses elementos.
O Exemplo 6 ilustra a consistência entre visões sobre o armazenamento no SASF. Nele, podemos observar (1) os serviços providos pelo sistema de armazenamento do SASF por meio da visão funcional; (2) que boa parte dos serviços de armazenamento não serão implementados do zero, uma vez que serão obtidos pelo Sistema de Gerência de Banco de Dados adotado, por meio da visão de desenvolvimento; e (3) que o sistema de armazenamento estará executando, no mínimo, em três servidores, por meio da visão de implantação. Note que, se alguma das visões for inconsistente com as outras, podem surgir dúvidas sobre: (1) quais serviços estão disponíveis para quem usa armazenamento, (2) o que será implementado e o que será aproveitado durante a implementação da solução de armazenamento do SASF e, por fim, (3) que tipo de hardware será necessário para executar a solução de armazenamento.
Exemplo 6
Na [Decisão Arquitetural 001], descrita no Exemplo 1, apresentamos três módulos que devem lidar diretamente com armazenamento: Cadastro de Usuários, Cadastro de Filmes e Transmissor de Filmes. No entanto, apenas as funções que eles devem implementar foram descritas, não como devem implementar. As decisões a seguir mostram alguns aspectos de como essas funções devem ser implementadas.
(Decisão Arquitetural 002). O armazenamento das informações dos módulos Cadastro de Usuários e Cadastro de Filmes será realizado usando um Sistema Gerenciador de Banco de Dados Relacional (SGBDR) de modo a permitir criação, edição, obtenção e remoção das entradas.
As informações guardadas no SGBDR são os atributos dos Usuários e Filmes e são essencialmente textuais ou metainformações para localização de arquivos de mídia (fotos ou vídeos). O armazenamento de arquivos de mídia é tratado na [Decisão Arquitetural 003]. Já o armazenamento de arquivos textuais que não são atributos dos Usuários ou Filmes, por exemplo, mensagens para usuários ou comentários sobre filmes é tratado em outra decisão arquitetural que não é descrita aqui.
Objetivo: Permitir a persistência dos atributos dos Usuários e Filmes, facilitando o desenvolvimento.
Motivação: Os atributos de Usuários e Filmes são essencialmente relacionais, se encaixando perfeitamente ao paradigma usado para armazenamento. Além de ser um paradigma bem conhecido pelo time de desenvolvimento.
(Decisão Arquitetural 003). O armazenamento de arquivos de mídia (fotos de Usuários, fotos de Filmes e arquivos de vídeo) serão armazenados usando uma Rede de Fornecimento de Conteúdo ( Content Delivery Network ou CDN).
Objetivo: Permitir a persistência de arquivos de mídia, facilitando a implementação e permitindo desempenho e controle de carga.
Motivação: Os arquivos de mídia presentes no SASF são conteúdo estático, que pode ser distribuído por uma CDN e, assim, tirar proveito de replicação, distribuição geográfica e caching, sem ter que implementar estas técnicas.
Já as decisões da visão de implantação, devem descrever os servidores que executaram os SGBDR e o serviço que se comunica com a CDN para o envio de arquivos.
Modelo para Análise
A arquitetura é um modelo do sistema, uma vez que descreve suas características. Ao documentar a arquitetura, obtemos um modelo manipulável do sistema que tem utilidade não só ao arquiteto, mas também a outros stakeholders. Com o modelo manipulável, é possível avaliar as decisões arquiteturais registradas e validá-las em relação aos requisitos que o software deve satisfazer. Além disso, o documento pode ainda servir de ferramenta que permita a verificação de se implementação está de acordo com o design, podendo prevenir eventuais deslizes arquiteturais.
Podemos citar três categorias2 de validação da arquitetura em relação aos requisitos: análise baseada em inspeções, análise baseada em modelos e análise baseada em simulações. No entanto, a possibilidade de aplicação de uma técnica de uma dada categoria de validação está diretamente ligada à representação usada no documento de arquitetura.
Análise baseada em inspeções
Análises baseadas em inspeções são conduzidas por bancas de revisão compostas por vários stakeholders. Entre os stakeholders, podemos encontrar, além do arquiteto e dos desenvolvedores, interessados menos técnicos, como o gerente de projeto e, em alguns casos, o cliente. Durante o processo de inspeção, os stakeholders definem os objetivos da análise e estudam as representações da arquitetura de forma a avaliá-la de acordo com seus objetivos.
Esta categoria de inspeção serve para verificar um conjunto amplo de propriedades da arquitetura e faz uso de múltiplas representações do design, tanto em linguagens formais, quanto informais. Por ser um processo essencialmente manual, é um tipo de análise mais caro do que os de outros, mas que possibilita também a inspeção em busca de qualidades menos formais do software, a exemplo de escalabilidade, manutenibilidade ou operabilidade. Outra vantagem deste tipo de análise é a de permitir o uso de representações informais ou parciais do design da arquitetura, além de possibilitar a análise considerando múltiplos objetivos de múltiplos stakeholders.
Como exemplos de análises baseadas em inspeções, podemos citar alguns métodos de avaliação de arquitetura criados pelo Software Engineering Institute, da Carnegie Melon University: o Software Architecture Analysis Method (SAAM), o Architectural Trade-Off Analysis Method (ATAM) e o método Active Reviews for Intermediate Designs (ARID).3
Análise baseada em modelos
Análises baseadas em modelos são menos custosas do que as baseadas em inspeções, uma vez que demonstram maior nível de automação. Este tipo de análise utiliza ferramentas que manipulam representações da arquitetura com o objetivo de encontrar algumas de suas propriedades. Para possibilitar a manipulação, as representações devem ser escritas em linguagens formais ou semiformais como ADLs ( architecture description languages ou linguagens de descrição de arquitetura), como por exemplo, ACME, SADL e Rapide, máquinas de estado finito ou UML.
Esta categoria de inspeção é utilizada na busca de propriedades formais da arquitetura, como corretude sintática ou ausência de deadlocks e, apesar de seu alto grau de automação, pode necessitar que o arquiteto guie a ferramenta de inspeção utilizada considerando os resultados parciais. Uma desvantagem desta categoria é seu desempenho na análise de grandes sistemas. Uma vez que as representações da arquitetura podem levar à explosão de estados, a análise de todo o espaço de estados do sistema pode ser inviável. Portanto, é comum que apenas partes da arquitetura sejam analisadas – de preferência partes mais críticas.
Como exemplos de análises baseadas em modelos, podemos citar o uso da linguagem Wright para a verificação de ausência de deadlocks4 e o uso da linguagem de modelagem MetaH para análise de propriedades confiabilidade e segurança ( safety)5.
Análise baseada em simulações
Análises baseadas em simulações se utilizam de modelos executáveis da arquitetura para extrair características do software ou de partes dele. Assim como a análise baseada em modelos, esse tipo de análise também se utiliza de ferramentas que automatizam o processo, deixando-o mais barato. No entanto, este tipo de análise produz resultados restritos às propriedades dinâmicas do software e estão sujeitas às imprecisões dos modelos de execução.
Para possibilitar a execução, as representações utilizadas devem ser formais, o que diminui sua aplicação na indústria, mas que proporciona resultados mais precisos em relação às qualidades estruturais, comportamentais e de interação entre as partes do software, como por exemplo qualidades de desempenho e confiabilidade.
Como exemplos de análises baseadas em simulações, podemos citar o uso de simulação de eventos discretos para análise de desempenho ou o uso da ferramenta XTEAM6, que utiliza ADLs e processos de estado finito para diferentes tipos de análises arquiteturais.
Ferramenta de Rastreabilidade
Por fim, a documentação permite rastreabilidade entre os requisitos e os elementos da arquitetura e implementação que satisfazem esses requisitos. Ao documentar as decisões arquiteturais, registramos (1) seus objetivos, que normalmente são qualidades a serem alcançadas pelo software, e (2) como esses objetivos são alcançados, por meio da descrição dos elementos que compõem o sistema e suas relações e regras de design que devem ser respeitadas durante a implementação. Este registro serve de ponte entre dois extremos do processo de desenvolvimento: os requisitos e a implementação, e assim permite a navegação entre pontos relacionados, sejam eles requisitos, decisões de design ou partes da implementação.
A rastreabilidade nos permite analisar qual o impacto de uma decisão de design, tanto em termos de quais requisitos ela afeta, quanto quais elementos de software ela dita a existência ou, em caso de manutenção, quais elementos são ou devem ser afetados por mudanças nos requisitos ou nas decisões. O exemplo a seguir mostra aspectos de rastreabilidade na documentação da arquitetura do SASF.
Exemplo 7
Se observarmos a arquitetura do SASF e procurarmos pelas decisões responsáveis por facilitar a manutenção do sistema, encontraremos entre elas a decisão de divisão do sistema em camadas. Essa decisão sugere uma divisão do sistema em camadas lógicas, mas também influencia na divisão em pacotes, serviços ou mesmo processos. Assim, a satisfação do requisito de manutenibilidade está diretamente ligada à correta divisão das partes do sistema em apresentação, lógica de negócio e persistência.
Da mesma maneira, se partirmos das partes que formam as camadas de apresentação, lógica de negócio e persistência, observaremos que elas estão ligadas à divisão do sistema (e à decisão arquitetural) que se propõe a atender a requisitos de manutenibilidade.





