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)
- Use sprints para organizar o trabalho de manutenção.
- Permita que solicitações urgentes dos clientes interrompam sprints de manutenção.
- Facilite o aprendizado da equipe com mentoria de desenvolvedores experientes.
- Permita que múltiplos membros aceitem solicitações e coordenem seu processamento.
- Equilibre o uso de documentação por escrito com comunicação presencial.
- Escreva casos de uso informais para complementar outras documentações.
- Desenvolvedores devem testar o trabalho uns dos outros.
- Assegure que os desenvolvedores compartilhem conhecimentos entre si.
- 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.