6. DISCUSSION OF THE FINDINGS AND CONCLUSIONS
6.3 T HE QUALITY AND RELEVANCE OF ABE
6.3.2 The role of `value quality´
Segundo Grubb e Takang (2003, p.55) manutenções corretivas e preventivas acontecem periodicamente, a um custo relativamente baixo, porém incremental. Com poucas exceções, requisições de manutenções adaptativas e perfectivas também ocorrem intermitentemente, ao custo de uma fração do desenvolvimento de um novo sistema. No longo prazo, o custo total dessas manutenções representa um valor considerável ao longo do ciclo de vida do sistema. No curto prazo, entretanto, a organização pode preferir gastar com as pequenas manutenções de custo comparativamente baixo enquanto realiza outros projetos mais ambiciosos e que demandem mais recursos financeiros.
Estudos mostram uma evolução histórica dos custos da manutenção. Segundo Pigoski (1996) e Pfleeger (2001) 80% dos custos de um software referem-se à manutenção. A Figura 3 mostra a evolução histórica desses custos, indo de 40% na década de 70 e chegando a 90%, no início dos anos 90, indicando um aumento progressivo da atividade de manutenção. Os problemas e dificuldades enfrentados durante a manutenção, alguns deles identificados anteriormente, contribuem significativamente para o aumento dos custos da manutenção dos sistemas.
A evolução do sistema, assim como a evolução do software é inerentemente onerosa por várias razões (Sommerville, 2007, p.23):
As mudanças propostas precisam ser analisadas com muito cuidado, tanto da perspectiva de negócios como do ponto de vista técnico. Essas mudanças precisam contribuir com os objetivos do sistema e não devem simplesmente ocorrer por motivos técnicos. Elas também devem ser aprovadas por uma série de pessoas antes de serem efetivadas (Sommerville, 2007, p.30).
Como os subsistemas nunca são totalmente independentes, as mudanças em um subsistema podem afetar desfavoravelmente o desempenho e o comportamento de outros subsistemas. Portanto, mudanças posteriores nesses subsistemas podem ser necessárias.
Os motivos das decisões do projeto original geralmente não são registrados. Os responsáveis pela evolução do sistema precisam imaginar por que determinadas decisões de projeto foram tomadas.
À medida que os sistemas “envelhecem”, sua estrutura é corrompida por mudanças e, dessa forma, o custo de novas mudanças aumenta.
Uma razão importante pela qual os custos de manutenção são altos é que é mais dispendioso acrescentar uma funcionalidade depois que o sistema estiver em operação do que implementar a mesma funcionalidade durante o seu desenvolvimento. Os principais fatores que distinguem o desenvolvimento e a manutenção e que levam a custos de manutenção mais altos são (Sommerville, 2003, p.520):
Estabilidade da equipe – Depois de um sistema ter sido entregue, é normal a equipe de desenvolvimento se dispersar para trabalhar em novos projetos. A nova equipe ou os indivíduos responsáveis pela manutenção do sistema não compreendem o sistema ou o background das decisões de projeto do sistema. É necessário bastante esforço durante o processo de manutenção, a fim de compreender o sistema existente, antes de implementar mudanças nele.
Responsabilidade contratual – O contrato para fazer a manutenção de um sistema, geralmente, é separado do contrato de desenvolvimento do sistema. O contrato de
estabilidade da equipe, significa que não há nenhum incentivo para uma equipe de desenvolvimento escrever o software de maneira que seja fácil de ser modificado. Se uma equipe de desenvolvimento puder optar pela simplificação, a fim de economizar esforço durante o desenvolvimento, vale a pena que proceda dessa maneira, mesmo que isso signifique aumento dos custos de manutenção.
Habilidade da equipe – O pessoal de manutenção, freqüentemente, tem pouca experiência e não está familiarizado com o domínio da aplicação. A manutenção tem uma imagem ruim entre os engenheiros de software. Ela é vista como um processo que requer menos habilidade do que o desenvolvimento do sistema e geralmente é designada para o pessoal mais novo. Além disso, os sistemas podem ter sido escritos em linguagens de programação obsoletas. O pessoal da manutenção pode não ter muita experiência do desenvolvimento com base nessas linguagens e precisa aprendê-las para fazer a manutenção do sistema.
Idade e estrutura do programa – À medida que os programas envelhecem, suas estruturas tendem a se tornar mais difíceis de ser entendidas e modificadas. Além disso, muitos sistemas legados foram desenvolvidos sem as modernas técnicas de engenharia de software. Elas nunca foram bem estruturadas e eram freqüentemente otimizadas com vistas à eficiência, e não à facilidade de compreensão. A documentação dos sistemas antigos pode não ter passado pelo gerenciamento de configuração; assim, perde-se tempo procurando as versões certas dos componentes de sistema que devem ser modificados.
Os primeiros três problemas surgem do fato de que muitas organizações ainda fazem distinção entre o desenvolvimento e a manutenção de sistemas. A manutenção é vista como uma atividade de segunda classe e não há nenhum incentivo em gastar dinheiro durante o desenvolvimento para reduzir os custos de modificação no sistema. A única solução no longo prazo para esse problema é aceitar que os sistemas raramente têm um tempo de vida útil definido, mas continuam em uso, de alguma maneira, por um período indefinido (Sommerville, 2003, p.521).
Segundo Sommerville (2003, pp.498-499), manter sistemas em uso evita os riscos de substituição por novos sistemas, no entanto alterar um software existente torna-se mais dispendioso à medida que o sistema se torna mais velho. Os sistemas legados são particularmente dispendiosos no que se refere a fazer alterações, por diversas razões:
Diferentes partes do sistema foram implementadas por diferentes equipes. Portanto, não há um estilo de programação consistente em todo o sistema.
Parte do sistema ou todo o sistema pode ser implementado com a utilização de uma linguagem de programação obsoleta. Pode ser difícil encontrar pessoal que tenha conhecimento dessa linguagem. Além disso, pode ser necessário um gasto dispendioso com a manutenção do sistema.
Freqüentemente a documentação do sistema é inadequada e desatualizada. Em alguns casos, a única documentação é o código-fonte do sistema. Algumas vezes, o código-fonte foi perdido e somente a versão executável do sistema está disponível. Em geral, muitos anos de manutenção podem ter corrompido a estrutura do sistema,
tornando-o cada vez mais difícil de ser compreendido. É possível que novos programas tenham sido acrescentados e que tenham sido criadas interfaces destes com outras partes do sistema, de acordo com a necessidade.
O sistema pode ter sido otimizado para melhorar o uso de espaço ou a velocidade de execução em vez de ter sido escrito para facilitar a compreensão. Isso acarreta dificuldades específicas para os programadores que aprenderam modernas técnicas de engenharia de software e que não foram expostos a truques de programação. Os dados processados pelo sistema podem estar armazenados em diferentes
arquivos, que podem ter estruturas incompatíveis. É possível que alguns dados tenham sido duplicados ou estejam desatualizados, inexatos ou incompletos.
Polo, Piatini e Ruiz (2003, p.vi) afirmam que a manutenção é o estágio mais oneroso do ciclo de vida do software, uma vez que novos ambientes e tecnologias requerem grandes esforços de manutenção para manter os sistemas em operação e, segundo esses autores, não há motivos para pensar que esta situação irá se modificar.
A observação de Sommerville (2003) remete à motivação desta pesquisa. Manter um sistema não é uma decisão trivial e puramente técnica. Os gestores devem ser capazes de justificar os investimentos em manutenção de sistemas legados através de métodos de avaliação de investimento, para então decidir se vale à pena investir esforços e recursos para manter um sistema atualizado em vez de desenvolver um novo que o substitua.