Estratégia para Suporte de Software

  • O software continua a evoluir com o tempo devido a várias mudanças.
  • Mudanças ocorrem quando:
  • Erros são corrigidos.
  • Adaptação a novos ambientes.
  • Clientes solicitam novas características ou funções.
  • Reengenharia para atualização.

Teoria Unificada para a Evolução do Software (Lehman)

Lei da Mudança Contínua (1974)

  • Software deve ser adaptado continuamente para evitar insatisfação.

Lei da Complexidade Crescente (1974)

  • Complexidade aumenta com a evolução do sistema, a menos que seja controlada.

Lei da Conservação da Familiaridade (1980)

  • Todos os envolvidos devem manter conhecimento sobre o sistema para uma evolução satisfatória.
  • Crescimento excessivo pode diminuir o conhecimento.

Lei do Crescimento Contínuo (1980)

  • Conteúdo funcional dos sistemas deve ser ampliado continuamente para manter a satisfação do usuário.

Lei da Qualidade em Declínio (1996)

  • Qualidade dos sistemas parece diminuir a menos que sejam mantidos e adaptados rigorosamente.

Suporte de Software

Gerenciamento de Versões

  • Integração das alterações de código
  • Integração contínua
  • Especificações de sistema da versão
  • Infraestrutura como código
  • Implementação e lançamento

Suportabilidade

  • Capacidade de fornecer suporte durante toda a vida útil do produto.
  • Inclui satisfazer requisitos, prover equipamento, infraestrutura, software adicional, serviços, mão de obra, etc.
  • Parte do modelo de requisitos e considerada durante o projeto e construção.

Atividades Importantes no Suporte

  • Correções, adaptações e melhorias
  • Suporte operacional continuado
  • Suporte ao usuário
  • Atividades de reengenharia

Manutenção e Apoio ao Suporte

  • Software “antidefeito” para ajudar o suporte quando defeitos são encontrados.
  • Banco de dados com registros de todos os defeitos, suas características, causas e soluções.
  • Recursos para resolver problemas diários dos usuários.
  • Responder a dúvidas sobre instalação, operação e uso da aplicação.

Manutenção de Software

Início da Manutenção

  • Começa quase imediatamente após a liberação do software.
  • Relatos de erros começam a chegar em poucos dias.
  • Solicitações de adaptação e melhorias surgem em semanas e meses.

Desafios da Manutenção

  • Fila crescente de correções, adaptações e melhorias.
  • Planejamento, programação e execução das mudanças.
  • Alto custo e consumo de recursos.
  • Empresas podem gastar 60 a 70% dos recursos em manutenção.

Importância da Manutenibilidade

  • Avaliar, controlar e fazer modificações.
  • Análise e projeto levam a uma manutenibilidade elevada.
  • Manutenibilidade é a facilidade de corrigir, adaptar ou melhorar o software.

Características do Software Manutenível

  • Modularidade eficaz.
  • Padrões de projeto compreensíveis.
  • Padrões e convenções de codificação bem definidos.
  • Código-fonte autodocumentado e inteligível.
  • Técnicas de garantia de qualidade que identificam problemas de manutenção.
  • Projeto e implementação que facilitam alterações futuras.

Tipos de Manutenção

  • Corretiva: Correção de erros.
  • Adaptativa: Adaptação a novos ambientes.
  • Perfectiva: Adição de novas funcionalidades.
  • Preventiva: Prevenção de problemas futuros.

Classes Gerais de Manutenção

  • Engenharia Reversa: Análise do sistema para identificar componentes e suas inter-relações. Criação de representações do sistema em outro nível de abstração.
  • Refatoração: Alteração do sistema sem mudar o comportamento externo, melhorando a estrutura interna. Facilita a qualidade, entendimento e manutenção.
  • Reengenharia (Evolução): Uso de um sistema existente para gerar um novo sistema com qualidade equivalente a práticas modernas de engenharia de software.

Tarefas de Manutenção

Heurísticas para Agilizar a Manutenção (Heeager e Rose)

  1. Use sprints para organizar o trabalho de manutenção.
  1. Permita que solicitações urgentes dos clientes interrompam sprints de manutenção.
  1. Facilite o aprendizado da equipe com mentoria de desenvolvedores experientes.
  1. Permita que múltiplos membros aceitem solicitações e coordenem seu processamento.
  1. Equilibre o uso de documentação por escrito com comunicação presencial.
  1. Escreva casos de uso informais para complementar outras documentações.
  1. Desenvolvedores devem testar o trabalho uns dos outros.
  1. Assegure que os desenvolvedores compartilhem conhecimentos entre si.
  1. Mantenha reuniões de planejamento curtas, frequentes e focadas.

Engenharia Reversa

  • Primeira tarefa antes de qualquer manutenção é entender o sistema que precisa ser modificado.
  • Muitas vezes, sistemas de baixa qualidade sem documentação razoável resultam em débito técnico.
  • Engenharia reversa não é um processo de "slot mágico", mas envolve análise detalhada do código existente e desenvolvimento de especificações significativas.

Aplicações

  • Entendimento de Dados: Análise de estruturas de dados em diferentes níveis de abstração.
  • Estrutura de Banco de Dados: Reengenharia para novos paradigmas de gerenciamento de banco de dados.
  • Abstrações Procedurais: Identificação de padrões de código e desenvolvimento de diagramas de fluxo.
  • Interfaces do Usuário: Recriação de GUIs complexas para melhorar a interação usuário-sistema.

Técnicas e Métodos

  • Semiautomatização usando ferramentas de análise de código.
  • Desenvolvimento de modelos comportamentais para entender interações de usuário.
  • Transformações de estrutura de dados para suportar novos modelos de banco de dados.

Desafios e Considerações

  • Complexidade aumentada em sistemas grandes.
  • Necessidade de compatibilidade com sistemas legados.
  • Revisão constante de especificações existentes versus implementação real.

Suporte Proativo de Software

  • Adaptação às demandas mutantes dos clientes.
  • Correção de defeitos antes que se tornem emergências.
  • Criação de ferramentas e processos para identificar e resolver questões antes que se tornem problemas.
  • Monitoramento de indicadores de qualidade do software.
  • Reestruturação ou refatoração para melhorar a qualidade.
  • Planejamento para aposentar o produto e criar substituto antes que clientes o abandonem.
  • Semelhança com monitoramento e mitigação de riscos.
  • Uso de indicadores para prever problemas de qualidade.

Refatoração

  • Refatoração (ou reestruturação) de software modifica código-fonte e/ou dados para facilitar futuras alterações.
  • Foco em detalhes de projeto de módulos e estruturas de dados locais.
  • Não altera a arquitetura geral do programa, a menos que envolva engenharia direta

Condições para Refatoração

  • Arquitetura básica sólida.
  • Partes técnicas internas necessitam de retrabalho.
  • Partes reparáveis do software precisam de modificação mais extensa.

Objetivos da Refatoração

  • Melhorar legibilidade do código.
  • Simplificar estruturas complexas.
  • Reduzir duplicação de código.
  • Facilitar a manutenção futura.

Técnicas de Refatoração

  • Extração de Método: Transformar parte do código em um novo método.
  • Inserção de Método: Mover código para um novo método.
  • Método de Objeto: Mover código para outro objeto.
  • Método de Colocação: Mover método dentro da classe.
  • Método de Coleta: Transformar em campos internos e converter em métodos.

Ferramentas de Refatoração

  • Automática: IDEs modernas oferecem ferramentas automatizadas.
  • Manual: Conhecimento técnico é uma ferramenta complexa existente.

Evolução de Software

Justificativa para Reengenharia

  • Custo de Manutenção: Manter uma linha de código pode custar 20 a 40 vezes mais do que seu desenvolvimento inicial.
  • Benefícios de Reprojeto: Facilita manutenção futura com arquitetura e estrutura de dados modernas.
  • Produtividade Aprimorada: Experiência do usuário e protótipo existente aumentam a produtividade de desenvolvimento.

Estratégias de Reengenharia

  • Princípio de Pareto: Aplicação da reengenharia aos 20% do software responsáveis por 80% dos problemas.
  • Ferramentas Automatizadas: Facilitam partes do trabalho de reengenharia ou evolução de software.

Engenharia Reversa

  • Definição: Processo de analisar um programa para criar uma representação em nível mais alto de abstração do que o código-fonte.
  • Objetivo: Recuperar o projeto original do software, entender a estrutura e a lógica subjacente.

Ferramentas e Métodos

  • Ferramentas de Engenharia Reversa: Automatizam a extração de informações sobre dados, arquitetura e procedimentos do programa existente.
  • Análise de Código: Avaliação detalhada das estruturas de dados, fluxos de controle e interações do software.