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