Mineração de Repositórios de Software: A Computação ajudando à Computação.

 

por Methanias Colaço Júnior

 

 

Caros Leitores,

 

neste artigo, introduziremos e apresentaremos as possibilidades de descoberta de conhecimento em projetos de softwares, imprescindíveis para tomada de decisão de seus Gerentes.

 

Nos últimos dez anos, com a coleta intensiva de dados e conseqüente explosão de informações disponíveis nas diversas áreas da ciência, a mineração de dados tem se apresentado como uma abordagem importante para descoberta de tendências e padrões previamente desconhecidos em repositórios de dados. Entretanto, técnicas de mineração precisam ser desenvolvidas ou adaptadas para tarefas e domínios específicos. Na Engenharia de Software (ES) não é diferente, necessita-se de abordagens específicas para se minerar os dados que são provenientes da construção de software.

 

Entre as fontes de dados passíveis de análise podemos citar: bases de código estático, histórico de versões do software, rastros de execução de programas, relatórios de erros, listas de discussão e logs de implantação de sistemas. Mas como esses dados são armazenados ?

 

Durante a manutenção e o desenvolvimento de software, programadores escrevem novo código, relatórios, acrescentam novas funcionalidades ao software, corrigem defeitos, discutem as alterações através de listas de discussão e e-mails, entre outras atividades. Atualmente, a utilização de ferramentas de software integradas e acopladas às atividades de desenvolvimento tem crescido consideravelmente, permitindo que sejam armazenados dados do processo de desenvolvimento automaticamente. É possível recuperar esses dados e transformá-los em informação valiosa para o aperfeiçoamento do processo de desenvolvimento. Assim como fontes de outras áreas, os dados da Engenharia de Software podem ser minerados, resultando no descobrimento de padrões e regras que podem melhorar a qualidade dos softwares desenvolvidos, bem como aumentar a produtividade dos mesmos.

 

Diversas tarefas podem ser auxiliadas. Vejamos algumas delas:

 

Programação

 

Se pensarmos em nível de construção de software, existem questionamentos básicos que acompanham um programador em suas tarefas de desenvolvimento, enumeramo-los:

 

·         Qual a categoria do software ?. Para aprendizado das melhores práticas e para promoção do reuso;

·         Como usar uma API (Application Program Interface) corretamente ?;

·         Como invocar um objeto ou um método do mesmo ?;

·         Como lidar com um método antes e depois da execução do mesmo ?;

·         Quais componentes devem ser reusados e qual a melhor maneira de reusá-los ?  Devem ser usados de forma combinada ?;

·         Como o código foi alterado em outras versões ?.

 

Desta forma, a mineração de dados pode ajudar, por exemplo, a: (1) Identificar características de uso de uma API ou framework automaticamente; (2) Manter os padrões de uso atualizados, baseando-se sempre na mais nova versão da API ou framework; (3) Identificar padrões que abranjam casos de herança em frameworks.

 

Detecção de defeitos

 

Todo sistema segue algumas regras para se manter correto, contudo, na maioria das vezes, essas regras não são documentadas. A derivação dessas regras requer um conhecimento prévio muito grande e as técnicas de mineração de dados podem ajudar a inferir essas regras do código-fonte.

 

Por exemplo, muitos erros em programação são causados pela falta de combinação indispensável de alguns métodos. Uma ocorrência clássica é a chamada de um método para desalocar memória por uma estrutura de dados que não foi instanciada e vice-versa (malloc, free). Em outras palavras, defeitos podem ser detectados pela ausência do padrão inferido de combinação, sendo corrigidos com apenas uma alteração no código-fonte.

 

Depuração

 

Diversas aplicações, principalmente as de código aberto, possuem repositórios de erros, os quais possuem relatórios dos erros e possíveis soluções. Estes relatórios consomem tempo de desenvolvimento e muitas vezes são duplicados, contudo, são um compendio valioso de informações.

 

Desta forma, técnicas de mineração podem ser utilizadas para tentar predizer se há probabilidade da geração de um erro, dado um estado S de um programa e um evento E.

 

Manutenção

 

Toda manutenção de software se inicia em um ponto específico do programa. Minerar dados do histórico de alterações armazenado em sistemas de controle de versão pode ajudar programadores com sugestões do tipo: “Programadores que alteraram esse método também alteraram o(s) método(s) ...”.

 

Isso pode ser utilizado em granularidades maiores, tais como diretórios, módulos e arquivos, bem como em granularidades menores, tais como métodos, seções ou variáveis.

 

Vejamos a seguir dois exemplos de ferramentas de mineração de software.

 

ChangeMiner (http://sites.google.com/site/frchico/changeminer)

 

O ChangeMiner usa regras de associação para minerar o histórico de versões e orientar programadores com sugestões do tipo: “Programadores que alteraram esse módulo também mudaram o(s) módulo(s)...”. Dado um conjunto de mudanças existentes, regras sugerem e predizem mudanças prováveis, identificam acoplamentos e previnem erros provenientes de mudanças incompletas.

 

NeuroMiner (www.neurominer.com)

 

O Neurominer é um ambiente que utiliza os princípios da Programação Neurolinguística para extrair das listas de discussão de um projeto o canal cognitivo mais usado pelos desenvolvedores (Sistema de Representação Preferencial (SRP) Contextual). Isso ajuda na tomada de decisão de alocação de desenvolvedores, bem como traça o perfil psicológico de cada colaborador ou cliente da organização, fazendo-se uso de qualquer texto que represente uma manifestação dos mesmos.

 

Em novos artigos, abordaremos como melhorar a qualidade dos dados de repositórios de sistemas através de Data Warehousing para Engenharia de Software. Além disso, a mineração de textos também será abordada em breve.

 

Abraços,

 

Methanias