Arquitetura de software e componentes reutilizáveis

O que é?

editar

Componentes Reutilizáveis são partes específicas de um sistema de software projetadas para serem usadas em diferentes aplicações sem modificações ou com alterações mínimas. Esses componentes são abstraídos de forma que não dependam de contextos específicos, permitindo que sejam facilmente integrados em novas aplicações ou partes diferentes de uma mesma aplicação.

Exemplos de componentes reutilizáveis são: bibliotecas e frameworks (conjuntos de funções pré-escritas com funcionalidades relacionadas), microsserviços (serviço de deploy independente que cumpre uma necessidade de negócio específica - como serviço de autenticação de usuário, serviço de processamento de pagamento, etc) e componentes web (elementos HTML/CSS reutilizáveis, por exemplo).

Motivação e Vantagens

editar
  • Custo: Reduz o custo de desenvolvimento, pois evita o retrabalho.
  • Consistência: Garante padronização dentro de todo o ecossistema de desenvolvimento de uma empresa.
  • Qualidade: Componentes reutilizáveis são mais testados, gerando mais qualidade que um componente que é usado apenas uma vez.
  • Produtividade: Reutilização de código implica evitar retrabalho, pois gera menos esforços em testes e design de código novo.
  • Manutenção: Aplicações que usam componentes reutilizáveis são mais fáceis de manter, já que ajustes aos componentes são propagados para todas as aplicações que os usam.
  • Confiabilidade: usar componentes bem testados aumenta a confiabilidade do sistema. Além de que ao utilizar o componente em vários sistemas, a chance de detectar bugs é maior, gerando mais correções e consequentemente mais confiabilidade.
  • Interoperabilidade: Vários sistemas funcionam melhor juntos se suas interfaces são implementadas de maneira consistente.

Obstáculos

editar

Desenvolvimento de software não se trata apenas de uma questão técnica. Os empecilhos podem ser de gestão e organização de pessoas, obstáculos econômicos, além dos desafios técnicos para que a implementação conduza à componentização e reutilização.

Investimentos iniciais: Por mais que traga benefícios a longo prazo, existe um custo inicial associado ao desenvolvimento de componentes reutilizáveis, pois eles exigem maior qualidade de software, mais abstração, generalidade e mantenabilidade. Além disso, para que os componentes sejam de fato reutilizados, é preciso que eles sejam também bem documentados.

Falta de apoio da gestão: Software reutilizável demora mais para ser desenvolvido. Muitas vezes a gestão só está interessada em entregar código rápido para o cliente e não coloca os incentivos para a equipe tomar cuidado com a reusabilidade.

Organização de projeto: Tentar implementar componentes reutilizáveis em um projeto já em andamento demanda grande organização da equipe, atrasando em curto prazo o desenvolvimento.

Usar software de outra pessoa: As pessoas tendem a se sentir menos independentes ao utilizar softwares reutilizáveis, pois não foram elas que programaram. Também há o fator de falta de confiança.

Não-reutilizabilidade do código: Ter fácil acesso ao código não implica diretamente que será mais fácil de o modificar, dado que modificar o código de alguém pode levar a custos maiores do que fazer um do zero.

Como instalar

editar

O professor Johannes Sametinger[1] propõe um framework de institucionalização do reuso de software que consiste em seis etapas:

1. Reuse Assessment (Avaliação)

  • Objetivo: Avaliar o potencial de reutilização de software dentro da organização.
  • Perguntas chave:
    • A reutilização de software é viável?
    • A produção de software é suficiente para justificar um programa de reutilização?
    • A gestão apoiará o programa de reutilização?
    • Existem recursos humanos e financeiros suficientes?
    • Quantos sistemas semelhantes serão produzidos?
    • Quais ativos reutilizáveis já estão disponíveis?
    • O domínio é adequado para reutilização?
    • Qual é a relação custo-benefício?
    • Como implementar o programa de reutilização?

2. Reuse Initiation (Início)

  • Objetivo: Analisar e selecionar componentes de software existentes que possam ser reutilizados.
  • Atividades:
    • Generalizar e documentar componentes reutilizáveis.
    • Armazenar componentes em um repositório.
    • Categorizar e priorizar componentes reutilizáveis.
    • Assegurar o apoio da gestão para cobrir os custos iniciais e garantir o retorno do investimento.

3. Reuse Experiment (Experimentação)

  • Objetivo: Realizar experimentos para aprender sobre questões técnicas e organizacionais que podem impedir o sucesso do programa de reutilização.
  • Atividades:
    • Definir critérios de sucesso e realizar medições.
    • Implementar o experimento em um projeto em andamento ou um novo projeto.
    • Avaliar resultados e decidir sobre a extensão ou revisão do programa.

4. Reuse Expansion (Expansão)

  • Objetivo: Expandir o programa de reutilização após o sucesso do experimento inicial.
  • Atividades:
    • Integrar outras aplicações nos esforços de reutilização.
    • Estender e consolidar o repositório de componentes reutilizáveis.
    • Oferecer incentivos para apoiar o programa até que a reutilização se torne parte da cultura organizacional.
    • Considerar outros domínios para reutilização.

5. Domain Analysis (Análise)

  • Objetivo: Instituir a reutilização sistemática identificando necessidades comuns a múltiplos projetos dentro de um domínio específico.
  • Atividades:
    • Analisar o domínio em profundidade para identificar oportunidades de reutilização.

6. Reuse Consolidation (Consolidação)

  • Objetivo: Ajustar estruturas organizacionais e processos de desenvolvimento de software para institucionalizar a reutilização.
  • Atividades:
    • Realizar análises de domínio contínuas.
    • Administrar o repositório de componentes.
    • Adaptar processos de desenvolvimento.
    • Estabelecer treinamentos e ferramentas de suporte para reutilização.
    • Reavaliar e aprimorar os níveis de abstração dos componentes reutilizados.
    • Considerar a inclusão de novas tecnologias, como a orientação a objetos, em ciclos subsequentes de instalação do programa de reutilização.

Referências

editar
  1. J. Sametinger: Software Engineering with Reusable Components (Habilitationsschrift), Springer-Verlag, ISBN 3-540-62695-6, 1997. DOI: 10.1007/978-3-662-03345-6