Prevenção, correção, evolução e adaptação

Realizar manutenções no software é uma atividade comum no ciclo de vida de desenvolvimento. Ao contrário do que muitos usuários julgam, a manutenção não se resume somente na correção de bugs que o software apresenta. A atividade de manutenção, em sua totalidade, se divide em quatro vertentes que serão abordadas neste artigo: prevenção, correção, evolução e adaptação.

Uma das maiores responsabilidades de um programador é sempre manter o software funcionando. Isso significa tratar os bugs e compreender as mudanças exigidas pelo usuário final. Implicitamente, o verbo “manter” já nos passa a ideia de que o software deve estar sempre funcional, voltado para as exigências da regra de negócio. Neste contexto, para facilitar a identificação das alterações, prioridades, responsabilidades e estimativas, a manutenção do software pode ser dividida em quatro aspectos, detalhados a seguir.

Prevenção

Esse tipo de manutenção, na verdade, é uma forma de prevenir que novas manutenções no software sejam necessárias! A prevenção envolve implementações que visam preparar o software para diferentes situações, independente do ambiente em que estiver sendo utilizado. Ao realizar manutenções de prevenção, evitamos que o software reproduza novos erros e o coordenamos para recuperar-se diante de imprevistos.

Um exemplo de prevenção é implementar uma funcionalidade de exportação de dados não somente para o Microsoft Office, mas também para outros pacotes, como o OpenOffice ou LibreOffice. Mesmo que todos os clientes atuais utilizem somente o pacote da Microsoft, há a possibilidade de novos clientes utilizarem produtos diferentes e, dessa forma, o software já estará preparado para trabalhar com essas diferenças. Outro exemplo é implementar funcionalidades que funcionem em diferentes versões do Windows, caso o software faça uso de APIs do sistema operacional.

Vale lembrar que os testes de software é uma atividade importante nesse tipo de manutenção.

Correção

Como o próprio nome diz, a correção visa solucionar os problemas encontrados no software, subdivididos em erros, defeitos e falhas. Antes de prosseguir, é importante ressaltar a diferença entre estes três tipos. Como exemplo, suponha que estamos lidando com uma funcionalidade para emissão de um relatório no software:

  • Defeito: ocorre quando o software não executa corretamente uma função (Ex: nada acontece ao clicar no botão “Relatório”);
  • Falha: consiste em um comportamento diferente do esperado (Ex: o relatório exibe dados incorretos ou inconsistentes);
  • Erro: desvios na implementação que podem causam exceções ou comportamentos não previstos (Ex: o software exibe uma mensagem de erro ao clicar no botão “Relatório”, devido a um objeto que foi instanciado incorretamente).

Os problemas reportados pelos usuários geralmente entram nessa categoria, já que impedem o software de realizar algum tipo de processamento satisfatoriamente. Quando comparada aos outros tipos de manutenção, a correção ganha prioridade nos backlogs e representam a maior porcentagem no ciclo de iteração do software.

O índice de correções pode ainda ser bastante útil para calcular métricas do software, gerando dados ou gráficos que exibam a produtividade dos desenvolvedores, bem como a tendência do número de erros, falhas e defeitos no produto. Essas métricas podem apoiar gestores nas tomadas de decisão e no controle do fluxo de implementações.

Evolução

A evolução abrange as novas funcionalidades exigidas pelo cliente e as possíveis alterações solicitadas, após serem devidamente analisadas e validadas. Tais funcionalidades e alterações, algumas vezes, consistem em aprimorar o valor que o software traz ao negócio, como um novo relatório gerencial, uma tela nova de estatísticas ou o desenvolvimento de um processo para simplificar as tarefas do usuário. Quando realizamos estes incrementos, podemos dizer que estamos “evoluindo” o software em termos de abrangência da regra de negócio, claro, buscando sempre a satisfação dos usuários.

Ao mesmo passo que a evolução traz a ideia de “expansão”, essa manutenção também aborda ajustes no software que podem reduzir a dimensão do produto, como, por exemplo, um novo requisito que exija a condensação de dois relatórios em apenas um. Neste caso, um dos relatórios poderá ser descartado do software, já que não será mais utilizado.

Adaptação

A adaptação, por sua vez, também é uma forma de evolução, mas recebe um foco mais crítico. Alterações em sistemas tributários, financeiros e contábeis podem exigir que o software sofra adaptações para entrar em conformidade com as regulamentações. Por exemplo, muitos devem se lembrar da época em que a Nota Fiscal Eletrônica passou a ser obrigatória. Antes disso, grande parte dos softwares emitiam notas fiscais em formulários impressos, normalmente utilizando impressoras matriciais. Essa exigência do governo resultou em uma adaptação brusca dos softwares comerciais para entrar nesse novo modelo.

Baseado neste exemplo, observe que, embora seja uma evolução, a adaptação tem origem de um fator externo (muitas vezes obrigatório) como leis, regras e padronizações. O mesmo ocorre quando o software deve ser adaptado para disponibilizar interfaces para dispositivos móveis, em virtude da necessidade dos usuários.

Extra: Refatoração

Pois bem, além dos quatro tipos de manutenção descritos acima, há também uma atividade que eu chamaria de refatoração do código-fonte. Apesar de lembrar o processo de evolução, essa atividade não envolve o desenvolvimento de novas funcionalidades, mas o aperfeiçoamento das funcionalidades existentes. Dentro dessa categoria, poderíamos incluir a redução da dívida técnica, refatoração de métodos complexos e qualquer alteração que tenha como objetivo melhorar o desempenho do software, como a utilização de padrões de projeto.

 

Para gerenciar os tipos de manutenção, é importante que a empresa utilize ou desenvolva alguma ferramenta que realize estimativas de esforço e tempo, e que seja adequada para controlar as alterações vinculadas ao incremento do software, principalmente as prioritárias.
Em algumas empresas, a divisão entre os tipos de manutenção também pode estimular a criação de diferentes equipes de desenvolvimento, como a equipe de correção, evolução e refatoração. Dessa forma, cada equipe pode ter seu próprio ciclo de iteração (Sprint, no Scrum) para contribuir com um número maior de implementações dentro do mesmo prazo.

Bem, espero ter sido claro neste artigo!
Obrigado pela atenção, pessoal! Até a próxima semana.


André Celestino