U NIVERSIDADE F EDERAL DE G OIÁS I NSTITUTO DE I NFORMÁTICA M ARCELLO H ENRIQUE D IAS DE M OURA Comparação entre Desenvolvedores de Software a partir de Dados Obtidos em Repositório de Controle de Versão Goiânia 2013 M ARCELLO H ENRIQUE D IAS DE M OURA Comparação entre Desenvolvedores de Software a partir de Dados Obtidos em Repositório de Controle de Versão Dissertação apresentada ao Programa de Pós–Graduação do Instituto de Informática da Universidade Federal de Goiás, como requisito parcial para obtenção do título de Mestre em Computação. Área de concentração: Mineração de Dados. Orientador: Prof. Dr. Hugo Alexandre Dantas do Nascimento Co-Orientador: Prof. Dr. Thierson Couto Rosa Goiânia 2013 Todos os direitos reservados. É proibida a reprodução total ou parcial do trabalho sem autorização da universidade, do autor e do orientador(a). Marcello Henrique Dias de Moura Possui graduação em Sistemas de Informação pela Faculdade Sul-Americana. É Técnico em Tecnologia da Informação do Centro de Recursos Computacionais da Universidade Federal de Goiás e colaborador da Associação do Software Livre de Goiás. Tem experiência na área de Ciência da Computação, atuando principalmente nos seguintes temas: Visualização de Informação, Recuperação de Informações, Desenvolvimento de Software, Ensino a Distância e Gerência de Projetos. Dedico este trabalho àqueles que direta ou indiretamente contribuíram com seu resultado, através de momentos de reflexão, apoio ou palavras que me deram força e me sustentaram nos momentos difíceis. Em especial dedico a meu filho, quando seus abraços me alimentaram para batalhas diárias, e a minha esposa, mesmo quando não se continha e me cobrava a atenção que a privei. Dedico ainda aos meus amigos. Se sentirem alguma dúvida quando lerem estas linhas, tenham certeza! Vocês são importantes em minha vida. Agradecimentos Agradeço ao Prof. Hugo Alexandre Dantas do Nascimento, um visionário a frente de seu tempo, que confiou em meu trabalho e em minha força de vontade para superar os momentos difíceis porém necessários da vida. Sempre dando espaço para superar minhas deficiências e acreditando em mim, quando eu mesmo já não acreditava. Ao Prof. Thierson Couto Rosa, uma pessoa extremamente sensata, agradável e inspiradora com quem tive a oportunidade trabalhar. Me esforço para estar à altura de suas espectativas. Que nesses momentos difíceis minhas vibrações positivas possam tê-lo alcançado servindo de alento. Aos meus amigos Ole Peter, Danilo Inácio, Nícolas Lazarte e Túlio Gonçalves, quando me ajudaram tecnicamente, quando buscava inspiração ou quando tinham paciência em escutar minhas explicações de ensaio. Aos gerentes de projeto Leonardo Ribeiro e Euler Sena que participaram nos estudos de caso realizados para avaliação do presente trabalho. À Universidade Federal de Goiás que tanto inspira e constrói. E, por último, a outros amigos e familiares, com quem sinto em sintonia. “A melhor parte da vida de uma pessoa está nas suas amizades” 16o Abraham Lincoln, Presidente dos Estados Unidos. Resumo de Moura, Marcello Henrique Dias. Comparação entre Desenvolvedores de Software a partir de Dados Obtidos em Repositório de Controle de Versão. Goiânia, 2013. 123p. Dissertação de Mestrado. Instituto de Informática, Universidade Federal de Goiás. Repositórios de Controle de Versão são sistemas que armazenam mudanças no código fonte realizadas por desenvolvedores de software. As pesquisas que extraem dados desses repositórios para análise podem ser classificadas em dois grupos: as que focam no processo de desenvolvimento e as que focam no desenvolvedor. O presente trabalho investiga o segundo aspecto contribuindo para o assunto com: (a) a definição de um histórico de arquivos que sumariza as mudanças realizadas no software em nível de linha e de arquivo; (b) um conjunto de métricas visando avaliar o trabalho dos desenvolvedores; e (c) duas propostas de abordagem para comparar os desenvolvedores. Um sistema computacional que implementa essas métricas e as abordagens foi construído, tendo sido aplicado em dois estudos de casos envolvendo projetos reais de desenvolvimento de software. Os resultados obtidos nos estudos foram positivos, coincidindo, em geral, com a percepção de gerentes de projetos sobre o trabalho dos desenvolvedores e apontando para novas ideias de evolução da pesquisa. Consideramos que este é um passo no sentido de entender e caracterizar melhor a forma de trabalho dos desenvolvedores. Palavras–chave Desenvolvimento de Software, Comparação entre Desenvolvedores, Repositório de Código Fonte, Sistema e Controle de Versão, Métricas, Visualização de Informações. Abstract de Moura, Marcello Henrique Dias. Comparison of Software Developers from Data Obtained from Version Control Systems. Goiânia, 2013. 123p. MSc. Dissertation. Instituto de Informática, Universidade Federal de Goiás. Version Control Systems are repositories that store source code changes done by software developers. Research that extracts data from these repositories for analysis can be classified into two groups: those that focus on the development process and the ones that focus on the developers. The present dissertation investigates the second case and contributes to the field by providing: (a) the definition of a history file that summarizes changes made to software in line and file levels, (b) a set of metrics to evaluate the work of the developers; and (c) two approaches for comparing the developers based on their metrics. A computational system that implements these metrics and approaches was built and applied to two case studies of real software development projects. The results obtained in the studies were positive. They were consistent with the general perception of project managers about the work done by the developers. They also leaded to new ideas for improving the research. We believe that these contributions are a step towards a better understanding and characterization of the way about how software developers work. Keywords Software Development, Comparison Between Developers, Source Code Repositories, Version Control System, Metrics, Information Visualization. Sumário Lista de Figuras 11 Lista de Tabelas 13 Lista de Algoritmos 14 1 15 17 17 Introdução 1.1 1.2 2 Revisão Bibliográfica 2.1 2.2 2.3 3 3.3 2.3.1 Trabalhos com foco no processo de desenvolvimento 2.3.2 Trabalhos com foco no desenvolvedor 2.3.3 Aspectos Gerais Definições básicas Conjunto de Métricas 3.2.1 Sobre aspectos individuais 3.2.2 Sobre o relacionamento entre desenvolvedores 3.2.3 Ampliação das métricas para análise em arquivo Comentários gerais Comparação entre Desenvolvedores 4.1 4.2 5 Dificuldades inerentes ao desenvolvimento de software Estudo sobre Sistemas de Controle de Versão Trabalhos que fazem uso de sistemas de controle de versão Métricas para Desenvolvedores 3.1 3.2 4 Objetivos Organização da dissertação Classificação por desempenho Comparação por similaridade Sistema Desenvolvido 5.1 5.2 5.3 Tecnologias utilizadas Etapas de Funcionamento do Sistema 5.2.1 Geração do Histórico 5.2.2 Cálculo das Métricas 5.2.3 Produção dos Dados de Comparação Visualizações desenvolvidas para análise 5.3.1 Visualização de relacionamento entre desenvolvedores 5.3.2 Visualização de cobertura de métricas 18 18 19 21 21 27 37 42 42 44 44 48 50 53 56 56 58 63 63 64 64 67 68 69 69 70 5.4 6 Dificuldades na Implementação Avaliação 6.1 6.2 6.3 6.4 Metodologia para os estudos de casos Estudo de Caso 1 6.2.1 Entrevista 6.2.2 Análise e interpretação dos resultados 6.2.3 Análise para outras métricas Estudo de Caso 2 6.3.1 Entrevista 6.3.2 Análise e interpretação dos resultados 6.3.3 Análise para outras métricas Outros Aspectos 71 73 73 76 78 79 80 81 83 84 84 85 Trabalhos Futuros 90 90 Referências Bibliográficas 92 A Apêndice 98 B Apêndice 111 7 Conclusão 7.1 Lista de Figuras 2.1 Coeficiente de agrupamento (clustering coefficient) de módulos do projeto Apache (topo) e Gnome (base) coletadas em fevereiro de 2004. Grafo do projeto Filezilla onde os nós representam os desenvolvedores. Visualização para identificar especialista em partes do código onde vários padrões de comportamento são apresentados. Visualização de evolução de código em nível de arquivos com CVSgrab. Visualização de evolução de código em nível de linhas com CVSscan. Visualização denominada Expertise Browser que apresenta especialista em partes do código fonte em projetos de software. Papéis geralmente desempenhados por desenvolvedores em projetos de Software Livre. Visualização denominada CodeSaw. Uma caixa de sugestão de especialistas e formas de contactá-los a partir de dados extraídos de SCV. Relação entre um grupo de desenvolvedores gerada pela computação de similaridades, provenientes do desenvolvimento de um componente do Eclipse. Apresentação dos clusters do projeto jEdit gerados pelo algoritmo EM (Expectation Maximization). Uma extração de informações a partir do SCV, do SAP e do próprio código fonte. Rede de desenvolvedores em colaboração no desenvolvimento de software do projeto Eclipse DTP. 36 3.1 Organização dos elementos em um histórico de projeto. 43 4.1 4.2 Exemplo de separação em classes de dominância. Exemplo do MDS em um agrupamento de pessoas com preferências em comum. Exemplo de uma Matrix Scatter Plot. 57 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 2.13 4.3 5.1 5.2 5.3 5.4 5.5 Descrição de cada processo para análise de desenvolvedores a partir da mineração de repositório. Apresentação de três painéis de métricas. Visualização de um processo de identificação de cobertura de métricas. Problema encontrado no arquivo de diferenças gerado pelo Subversion. Problema encontrado em operações inconsistentes geradas pelo Subversion. 23 25 26 27 28 29 30 31 32 33 34 35 59 62 64 70 71 72 72 6.1 6.2 6.3 6.4 6.5 6.6 Resultado MDS para o projeto Weby. Duas imagens comparando o MDS para conjunto distindo de métricas referentes ao projeto Weby. Resultado MDS para o projeto Solicite. Duas imagens comparando o MDS para conjunto distindo de métricas referentes ao projeto Solicite. Imagens do MDS para várias configurações de entrada do Algoritmo 4.2. Imagens do MDS para propostas diferentes de normalização das métricas. 78 80 82 85 88 89 Lista de Tabelas 2.1 2.2 As gerações dos principais Sistemas de Controle de Versão. Relação dos artigos relacionados. 20 40 3.1 Relação das métricas absolutas definidas. 54 4.1 Exemplo de uso do MDS em um conceito minimalista. 59 6.1 6.2 Formulário utilizado nas entrevistas dos estudos de caso. Informações gerais sobre o projeto Weby. Total de commits, arquivos e linhas adicionados, modificados e removidos. Conjunto de métricas selecionadas e resultados para o projeto Weby. Resultados da classe de dominância para o projeto Weby. Informações gerais sobre o projeto Solicite. Total de commits, arquivos e linhas adicionados, modificados e removidos. Conjunto de métricas selecionadas e resultados para o projeto Solicite. Resultados da classe de dominância para o projeto Socilite. Tabela de informações sobre o resultado de seleção de métricas. 75 6.3 6.4 6.5 6.6 6.7 6.8 77 77 77 81 82 82 87 Lista de Algoritmos 3.1 4.1 4.2 5.1 5.2 Algoritmo Esfo_Dist_Mod(d): produz a métrica de Esforço Distinto de Modificação. Algoritmo Divisão_em_Classes(D ): seleciona um conjuto de desenvolvedores em classes onde cada classe não é dominada por outra. Algoritmo Seleção_de_Métricas(correl, limite, F ): seleciona um conjuto de métricas não correlacionadas a partir de uma matriz de correlação e um limiar. Algoritmo Constrói_Histórico_Projeto(SP ): extrai dos registros de um Sistema de Controle de Versão e constrói um histórico de projeto. Algoritmo Atualiza_Histórico(Ha , v, d, X ): atualiza histórico de arquivo. 47 58 61 66 67 CAPÍTULO 1 Introdução Diante da crise mundial e obviamente dos fatores de produção limitados e recursos naturais finitos, muitos países tem buscado aproveitar melhor seus insumos, otimizando seus processos e reduzindo custos. A tecnologia diretamente ligada a inovação é um mecanismo para redução de custos e otimização de processos pois permite a ampliação dos negócios em uma vasta gama de possibilidades. Vários setores da economia utilizam da tecnologia para ampliar sua participação no mercado e desenvolver mais (produtos) com menos (recursos). A Tecnologia da Informação (TI), em especial, deixou de ser luxo para se tornar necessidade e o desenvolvimento de programas de computador (software) é hoje essencial, visto a economia e qualidade de vida que potencialmente pode gerar [10]. Empresas privadas utilizam-se de software para fomentar seus processos. Muitas delas, que antes eram meras usuárias, agora desenvolvem seus próprios software trazendo diferenciais para o mercado diante da necessidade cada vez mais crescente de personalização para continuar inovando e ter competitividade diante da concorrência. O governo brasileiro, por sua vez, também vem investindo gradativamente em tecnologia da informação e identificou gastos financeiro substanciais com o pagamento de licenças de software a países de primeiro mundo [32]. Para impedir esse escoamento, o governo decidiu fomentar o uso do Software Livre criando projetos como o Portal do Software Público 1 , o qual reúne projetos nacionais de inovação tecnológica. Na América do Norte, em torno de 1,1 milhões de desenvolvedores investem parte do seu tempo no fomento ao Software Livre [14]. Existe uma certa dificuldade inerente ao processo de desenvolvimento, tanto na análise do código fonte, que é a matéria prima de todo software, quanto nas relações entre os desenvolvedores que produzem o código. Alguns fatores complicadores são: a comunicação entre as pessoas ou equipes, a grande quantidade de projetos e os recursos humanos envolvidos, além da possibilidade dos locais de trabalho estarem geograficamente distribuídos. 1 http://www.softwarepublico.gov.br 16 Quanto ao fator de comunicação, pesquisas estimam que pelo menos 70% do tempo dos desenvolvedores é usado com essa atividade [12]. Para melhorar o processo de comunicação e difusão do conhecimento, fábricas de software com alto fluxo de tarefas investem no trabalho colaborativo através das redes sociais. As redes sociais já estão bem difundidas, existindo inclusive redes sociais de pesquisadores 2 e específicas de desenvolvedores de software [34, 19, 8], tendo os Repositórios ou Sistemas de Controle de Versão (SCVs) como centro de interesse comum. Os SCVs, comumente chamados de versionadores, são sistemas para auxiliar o desenvolvimento de outros sistemas através do registro das mudanças ocorridas nos mesmos durante o processo de desenvolvimento. Sobre os demais fatores, a elevada quantidade de projetos, de recursos e a distância, também têm exigido a adoção de ferramentas, sendo os SCVs novamente um elemento essencial, pela sua capacidade de facilitar o trabalho remoto e a integração dos resultados produzidos por várias pessoas ou equipes. Atualmente, os SCVs são alvos de estudos, na tentativa de revelar padrões ocultos para servir de apoio no processo de desenvolvimento. A importância em conhecer como o desenvolvedor trabalha para melhor utilizá-lo em projetos futuros é crescente na medida que a demanda por novos serviços de TI aumenta. Com o objetivo de compreender esses padrões ocultos, algumas pesquisas relacionam as alterações do código fonte com sistemas de acompanhamento de problemas (SAP ou também chamados no inglês como Bug Tracking Systems – BTS), para identificar pontos críticos no software a partir da reincidências de problemas. Em alguns casos, as pesquisas ajudam a indicar especialistas naquela parte do código com base em correções prévias feitas pelos desenvolvedores [30, 29]. Outros estudos buscam analisar apenas o código fonte e as mudanças promovidas pontuando e caracterizando os desenvolvedores [53, 54, 24]. Apesar de interessantes, essas pesquisas focam na evolução do código mais do que nas pessoas embora façam alguma avaliação individual ou coletiva dos desenvolvedores. Poucos trabalhos abordam as características do desenvolvedor propriamente dito. Nossa pesquisa vem a contribuir nesse último aspecto, apresentando novas métricas relacionadas ao trabalho dos desenvolvedores e formas de compará-los com o propósito de verificar a similaridade e o desempenho dos mesmos. Na presente dissertação propomos novas métricas que foram formalizadas e desenvolvemos um sistema computacional para aplicá-las em projetos de software reais. Os resultados obtidos com a pesquisa demonstram que é possível, através de métricas extraídas dos SCVs, avaliar os desenvolvedores em vários aspectos de forma a complementar 2 http://www.mendeley.com 1.1 Objetivos 17 ou validar a percepção que os gerentes de projeto de software possuem acerca de sua equipe. 1.1 Objetivos O objetivo principal deste trabalho é apresentar um ferramental composto de históricos, métricas e abordagens comparativas para avaliação de desenvolvedores em projetos de software, tomando como base as interações residentes em SCVs (Sistemas de Controle de Versão). Os objetivos específicos deste trabalho são: • Propor uma estrutura única que armazena toda a história (as mudanças ocorridas) de um arquivo de código fonte e um novo conjunto de métricas individuais e coletivas para avaliar os desenvolvedores. • Sugerir abordagens para comparação entre desenvolvedores com base nas métricas propostas. • Apresentar um sistema computacional que utiliza os conceitos deste trabalho para aplicá-lo a outros projetos de software. 1.2 Organização da dissertação O restante desta dissertação está organizada como segue: o Capítulo 2 traz uma revisão bibliográfica dos principais temas envolvidos no presente projeto. O Capítulo 3 introduz a estrutura de histórico e as novas métricas propostas, baseadas em repositórios de código fonte. O Capítulo 4 descreve formas de comparação entre desenvolvedores por desempenho e por similaridade. O Capítulo 5 apresenta um sistema desenvolvido a partir das métricas identificadas. O Capítulo 6 aborda estudos de casos. Por fim, no Capítulo 7, encontram-se as conclusões e sugestões para trabalhos futuros. CAPÍTULO 2 Revisão Bibliográfica Este capítulo aborda as dificuldades, em geral, inerentes ao desenvolvimento de software, traz um estudo sobre sistemas de controle de versão e apresenta as pesquisas afins ao nosso trabalho. Tais pesquisas foram divididas logicamente em dois grupos: as que focam no processo de desenvolvimento de software e as que focam nos desenvolvedores. Os trabalhos nesse último grupo se preocupam em identificar perfis e/ou papéis para os desenvolvedores a partir de características individuais ou coletivas. Técnicas de visualizações de informação aplicadas a esse domínio do conhecimento e pesquisas que são pertinentes ao assunto são também apresentadas. 2.1 Dificuldades inerentes ao desenvolvimento de software Em 1968 foi realizada em Garmisch, na Alemanha, uma das primeiras conferências sobre engenharia de software promovidas pelo NATO Science Committee [31]. Entre os assuntos tratados estava a dificuldade de desenvolver e manter software. A conferência reuniu mais de 50 pessoas de partes diferentes do mundo que lidavam com software, desde usuários até professores universitários. Foram discutidos temas de grande importância como: a relação entre o software (parte lógica) e o hardware (parte física); desenho arquitetural, produção, distribuição e serviço de software. Algumas questões discutidas na conferência, tais como se o preço do software deveria ser separado do preço do hardware, impulsionou o desenvolvimento de grandes R R empresas conhecidas atualmente (e.g., IBM , MicroSoft ), embora outros assuntos ainda permaneçam em aberto. Já em 1969, na segunda versão da conferência [35], foi relatado que seria prematuro denominar essa nova área de engenharia, em função da complexidade no processo de desenvolvimento de software e da existência de diferenças entre a engenharia comum e a mesma. Algumas dificuldades são: gerir os artefatos produzidos, mensurar todos os processos envolvidos e ainda garantir a qualidade. Frederic Brooks [6, 5] faz 2.2 Estudo sobre Sistemas de Controle de Versão 19 alusão ao folclore concluíndo que não existe bala de prata quando a questão envolve desenvolvimento de software. Todo desenvolvimento de software envolve basicamente três agentes: processos, pessoas e produtos. Os processos são procedimentos necessários para alcançar um objetivo. As pessoas são desenvolvedores capacitados a produzir, através dos procedimento, o produto final, o software. Um bom processo de desenvolvimento envolve ferramentas de apoio, e, entre as várias existentes, destacam-se os Sistema de Controle de Versão. 2.2 Estudo sobre Sistemas de Controle de Versão O código fonte é o elemento principal de qualquer software [48, 36]. Ele pode ser interpretado ou compilado para gerar o resultado almejado. Existe sempre uma motivação para construção de um programa e, seja qual for a finalidade do mesmo, fazer uso de um repositório de código fonte para gerenciar o projeto é essencial. Os repositórios, também conhecidos como Sistemas de Controle de Versão (SCV) ou simplesmente versionadores (e.g., CVS, Subversion, Git), são responsáveis por registrar e facilitar o controle da evolução do software. Tal evolução consiste em mudanças que podem ser de três tipos: alterações, inserções e remoções de linhas ou arquivos do código fonte, seja para acrescentar novas características ao programa ou para corrigir problemas conhecidos (bugs). Além disso, há recursos mais avançados como ramificar um projeto de software ou unificar ramos de desenvolvimento. Para remontar a história dos SCV, voltamos à década de 60 com um marco da computação, a criação do Sistema Operacional Unix. O Unix foi inicialmente desenvolvido em linguagem Assembly e reescrito em linguagem C anos depois. Na década de 70, o Unix foi uma grande influência no meio acadêmico que inspirou a maioria dos sistemas operacionais atuais como BSD, MacOS, Solaris, HP-UX, AIX, Minix, Linux e outros. No processo de desenvolvimento do Unix, como ainda é o caso até hoje, a comunicação entre os desenvolvedores acontece indiretamente pela análise das diferenças entre duas versões de um mesmo arquivo de código fonte. Essa foi a motivação para a criação de uma ferramenta chamada diff por Malcolm Douglas McIlroy, também desenvolvedor do Unix, com base em um artigo publicado com James W. Hunt [22]. A questão original sobre o problema do diff é encontrar a maior subsequência comum ou “Longest Common Subsequence (LCS) Problem”, em inglês, para identificar a posição correta onde ocorreram as inserções ou remoções em um arquivo. Logo em seguida, Larry Wall, o mesmo criador da linguagem de programação Perl, criou uma ferramenta chamada patch para aplicar no código fonte um conjunto de mudanças baseado nas diferenças geradas pelo programa diff. Como o próprio nome diz, 2.2 Estudo sobre Sistemas de Controle de Versão 20 um “patch” é um remendo ou um ajuste do software original. O diff é usado, internamente, pela maioria dos SCV até os dias atuais. O SCCS (Source Code Control System), primeira geração dos SCV, foi desenvolvido nos laboratórios da Bell em 1972 por Marc J. Rochkind [37]. Ele foi massivamente utilizado até a liberação do RCS (Revision Control System) por Walter F. Tichy [47], em 1982, na Universidade de Purdue. Com o passar do tempo, o SCCS foi gradativamente sendo substituído pelo RCS. Apesar das melhorias propostas pelo RCS, ele ainda operava somente com um arquivo de cada vez e não existia um caminho trivial para trabalhar com um projeto (vários arquivos no mesmo contexto). Também, não existia capacidade de acesso pela rede. Em 1985, Dick Grune [20] criou um conjunto de scripts para adicionar novas características ao RCS. Dois anos depois, Brian Berliner [1] reescreveu-os em um único programa feito em linguagem C, que se tornou a base para o CVS (Concurrent Versions System). O CVS potencialmente facilitou o trabalho colaborativo na evolução de um código, permitindo-se trabalhar em um projeto via rede. Inicia-se assim a segunda geração dos SCV, conhecida como a dos versionadores de código fonte modernos. Criada em 1999, a CollabNet iniciou um projeto para substituir o CVS por outro sistema que recebeu o nome de Subversion [33]. A ideia principal era criar um novo versionador a partir das funcionalidades do CVS, porém livre de bugs e com mais recursos. Através de uma articulação entre colaboradores que procuravam algo além das fronteiras do CVS, a CollabNet conseguiu promover uma evolução sem perder o conhecimento adquirido. Dessa forma, um usuário familiarizado com CVS facilmente poderia usar o Subversion por sua similaridade intencional prevista por seus desenvolvedores. Recentemente o Subversion passou a fazer parte do portfólio de projetos da ASF (Apache Software Foundation) 1 . Uma das limitações dos versionadores de segunda geração é seu modelo centralizado. A maioria das operações necessitam de acesso a um servidor central. A mudança desse paradigma permitiu a criação dos versionadores de terceira geração, cuja principal característica é adotar um modelo distribuído e descentralizado 2 . A Tabela 2.1 apresenta os principais SCV e algumas de suas características. Geração Nome do SCV Suporte a Rede Tipo de Operação a 1 SCCS, RCS N.A. Acesso Local a 2 CVS, Subversion Centralizado Cliente-Servidor a 3 Git, Bazaar, Mercurial, BitKeeper Distribuído Descentralizado Tabela 2.1: As gerações dos principais Sistemas de Controle de Versão. 1 http://projects.apache.org 2 http://www.ericsink.com/vcbe/html/history_of_version_control.html 2.3 Trabalhos que fazem uso de sistemas de controle de versão 21 Com o envolvimento de uma grande comunidade de desenvolvedores, os SCV descentralizados emergiram e já estão sendo usados em vários projetos livres e proprietários. Os SCV abrem muitas possibilidades para análise e compreensão tanto do código fonte como do relacionamento entre os desenvolvedores de software, uma vez que estes sistemas registram todo o trabalho efetuado. Além de ferramentas SCV isoladas, incubadoras de projetos como Github [34], GoogleCode [19] e Launchpad [8] fazem uso de SCV internamente. O que então eram simples sistemas de versionamento, tornaram-se ecossistemas complexos 3 e uma grande quantidade de dados estão dispostos para serem analisados. 2.3 Trabalhos que fazem uso de sistemas de controle de versão Uma das vantagens do uso de um SCV é o registro de toda atividade relacionada na evolução do código fonte. Esse registro pode ser minerado automaticamente, sem intervenção humana, para, de alguma maneira, refletir a colaboração no processo de construção dos artefatos de software. Entende-se como artefatos de um software todos os componentes criados para o software em questão, os quais podem ser de documentação, controle, configuração e o código fonte. Diante das facilidades concedidas pelos SCV em utilizar as informações armazenadas em seus repositórios, muitos artigos científicos exploram essas informações no sentido de compreender como a evolução do software acontece através de iterações sobre os artefatos e do relacionamento entre os desenvolvedores. Foram revisados vários artigos científicos que usam de repositórios de código fonte. Esses artigos foram classificados em dois grupos: os que focam no processo de desenvolvimento e os que focam nos desenvolvedores. Os trabalhos nesses dois grupos são descritos nas próximas seções. Ao final, apresentamos a Tabela 2.2 listando os artigos citados. 2.3.1 Trabalhos com foco no processo de desenvolvimento Nesta seção apresentamos as pesquisas que se preocupam com o código fonte para entender a sua evolução e servir de apoio às equipe de desenvolvimento de software na melhoria de seus processos. 3 Além do SCV, tais ambientes possuem também: gerenciador de tarefas, fórum, wiki e outras ferramentas integradas para apoiarem os desenvolvedores no processo de desenvolvimento. 2.3 Trabalhos que fazem uso de sistemas de controle de versão 22 Lopez-Fernandez et al. [28] propuseram uma abordagem de análise de redes sociais a partir das informações contidas em SCV. A teoria de redes complexas é baseada na representação de sistemas complexos como grafos. Dois grafos foram construídos. O primeiro representa a rede de commiters (desenvolvedores do projeto), onde os vértices correspondem a um particular commiter e dois commiters são ligados quando eles têm contribuído como pelo menos um módulo em comum. O peso das arestas é dado pelo número de commits executado por ambos os desenvolvedores para todos os módulos em comum. No segundo grafo, os vértices representam um módulo do projeto. Nesses termos, dois módulos são ligados quando pelo menos um commiter tem contribuído para ambos. Os pesos das arestas é o total de commits executado em ambos os módulos. Para análise foram consideradas definições comuns em redes sociais como: degree of a vertex, weighted degree of a vertex, distance centrality of a vertex, betweenness centrality of a vertex, weighted clustering coefficient of a vertex e clustering coefficient of a vertex. Por exemplo, o coeficiente de agrupamento (clustering coefficient of a vertex), denotado por, E(v) , (2-1) Cv = Kv (Kv − 1) onde Kv é o número de vizinhos de v e E(v) é o número de arestas entre os vizinhos, corresponde à medida com que os nós de um grafo tendem a se agrupar. Os autores realizaram estudos de caso envolvendo grandes projetos de Software como Apache, Gnome e KDE que possuem milhões de linhas de código. A Figura 2.1 apresenta a distribuição do coeficiente de agrupamento para comparativo visual entre os módulos do projeto Apache (topo) e Gnome (base) coletadas em fevereiro de 2004. Como resultado, concluíram que as características desses projetos são redes small-world (mundo-pequeno) 4 e que as teorias dessa área podem ser aplicadas. Apesar deste trabalho verificar o relacionamento entre desenvolvedores o foco ainda permanece na evolução do software e não nos desenvolvedores propriamente dito. O trabalho de Huang e Liu [21], semelhante ao anterior quando se trata de verificar a evolução do código fonte, revisa os históricos de repositórios de projetos SourceForge 5 . Os desenvolvedores foram divididos em dois grupos: o grupo responsável pela parte principal e o grupo responsável pela parte periférica do sistema, para descrever as interações no processo de desenvolvimento. Foi usado um modelo representativo chamado Legitimate Peripheral Participation (LPP) [27]. A ideia essencial do LPP é a fixação do aprendizado em situações sociais onde pessoas mais experientes interagem com os aprendizes na prática diária. Conseguiu-se analisar os relacionamentos entre 4 Uma rede mundo-pequeno é uma representação gráfica de relacionamentos onde é possível alcançar um elemento dentro dessa rede, através de um pequeno número de passos. 5 http://sourceforge.net/about 2.3 Trabalhos que fazem uso de sistemas de controle de versão 23 Figura 2.1: Coeficiente de agrupamento (clustering coefficient) de módulos do projeto Apache (topo) e Gnome (base) coletadas em fevereiro de 2004. O eixo y corresponde a quantidade de módulos (diretórios) e o eixo x ao coeficiente de agrupamento. Extraído de Lopez-Fernandez [28]. o grupo da equipe principal e o grupo restante no processo de desenvolvimento. Os autores acreditam que o sucesso de um projeto de Software Livre depende apenas de uma pequena parte do código que permitiria desenvolvedores comerciais trabalharem com grupos periféricos em desenvolvimento de produtos, sem a necessidade de liberar todo o código fonte ao público. Um método de análise da rede de colaboração foi proposto para perceber a importância dos desenvolvedores. Definiu-se um conjunto de desenvolvedores D p , onde p representa um caminho de um diretório afetado no SCV, sendo: D p = {d|desenvolvedor d modificou caminho p}. 2.3 Trabalhos que fazem uso de sistemas de controle de versão 24 Um grafo simétrico de desenvolvedores Gd é definido como: Gd = {Vd , Ed } Vd = {d|d é um desenvolvedor } Ed = {(d1 , d2 )|∃ caminho p de tal forma que d1 ∈ D p e d2 ∈ D p }. A distância de centralidade do grafo é apresentada como: Dc (v) = 1 , ∑t∈G dG (v,t) onde dG (v,t) é a distância mínima de um vértice v para um vértice t. Dessa forma, os autores criaram um grafo da rede social dos desenvolvedores de vários projetos armazenados no SourceForge. A Figura 2.2 mostra o grafo resultante desse processo para o projeto Filezilla. É percebido que os desenvolvedores que têm um alto valor de centralidade desempenham papéis importantes no projeto enquanto que os que possuem baixo valor de centralidade são desenvolvedores periféricos ou corretores. Os autores comentaram que o grafo pode conter problemas pela característica do uso de diretórios na geração dos relacionamentos pois dependendo da arquitetura do projeto, para adicionar uma funcionalidade é requerido alterar vários diretórios do sistema, portanto, isso poderia implicar em uma equivocada definição de papéis. Foi possível, ainda, analisar os níveis de colaboração através da intensidade das cores dos nós que representam os desenvolvedores no grafo e a habilidade de desenvolvedores periféricos manter a vitalidade e a popularidade do projetos pelas ligações nos limites do grafo. Girba et al. [17] investiram na visualização para representar a evolução do software. Para os autores, quando o sistema é grande torna-se difícil conhecê-lo como um todo e portanto os desenvolvedores acabam conhecendo-o em partes. Diante dessa emblemática, surge a pergunta, "que autores desenvolvem quais partes do sistema?". Motivados por essa questão, desenvolveram uma representação visual composta da seguinte maneira: as linhas são arquivos, os círculos são commits e as cores são autores. O que está fora de contexto durante a visualização permanece em tons de cinza e a linha do tempo está no sentido da esquerda para direita. Os dados são extraídos de SCV e para ordenação dos arquivos de uma maneira significativa, utilizaram uma métrica de distância entre os commits baseados em algoritmo de hierarquia de clusters. A Figura 2.3 demonstra a aplicação da técnica. Alguns padrões de comportamento foram identificados os quais são: • Monologue – denota o período onde todas as mudanças e a maioria dos arquivos pertencem a um mesmo autor representado por uma cor que o identifica. • Familiarization – caracteriza uma acomodação sobre um longo período de tempo. 2.3 Trabalhos que fazem uso de sistemas de controle de versão 25 Figura 2.2: Grafo do projeto Filezilla onde os nós representam os desenvolvedores. O desenvolvedor com maior valor de centralidade aparece em formato retangular. Além disso, a intensidade das cores representa o valor de centralidade, portanto, cores claras são baixo valor de centralidade enquanto que cores escuras representam alto valor de centralidade. Extraído de Huang e Liu [21]. • Takeover – representa o comportamento onde um desenvolvedor faz uma grande quantidade de código em uma pequena quantidade de tempo. • Bug-fix – é uma pequena e localizada mudança que não faz muito efeito na imagem gráfica da linha que representa o arquivo. • Expansion – demonstra a expansão de arquivos, ou seja, arquivos que são criados. • Edit – representa o trabalho de um editor que aplica várias mudanças em vários arquivos ao mesmo tempo. • Teamwork – é uma colaboração alternada entre desenvolvedores. Quando um desenvolvedor faz muitas mudanças em um arquivo ele se apropria daquele arquivo e portanto a partir daquele ponto a cor da linha permanece da sua mesma cor, ou seja, da cor do seu círculo. A validação feita em vários projetos proprietários (i.e., Outsight) e livres (i.e., Ant, Tomcat, JEdit e JBoss). A conclusão que o trabalho é útil na descoberta de padrões de comportamento e quais desenvolvedores são os especialista em partes do código. Kagdi et al. [25] mineraram repositórios de código fonte a partir de um conjunto de heurísticas a procura de grupos de mudanças que caracterizessem padrões de alterações em arquivos. A pesquisa tenta descobrir quais arquivos são alterados em conjunto, com o propósito de dar subsídios para previsões de mudança no software e melhorar o entendimento de sua evolução. A ordem em que os arquivos são alterados é importante para esse propósito pois permite inferir que variações no arquivo de interface conduzem a variações no arquivo de persistência, ambos do código fonte de um mesmo módulo. 2.3 Trabalhos que fazem uso de sistemas de controle de versão 26 Figura 2.3: Visualização para identificar especialista em partes do código onde vários padrões de comportamento são apresentados. Extraído de Girba et al. [17]. Voinea et al. [49] propõem um conjunto de ferramentas e técnicas de visualização para avaliar diferentes níveis de detalhe da evolução de software armazenados em SCV. Eles criaram duas ferramentas de visualização em duas dimensões: o CVSgrab, que explora a evolução dos arquivos e o CVSscan que explora a evolução em nível de linhas. Ambas servem de apoio aos desenvolvedores no entedimento da evolução do código. As visualizações utilizam as cores em três tipos de configuração: a) linhas – cor verde escuro são constantes (sem alterações), azuis são inserções, amarelas são modificações e vermelho claro são exclusões; b) blocos de estruturas – laranja são arquivo de referência, bloco de aninhamento nível 1, verde são comentários e azul são blocos de aninhamento nível 2; c) autores – como exemplo, laranja corresponde ao autor1, amarelo ao autor2 e azul ao autor3, pode ser utilizado uma paleta de cores para diferenciar os autores. O CVSgrab [50] busca identificar padrões de comportamento através das manipulações efetuadas pelos desenvolvedores nos arquivos do código fonte e obter informações detalhadas sobre os commits, os desenvolvedores e a evolução dos arquivos. A Figura 2.4 demonstra a atuação CVSgrab onde cada linha na horizontal corresponde a um arquivo e vários painéis permitem o controle da visualização. É possível manipular o tamanho, a transparência e a sobra das linhas além da aproximação (zoom), ordenação por nome dos arquivos, data de criação, atividade de alterações dentre outros. O CVSscan apresentado na Figura 2.5, permite um maior nível de detalhes e explora as interações dos desenvolvedores em um baixo nível de granularidade analisando as linhas alteradas. Diferente da visualização anterior, agora as linhas horizontalmente coloridas representam as linhas do código fonte. Na visualização é possível controlar: os níveis de aproximação (zoom), o intervalo de seleção além de blocos de visão geral e detalhe. A posição do mouse indicado pelo marcador (1) mostra no bloco (2, 3) a evolução das linhas no código fonte. 2.3 Trabalhos que fazem uso de sistemas de controle de versão 27 Figura 2.4: CVSgrab é uma ferramenta para visualização da evolução de um código fonte em nível de arquivos. Extraído de Voinea et al. [50] 2.3.2 Trabalhos com foco no desenvolvedor Nessa seção apresentamos trabalhos focados no desenvolvedor ou na colaboração entre membros de projetos com o objetivo de identificar o perfil de tais colaboradores. Mockus e Herbsleb [30] buscam identificar desenvolvedores experientes em partes do código através do conceito de Experience Atoms (EAs) que são unidades elementares de experiência. Para os autores, experiência é o resultado direto de uma atividade pessoal com respeito ao trabalho realizado, que, neste caso, pode ser uma correção ou melhoramento do código. Neste trabalho não foram revelados detalhes sobre a computação das EAs, apenas que através de diferenças obtidas a partir do SCV é possível extrair unidades de experiência pela frequência de alterações nos arquivos. A Figura 2.6 exibe uma visualização denominada ExB – Expertise Browser, para apresentar sugestões de pessoas com experiência nos artefatos de código na medida em que são inspecionados. A visualização pretente responder as seguintes perguntas: “quem tem perícia em uma unidade do software?” e “qual perfil desse perito?”. A pergunta sobre a perícia pode respondida pela indicação de especialistas que atuaram naquele fragmento de código e o perfil pode ser respondido pelo foco onde o especialista trabalhou, se 2.3 Trabalhos que fazem uso de sistemas de controle de versão 28 Figura 2.5: CVSscan é uma ferramenta para visualização da evolução de um código fonte. Em um baixo nível de granuralidade, painéis apresentam as linhas de código (2,3) selecionadas pelo mouse (1). É possível interagir selecionando um intervalo de visualização, controlar o foco e outras configurações. Extraído de Voinea et al. [49]. em arquivos de banco de dados provalvemente um especialista em banco de dados por exemplo. Em resumo, os autores reconhecem que seu modelo não é infalível, porém, essas heurísticas, podem prover um caminho fácil para identificar e indicar pessoas experientes em alguma parte do projeto. Ye e Kishida [51] intrigados com a possibilidade aprender sobre a motivação que levam desenvolvedores a promover software sem benefícios monetários, estudaram as atividades desempenhadas por essas pessoas em comunidades de Software Livre. Identificaram oito papéis (Figura 2.7), os quais são: • Project Leader – são pessoas que iniciam, têm uma visão geral e direcionam o projeto; • Core Member – são responsáveis por coordenar o desenvolvimento do projeto e fazem significantes contribuições para a evolução do sistema; 2.3 Trabalhos que fazem uso de sistemas de controle de versão 29 Figura 2.6: Visualização denominada Expertise Browser que apresenta especialista em partes do código fonte em projetos de software. Extraída de Mockus e Herbsleb [30]. • Active Developer – são pessoas que regularmente contribuem com grande quantidade de novas funcionalidades e correção de problemas; • Peripheral Developer – são pessoas que ocasionalmente contribuem com novas funcionalidades ou funcionalidades que ampliam suporte a sistemas de interesse com envolvimento pequeno e esporádico; • Bug Fixer – são pessoas que corrigem problemas reportados por outros usuários, geralmente conhecem pequenas partes do código fonte onde atuam; • Bug Reporter – são pessoas que descobrem e reportam problemas, muitas vezes assumem o papel de testadores; • Reader – são pessoas que leem ativamente o código do projeto para usar e entender seus conceitos; e • Passive User – são pessoas que somente usam o sistema e não estão interessadas em alterar ou entender o código. Nem todos os papéis existem para todos os projetos e alguns projetos usam outros nomes para atividades semelhantes como Maintainers em vez de Core Members. Já algumas comunidades preferem assumir ação combinada de papéis como no caso de Bug Fixers e Peripheral Developers para os quais a diferença é sutíl. Os autores não fazem uso direto de SCV mas relataram a forma de interação no desenvolvimento de um sistema tendo a comunidade de Software Livre como sua mantenedora. O trabalho relatou que a ascendência de uma pessoa na comunidade se faz, muitas vezes, por meritocracia e reconhecimento a partir das contribuições efetuadas, demonstrando a importância em analisar o código fonte através de um SCV para verificar como a evolução acontece e como os desenvolvedores se relacionam. 2.3 Trabalhos que fazem uso de sistemas de controle de versão 30 Figura 2.7: Papéis geralmente desempenhados por desenvolvedores em projetos de Software Livre. Os círculos mais internos são mais importantes. Extraído de Ye e Kishida [51]. A definição de papéis em projetos de desenvolvimento de software proprietário é rígida, ou seja, o empregador define estes papéis, enquanto que em projetos livres é dinâmica, neste caso, não existe cargos pré-estabelecidos, os desenvolvedores se autoorganizam. Neste sentido é importante a categorização dos desenvolvedores para entender como os relacionamentos ocorrem na evolução dos artefatos de código, sejam eles de código fonte ou informacionais (e.g., documentação, tutoriais, referências). Gilbert e Karahalios [16] procuraram analisar ambos o repositório de código fonte e a comunicação por correio eletrônico (email) entre os desenvolvedores buscando evidências de colaboração. Para os autores, a comunicação é de extrema importância e revela evidências na atividade de alteração no código fonte. Os benefícios está em oferecer a oportunidade de verificar se existe alguma relação entre as comunicações por mensagens entre os desenvolvedore e as alterações no código fonte. Também, oferece a chance de refletir se o processo de comunicação está afetando o desenvolvimento. Os autores criaram uma visualização do tipo visão geral e detalhe (overview+detail) [11] apresentada na Figura 2.8, denominada CodeSaw. A visualização é dividida em duas partes. A parte superior do eixo x representa as contribuições no código fonte e a parte inferior do eixo x a comunicação por email. Na visualização em detalhe, é possível comparar visualmente os desenvolvedores e obter, em caixa flutuante, informações sobre eles e seus últimos cinco arquivos alterados. Em acréscimo, é possível criar mensagens flutuantes, chamada spatial messaging sobre a visualização gerada. Sarma et al. [41] usa abordagem similar a partir de comunicação entres desenvolvedores, embora sejam geradas visualizações diferentes. Minto e Murphy [29] criaram o conceito de Emergent Expertise Locator (EEL) como forma de sugerir outros desenvolvedores especialistas ao desenvolvedor que está interagindo com o código fonte (Figura 2.9), através de uma IDE no momento da edição desse código. A computação da EEL é feita utilizando três matrizes (i linhas× j colunas): 2.3 Trabalhos que fazem uso de sistemas de controle de versão 31 Figura 2.8: Visualização denominada CodeSaw. Extraído de Gilbert e Karahalios [16]. • Matriz de dependência (i × j) – indica o número de vezes que o arquivo i e arquivo j foram modificados juntos. • Matriz de autoria (i × j) – indica o número de vezes que o desenvolvedor i alterou o arquivo j. • Matriz de perícia – representa a perícia baseada na matriz de dependência de arquivo e na matriz de autoria de arquivo. A Matriz de perícia é computada pela seguinte equação C = (FA FD )FAT , onde FA é a matriz de autoria e FD é a matriz de dependência. A extração de dados é feita a partir da evolução do código armazenados em um SCV e a sugestão de especialista é feita em tempo de execução. Testes de validação foram feitos com grandes de projetos como Eclipse, Firefox e Bugzilla e verificou-se uma alta precisão e alta revocação (recall) dos especialistas indicados. Schuler e Zimmermann [42] analisaram o desenvolvimento da IDE Eclipse e propusseram uma técnica que permite recomendar desenvolvedores especialistas avaliando fragmentos da evolução do código fonte armazenados em SCV. Foram levados em consideração códigos fontes de linguagens de programação orientadas a objeto. O trabalho consiste em analisar o conjunto de mudanças (change-sets) a partir das diferenças (diffs) entre todos os arquivos alterados entre um par de revisões. Os autores buscaram, em todos os arquivos, os nomes dos métodos e a quanti- 2.3 Trabalhos que fazem uso de sistemas de controle de versão 32 Figura 2.9: Uma caixa de sugestão de especialistas, através de um Ambiente de Desenvolvimento Integrado (IDE), e forma de contactá-los é apresentada ao desenvolvedor quando o mesmo busca forma de interagir. Extraído de Minto e Murphy [29]. dade de parâmetros alterados por cada desenvolvedor utilizando os conceitos de “experiência de implementação”, que significa o conhecimento que o desenvolvedor tem sobre a implementação propriamente dita, de um determinado método. A “experiência de uso”, que neste caso é o conhecimento que os desenvolvedores possuem em usar os métodos porém não se sabe como eles foram implementados. Em outras palavras, uma experiência de uso consiste nas chamadas dos métodos em outras partes do código, conhecendo as entradas e saídas do métodos porém não compreendendo suas estruturas internas. Uma experiência de implementação consiste em um conhecimento mais amplo de um método, inclusive de suas estruturas internas. A cada desenvolvedor é atribuído um perfil de experiência que consiste na computação feita pela frequência de experiência de implementação e de uso. O artigo utiliza informações de um SCV através de árvore de sintaxe abstrata para identificar a composição e as chamadas dos métodos. Isto significa que a técnica utilizada apesar de ser precisa para detectar alterações e chamadas de métodos é específica apenas para um determinado tipo de linguagem. Os autores apresentam um mecanismo de identificação de especialista em partes de código pela computação de similaridades entre o perfil de experiência em intervalos de 0 a 1, sendo 0 para perfis totalmente diferentes e 1 para perfis idênticos. A Figura 2.10 apresenta a computação dessa similaridade entre desenvolvedores com valor maior ou igual a 0,08. Zhang et al. [53] afirmam ser os primeiros a especificamente minerar e decompor métricas a partir de projetos de software colaborativo em nível individual de granularidade. Eles utilizaram SAP (Sistema de Acompanhamento de Problemas) e SCV para apresentar resultados sobre indicadores de desempenho individual dos desenvolvedores. O processo acontece em três níveis de extração sendo: 1. analisar o código fonte e computar métricas; 2. analisar as mudanças armazenadas nos SCV; 3. analisar as tarefas do SAP. Para analisar o código fonte, são usadas métricas [39] para projetos de software orientados a objeto como: 2.3 Trabalhos que fazem uso de sistemas de controle de versão 33 Figura 2.10: Relação entre um grupo de desenvolvedores gerada pela computação de similaridades, provenientes do desenvolvimento de um componente do Eclipse. Os desenvolvedores são os nós e a espessura de cada arestas representam as similaridades entres eles. Extraído de Schuler e Zimmermann [42]. • CC (Cyclomatic Complexity) – é usado para verificar a complexidade das classes, por complexidade entende-se a quantidade de condicionais e laços existentes; • WMC (Weighted Methods per Class) – é a quantidade de métodos implementados ou a soma das complexidades dos métodos utilizando o CC (definido anteriormente); • DIT (Depth of Inheritance Tree) – é o tamanho máximo de profundidade de uma classe com a herança hierárquica; • NOC (Number Of Children) – é número imediato de subclasses subordinadas para uma hierarquia de classes; • RFC (Response For a Class) – representa um conjunto de métodos que podem ser invocados mesmo através da hierarquia de classes; • CBO (Coupling Between Objects) – é a quantidade de acoplamento entre as classes, o acoplamento indica nível de dependência entre uma classe e outra; • LCOM (Lack of Cohesion in Methods) – mede o grau de similaridade dos métodos através das variáveis ou atributos das classes; • Lines of Code – quantidade de linhas de código existentes; e • Comment Percentage – corresponde a quantidade relativa de comentários existentes. Do SCV foram obtididas as seguintes informações: TLOC (número de linhas de código adicionadas e excluídas) e NCO (número total de commits). Para o SAP, foram analisados os campos das tarefas que descrevem os problemas encontrados. Uma vez 2.3 Trabalhos que fazem uso de sistemas de controle de versão 34 identificado o corretor cruza as informações com o SCV. Foi realizado um experimento com Software Livre jEdit, sendo inspecionados 2.871 commits de 3.677 arquivos de código em linguagem de programação Java, 5.412 classes e 29.192 métodos. Via SAP, analisaram 5.218 bugs reportados; destes 278 eram duplicados e 472 inválidos sendo descartados. Os resultados são apresentados utilizando cluster analysis algorithm EM (Expectation Maximization), apresentado na Figura 2.11 com o objetivo de aumentar a compreensão dentro de uma coleção de indicadores. Os resultados podem beneficiar organizações no entendimento do desempenho de seus desenvolvedores. Figura 2.11: Apresentação dos clusters do projeto jEdit gerados pelo algoritmo EM (Expectation Maximization); o eixo x são os quatro clusters formados, e o eixo y a proporção da métrica WMC por linhas de código para cada desenvolvedor. Extraído de Zhang et al. [53]. Em [54], Zhang et al. fazem uso de uma técnica de análise de dados definida como Data Envelopment Analysis (DEA) 6 . O modelo proposto analisa o SCV, o SAP e o código fonte. A análise do código fonte é feita por ferramentas automatizadas 7 para criação de métricas individuais de desempenho dos desenvolvedores. Após todas as extrações de dados das fontes de informações citadas são produzidos indicadores classificados em dois grupos que são: 1. Métricas de produção: 6 DEA é um modelo de avaliação de desempenho baseado em programação não parametrizada [9], técnica aceita em pesquisas de análise comparativa de desempenho. Alguns trabalhos anteriores do autores [52, 40] são baseados em estudos empíricos sobre DEA. 7 http://pmd.sourceforge.net 2.3 Trabalhos que fazem uso de sistemas de controle de versão 35 1.1. Análise de código – métricas de controle de fluxo, número de operações distintas e declarações, grau de modularidade, número de instância e outros; e 1.2. Técnica de análise estática – violação de estilo ou más práticas como: sobrecarga de memória, ponteiros nulos, uso de variáveis não inicializadas ou inicialização de variáveis nunca utilizadas dentre outros. 2. Métricas de desenvolvimento: 2.1. Extração de dados do SCV – número de operações por dia, quantidade média de linhas adicionadas, total de linhas excluídas, qual o último desenvolvedor fez alterações em alguma parte do código e outras. 2.2. Extração de dados do SAP – número de defeitos registrado com alto grau de urgência, número de defeitos corrigidos, etc. Essas métricas servem como entrada para o DEA. A Figura 2.12 ilustra o fluxo proposto pelos autores. As saídas, por sua vez, mais detalhes em [40], são computadas, gerando pontuações caracterizando o desempenho individual do desenvolvedor (IDP). Figura 2.12: Uma extração de informações a partir do SCV, do SAP e do próprio código fonte. São geradas métricas de entrada para um processo de análise. Extraído de Zhang et al. [54]. Jermakovics et al. [24] apresentaram uma abordagem para minerar e visualizar a modularidade em redes de desenvolvedores de software baseadas em alterações efetuadas em arquivos. Os estudos foram validados em projetos comerciais. Cada desenvolvedor é tratado como um vetor com pesos para os arquivos. Cada peso de um arquivo f de um desenvolvedor d é definido usando o número de commits para f efetuado por d, como 2.3 Trabalhos que fazem uso de sistemas de controle de versão 36 segue: peso f ,d N = commits f ,d · log nf em que N é o total de desenvolvedores e n f é o número de desenvolvedores que alteraram f . A similaridade entre dois desenvolvedores é dada pelo coseno do ângulo entre os seus vetores a e b, respectivamente: similaridade(a, b) = cos(a, b) = a·b ∑ ak bk =q k |a||b| ∑k a2k ∑k b2k Outras propostas como similaridade Jaccard e correlação de Pearson foram testadas, porém a similaridade dos cosenos mostrou melhor desempenho e foi escolhida como a medida principal. Pela densidade típica de redes formadas pelos históricos de versionamento aplicou-se uma proposta de filtros para reduzir o número de arestas e evitar essa densidade. A estrutura revelou grupos de desenvolvedores e demonstrou a modularidade na visualização da rede de desenvolvedores. Um estudo de caso foi aplicado em um projeto de Software Livre, onde os resultados indicaram que a abordagem exibiu estruturas ocultas com base nas redes de interação entre grupos de desenvolvedores, conforme apresentado na Figura 2.13. Figura 2.13: Rede de desenvolvedores em colaboração no desenvolvimento de software do projeto Eclipse DTP. A rede de colaboração pode ser facilmente percebida pelos destaque entre os grupos formados. Extraído de Jermakovics et al. [24]. 2.3 Trabalhos que fazem uso de sistemas de controle de versão 2.3.3 37 Aspectos Gerais Nesta seção aprentamos a Tabela 2.2 com informações gerais sobre os trabalhos pesquisados e comparamos brevemente as pesquisas com nosso trabalho. Essas pesquisas nos serviram de motivação para entender as lacunas existentes que ainda não foram exporadas. Poucos trabalhos fazem uso de SCV porém acreditamos que será uma tendência extrair e analisar dados armazenados em SCV para melhorar a compreensão das interações entre os desenvolvedores e o processo de desenvolvimento de software. Grande parte dos trabalhos científicos que utilizam o SCV não definem novas medidas de comparação entre os desenvolvedores (métricas). Nossa pesquisa não está direcionada a métricas gerais da engenharia de software geradas a partir da análise do código fonte. Criamos algumas métricas pela combinação das operações comuns dos SCV que não foi exploradas por nenhum outro trabalho pesquisado. Elas são usadas em nosso processo para comparação dos desenvolvedores. Lopez-Fernandez [28] e Huang e Liu [21] exploram os repositórios a partir de análise de redes complexas, aplicando técnicas difundidas nesta área de conhecimento para verificar padrões de comportamento dos desenvolvedores em relação ao código fonte. Essa conclusão revela ferramentas potênciais a serem utilizadas no qual se difere de nossa abordagem focada nas interações entre os desenvolvedores. Alguns trabalhos como Huang e Liu [21], Kagdi et al. [25] e também Jermakovics et al. [23] extraem dados de repositórios a partir de iterações geradas pelo SCV em nível de arquivos. Porém, o presente trabalho, focou em resultados em um nível mais fino de granularidade, ao considerar alterações em linhas de código. Voinea et al. [49] criaram duas ferramentas de visualização de informação para evidenciar padrões na evolução do código fonte e auxiliar os desenvolvedores no processo de desenvolvimento. Embora o foco do nosso trabalho esteja nos desenvolvedores e não na evolução do código fonte, utilizamos de duas visualizações que nos serviram de guia para produzir os métodos de escolha e seleção de métricas. Os trabalhos de Mockus e Herbsleb [30] buscam identificar especialista em partes do código através da frequência de alterações no código. Em nosso trabalho, utilizamos a frequência de alterações no código combinada com conceitos de esforço e efetividade para criação das métricas. Applying social network analysis to the information in CVS repositories Mining version histories to verify the learning process of Legitimate Lopez-Fernandez, L. Huang, Shih-Kun; Liu, Kang-min. 2006 sitory querying, analysis and visua- Telea, Alexandru. Visual assessment of software evo- lution Voinea, L.; Luk- kien, J.; Telea, A. lization An open framework for CVS repo- from version histories Lucian; Voinea, I. Maletic, Jonathan Yusuf, Shehnaaz; 2007 2006 do software Na evolução do software Na evolução do software Na evolução SCV SCV SCV Visualização de Infor- Mineração de Dados e oria dos Grafos Redes complexas e Te- Mineração de Dados, Redes Complexas Mineração de Dados e Abordagem de Análise mações Visualização de Infor- Mineração de Dados e mações Visualização de Infor- Mineração de Dados e Análise Combinatória Mineração de Dados e Huzefa; Mining sequences of changed-files SCV :w SCV SCV Fonte de Dados Kagdi, do software Na evolução do software Na evolução do software Na evolução Foco mações Evolution A.; Seeberger, M.; 2005 2005 2004 Ano Ducasse, S. How Developers Drive Software Girba, T.; Kuhn, Peripheral Participants Título Autor linhas com visão geral e detalhe. Visualizações em nível de arquivos e Visualização em nível de arquivos N.A. uma cor específica. brepostos as linhas, cada um com nhas e os commits são círculos so- Visualização onde os arquivos são li- código fonte. relacionamentos entre alterações no volvedores são nós e as arestas são Desenho de grafos onde os desen- N.A. Visualizações Construídas 2.3 Trabalhos que fazem uso de sistemas de controle de versão 38 2002 Recommending Emergent Teams Minto, David; Thomas. Zimmermann, Schuler, Murphy, Gail C. sion archives Mining usage expertise from ver- distributed software development rahalios, Karrie. Shawn; CodeSaw: A social visualization of 2008 2007 2007 dor velopers Gilbert, Eric; Ka- desenvolve- tivation Open Source Software de- Kishida, Kouichi. 2003 Toward an understanding of the mo- Yunwen; Ye, SCV dor desenvolve- No perfil do dor desenvolve- No perfil do SCV SCV mações Visualização de Infor- Mineração de Dados e Mineração de Dados mações dor Mineração de Dados e ware Engenharia de Soft- Visualização de Infor- SCV e Email N.A. desenvolve- No perfil do No perfil do dor desenvolve- approach to identifying expertise No perfil do Herbsleb, J. D. Expertise browser: a quantitative Visualização de Infor- Mineração de Dados e Abordagem de Análise Mineração de Dados A; SCV e SAP Fonte de Dados Mockus, do software Na evolução Foco mações truction 2009 Ano chele. D.; Lanza, Mi- Visual software evolution recons- Ambros, Marco Título Autor dades entre os desenvolvedores. Visualização em grafo das similari- pecialistas Caixa de texto com indicação de es- email. x correspodem a comunicação por digo fonte e a parte inferior do eixo respondem as contribuições no có- onde a parte superior do eixo x cor- Visualização de gráfico de linhas N.A. lista. Painéis com a indicação de especia- Visualizações diversas Visualizações Construídas 2.3 Trabalhos que fazem uso de sistemas de controle de versão 39 Mining Individual Performance In- Shen; Yongji; Zhang, Wang, Capability Assessment of Indivi- dual Software Development Pro- cesses Using Software Repositories and DEA Mining and visualizing developer networks from version control sys- tems Shen; Yongji; Zhang, Wang, Yang, Ye; Xiao, Junchao. Jermakovics, An- drejs; Sillitti, Al- berto; Succi, Gi- ancarlo. ment Using Software Repositories Xiao, Junchao. dicators in Collaborative Develop- Título Autor dor desenvolve- No perfil do dor desenvolve- No perfil do dor desenvolve- No perfil do Foco SCV código fonte SCV, SAP e o código fonte SCV, SAP e o Fonte de Dados Teoria dos Grafos Mineração de Dados e Mineração de Dados Mineração de Dados Abordagem de Análise Tabela 2.2: Relação dos artigos relacionados. 2011 2008 2008 Ano Visualização em formato de grafos. N.A. dades. volvedores a partir de suas similari- Gráfico com agrupamento de desen- Visualizações Construídas 2.3 Trabalhos que fazem uso de sistemas de controle de versão 40 2.3 Trabalhos que fazem uso de sistemas de controle de versão 41 Os trabalhos de Ye e Kishida [51] demostram que a definição de papéis em projetos de Software Livre é feita pela meritocracia e comprometimento dos desenvolvedores com o projeto. Este conhecimento nos permite considerar a existência de uma estrutura não evidente porém, ainda, armazenada nos SCV. Em muitos casos, os papéis ou perfis que os desenvolvedores desempenham em projetos são escusos, ou seja, algumas habilidades dos desenvolvedores são desconhecidas embora armazenadas nos repositórios. Possivelmente, em um trabalho futuro de extração de dados e definição de métricas poderiam revelar essas habilidades “escondidas”. Zhang et al. [53] criaram métricas, a partir da análise do código fonte, do SCV e do SAP para pontuar os desenvolvedores em seus desempenhos. Outro trabalho de Zhang et al. [54] também faz uso de métricas mas não menciona detalhes formais. Nosso trabalho define métricas formalmente pela extração de dados unicamente do SCV pela facilidade na obtenção de dados. Futuramente, pretendemos análisar o código fonte e prover integração com outros sistemas de apoio ao processo de desenvolvimento. CAPÍTULO 3 Métricas para Desenvolvedores Neste capítulo propomos um conjunto de métricas sobre dados armazenados em SCV para contribuir na identificação da forma como os desenvolvedores trabalham. Apresentamos uma definição formal de uma nova estrutura de informação para armazenar os dados oriundos do SCV visando facilitar seu processamento. Em seguida, descrevemos o conjunto de métricas dividindo-as em aspectos individuais dos desenvolvedores e nos relacionamentos entre desenvolvedores no processo de desenvolvimento. Por último, apresentamos uma tabela sumarizada das métricas e concluímos com comentários sobre nosso modelo e possíveis melhorias para contemplar outras opções além das propostas neste trabalho. 3.1 Definições básicas Considere a existência de um sistema de controle de versão (SCV) de projetos de software. Seja P um projeto de software e D o conjunto de desenvolvedores desse projeto. Seja também A o conjunto de todos os arquivos criados durante o desenvolvimento de P , e A r ⊆ A o conjunto dos arquivos que foram removidos (não chegaram na versão final) desse projeto. Para cada arquivo a ∈ A que existe ou existiu durante o desenvolvimento de P , definimos um arquivo de história Ha contendo as operações de criação, modificação ou remoção feitas nas linhas de a. Um arquivo de história Ha consiste, mais precisamente, em uma sequência de históricos de linha hhal1 , hal2 , . . . , halt i para t linhas consecutivas que ocorrem ou já ocorreram em pelo menos uma das versões de a. Cada histórico de linha hali , por sua vez, é uma sequência de operações ho1 , o2 , . . . , ou i que ocorreram na linha li do arquivo a. O tamanho u dessa sequência, também dado por |hali |, é menor ou igual à quantidade de versões do arquivo a que aparecem no projeto P do SCV mais uma unidade1 . Cada operação o de um histórico de linha possui quatro atributos o.versao, 1 Essa unidade é decorrente de revisões que removem o arquivo, com todas as suas linhas, como explicado mais adiante. 3.1 Definições básicas 43 o.desenv, o.tipo e o.texto, os quais são definidos a seguir: o.versao – número da versão do projeto P na qual a operação o foi realizada; o.desenv – referência ao desenvolvedor que executou a operação o, com o.desenv ∈ D ; o.tipo – tipo da operação o, podendo ser: CRI (criação), MOD (modificação) e REM (remoção); o.texto – conteúdo da linha na revisão o.versao. Todo histórico de uma linha sempre começa com uma operação o do tipo CRI, podendo haver, em seguida, zero ou mais operações com o atributo tipo igual a MOD. Se uma operação o do tipo REM ocorre em um histórico de linha, ela deve ser a última a, j na sequência que forma esse histórico. Definimos a notação oi para indicar a i-esíma a, j operação realizada na linha j do arquivo a. A notação o1 refere-se à primeira operação a, j a, j na linha j. Já o|h a | , representado simplesmente por o f im , indica a última operação nessa lj linha. Também, por simplicidade de notação, omitiremos a referência ao arquivo a quando subentendido. Se um arquivo a é removido em alguma versão do desenvolvimento do projeto, então considera-se que todas as suas linhas são removidas, sendo isso indicado por uma operação final do tipo REM no histórico de cada linha de a. Denominamos histórico do projeto o conjunto de arquivos de história HP = {Ha1 , Ha2 , . . . , Ham } dos m arquivos do projeto P . A Figura 3.1 ilustra a organização dos elementos de um histórico de projeto. Tal histórico pode ser construído iterando sobre os registros no SCV conforme o Algoritmo 5.1 descrito posteriormente na Seção 5.2.1. Figura 3.1: Organização dos elementos em um histórico de projeto. O conjunto Ha corresponde a todos os arquivos do projeto. O subconjunto hl corresponde a todas as linhas do arquivos. O subconjunto o corresponde a todas as operações que as linhas sofreram. 3.2 Conjunto de Métricas 3.2 44 Conjunto de Métricas Nesta seção, aborda-se métricas para avaliar os desenvolvedores utilizando as definições apresentadas anteriormente. Algumas métricas possuem o termo efetividade ou esforço na composição de seus nomes. O termo efetividade indica métricas que mensuram a quantidade de operações perenes, cujos resultados se mantiveram até a versão final do arquivo onde ocorreram. Já o termo esforço refere-se ao volume total de operações independentes da perenidade de seu resultado. No devido contexto, como exemplo, toda operação de criação de uma linha é um esforço, mas apenas operações de criação que resultaram em linhas que não foram modificadas posteriormente por outros desenvolvedores, são consideradas efetivas. Além disso, sucessivas operações de modificação em uma linha por um mesmo desenvolvedor são consideradas uma única operação para fins de avaliação de efetividade, porém, não de esforço. 3.2.1 Sobre aspectos individuais A seguir, apresentamos métricas que avaliam a efetividade e o esforço do trabalho dos desenvolvedores individualmente quanto ao tipo de operação realizada nas linhas dos arquivos. Efetividade de Criação - Efet_Cri(d) A métrica Efet_Cri: D → N indica o total de linhas que foram criadas por um desenvolvedor d e que não foram alteradas por outro desenvolvedor nem removidas posteriormente pelo próprio d. Essa métrica pode ser definida como: a, j 1 se o1 .desenv = d e a, j |Ha | ∀ os com s 6= 1, Efet_Cri(d) = ∑ ∑ a, j a, j (os .tipo = MOD e os .desenv = d); a∈(A −A r ) j=1 0 caso contrário. a, j (3-1) Na Equação 3-1, o termo o1 .desenv = d indica que a primeira operação da linha j do arquivo a foi realizada pelo desenvolvedor d (lembrando que essa operação é de criação). Os demais termos indicam que qualquer outra operação na mesma linha, se existir, deve ser de modificação e realizada pelo próprio desenvolvedor d. 3.2 Conjunto de Métricas 45 Efetividade de Criação Relativa - Efet_Cri_Rel(d) A métrica Efet_Cri, (3-1) definida anteriormente, corresponde a uma medida absoluta da quantidade de linhas de código criadas por um desenvolvedor d ∈ D . Entretanto, é importante, do ponto de vista gerencial, a possibilidade de aferir a capacidade de criação do desenvolvedor em relação a outros desenvolvedores envolvidos no projeto. Para tal, definimos a métrica Efetividade de Criação Relativa, Efet_Cri_Rel: D → R de acordo com a Equação 3-2. Efet_Cri(d) (3-2) Efet_Cri_Rel(d) = ∑x∈D Efet_Cri(x) Efetividade de Modificação - Efet_Mod(d) A métrica Efet_Mod: D → N para um desenvolvedor d ∈ D avalia a quantidade de linhas do projeto P que satisfazem as três condições a seguir: • a última operação na linha é do tipo MOD; • essa operação foi efetuada pelo desenvolvedor d; • existe pelo menos uma operação antes da última cujo desenvolvedor é diferente de d. A definição formal da métrica Efet_Mod é dada a seguir: 1 se oa, j .tipo = MOD e oa, j .desenv = d e f im f im |Ha | a, j a Efet_Mod(d) = ∑ ∑ ∃w, 1 ≤ w < |hl j |, tal que ow .desenv 6= d; a∈(A −A r ) j=1 0 caso contrário. (3-3) Efetividade de Modificação Relativa - Efet_Mod_Rel(d) A métrica Efet_Mod (3-3) também corresponde a uma medida absoluta da quantidade de linhas de código alteradas por um desenvolvedor d ∈ D . Similarmente à métrica 3-2, porém no contexto de efetividade de modificação, definimos a sua versão relativa, Efet_Mod_Rel: D → R, como: Efet_Mod_Rel(d) = Efet_Mod(d) ∑x∈D Efet_Mod(x) (3-4) Esforço de Criação - Esfo_Cri(d) Definimos a métrica Esforço de Criação: D → N como o total de linhas criadas pelo desenvolvedor d sobre os arquivos do projeto P . Formalmente, o esforço de criação 3.2 Conjunto de Métricas 46 de um desenvolvedor d é: |Ha | Esfo_Cri(d) = ( ∑∑ a∈A j=1 a, j 1 se o1 .desenv = d; 0 caso contrário. (3-5) Esforço de Criação Relativo - Esfo_Cri_Rel(d) Definimos a métrica Esforço de Criação Relativo pela métrica Esfo_Cri_Rel: D → R do seguinte modo: Esfo_Cri_Rel(d) = Esfo_Cri(d) ∑x∈D Esfo_Cri(x) (3-6) Esforço de Remoção - Esfo_Rem(d) Definimos a métrica Esforço de Remoção: D → N como o total de linhas removidas pelo desenvolvedor d nos arquivos do projeto P : |Ha | Esfo_Rem(d) = ∑∑ a∈A j=1 ( a, j a, j 1 se o f im .desenv = d e o f im .tipo = REM; 0 caso contrário. (3-7) Esforço de Remoção Relativo - Esfo_Rem(d) Definimos Esfo_Rem_Rel: D → R como: Esfo_Rem_Rel(d) = Esfo_Rem(d) ∑x∈D Esfo_Rem(x) (3-8) Esforço Distinto de Modificação - Esfo_Dist_Mod(d) A métrica de Esfo_Dist_Mod: D → N procura quantificar o esforço de modificação de um desenvolvedor mas desconsiderando operações MOD consecutivas realizadas pelo mesmo. Isso é importante pois um desenvolvedor que faz commits frequentemente acaba por ter mais operações de modificação registradas nas linhas do que outro que só faz commits quando o novo código desenvolvido está correto e completo. Assim, nessa métrica. Procura-se minimizar esse efeito registrando apenas uma ocorrência para toda sequência de modificações feitas por um mesmo desenvolvedor em uma linha. O Algoritmo 3-9 computa a métrica Esfo_Dist_Mod para um desenvolvedor D . A fim de apresentarmos também uma definição matemática da função que implementa essa métrica, precisamos introduzir um novo conceito: a compactação de um histórico de linha hl , dada por hl . Tal compactação consiste na mesma sequência de operações de hl exceto que toda subsequência de operações consecutivas de modificação feitas por um mesmo desenvolvedor são representadas por uma única operação, no caso, pela 3.2 Conjunto de Métricas 47 última operação dessa subsequência. Operações no histórico de linha compactadas são representadas por o ao invéz do símbolo o. Desta forma, definimos o Esforço Distinto de Modificação como: |Ha | |hl j | Esfo_Dist_Mod(d) = ( ∑∑∑ a∈A j=1 i=1 a, j a, j 1 se oi .desenv = d e oi .tipo = MOD; 0 caso contrário. (3-9) Algoritmo 3.1: Esfo_Dist_Mod(d) Entrada: Um desenvolvedor do conjunto de desenvolvedores, d ∈ D Saída: Total de esforço distinto de modificação realizado pelo desenvolvedor d 1 2 3 4 5 total ← 0; para todo a ∈ A faça /* Para todo arquivo a para j ← 1 até |Ha | faça /* Para cada linha em a encontrou_desenv ← falso; para i ← 1 até |halj | faça /* Para cada operação na linha se 6 = MOD então a, j se encontrou_desenv = falso e oi .desenv = d então total ← total + 1; encontrou_desenv ← verdadeiro; 8 9 a, j senão se encontrou_desenv = verdadeiro e oi .desenv 6= d então encontrou_desenv ← falso; fim 10 11 12 fim 13 fim 14 16 17 */ a, j oi .tipo 7 15 */ */ fim fim retorna total; Esforço Distinto de Modificação Relativo - Esfo_Dist_Mod_Rel(d) Neste trabalho, de forma similar aos casos anteriores, define-se Esforço Distinto Relativo por meio da métrica Esfo_Dist_Rel: D → R como segue: Esfo_Dist_Mod_Rel(d) = Esfo_Dist_Mod(d) ∑x∈D Esfo_Dist_Mod(x) (3-10) Além dessas métricas, existe a possibilidade de construir outras derivadas através de uma razão entre efetividade e esforço. As próximas duas métricas são, portanto, 3.2 Conjunto de Métricas 48 resultado dessa composição. Efetividade de Criação dividido pelo Esforço de Criação - Efet_Cri_Div_Esfo_Cri(d) A razão entre Efetividade de Criação e Esforço de Criação de um desenvolvedor d gera uma nova métrica definida como: Efet_Cri_Div_Esfo_Cri(d) = Efet_Cri(d) Esfo_Cri(d) (3-11) A versão relativa dessa métrica é dada por: Efet_Cri_Div_Esfo_Cri_Rel(d) = Efet_Cri_Div_Esfo_Cri(d) ∑x∈D Efet_Cri_Div_Esfo_Cri(x) (3-12) As referidas métricas (3-11 e 3-12) computam a taxa de aproveitamento (na versão final do arquivo) das criações feitas por um determinado desenvolvedor. Tais métricas ajudam a diferenciar desenvolvedores que possuem valores parecidos de Efetividade de Criação mas cujos Esforços de Criação são distintos. Efetividade de Modificação dividido pelo Esforço Distinto de Modificação Efet_Mod_Div_Esfo_Dist_Mod(d) Já a razão Efetividade de Modificação e Esforço Distinto de Modificação leva à métrica: Efet_Mod_Div_Esfo_Dist_Mod(d) = Efet_Mod(d) Esfo_Dist_Mod(d) (3-13) A versão relativa da mesma é: Efet_Mod_Div_Esfo_Dist_Mod(d) ∑x∈D Esfo_Mod_Div_Esfo_Dist_Mod(x) (3-14) As métricas (3-13 e 3-14), por sua vez, procuram diferenciar desenvolvedores que possuem valores parecidos de “Efetividade de Modificação” mas cujos valores na métrica “Esforço Distintos de Modificação” são diferentes. Efet_Mod_Div_Esfo_Dist_Mod_Rel(d) = 3.2.2 Sobre o relacionamento entre desenvolvedores Em adição às métricas supracitadas, as quais estão associadas a um único desenvolvedor por vez, são apresentadas a seguir métricas de relacionamento entre pares de desenvolvedores com base na sequência das ações realizadas pelos mesmos no desenvolvimento de linhas de código. Essas métricas computam, em geral, quantos pares de operações do tipo (t1 ,t2 ) em sequência, com t1 ,t2 ∈ {CRI, MOD, REM}, foram 3.2 Conjunto de Métricas 49 realizadas pelos desenvolvedores x, y respectivamente. As métricas consideram todas as operações nas linhas de código sendo portanto uma medida de esforço. A métrica apresentada a seguir calcula a quantidade de pares de operações consecutivas dos tipos (CRI, MOD) em que a primeira é realizada pelo desenvolvedor x e a segunda pelo desenvolvedor y. Como vimos anteriormente, a operação CRI, que representa a criação, é a primeira operação em uma linha ou arquivo. Ela pode ser acompanhada por sucessivos MOD’s e de um REM. A métrica opera apenas sobre históricos de linhas que possuem pelo menos duas operações. 1 se |hl j | > 1 e a, j a, j |Ha | o1 .desenv = x e o1 .tipo = CRI e Linha_Cri_Mod(x, y) = ∑ ∑ a, j a, j o2 .desenv = y e o2 .tipo = MOD; a∈A j=1 0 caso contrário. (3-15) As próximas três métricas descritas seguem a mesma estrutura da anterior, apenas variando a sequência de tipos de operação em pares (CRI, REM), (MOD, MOD) e (MOD, REM). Note que a métrica para o par (MOD, MOD) é representada sobre o histórico de linha compactada, a fim de desconsiderar modificações em sequência de um mesmo desenvolvedor. 1 se |hl j | > 1 e a, j a, j |Ha | o1 .desenv = x e o1 .tipo = CRI e Linha_Cri_Rem(x, y) = ∑ ∑ (3-16) a, j a, j o .desenv = y e o .tipo = REM; a∈A j=1 2 2 0 caso contrário. 1 se oa, j .desenv = x e oa, j .tipo = MOD e |Ha | |hl j |−1 i i Linha_Mod_Mod(x, y) = ∑ ∑ ∑ oi+1 .desenv = y e oi+1 .tipo = MOD; a∈A j=1 i=1 0 caso contrário. (3-17) a, j a, j 1 se oi .desenv = x e oi .tipo = MOD e Linha_Mod_Rem(x, y) = ∑ ∑ ∑ oi+1 .desenv = y e oi+1 .tipo = REM; a∈A j=1 i=1 0 caso contrário. (3-18) Cada uma das quatro métricas anteriores induz uma matriz de dimensão |D| × |D|, cujas células contém as quantidades de pares de operações de um certo tipo realizadas. O somatório das linhas e das colunas dessas matrizes são também métricas para os |Ha | |hl j |−1 3.2 Conjunto de Métricas 50 desenvolvedores. Dessa forma, podemos criar variações das métricas supracitadas com base no somatório de uma linha ou de uma coluna, excluíndo-se as células na diagonal principal, como exemplificado a seguir. Linha_Cri_ΣMod(d) = ∑ Linha_Cri_Mod(d, y) (3-19) ∑ Linha_Cri_Mod(x, d) (3-20) y∈D −{d} Linha_ΣCri_Mod(d) = x∈D −{d} A primeira equação 3-19, define a quantidade total de modificações imediatamente feitas por outros desenvolvedores em linha criadas pelo desenvolvedor d. Já a equação 3-20 define a quantidade total de modificações imediatamente realizadas pelo desenvolvedor d em linha criadas por outros desenvolvedores. Este mesmo conceito pode ser utilizado para produzir métricas individuais com base nas equações 3-16, 3-17 e 3-18. Ao todo, oito novas métricas sobre aspectos individuais são obtidos. 3.2.3 Ampliação das métricas para análise em arquivo As métricas apresentadas nas seções anteriores podem ser expandidas para computar alterações em arquivos, em um nível mais alto de granularidade. Para tanto, definimos novos conceitos, em adição aqueles introduzidos na Seção 3.1, os quais são muito próximos da forma como um SCV armazena a evolução dos artefatos de um projeto. Uma revisão de projeto é uma tripla (r, d, L), onde: • r é o rótulo da revisão/versão, • d é identificador do desenvolvedor que a realizou, com d ∈ D e • L é uma lista de pares (a,t) onde a é um arquivo e t ∈ {C, M, R}2 descreve a operação realizada sobre o arquivo a na revisão r. Uma sequência de revisão de projeto é uma sequência SP = h(r1 , d1 , L1 ), (r2 , d2 , L2 ), . . . , (rm , dm , Lm )i de triplas definidas acima, de forma a representar todo o histórico das alterações feitas sobre os arquivos do projeto P sem, no entanto, entrar em detalhe nas modificações realizadas nas linhas individualmente. Todo arquivo a ∈ A é criado em alguma revisão do projeto e pode ser mantido inalterado, modificado ou removido nas revisões seguintes. No caso de ser removido, o arquivo não mais aparece em futuras revisões3 . Se o arquivo não for alterado em alguma revisão i ele não aparece nos pares da lista Li . 2 Utilizar-se-à das primeiras letras de CRI, MOD, REM, respectivamente, para diferenciar as operações sobre arquivos das operações de linhas. 3 A reinclusão deste arquivo no SCV é possível, mais isso é representado pela criação de um outro arquivo, mesmo que tenha nome idêntico. 3.2 Conjunto de Métricas 51 Com base nesses conceitos, definimos novas métricas a seguir. A métrica abaixo computa a quantidade de commits4 feitos pelo desenvolvedor x seguidos imediatamente de um commit do desenvolvedor y. |SP |−1 Commits(x, y) = ∑ i=1 ( 1 se di = x e di+1 = y; 0 caso contrário. (3-21) Já a métrica 3-22 indica a quantidade de modificações imediatamente efetuadas pelo desenvolvedor y em arquivos criados pelo desenvolvedor x. Essa função é uma especificação de maior granularidade para relação entre desenvolvedores dada pela equação 3-15. 1 se existem inteiros i, j ∈ [1, |SP |] com i < j tal que di = x, d j = y, (a,C) ∈ Li , (a, M) ∈ L j , Arquivo_Cri_Mod(x, y) = ∑ e não haja inteiro k, i < k < j, para o qual (a,t) ∈ Lk a∈A para qualquer tipo de operação t; 0 caso contrário. (3-22) De modo similar, as próximas métricas são variações das equações 3-16, 3-17 e 3-18, definidas anteriormente. 1 se existem inteiros i, j ∈ [1, |SP |] com i < j tal que di = x, d j = y, (a,C) ∈ Li , (a, R) ∈ L j , Arquivo_Cri_Rem(x, y) = ∑ e não haja inteiro k, i < k < j, para o qual (a,t) ∈ Lk a∈A para qualquer tipo de operação t; 0 caso contrário. (3-23) 1 se di = xe e d j = ye (a, M) ∈ Li ∩ L j ∑ ∑ e 6 ∃ k, i < k < y, tal que (a, M) ∈ Lk ; j=i+1 a∈A 0 caso contrário. (3-24) |SP |−1 |SP | Arquivo_Mod_Mod(x, y) = ∑ i=1 4 O commit corresponde a um conjunto de mudanças (change-sets) que afetam arquivos e uma mensagem descritiva armazenada pelos SCV. 3.2 Conjunto de Métricas 52 1 se existem inteiros i, j ∈ [1, |SP |] com i < j tal que di = x, d j = y, (a, M) ∈ Li , (a, R) ∈ L j , Arquivo_Mod_Rem(x, y) = ∑ e não haja inteiro k, i < k < j, para o qual (a,t) ∈ Lk a∈A para qualquer tipo de operação t; 0 caso contrário. (3-25) A métrica Arquivo_Mod_Mod está definida de forma a considerar pares de alterações Mod_Mod consecutivas em todos os arquivos, mesmo daqueles que posteriormente são excluídos do repositório, caracterizando pois uma medida de esforço. Note que o cálculo da métrica pode ser implementado de forma mais eficiente em termos de tempo de execução do que aquela implicitamente sugerida pela equação 3-24, para isso é necessário manter atualizada uma lista das últimas ações realizadas sobre cada arquivo a ∈ A na medida em que avançamos de L1 até Lm , com m = |SP |. A quantidade total de pares de operações consecutivas sobre arquivos realizados pelo par de desenvolvedores (x, y) é dada por: Arquivo_Oper_Oper(x, y) = Arquivo_Cri_Mod(x, y)+ Arquivo_Cri_Rem(x, y)+ Arquivo_Mod_Mod(x, y)+ Arquivo_Mod_Rem(x, y) (3-26) Essas métricas de relacionamento induzem matrizes bidimensionais como na seção 3.2.2. Consequentemente, a somatória de suas linhas ou colunas também geram métricas individuais dos desenvolvedores conforme definidas abaixo, para as equações 3-21 e 3-22: Arquivo_Cri_ΣMod(d) = ∑ Arquivo_Cri_Mod(d, y) (3-27) ∑ Arquivo_Cri_Mod(x, d) (3-28) y∈D −{d} Arquivo_ΣCri_Mod(d) = x∈D −{d} Aplicam-se as mesmas regras de somatória para as equações 3-23, 3-24, 3-25 e 3-26. Para o caso da quantidade total de commits feitas por um desenvolvedor d, usamos uma definição mais simples: |SP | ΣCommits(d) = ∑ i=1 ( 1 se di = d 0 caso contrário. (3-29) 3.3 Comentários gerais 53 Todas essas métricas individuais possuem sua versão relativa (normalizada) divindo seu valor pela soma das mesmas para todos os desenvolvedores e como feito no caso das funções: 3-2, 3-4, 3-6, 3-8 e 3-10. As novas métricas relativas são indicadas pelo uso do sufixo _Rel em seus nomes. 3.3 Comentários gerais Apresentamos um conjunto de métricas M disposto na Tabela 3.1 que contempla as métricas absolutas, anteriormente formalizadas. Para cada métrica, existe também sua versão relativa, que foi utilizada, na prática (veja em Sistema Desenvolvido no Capítulo 5), como forma de normalização no processo de avaliação que será apresentado nos Estudos de Caso no Capítulo 6. Identificados alguns problemas decorrentes do modelo de métricas proposto que são expostos abaixo: • As alterações de modificação em níveis de linhas não consideram os caracteres alterados e foi percebido uma grande utilidade semântica para essa abordagem. Uma vez identificada a natureza da alteração seria possível indicar pontos de falhas com o objetivo de indicar partes do código que requerem atenção e apoiar os desenvolvedores em futuras alterações. • Não consideramos a temporariedade dos commits, todos tem igual importância. Portanto, seria interessante acrescentar essa propriedade para tratar essa característica criando uma medida configurável para cada alteração de acordo com o tempo. • Os arquivos e consequentemente as linhas, são tratados com a mesma relevância. Deste modo, um arquivo do núcleo do sistema tem o mesmo valor que algum arquivo do componente de visualização menos importante. • Não se tem definido mecanismos de como adicionar especialistas com experiência já comprovada seja em outros projetos ou empírica. No presente trabalho, essa experiência é baseada na meritocracia gerada a partir dos registros armazenados unicamente no SCV. Existe a possibilidade de se criar novas métricas a partir dos relacionamentos mais complexos como, por exemplo, uma relação de três operações sequenciais para arquivos ou linhas ou pela combinação das métricas já existentes, como foi feito para “Efetividade de Criação dividida pelo Esforço de Criação”. Vale resaltar, ainda, que pode ser aplicada alguma operação matemática que faça sentido para obtenção de dados relevantes. Outra possibilidade a se considerar é a verificação da cobertura do trabalho realizado por um desenvolvedor. Essa cobertura poderia aferir a distância, no sentido de Efet_Cri Efet_Mod Esfo_Cri Esfo_Dist_Mod Esfo_Rem Efet_Cri_Div_Esfo_Cri Efet_Mod_Div_Esfo_Dist_Mod ΣCommits Linha_ΣCri_Mod Linha_ΣMod_Mod Linha_ΣMod_Rem Linha_ΣCri_Rem Linha_Cri_ΣMod Linha_Mod_ΣMod Linha_Mod_ΣRem Linha_Cri_ΣRem Arquivo_ΣCri_Mod Arquivo_ΣMod_Mod Arquivo_ΣMod_Rem Arquivo_ΣCri_Rem Arquivo_Cri_ΣMod Arquivo_Mod_ΣMod Arquivo_Mod_ΣRem Arquivo_Cri_ΣRem 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Efetividade de criação de d. Efetividade de modificação de d Esforço de criação de d. Esforço distinto de modificação de d. Esforço de remoção de d. Efetividade de criação dividido pelo esforço de criação de d. Efetividade de modificação dividido pelo esforço distinto de modificação de d. Somatório de commits feitos por d. Somatório das linhas adicionadas por d seguidas de modificação por outro desenvolvedor. Somatório das linhas modificadas por d seguidas de modificação por outro desenvolvedor. Somatório das linhas modificadas por d seguidas de exclusão por outro desenvolvedor. Somatório das linhas adicionadas por d seguidas de exclusão por outro desenvolvedor. Somatório das linhas modificadas por d logo após serem adicionadas por outro desenvolvedor. Somatório das linhas modificadas por d logo após serem modificadas por outro desenvolvedor. Somatório das linhas excluídas por d logo após serem modificadas por outro desenvolvedor. Somatório das linhas excluídas por d logo após serem adicionadas por outro desenvolvedor. Somatório dos arquivos adicionados por d seguidos de modificação por outro desenvolvedor. Somatório dos arquivos modificados por d seguidos de modificação por outro desenvolvedor. Somatório dos arquivos modificados por d seguidos de exclusão por outro desenvolvedor. Somatório dos arquivos adicionados por d seguidos de exclusão por outro desenvolvedor. Somatório dos arquivos modificados por d logo após serem adicionados por outro desenvolvedor. Somatório dos arquivos modificados por d logo após serem modificados por outro desenvolvedor. Somatório dos arquivos excluídos por d logo após serem modificados por outro desenvolvedor. Somatório dos arquivos excluídos por d logo após serem adicionados por outro desenvolvedor. Descrição Tabela 3.1: Relação das métricas absolutas definidas. Suas versões relativas também existem. Métricas No 3.3 Comentários gerais 54 3.3 Comentários gerais 55 proximidade dos arquivos alterados. Por essa aproximidade caracteriza se o desenvolvedor é mais completo, se trabalhou em arquivos espalhados pelo projeto, ou se específico, quando ele trabalhou somente em arquivos comuns que caracterizam módulos do sistema. Algumas métricas usam informações que são necessárias para a composição de outras, portanto, é evidente que existe uma relação entre elas. Fazer uso de métricas que são altamente correrelacionadas, ou seja, na medida que uma aumenta a outra aumenta proporcionalmente, influencia negativamente na avaliação que procura destacar aspectos distintos dos desenvolvedores na tentativa de anular ou minimizar este problema, propomos métodos para detecção de um subconjunto, os quais são discutidos nos próximos capítulos. CAPÍTULO 4 Comparação entre Desenvolvedores Com base nas métricas definidas no Capítulo anterior, são propostas duas abordagens para comparação dos desenvolvedores. A primeira abordagem procura classificar os desenvolvedores de acordo com o desempenho obtido em algumas métricas. Já a segunda, objetiva demonstrar visualmente quão parecidos ou diferentes os desenvolvedores são entre si. 4.1 Classificação por desempenho Para a comparação de desenvolvedores descrita nesta seção, aproveitamos alguns conceitos comumente utilizados em métodos de resolução de problemas de otimização multiobjetivos, baseados na ideia de Fronteira de Pareto ou Pareto Ótimo [38, 13]. Três conceitos são particularmente úteis para o presente trabalho – dominância, soluções equivalentes e solução eficiente – os quais são definidos a seguir Sejam fi , i = 1, 2, . . . , k, funções objetivos a serem analizadas, e S o conjunto de todas as soluções factíveis para um problema de otimização. Dadas duas soluções xa e xb ∈ S , se fi (xb ) ≤ fi (xa ) para todo i e se a desigualdade é estrita para algum i, então dizemos que xb domina xa . Se xa não domina xb nem o inverso ocorre, então xa e xb são ditas soluções equivalentes. Uma solução é considerada eficiente se ela não é dominada por nenhuma outra solução em S . O conjunto de todas as soluções eficientes em S é o Pareto Ótimo 1 . Aproveitamos esses conceitos fazendo uma associação na qual as métricas são tratadas como funções e os desenvolvedores são as soluções. O objetivo agora é dividir os desenvolvedores em classes de equivalência hierarquicamente dominadas (c1 , c2 , . . . , cn ), de tal forma que cada classe seja um conjunto de soluções equivalentes (desenvolvedores que não se dominam) e cada desenvolvedor em uma classe ci , para i > 1, é dominado por pelo menos um outro desenvolvedor na classe anterior ci−1 . 1 Encontrar o Pareto Ótimo está relacionado com o Problema do Vetor Máximo (ou Maximum Vector Problem em inglês) [43, 18]. 4.1 Classificação por desempenho 57 A Figura 4.1 demonstra um exemplo da separação dos desenvolvedores em classes. A primeira classe contém desenvolvedores que não são dominados por nenhum outro desenvolvedor do conjunto. Em seguida, temos uma classe formada por desenvolvedores que são dominados por, pelo menos, um desenvolvedor da primeira classe. Figura 4.1: Exemplo de separação em classes de dominância. O desenvolvedor dc não faz parte da primeira classe porque é dominado por db . Já da e db não se dominam nem são dominados por qualquer outro desenvolvedor do conjunto D , fazendo assim parte da primeira classe (correspondente ao Pareto Ótimo). A divisão dos desenvolvedores em classes pode ser obtida através de um processo que iterativamente identifica e extrai todos os desenvolvedores não dominados de um conjunto inicialmente configurado como igual a D. Uma versão simples desse processo é apresentado no Algoritmo 4.1. Consideramos que, quando um desenvolvedor faz parte da primeira classe, ele é quantitativamente superior aos demais. Essa relação vale para as classes subsequentes. No entanto, para que o processo comparativo funcione, é preciso que as métricas tenham um mesmo sentido de valor, por exemplo, quanto maior melhor. A definição do sentido de interpretação de uma métrica é uma tarefa subjetiva. Como ilustração considere a métrica de Esforço de Modificação. Um alto valor nessa métrica pode indicar que o desenvolvedor em questão trabalhou bastante no desenvolvimento de um software, o que seria algo positivo. Por outro lado, é possível também considerar um grande volume de esforço como um aspecto negativo, principalmente se ele não gerou resultados efetivos. Desta forma, cabe ao interessado em comparar os desenvolvedores a definição do sentido que deve ser dado a cada uma das métricas, bem como, escolher dentre elas as que são mais adequadas ao contexto. Note que é possível inverter o sentido de um métrica tormando negativo o seu valor ou elevando-o à potência -1. 4.2 Comparação por similaridade 58 Algoritmo 4.1: Divisão_em_Classes(D ) Entrada: Conjunto de desenvolvedores D Saída: Classes de desenvolvedores ci ⊆ D , hierarquicamente dominados. 1 2 3 4 5 6 7 8 9 10 A ← D; / R ← 0; i ← 1; enquanto A 6= 0/ faça ci ← todos os desenvolvedores de A que não são dominados por nenhum outro desenvolvedor nesse conjunto; /* Se A é um conjunto de desenvolvedores equivalentes, então será retornado o próprio A. */ A ← A − ci ; R ← R ∪ {ci }; i ← i + 1; fim retorna R ; Alguns cuidados adicionais devem ser tomados quando utilizando as métricas Efet_Cri_Div_Esfo_Cri e Efet_Mod_Div_Esfo_Dist_Mod. Elas podem produzir injustiças como participações pequenas com alto percentual de aproveitamento. Para estes casos, antes de produzir as classes de dominiância, deve ser anulado (definida como 0) o valor nessas métricas para os desenvolvedores cuja a produção for inferior a 10% da soma total em Esfo_Cri e Esfo_Dist_Mod, respectivamente. 4.2 Comparação por similaridade Em complementação à abordagem anterior, apresentamos uma comparação por similaridade que busca identificar se os desenvolvedores são semelhantes na sua forma de trabalho com base nas métricas. Para tanto, utilizamos uma ferramenta estatística conhecida como Multidimensional Scaling (MDS) [2, 7] que escalona dados multidimesionais para projetá-los em uma dimensão menor 2 , efatizando as relações de proximidade entre os mesmos. O MDS pode ser aplicado em várias áreas do conhecimento como: (a) ciências sociais, classificando indivíduos por seus desejos; (b) Arqueologia, analisando compatibilidade de objetos encontrados; (c) química, para conformatização molecular, que é um problema de reconstrução espacial de estruturas moleculares, (d) Computação, desenho de leiautes de grafos [26] e outros. 2 No presente trabalho utilizou-se de duas dimensões. 4.2 Comparação por similaridade 59 Para demonstrar o MDS em um exemplo minimalista e hipotético, projetou-se os critérios de preferência entre seis pessoas pelo gosto por frutas, verduras, carne branca, carne vermelha e massas em uma escala de 0 a 1, onde 0 representa não gostar e 1 gostar. A diposição de suas preferências segue o disposto na Tabela 4.1. Pessoa Frutas Verduras 1 0,50 0,40 2 0,50 0,60 3 0 0 4 0 0 5 0 0 6 0 0 Carne Branca Carne Vermelha Massas 0 0 0 0 0 0 0 0 0,60 0 0 0,50 0,55 0,55 0 0,45 0,45 0 Tabela 4.1: Exemplo de uso do MDS em um conceito minimalista. Intencionalmente, e apenas a título de ilustração, manipulou-se as pessoas 1 e 2 pelo gosto exclusivo por frutas, as pessoas 3 e 4 pelo gosto por massas e as pessoas 5 e 6 pelo gosto por carnes. Como resultado, espera-se do MDS um agrupamento das pessoas pelas suas preferências, fato que se confirma, conforme verificado na Figura 4.2. Figura 4.2: Exemplo do MDS em um agrupamento de pessoas com preferências em comum. Aplicando esse conhecimento ao nosso problema, cada desenvolvedor possui valores para um conjunto de métricas, e uma projeção MDS é adotada para destacar visualmente a similaridade (ou a diferença) entre esses desenvolvedores com base nos seus valores. Deve-se ter o cuidado, no entanto, para não escolher métricas fortemente correlacionadas para a análise com o MDS. Se muitas métricas correlacionadas entre si forem escolhidas para o conjunto de análise, elas tenderão a dominar a projeção e a 4.2 Comparação por similaridade 60 visualização não conseguirá expressar os aspectos distintos dos desenvolvedores (o que seria desejável). Diante do problema exposto, é necessário um procedimento para verificar a relação das métricas e escolher, dentre elas, um conjunto não fortemente relacionado para ser utilizado na análise de similaridade. A fim de identificar automaticamente métricas não correlacionadas, construiu-se, neste trabalho, um processo para selecionar boas métricas de avaliação. Inicialmente, calcula-se o coeficiente de correlação de Pearson que retorna a correção linear entre duas variáveis x e y em uma escala de -1 a +1, sendo: -1 – correlação negativamente perfeita entre as duas variáveis (quando uma aumenta a outra diminui), 0 – não dependem linearmente uma da outra (mas pode existir uma relação não-linear), e +1 – correlação perfeitamente positiva entre as duas variáveis (quando uma aumenta a outra aumenta), O coeficiente de Pearson é calculado para todo par de métricas, resultando em uma matriz de métricas de tamanho n × n onde n é a quantidade de métricas. Em seguida, selecionamos um conjunto de métricas fracamente relacionadas. Isso foi feito através do Algoritmo 4.2, construído neste trabalho exclusivamente para tal fim. O Algoritmo recebe a matriz de correlação, um limiar de corte de correlação entre 0 e 1 e uma lista de métricas fixas, possivelmente vazia. O Algoritmo retorna o conjunto de métricas fixas acrescido de outras com base na correlação máxima definida pelo limiar. Caso o limiar seja igual a 0, o conjunto será adicionado apenas de métricas que não mantêm correlação linear entre si nem com as métricas fixas. Se o limiar for igual a 1, todas as métricas serão retornadas. Já limiares no intervalo (0,1) servem para descartar métricas cujo valor absoluto de sua correlação com outras já consideradas para retorno é superior a esse limite. A existência da lista de métricas fixas se justifica caso seja necessário escolher intuitivamente um conjunto de métricas e desconsiderar outras ou quando deseja-se aumentar um conjunto de métricas pré-selecionadas para reforçar algum critério de interesse. 4.2 Comparação por similaridade 61 Algoritmo 4.2: Seleção_de_Métricas(correl, limite, F ) Entrada: Matriz de correlação de tamanho n × n, limite para corte da correlação no intervalo [0, 1], lista F de métricas fixas pertencentes ao conjunto completo M Saída: Conjunto de métricas selecionadas de M 1 2 3 4 5 6 7 8 9 Para cada métrica m ∈ M , calcule o somatório da correlação de m com todas as outras métricas em M ; Crie um vetor V contendo, no início, as métricas de F seguidas das demais métricas ordenadas ascendentemente pelo seu somatório; Marque todas as métricas em M como selecionadas; para i = 1 até |V | − 1 faça se a métrica V [i] está marcada em M como selecionada então para j = i + 1 até |V | faça se V [ j] ∈ / F e absoluto(correl[V [i]], V [ j]]) > limite então Marque V [ j] em M como não selecionada; fim fim 10 11 12 13 fim fim retorna as métricas de M marcadas como selecionadas; Existem deficiências em nosso algoritmo a considerar. Por exemplo, ele não detecta correlação não linear. Além disso, embora a verificação da correlação de Pearson das métricas seja útil, ela não deve ser a única técnica utilizada, uma vez que falsos-positivos podem existir (por exemplo, correlação alta porém gráfico não linear) e conduzir-nos a resultados errôneos. Pode ser empregada, portanto, uma Matrix Scatter Plot (MSP) para confirmar visualmente padrões de correlação entre as métricas. Dado um conjunto de variáveis X1 , X2 , . . . , Xk , uma MSP é formada pelo emparelhamento de simples Scatter Plots em um formato de matriz. A diagonal principal (onde k-linha é igual a k-coluna) é descartada uma vez que não tem sentido prático comparar uma váriavel com ela mesma. A matriz gerada é simétrica. Um exemplo ilustrativo de uma MSP é apresentado na Figura 4.3. Foi computada uma MSP sobre as métricas dos desenvolvedores para um projeto de software estudado (o primeiro estudo de caso descrito no Capítulo 6). A matriz MSP possui 24 × 24 Scatter Plots descrevendo a relação entre 24 métricas para onze desenvolvedores. Após extensiva análise visual de todos os relacionamentos apresentados nessa matriz e experiência empírica, percebeu-se a utilidade de quatro métricas sendo elas: Efetividade de Criação (Efet_Cri), Efetividade 4.2 Comparação por similaridade 62 Figura 4.3: Exemplo de uma Matrix Scatter Plot onde as variáveis são, largura e altura das pétalas e sépalas de lírios. Exemplo ilustrativo e não discutido no texto. Extraído de http://bl.ocks.org/4063663. de Modificação (Efet_Mod), Efetividade de Criação dividido pelo Esforço de Criação (Efet_Cri_Div_Esfo_Cri), e Efetividade de Modificação dividido pelo Esforço Distinto de Modificação (Efet_Mod_Div_Esfo_Dist_Mod). Essas métricas representam a quantidade de criação de um desenvolvedor, o esforço que ele desprendeu para evolução dos artefatos, e as taxas de aproveitamento de suas criações e modificações respectivamente. Acreditamos que tais métricas são um ponto de partida para comparação entre os desenvolvedores, devendo as mesmas serem ratificadas ou modificadas por meio de um estudo para cada projeto de software. CAPÍTULO 5 Sistema Desenvolvido Este capítulo apresenta um sistema que implementa as métricas formuladas no Capítulo 3 e as abordagens de comparação entre os desenvolvedores proposto no Capítulo 4. A motivação para a criação de um sistema é oferecer uma ferramenta pronta para aplicar a abordagem em repositórios reais de código fonte. 5.1 Tecnologias utilizadas Para implementação, foi usada a linguagem de progração Ruby [15, 46] na versão 1.9.3, além de algumas de suas bibliotecas internas e externas, como listadas a seguir: • Bundler – componente facilitador que permite instalar dependências internas de bibliotecas e componentes necessárias para o funcionamento do sistema. 1 • Awesome_print – biblioteca para impressão amigáveis das estruturas muito utilizado para depuração. 2 • Mime-types – biblioteca que permite a identificação de tipo de arquivos. Em nossa implementação necessitamos saber se os arquivos são binários ou de texto plano para aplicar o processo de análise. 3 • Axlsx – componente que permite a geração de planilhas. 4 Foi criada uma aplicação desktop capaz de conectar em um SCV indicado por parâmetro e extrair todos os dados necessários para análise. Optamos por trabalhar com o Subversion (svn) que apesar de ser comum é compatível com seu antecessor o CVS e também bastante utilizado em modelos de softwares livres e proprietários. 1 http://gembundler.com 2 https://github.com/michaeldv/awesome_print 3 http://mime-types.rubyforge.org 4 https://github.com/janhuehne/axlsx 5.2 Etapas de Funcionamento do Sistema 64 Nossa implementação suporta apenas o versionador Subversion porém já está em desenvolvimento, uma versão inicial para Git. Outros versionadores podem ser utilizados desde que implementados os drivers adequados. Além dessas tecnologias, o sistema produz arquivos de saída em formatos para serem lidos por outros programas como: GGobi [45, 44], uma ferramenta livre para exploração de dados multidimensionais e o D3js [4], um framework de visualização de informações. O sistema também faz uso do aplicativo diff que é comum em sistemas operacionais Linux para geração das diferenças entre arquivos. Apesar dos SCV implementarem sua própria versão do diff, usamos a do sistema operacional para solucionar problemas encontrados que serão comentados no final deste capítulo. 5.2 Etapas de Funcionamento do Sistema O sistema funciona em três etapas: Geração do Histórico, Coleta das Métricas e Produção dos Dados de Comparação, como ilustrado na Figura 5.1. Essas etapas são implementadas na forma de programas separados e são descritos detalhadamente a seguir. Figura 5.1: Descrição de cada processo para análise de desenvolvedores a partir da mineração de repositório. 5.2.1 Geração do Histórico A Geração do Histórico tem por objetivo ler os dados de um SCV e produzir os históricos de projeto com seus respectivos históricos de arquivos e históricos de linhas como descritos nas Seções 3.2.2 e 3.2.3. O histórico de projetos no nível de arquivo (Seção 3.2.3) advém diretamente do Subversion sem grandes alterações. A partir 5.2 Etapas de Funcionamento do Sistema 65 dessa estrutura, criamos os históricos de arquivos e de linhas usando um algoritmo que desenvolvemos e que está referenciado a seguir como Algoritmo 5.1. O Algoritmo e as operações efetuados sob os arquivos podem ser descritos da seguinte maneira. 5 • Quando uma alteração do tipo A (correspondente a adicionar) é identificada, inicializa-se uma estrutura de dados armazenando todas as suas linhas. • Quando uma alteração do tipo D (correspondente a excluir) é identificada, marca-se todas as linhas como removidas 6 no arquivo de estrutura de dados. • Quando uma alteração do tipo M (correspondente a modificar) é identificada, incrementa-se o arquivo de estrutura (anteriormente adicionado) com as devidas modificações encontradas após análise das diferenças linha a linha. A operação nos arquivos do tipo (M) leva a implementação do Algoritmo 5.2 que obtém a diferença de um mesmo arquivo em sua versão anterior e atual. A diferenças, por sua vez, pode conter alterações nas linhas do tipo CRI, MOD, REM, apesar de parecer simples quando existe uma operação de CRI (criação) é necessário verificar a posição precisa no arquivo de história e fazer a inserção correta nas estruturas de dados do sistema. Para efetuar um inserção deve-se levar consideração as alterações feitas anteriormente. Por exemplo, se a iteração anterior removeu linhas, então a posição das novas linhas deve desconsiderar as linhas previamente removidas. Ao término da iteração de todos os arquivos do projeto, é obtida uma cópia da árvore de diretórios no mesmo formato da original contendo em cada arquivo toda a sua história. Portanto é possível restaurar os arquivos em qualquer revisão feita anteriormente. Um exemplo hipotético criado para demonstrar o formado dos arquivos que serão gerados é apresentado no Registro 5.1. O devido arquivo foi inicializado com duas linhas (a primeira coluna representa as linhas) sendo “linha-1” e “linha-2” respectivamente (revisão 1). Na revisão seguinte é modificada a primeira linha pelo conteúdo “linha-a” e adicionado linha 3 com conteúdo “linha-4” (revisão 2), na próxima iteração removeuse a linha 3 (revisão 3). A linha zero é reservada para metadados em caso de alguma necessidade futura. Entretanto, é necessário considerar mais duas operações sobre os arquivos identificadas no modelo do Subversion que são: C (copiar) e R (substituir). O primeiro corresponde a uma operação conceitual, ou seja, cria uma referencia entre arquivos enquanto não são modificados. O teor dos arquivos são os mesmos mas em locais diferentes. Na prática isso permite uma grande economia de espaço em projetos que 5A nomeclatura dos tipos estão idênticas ao versionador subversion em questão, que são A,M,D,R que em nosso modelo corresponde à C,M,R,S respectivamente. 6 Nenhuma remoção é efetivamente efetuada pois é necessário computação das métricas. 5.2 Etapas de Funcionamento do Sistema 66 Algoritmo 5.1: Constrói_Histórico_Projeto(SP ) Entrada: Sequênca de Revisão de Projeto SP Saída: Histórico de Projeto HP e conjuntos de arquivos A e Ar ⊂ A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 / HP ← 0; / Cria uma lista com última versão de cada arquivo. Inicialmente A ← 0; r / Cria também uma lista de arquivos A ← 0; para cada revisão no projeto s ∈ SP faça /* Obs.: Um revisão de projeto consiste de uma tripla (r,d,L) com descrito na Seção 3.2.2 */ para cada (a,t) ∈ s.L faça /* */ se t = C então /* Se a operação é de Criação */ Cria arquivo de historia Ha ← ∅; para cada linha l de a em sequência faça /* */ Cria um histórico de linha hl com operação o = (s.r, s.d,CRI, l); Adiciona hl no final de Ha ; fim Adiciona Ha a HP ; Adiciona a a A; senão se t = R então /* Se a operação é de Remoção */ Recupera Ha de HP ; para cada histórico de linha hl ∈ Ha faça /* */ se hl não termina com a operação REM então Cria um histórico de linha hl com operação o = (s.r, s.d, REM, ∅); Adiciona o no final de hl ; fim fim Adiciona a a Ar ; senão se t = M então /* Se a operação é de Modificação */ Recupera a última versão de a ∈ A. Seja a0 essa versão; Computa uma sequência X de alterações de linha de a com base no comando di f f (a0 , a). Uma alteracão de linha é da forma x = (linha,tipo,texto), na qual linha é o número da linha alterada, tipo ∈ {CRI, MOD, REM} é o tipo de alteração realizada na linha pelo desenvolvedor, e texto é o conteúdo da linha após a alteração. A lista X deve conter um sequência de alterações de linha ordenadas pelo número da linha alterada; Recupera Ha de HP ; Hanovo ← Atualiza_Histórico(Ha , s.r, s.d, X ); // Ver Algoritmo 5.2 Substitui Ha ∈ HP por Hanovo ; Substitui a0 ∈ A por a; fim fim fim 5.2 Etapas de Funcionamento do Sistema 67 Algoritmo 5.2: Atualiza_Histórico(Ha , v, d, X ) Entrada: Histórico de arquivo Ha , versão v, desenvolvedor d, Lista de alterações X em ordem crescente de linhas. Saída: Histórico de arquivo Ha , incrementado com a lista de alterações. 1 2 3 4 5 6 7 8 9 10 11 para cada x ∈ X faça /* Para cada alteração da Lista X */ p ← Posição no histórico Ha da linha indicada por x.linha, desconsiderando as linhas do tipo “Rem” existentes; se x.tipo = “Cri” então // Se a operação é de Criação Cria uma operação o (versão = v, desenv = d, tipo = x.tipo, texto = x.texto); Cria um novo histórico de linha na posição p de Ha , deslocando o restante dos históricos de linha para baixo; Insere o no histórico de linha na posição p; senão se x.tipo = “Mod” ou o.tipo = “Rem” então // Caso contrário Acrescenta a operação o no histórico de linha que se encontra na posição p de Ha ; fim fim retorna Ha ; tem muitas derivações de um parte principal ou em casos de ramos (branches) e rótulos (tags), correspondente a liberações de versões baseadas em planejamentos prévios. O segundo representa uma operação de excluir e adicionar feita de uma única vez. A não existência dessa operação implicaria a necessidade de duas em sequência que não é muito prático. Tratamos o caso R (substituir) como M (modificar) da seguinte maneira: aplicase uma operação D, removendo todas as linhas do arquivo e em seguida aplica-se as operações C (criar), adicionando as linhas incluídas na referida revisão. O histórico de arquivos será mantido em uma sequência de tipos no formato A > (M) > D, em outro caso seria A > (R > A) > D, o sinal > significa “seguido de” em um histórico de arquivo e os parênteses “()” indicam a posição onde ocorreram as ações que descrevemos. Os arquivos de histórico mencionados são usados como entrada para a análise dos resultados obtidos e para a próxima etapa do processo. 5.2.2 Cálculo das Métricas O processo de cálculo das métricas inicia-se na análise das estrutura dos históricos e procede de acordo com o tipo de cada alteração efetuada. No momento que os arquivos de histórico são analisados as métricas são computada conforme descrito no Capítulo 3. 5.2 Etapas de Funcionamento do Sistema 68 [0] [] , [1] [ [0] {: versao : 1, : desenv : " user1 ", : tipo : " Cri ", : texto : " linha -1\ n"} , [1] {: versao : 2, : desenv : " user2 ", : tipo : " Mod ", : texto : " linha -a\n"} , ], [2] [ [0] {: versao : 1, : desenv : " user1 ", : tipo : " Cri ", : texto : " linha -2\ n "} ], [3] [ [0] {: versao : 2, : desenv : " user2 ", : tipo : " Cri ", : texto : " linha -4\ n"} , [1] {: versao : 3, : desenv : " user1 ", : tipo : " Rem ", : texto : " linha -4\ n "} ] Registro 5.1: Exemplo de registro de histórico processado pelo Algoritmo 5.2. 5.2.3 Produção dos Dados de Comparação Uma vez que todas as métricas são computadas, o último processo é executado para gerar os seguintes arquivos como resultado: 1. Classes de equivalência – Um arquivo no formato de dados serializados (yaml) 7 legível contendo as classes de dominância previamente apresentada. 2. Análise MDS – Um arquivo no formato de marcação extendida (xml) 8 preparado para o GGobi. O referido arquivo possui duas partes, a primeira contendo as métricas para cada desenvolvedor e a outra com a distância euclidiana entre os desenvolvedores. 3. Relação das métricas selecionadas – Um arquivo no formato de notação de objeto JavaScript Object Notation (json) 9 , as estruturas estão definidas para visualização pelo framework D3js. 7 http://www.yaml.org/spec/1.2/spec.html 8 http://www.w3.org/TR/REC-xml/ 9 http://www.ietf.org/rfc/rfc4627.txt 5.3 Visualizações desenvolvidas para análise 69 4. Visualização das relações entre os desenvolvedores – Um arquivo no formato de notação de objeto (json), as estruturas estão definidas para visualização pelo D3js. 5. Matriz de correlação – Um arquivo no formato planilha (xlsx) 10 contendo o valor da correlação entre todas as métricas; 6. Métricas selecionadas – Um arquivo no formato planilha (xlsx) contendo todas as métricas selecionadas em sua versão absoluta e relativa; 7. Métricas de relacionamento entre desenvolvedores – Um arquivo no formato planilha (xlsx) que contém em cada aba as métricas de relacionamento entre os desenvolvedores em sua versão absoluta e relativa; Alguns dos arquivos gerados foram usados como base para entrevistas com os gerentes de projetos nos estudo de caso descritos no Capítulo 6. 5.3 Visualizações desenvolvidas para análise Para facilitar a identificação de padrões no comportamento dos desenvolvedores e apoiar o processo de escolha de métricas foram contruídas visualizações de informação utilizado o framework D3js 11 . As próximas seções descrevem tais visualizações. 5.3.1 Visualização de relacionamento entre desenvolvedores A visualização de relacionamento entre os desenvolvedores foi a primeira a ser produzida neste trabalho e teve como meta a verificação do trabalho exercido pelos desenvolvedores a partir de suas métricas. Toda planilha de relacionamento entre os desenvolvedores foi transformada para o formato json, e usada como entrada para geração dessas visualizações. A estrutura visual consiste em um painel para cada métrica. Cada painel, por sua vez, possui nós que representam os desenvolvedores e que estão dispostos de modo equidistantes sobre uma circunferência. O tamanho do nó aumenta quando um desenvolvedor faz iterações com ele mesmo em sequência, por exemplo, um commit seguido de outro commit, ambos, feitos pelo mesmo desenvolvedor. Uma aresta existe quando um desenvolvedor interage com outros desenvolvedores, a cor indica a origem e a espessura indica a quantidade de iterações com o destino. 10 http://msdn.microsoft.com/en-us/library/dd361853.aspx 11 O D3js [4] é a evolução do Protovis [3] ambos produzidos por um grupo de visualização da Universidade de Stanford (http://vis.stanford.edu) e utiliza padrões web amplamente adotados pela maioria dos navegadores. 5.3 Visualizações desenvolvidas para análise 70 Dessa forma um desenvolvedor que interage bastante com outro desenvolvedor terá uma ligação espessa e facilmente percebida visualmente. É notável, também, quando existe um grande esforço do desenvolvedor com ele próprio (operações em sequência do mesmo desenvolvedor) pelo tamanho do nó que representa o desenvolvedor. A visualização possui interação com o usuário e é possível selecionar quais painéis se deseja mostrar simultaneamente. Basta um clique em um nó para destacá-lo e também suas arestas, em todos os painéis. É possível destacar vários nós ao mesmo tempo, permitindo verificar visualmente as interações entre esses desenvolvedores. A Figura 5.2 apresenta a visualização descrita anteriormente, selecionado apenas três painéis (no caso, commits, arquivos e linhas) e destacando dois desenvolvedores. Figura 5.2: Apresentação de três painéis de métricas: commits, arquivos e linhas da esquerda para direita respectivamente. Os desenvolvedores 1 (azul do lado direito dos painéis) e 7 (vermelho do lados esquerdo dos painéis) estão destacados. 5.3.2 Visualização de cobertura de métricas A segunda visualização foi proposta como forma de apoiar a identificação de métricas altamente correlacionadas. Foi usado um grafo e um sistema de forças no modelo springs onde cada nó corresponde a uma métrica e uma aresta existe para cada par de nós, representando a correlação entre as suas respectivas métricas. Os nós são posicionados no início de forma aleatória e o sistema de força tende a reorganizá-los. O grafo gerado conduziu-nos a geração da rotina de Seleção de Métricas (Algoritmo 4.2) e portanto os seu dados consideram apenas nós que são superiores a um limiar pré-estabelecidos. A Figura 5.3 apresenta um conjunto de métricas com limiar 0,1, foram selecionadas automaticamente as seguintes métricas: Efet_Mod_Div_Esfo_Dist_Mod e Linha_Mod_ΣDel. 5.4 Dificuldades na Implementação 71 Figura 5.3: Visualização de um processo de identificação de cobertura de métricas onde as métricas destacadas foram selecionadas automaticamente pelo Algoritmo de Seleção de Métricas. 5.4 Dificuldades na Implementação Algumas dificuldades foram encontradas no desenvolvimento do sistema apresentado neste capítulo. Notou-se dois problemas difícies de se identificar no qual foram gastos tempo com depurações e implementações para contorná-los. No primeiro caso, o versionador não gerava um arquivo de diferenças válido para algum código, conforme demonstrado na Figura 5.4. Note na linha 10 que o segundo contexto é expressado pelos sinais @@. Neste caso, isso diz que aquele bloco se inicia na linha 2 porém existem três linhas antes, o que é um equívoco. No segundo caso, operações inconsistentes foram geradas. Confira na Figura 5.5 o registro de atividades de um arquivo. Esse arquivo foi adicionado pela primeira vez na revisão 975 e alterado nas revisões 988 e 1015. Porém, ele foi adicionado novamente na revisão 1456 e ainda na revisão 1563, sem antes ter sido removido, confirmando uma operação de inconsistência. Em contato com o gerente e os desenvolvedores do projeto percebeu-se uma alteração na codificação de caracteres desses arquivos, algo que o SCV 5.4 Dificuldades na Implementação 72 Figura 5.4: Problema encontrado no arquivo de diferenças gerado pelo Subversion. não entendeu causando má interpretação das operação ao considerar um novo arquivo. Para estes casos nenhuma ação foi tomada apenas o avisos de inconsistência são gerados pelo nosso sistema. Figura 5.5: Problema encontrado em operações inconsistentes geradas pelo Subversion. CAPÍTULO 6 Avaliação Com o intuito de verificar o comportamento das abordagens de comparação entre desenvolvedores descritas anteriormente, foi realizada uma avaliação qualitativa através de dois estudos de casos utilizando o sistema implementado em SCV de projetos reais. A metodologia de avaliação e o resultado dos estudos são apresentados a seguir. No final do capítulo, discutimos também outros aspectos relacionados com o ajuste de configurações. 6.1 Metodologia para os estudos de casos Para a realização dos estudos, escolhemos dois projetos de desenvolvimento de software armazenados em repositórios SCV Subversion sob responsabilidade do Centro de Recursos Computacionais (Cercomp) 1 da UFG. Tal escolha foi feita com base na disponibilidade de gerentes que poderiam fornecer informações sobre esses projetos e analisar as abordagens de comparação apresentadas. O primeiro estudo de caso foi utilizado para experimentação e validação das metodologias, sendo que o autor da presente dissertação foi desenvolvedor e gerente do projeto. O segundo estudo de caso envolveu outra equipe. O gerente da mesma indicou o projeto no qual tinha interesse na avaliação para conhecer o perfil de seus desenvolvedores. A avaliação, para cada estudo de caso, foi realizada em quatro etapas: 1. Execução do sistema descrito no Capítulo 5, utilizando o repositório SCV indicado. Como mencionado anteriormente, esse sistema produz informações sobre o repositório SCV, métricas, classificação dos desenvolvedores por classes e uma matriz de dissimilaridade. 1 O Cercomp é o órgão da Universidade responsável pela infraestrutura de TI e desenvolvimento e manu- tenção dos sistemas acadêmicos e administrativos. Atualmente, há cerca de 50 projetos de desenvolvimento de software no repositório Subversion do órgão. O acesso aos dados foram cedidos pela direção do Cercomp para o presente trabalho. 6.1 Metodologia para os estudos de casos 74 2. Realização de uma entrevista com o gerente do projeto de desenvolvimento de software em questão com o objetivo de avaliar qualitativamente as abordagens de comparação baseadas em métricas. 3. Análise e interpretação dos resultados obtidos com a entrevista. 4. Repetição dos passos 1 para um novo conjunto de métricas e uma análise geral com o gerente. Para a etapa 1, foram escolhidas as quatro métricas citadas no final da Seção 4.2 que são: Efetividade de Criação (Efet_Cri), Esforço de Criação (Esfo_Cri), Efetividade de Criação dividido pelo Esforço de Criação (Efet_Cri_Div_Esfo_Cri) e Efetividade de Modificação dividido pelo Esforço Distinto de Modificação (Efet_Mod_Div_Esfo_Dist_Mod). Após a entrevista e com base nas perguntas finais respondidas pelo especialista, foi selecionado um novo conjunto de métricas de sua preferência e gerada novas comparações para análise. No caso específico das entrevistas, essas consistiram de um conjunto de perguntas previamente elaboradas para verificar se os resultados apresentados são compatíveis com as percepções de um especialista, que neste caso, é o gerente de projeto. O gerente de projeto foi escolhido como elemento central na entrevista por desempenhar um papel importante no processo de desenvolvimento de um software. Ele conhece todos os atores envolvido no desenvolvimento, os objetivos a serem alcançados e a metodologia de trabalho. A entrevista seguiu um roteiro de seis passos conforme descritos a seguir e apresentado em detalhe na Tabela 6.1: 1. Apresentação do objetivo da avaliação (ou seja, comparar desenvolvedores com base em dados coletados do Subversion e nas métrica geradas). 2. Apresentação da classificação dos desenvolvedores por classe de dominância e seu significado. 3. Realização de perguntas ao especialista (o gerente de projeto) sobre a interpretação dos resultados da classificação. 4. Apresentação da visualização em MDS. 5. Perguntas ao especialista sobre a visualização em MDS. 6. Perguntas finais ao avaliador sobre as métricas escolhidas para o projeto. 6.1 Metodologia para os estudos de casos Formulário de Entrevista Nome do Entrevistado: Nome do Projeto: Cargo: Formação: Local e Data: 1 Explicar os dados existentes e as métricas. (Explicar o que o sistema desenvolvido faz) 2 Apresentar a classificação por classe de dominância. (Explicar o significado de cada classe) 3 Perguntas sobre a classe de dominância. a) “Essa separação faz sentido para você?” b) “Se você fosse escolher um ou mais desenvolvedores para um projeto futuro, esta classificação ajudaria? Por quê? Quais os desenvolvedores você escolheria?” c) “Você classificaria os desenvolvedores dessa mesma forma? Por quê? Se não, como seria sua classificação?” d) “Tem algum desenvolvedor que você acha que foi classificado equivocadamente?” 4 Apresentar a visualização em MDS. (Explicar o que significa a distância entre dois desenvolvedores) 5 Perguntas sobre a visualização em MDS. e) “Os desenvolvedores que estão próximos são, de fato, parecidos na sua produção técnica? Eles produzem resultados semelhantes?” f) “Como você rotularia (daria nomes com base em alguma característica de similaridade) os “grupos” de pessoas visivelmente próximas?” g) “Há alguma discrepância ou semelhança entre os resultados das classes de dominância, apresentadas anteriormente, e a visualização MDS atual?” 6 Perguntas sobre o conjunto total de métricas. h) “Você concorda que quanto maior for o valor obtido em cada uma dessas 4 métricas melhor foi o desempenho do desenvolvedor? Por quê?” i) “Quais outras métricas (da planilha completa) você acha interessante/útil para uma avaliação dos desenvolvedores? Por quê?” Tabela 6.1: Formulário utilizado nas entrevistas dos estudos de caso. 75 6.2 Estudo de Caso 1 6.2 76 Estudo de Caso 1 O primeiro estudo de caso analisou um gerenciador de conteúdo Web chamado Weby. O nome Weby é uma junção das duas letras iniciais da palavra “Web” mais as duas letras finais da palavra “Ruby”, linguagem de programação utilizada em sua produção. O projeto iniciou-se em julho de 2010 pela Equipe Web do Cercomp com o objetivo de desenvolver um sistema flexível e extensível, com uma linguagem de programação moderna, e com várias novos recursos que o gerenciador de conteúdo antigo (também desenvolvido pela instituição e em PHP) da Universidade Federal de Goiás (UFG) não dispunha. A principal motivação para o projeto disponibilizar conteúdo de maneira simples, permitindo uma fácil administração da informação. O software é utilizado hoje para gerenciar mais de 400 sítios da UFG. O sistema é utilizado para apoiar a instituição no cumprimento a Lei 12.527, sancionada em 18 de novembro de 2.011, pela Presidente da República, Dilma Roussef, o qual regulamenta o direito constitucional de acesso dos cidadãos às informações públicas 2 . Também, instaura um canal de ouvidoria 3 conforme resolução Consuni 03/2009/UFG. A equipe iniciou o desenvolvimento do projeto com um colaborador e quatro estagiários. O contrato dos estagiários é de um ano, podendo ser renovado por mais um ano. O tempo de estágio é considerado pouco, gerando assim, um alto índice de rotatividade. O projeto foi avaliado considerando o período do seu início até o final de fevereiro de 2012 (1 anos e 7 meses) chegando a 1.294 revisões hospedadas no SCV (Subversion) após essa data o sistema foi migrado para outro SCV (Git), para o qual nosso sistema ainda não tem suporte. Durante o período considerado, onze desenvolvedores contribuiram para a evolução do software, sendo um servidor público, dois colaboradores e oito estagiários. A Tabela 6.2 apresenta informações gerais sobre o projeto como quantidade de commits, total de arquivos e linhas adicionados, modificados e removidos, em acréscimo, oferece informações sobre a ação dos desenvolvedores no projeto Weby. A primeira coluna corresponde aos nomes dos desenvolvedores que foram suprimidos para garantir suas privacidades evitando a identificação, a segunda coluna corresponde ao total de commits efetuados, a terceira coluna tríplice o total de arquivos criados, modificados e removidos e a última coluna tríplice o total de linhas criadas, modificadas e removidas. O Apêndice A mostra os quadros de métricas completas para esse projeto. Os resultados dos testes procederam com configuração de métricas conforme Tabela 6.3 que produziu a classe de dominância conforme Tabela 6.4. Para o MDS, 2 http://www.sic.ufg.br 3 http://www.ouvidoria.ufg.br 6.2 Estudo de Caso 1 Desenv. d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 Total Commits 474 159 2 170 30 99 61 183 20 24 72 1.294 77 Adicionados 652 3.610 1 378 43 2.142 13 5.883 1 8 7 12.738 Arquivos Modificados 1.827 496 7 591 79 374 381 786 34 74 203 4.852 Removidos 86 14 0 63 1 35 15 44 0 5 4 267 Adic. 110.204 4.340 26 44.013 1736 51.673 1.116 85.686 102 542 1.190 300.628 Linhas Mod. 7.026 1.521 31 1.577 142 1.548 923 4.688 398 196 489 18.549 Rem. 54.710 1.587 165 1.224 205 3.220 1.214 5.289 15 476 308 68.413 Tabela 6.2: Informações gerais sobre o projeto Weby. Total de commits, arquivos e linhas adicionados, modificados e removidos. utilizou-se o GGobi com configurações de análise de dissimilaridade com duas dimensões que produziu a visualização apresentada na Figura 6.1. D. d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 Efet_Cri 102.817 3.188 0 41.929 1.185 50.630 483 83.409 55 225 1.053 Efet_Mod 539 294 0 410 21 479 163 1.302 211 43 1.053 Efet_Cri_Div_Esfo_Cri 0,932935903 0,734562212 0,0 0,952628709 0,6826036866 0,9797205774 0,4324082363 0,9735284849 0,5392156863 0,4151291513 0,8848739496 Efet_Mod_Div_Esfo_Dist_Mod 0,2531705026 0,6099585062 0,0 0,4550499445 0,4375 0,8077571669 0,6127819549 0,6326530612 0,8755186722 0,6056338028 1,0096153846 Tabela 6.3: Conjunto de métricas selecionadas e resultados para o projeto Weby. Classes de dominância 1 2 3 4 5 6 Desenvolvedor d1, d6 e d8. d4. d2 e d11. d5, d7 e d9. d10. d3. Tabela 6.4: Resultados da classe de dominância para o projeto Weby. 6.2 Estudo de Caso 1 78 Figura 6.1: Resultado MDS para o projeto Weby. 6.2.1 Entrevista Como mencionado anteriormente, o autor desta dissertação foi desenvolvedor e gerente do projeto em questão. Assim, outro desenvolvedor foi escolhido para a avaliação que atualmente é o gerente da equipe 4 . A seguir, apresentamos as perguntas e as respostas dadas por esse gerente. A. Perguntas sobre a classe de dominância 1. “Essa separação faz sentido para você?” Sim. 2. “Se você fosse escolher um ou mais desenvolvedores para um projeto futuro, esta classificação ajudaria? Por quê? Quais os desenvolvedores você escolheria?” Ajudaria, porque perceberia o desempenho das pessoas. Os desenvolvedores d1, d6 e d8. 3. “Você classificaria os desenvolvedores dessa mesma forma? Por quê? Se não, como seria sua classificação?” Faria algumas pequenas modificações de modo que elevaria o desenvolvedor d4 para classe 1 e o desenvolvedor d10 para classe 4. 4. “Tem algum desenvolvedor que você acha que foi classificado equivocadamente?” Apesar da mudanças sugeridas na pergunta anterior a classificação não está ruim está apenas mais definida, ou seja contendo mais classes do que sugeri. 4O autor desta dissertação é o desenvolvedor d1 e o novo gerente é o desenvolvedor d11. 6.2 Estudo de Caso 1 79 B. Perguntas sobre a visualização em MDS 1. “Os desenvolvedores que estão próximos são, de fato, parecidos na sua produção técnica?” Sim, mostrou bem a semelhança entre eles. 2. Eles produzem resultados semelhantes? Os que estão próximos sim. 3. “Como você rotularia (daria nomes com base em alguma característica de similaridade) os “grupos” de pessoas visivelmente próximas?” Sim, o grupo (d2, d5, d7, d9, d10 e d11) são alteradores e (d4, d6) são criadores na parte de interface, o restante (d1 e d8) possui características individuais distintas. 4. “Há alguma discrepância ou semelhança entre os resultados das classes, apresentadas anteriormente, e a visualização MDS atual?” Sim, há semelhança visível no MDS e nas classes de dominância. C. Perguntas sobre as métricas 1. “Você concorda que quanto maior for o valor obtido em cada uma dessas métricas melhor foi o desempenho do desenvolvedor? Por quê?” Sim, porque como você mencionou estão orientadas (em um mesmo sentido). 2. “Quais outras métricas (da planilha completa, Tabela 3.1) você acha interessante/útil para uma avaliação dos desenvolvedores? Por quê?” Nenhuma. As atuais parecem caracterizar bem os desenvolvedores. O entrevistado não mostrou interesse explícito pelo uso de nenhuma outra métrica. No entanto, comentou que, caso as métricas 11, 12, 19 e 20 (vide Tabela 3.1) venham a ser selecionadas, elas deveríam contar ponto em desfavorecimento do desenvolvedor em questão, por considerarem o trabalho desse desenvolvedor como alvo de remoções. 6.2.2 Análise e interpretação dos resultados O desenvolvedor d3 participou inicialmente do projeto e por isso tem pouca produção. Outros desenvolvedores que foram estagiários por pouco tempo também tiveram uma vaga participação. Os comentários referentes à direção (sentido) das métricas levou a considerar a criação de um mecanismos para inverter seus valores quando solicitados, porém isso ainda não foi implementado. Pela opinião do entrevistado, os resultados foram satisfatórios e consistentes, em sua maioria, com as suas impressões como especialista e gerente do projeto. 6.2 Estudo de Caso 1 6.2.3 80 Análise para outras métricas Após a realização da entrevista, e como o entrevistado havia feito comentários sobre métricas de remoção, acrescentamos a métrica Esfo_Rem no conjunto de métricas fixas e utilizamos o algoritmo de seleção de métricas com limiar 0,5. Como resultado, foram selecionadas, além das métricas cinco métricas fixas sugeridas, as seguintes: Arquivos_Cri_ΣRem e Arquivos_ΣMod_Rem. O sistema então gerou o MDS demonstrado na Figura 6.2 (b). A Figura 6.2 (a) consiste no MDS da primeira avaliação e foi colocada ao lado para fins comparativos. O novo MDS (b) separou os desenvolvedores d2 e d7 dos desenvolvedores d5, d9, d10 e d11, afastou consideravelmente os desenvolvedores d4 e d6 e aproximou o desenvolvedor d8 do d6 em virtude do aumento na quantidade de métricas. Apesar do Algoritmo de seleção de métricas ter sido elaborado para auxiliar na comparação por similaridade, resolvemos verificar também como a comparação por desempenho mudaria com as métricas selecionadas pelo mesmo. No caso, foi considerado que todas as métricas possuem um sentido positivo (quanto maior melhor). O efeito foi que a relação de dominância sofreu uma pequena alteração na qual o desenvolvedor d4 subiu da classe 2 para classe 1, e o restante permaneceu conforme disposto na Tabela 6.4. Esse novo resultando é mais próximo das sugestões que foram mencionadas na entrevista. (a) MDS da primeira avaliação. (b) MDS da segunda avaliação. Figura 6.2: Duas imagens MDS referentes ao projeto Weby. O resultado da primeira avaliação (a) com quatro métricas fixas em comparação com o resultado da segunda avaliação (b) com quatro métricas fixas em acréscimo da métricas Esfo_Rem e seleção automática com limiar 0,5. 6.3 Estudo de Caso 2 6.3 81 Estudo de Caso 2 Para o segundo estudo de caso, utilizamos o Solicite, um sistema desenvolvido pela divisão de Sistemas do Cercomp com a função de otimizar o processo de solicitação de bens, serviços e requisições de materiais pelos diversos órgãos administrativos e unidades acadêmicas da UFG. Sua principal vantagem é o rastreamento de solicitações. Ele é o módulo inicial destinado a gerenciar todo o processo de compras e prestações de serviços, atendendo a Lei de Licitações 8.666 de 21 de junho de 1.993. O Solicite interage ainda com os sistemas financeiro e orçamentário, de tabelas gerais, de pessoal, de almoxarifado e com o sistema de patrimônios da Universidade. Uma vez criada a solicitação é possível os usuários interessados monitorar o seu estado e acompanhar sua evolução. O Solicite foi implantado no final de 2.010 e em janeiro de 2.011, por determinação da Pró-Reitoria de Administração (Proad) e se tornou uma ferramenta institucional utilizada intensivamente. Atualmente é o sistema mais bem estruturado em termos de processo de desenvolvimento de software, possui uma razoável definição de controle de versão, dispõe de uma equipe para realizar testes e de pessoas bem comprometidas e competentes nas suas funções. Foi avaliado 1.657 commits com o total de 11 desenvolvedores envolvendo o período de Setembro de 2.008 a Dezembro de 2.012. A Tabela 6.5 apresenta informações gerais sobre o trabalho dos desenvolvedores nesse período. O Apêndice B mostra os quadros de métricas completas para esse projeto. Desenv. d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 Total Commits 493 106 244 457 12 5 5 142 22 165 6 1.657 Adicionados 943 160 47 942 4 6 2 41 0 29 0 2.174 Arquivos Modificados 1.822 192 780 1.553 16 2 12 201 0 456 0 5.034 Removidos 75 4 1 5 1 0 0 0 0 0 0 86 Adic. 16.304 2.295 239 89.118 10 0 0 0 0 11.650 0 119.616 Linhas Mod. 462 84 90 1.339 0 0 0 0 0 5.853 0 7.828 Rem. 1.841 1.315 235 890 10 0 0 0 0 2.195 0 6.486 Tabela 6.5: Informações gerais sobre o projeto Solicite. Total de commits, arquivos e linhas adicionados, modificados e removidos. Os resultados dos testes procederam com configuração de métricas conforme Tabela 6.6 que produziu a classe de dominância conforme Tabela 6.7. Para o MDS, 6.3 Estudo de Caso 2 82 utilizou-se o GGobi com configurações de análise de dissimilaridade com duas dimensões que produziu a visualização apresentada na Figura 6.3. D. d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 Efet_Cri 16.167 1.946 196 83.481 10 0 0 0 0 11.509 0 Efet_Mod 0 0 0 188 0 0 0 0 0 4.285 0 Efet_Cri_Div_Esfo_Cri 0,991597154 0,847930283 0,820083682 0,936746785 1,0 0,0 0,0 0,0 0,0 0,987896996 0,0 Efet_Mod_Div_Esfo_Dist_Mod 0,0 0,0 0,0 0,1567973311 0,0 0,0 0,0 0,0 0,0 0,7884084637 0,0 Tabela 6.6: Conjunto de métricas selecionadas e resultados para o projeto Solicite. Classes de dominância 1 2 3 4 5 Desenvolvedor d1, d4 e d10. d2. d3. d5. d6, d7, d8, d9 e d11. Tabela 6.7: Resultados da classe de dominância para o projeto Socilite. Figura 6.3: Resultado MDS para o projeto Solicite. 6.3 Estudo de Caso 2 6.3.1 83 Entrevista A. Perguntas sobre a classe de dominância 1. “Essa separação faz sentido para você?” Faz sentido [. . .] achei justo a classificação. 2. “Se você fosse escolher um ou mais desenvolvedores para um projeto futuro, esta classificação ajudaria? Por quê? Quais os desenvolvedores você escolheria?” Com certeza ajudaria. Primeiramente pelos critérios utilizados pelas rotinas. Os desenvolvedores d4 e d10. 3. “Você classificaria os desenvolvedores dessa mesma forma? Por quê? Se não, como seria sua classificação?” Não, porque conheço pessoalmente o trabalho deles. Adicionaria os desenvolvedores d7 e d8 na classse 4. 4. “Tem algum desenvolvedor que você acha que foi classificado equivocadamente?” Sim. o desenvolvedor d7 e o d8. B. Perguntas sobre a visualização em MDS 1. “Os desenvolvedores que estão próximos são, de fato, parecidos na sua produção técnica?” Sim. 2. “Eles produzem resultados semelhantes?” Sim. 3. “Como você rotularia (daria nomes com base em alguma característica de similaridade) os “grupos” de pessoas visivelmente próximas?” Eu rotularia como: grupo dos que não são programadores (d6, d7, d8, d9 e d11), grupo dos programadores antigos (d1, d2, d3 e d5) e atuais (d4 e d10). 4. “Há alguma discrepância ou semelhança entre os resultados das classe, apresentadas anteriormente, e a visualização MDS atual?” Percebi a mesma semelhança de agrupamento presente tanto no MDS quanto na classe de dominância. C. Perguntas sobre as métricas 1. “Você concorda que quanto maior for o valor obtido em cada uma dessas 4 métricas melhor foi o desempenho do desenvolvedor? Por quê?” Sim, porque estão no mesmo sentido. 2. “Quais outras métricas (da planilha completa, Tabela 3.1) você acha interessante/útil para uma avaliação dos desenvolvedores? Por quê?” 6.3 Estudo de Caso 2 84 Têm várias. A de commit por exemplo é importante porque quanto mais rápido o desenvolvedor efetuar commits menor será os problemas de conflito. Remoção também é interessante para entender se o escopo do projeto mudou ou se existe muitas falhas que neste caso deveria fazer uma análise mais refinada pelo fornecedor de requisitos ou verificar a necessidade de qualificação dos desenvolvedores. O entrevistado perguntou se existia a implementação de algum mecanismos para avaliar os pontos de função referente a cada alteração no código fonte, no qual foi respondido que não possui nenhum mecanismo de análise de sintaxe ou vínculo com ferramenta de registro de bugs. Existe também, a dificuldades inerentes a integração com outras ferramentas. Uma sugestão anotada, foi a possibilidade de aplicar a ferramenta em um intervalo específico de tempo a fim de verificar os resultados em partes. Ao final da entrevista, o gerente comentou que achou importante as métricas de esforço dos desenvolvedores para avaliar se existe sinergia entre a equipe. Portanto, em um eventual pedido de aumento salarial poderia ser aferido o merecimento através dos indícios comparativos de sua produção e se comprovada a sua qualidade, recompensá-lo adequadamente ou até mesmo recomendá-lo a participar de outros projetos. 6.3.2 Análise e interpretação dos resultados Os desenvolvedores d9 e d11, apesar de terem commits, apenas criaram diretórios no projeto e não possui nenhuma estatística para arquivos e linhas. O desenvolvedor d6 trabalhou somente com arquivos binário e não possui estatística para linhas. Os desenvolvedores d7 e d8 foram afetados pelo problema comentados na Seção 5.4 e por isso não possuem estatísticas para linhas. Os erros encontrados ao extrair os dados do repositório foram identificados e serão enviados aos desenvolvedores do SCV em questão (Subversion). Esses erros afetaram sensivelmente os resultados da avaliação, embora ainda tenham sido satisfatórios conforme expressado na entrevista pelo gerente do projeto. 6.3.3 Análise para outras métricas Após a entrevista, ainda na presença do gerente entrevistado e por sua vontade, ajustamos o Algoritmo de seleção automática de métricas para um limiar 0,4 e nenhuma métrica fixa. Foram selecionadas automaticamente 4 métricas que são: Linhas_ΣMod_Rem, Arquivo_Mod_ΣRem, Linhas_Cri_ΣMod e Linhas_ΣCri_Mod. Como no estudo de caso anterior (na Seção 6.2.3), para fins de comparação por desempenho, essas métricas foram consideradas como tendo o mesmo sentido (quanto maior melhor). 6.4 Outros Aspectos 85 A hierarquia de classe permaneceu apenas com dois grupos sendo: classe 1 (d1, d2, d3, d4 e d10) e classe 2: (d5, d6, d7, d8, d9 e d11) diminuindo o nível de detalhes em relação à estrutura a anterior. Uma comparação entre o MDS anterior e o atual são apresentados na Figura 6.4 e comentados em seguida. Semelhante ao que aconteceu com a camada de dominância, os agrupamentos do MDS se mostraram menos detalhados que o anterior. Três mudanças foram percebidas: a primeira, houve um distanciamento dos desenvolvedores d2 e d3 do agrupamento de desenvolvedores d6, d7, d8, d9 e d11. A segunda, o desenvolvedor d5 se juntou ao agrupamento (d6, d7, d8, d9 e d11). A terceira, o desenvolvedor d1 afastou-se consideravelmente dos desenvolvedores d2 e d3. A primeira avaliação está mais condizente com as impressões do gerente sobre sua equipe. (a) MDS da primeira avaliação. (b) MDS da segunda avaliação. Figura 6.4: Duas imagens MDS referentes ao projeto Solicite. O resultado da primeira avaliação (a) com quatro métricas fixas em comparação com o resultado da segunda avaliação (b) com seleção automática com limiar 0,4. 6.4 Outros Aspectos Conforme observado na Seção 6.3.3, a seleção totalmente automática de métricas resultou em um MDS que não refletiu a percepção do gerente de projeto quanto a similaridade dos desenvolvedores na mesma proporção que o MDS com as quatro métricas fixas pré-selecionadas. Isso reforça o nosso comentário de que a escolha de um conjunto de métricas é um processo subjetivo e deve ser gerenciado com cuidado pelo interessado na análise dos dados. 6.4 Outros Aspectos 86 Em função disso, decidimos fazer uma análise mais detalhada da seleção de métricas para a comparação por similaridade usando o Algoritmo 4.2. A análise considerou o projeto Weby descrito no primeiro estudo de caso, com diferentes valores de limiar (de / {E f et_Mod}, as quatro 0,1 a 0,5 com incremento de 0,1) e conjunto de métricas fixas (0, métricas previamente selecionadas). A Tabela 6.8 apresenta o resultado da seleção gerada pelo Algoritmo para as diversas configurações de parâmetro. Os resultados com limiar 0,1 foram suprimidos por conterem poucas métricas. Quando não foi selecionada qualquer métrica, o algoritmo de fato retorna um conjunto de métricas que considera mais adequado. Esse conjunto tende a aumentar na medida em que se eleva o limiar. No entanto, o conjunto de métricas resultante pode deixar de incluir algum aspecto de interesse para comparação dos desenvolvedores. Assim, o método permite que sejam pré-selecionadas algumas métricas desejáveis. Nos exemplos identificados como (d), (e) e (f) foi considerada apenas uma métrica fixa, tendo o algoritmo selecionado outras para os dois últimos casos. Já nos exemplos (g), (h) e (i), foi pré-selecionado um conjunto maior de métricas desejáveis. Esse conjunto possui maior correlação com várias outras métricas. Mesmo assim, elevando o limiar, é possível aumentar gradativamente o conjunto. Os resultados MDS para as configurações supracitas são apresentados na Figura 6.5. Os rótulos dos gráficos estão relacionados com a coluna (Id.) na Tabela 6.8 indicando a configuração correspondente. Quando há apenas uma métricas (como é o caso (d)), não é possível fazer uma diferenciação significativa dos desenvolvedores já que todos eles ficam posicionados visualmente em uma mesma linha. Na figura (e), onde existe apenas duas métricas selecionadas, foi produzida uma comparação visual dos desenvolvedores bastante peculiar, não presente em nenhum outro gráfico. Na medida em que se aumenta a quantidade de métricas os desenvolvedores tendem a se distanciar e formar visualmente novos grupos (clusters) no MDS. Note que, para os casos em que foram selecionadas seis métricas (os gráficos (c), (f) e (i)), os MDSs são muito parecidos apesar das métricas serem diferentes. Isso se deve, contudo, ao fato do limiar ser maior, o que faz com que sejam selecionadas métricas que representam os mesmos aspectos que outras correlacionadas. Em conclusão, uma maior quantidade de métricas é melhor para caracterizar os desenvolvedores, mas o resultado é mais efetivo se tais métricas forem não correlacionadas. Várias das 24 métricas propostas neste trabalho possuem uma forte correlação entre si, não sendo adequadas para uso em conjunto no MDS. Portanto, seria útil a criação de outras métricas com baixa correlação com as já sugeridas visando complementar ainda mais a comparação por similaridade. Além da análise do conjunto selecionado de métricas, procuramos obter melhores medidas de normalização para comparar os desenvolvedores utilizando, ao invés 6.4 Outros Aspectos Entrada Métricas pré-selecionadas 87 Limiar Id. Total 0.2 (a) 3 0.3, 0.4 (b) 4 0.5 (c) 6 0.2 (d) 1 0.3 e 0.4 (e) 2 0.5 (f) 6 0.2, 0.3 (g) 4 0.4 (h) 5 0.5 (i) 6 0/ Efet_Cri_Div_Esfo_Cri Efet_Cri Efet_Mod Efet_Cri_Div_Esfo_Cri Efet_Mod_Div_Esfo_Dist_Mod Saída Métricas escolhidas Efet_Mod_Div_Esfo_Dist_Mod Arquivo_Cri_ΣRem Efet_Mod Efet_Mod_Div_Esfo_Dist_Mod Arquivo_Cri_ΣRem Arquivo_ΣMod_Rem Efet_Mod Efet_Mod_Div_Esfo_Dist_Mod Arquivo_Cri_ΣRem Arquivo_ΣMod_Rem Efet_Mod Linha_Mod_ΣRem Esfo_Rem Efet_Cri_Div_Esfo_Cri Efet_Cri_Div_Esfo_Cri Arquivos_ΣMod_Rem Efet_Cri_Div_Esfo_Cri Efet_Mod_Div_Esfo_Dist_Mod Arquivo_Cri_ΣRem Arquivo_ΣMod_Rem Arquivo_ΣCri_Rem Esfo_Rem Efet_Cri Efet_Mod Efet_Cri_Div_Esfo_Cri Efet_Mod_Div_Esfo_Dist_Mod Efet_Cri Efet_Mod Efet_Cri_Div_Esfo_Cri Efet_Mod_Div_Esfo_Dist_Mod Arquivo_ΣMod_Rem Efet_Cri Efet_Mod Efet_Cri_Div_Esfo_Cri Efet_Mod_Div_Esfo_Dist_Mod Arquivo_ΣMod_Rem Arquivo_Cri_ΣRem Tabela 6.8: Tabela de informações sobre o resultado de seleção de métricas. da versão relativa das métricas, uma padronização baseado na média e no desvio padrão (x − x)/σ. No entanto, o MDS resultante, ilustrado na Figura 6.6, sofreu apenas alterações sutis entre a proximidade dos desenvolvedores. 6.4 Outros Aspectos 88 (a) (b) (c) (d) (e) (f) (g) (h) (i) Figura 6.5: Conjunto de figuras MDS composto por várias configurações de entrada para o Algoritmo 4.2 como um pequeno teste de sensibilidade. 6.4 Outros Aspectos 89 (a) MDS utilizando métricas relativas. (b) MDS utilizando métricas com desvio padrão. Figura 6.6: Outras formas de normalização. (a) MDS utilizando métricas relativas, e (b) MDS utilizando métricas com desvio padrão. CAPÍTULO 7 Conclusão O presente trabalho buscou comparar os desenvolvedores de software para endender sua forma de trabalho. Para tanto, foi realizada uma revisão bibliográfica sobre pesquisas afins, foram criados: um modelo de históricos de alteração de código e um conjunto de métricas e propostas duas abordagens para comparação entre desenvolvedores. Foi criado também um sistema computacional para calcular as métricas e gerar os dados de comparação. As abordagens e as métricas foram avaliadas em dois estudos de casos envolvendo projetos reais de desenvolvimento de software. A validação com especialistas foi extremamente importante para averiguar a qualidade das comparações geradas. Em geral, obtivemos resultados positivos e bons comentários dos avaliadores referentes aos projetos analisados. A definição formal das métricas e dos históricos e a sua implementação em um sistema computacional necessitou de um grande investimento de tempo e concentração. A escolha das ferramentas foi essencial e ajudou em grande parte do trabalho. Além disso muitos projetos comerciais utilizam o Subversion, pelo seu modelo centralizado e fluxo de trabalho mais simples, se comparado a SCV de terceira geração. Assim a ferramenta desenvolvida pode ser utilizada para a comparação de desenvolvedores em outros projetos de software. Em particular, sentimos a necessidade de aplicar a avaliação em um Software Livre de grande porte e coletar, de alguma forma, as opiniões de seus desenvolvedores. 7.1 Trabalhos Futuros Apesar dos resultados iniciais positivos, encontramos algumas limitações na nossa abordagem e no sistema apresentado que podem ser atendidas em trabalhos futuros. São elas: • não foi levado em consideração o fator tempo. Portanto, todas as alterações têm igual importância independentemente se foram realizados logo no início do projeto ou no final; 7.1 Trabalhos Futuros 91 • todos os arquivos e diretórios também tem igual relevância e são tratados igualmente na nossa proposta. No entanto, alguns arquivos, dependendo da arquitetura do projeto, demandam mais dedicação e/ou conhecimentos específicos dos desenvolvedores do que outros. Inclusive, alguns arquivos podem ter sido gerados automaticamente por ferramentas de desenvolvimento; • não é possível avaliar mais de um projeto (com o sistema atual) ao mesmo tempo e integrar os dados coletados. No entando pode ser útil expandir a abordagem comparativa para incluir métricas extraídas de múltiplos projetos; • dados de poucos SCV foram analisados neste trabalho e faz-se necessário aplicar as abordagens descritas para projetos de grande porte; • poderiam ter sido definidas métricas que avaliam outros aspectos dos desenvolvedores, inclusive métricas subjetivas com base no conhecimento dos membros de uma equipe de desenvolvimento de software pelo gerente de projeto; • não é possível utilizar, concomitantemente com o SCV, dados de outros sistemas, tais como de SAP (Sistemas de Acompanhamento de Problemas); • o sistema implementado pode ser melhorado através de modificações como: – disponibilizá-lo para utilização via Web; – inserir novas métricas através de um mecanismo modular de acoplamento. Atualmente as métricas estão fortemente acopladas ao sistema central. Se o sistema fosse modular seria possível a criação de novas métricas de maneira simples e complementar as já existentes; – incluir drivers para versionadores de terceira geração; – suportar novas técnicas de visualização de informações; e – disponibilizar através de uma interface gráfica todos resultados do sistema de forma amigável e relatórios estatísticos sobre os dados dos projetos analisados como por exemplo, quantidade de desenvolvedores, total de arquivos e linhas de código criadas. Referências Bibliográficas [1] B ERLINER , B. CVS II: Parallelizing Software Development. In: Proceedings of the USENIX Winter 1990 Technical Conference, p. 341–352, Berkeley, CA, 1990. USENIX Association. [2] B ORG , I.; G ROENEN , P. Modern Multidimensional Scaling: Theory and Applications. Springer, 2005. [3] B OSTOCK , M.; H EER , J. Protovis: A Graphical Toolkit for Visualization. IEEE Transactions on Visualization and Computer Graphics, 15(6):1121–1128, Nov. 2009. [4] B OSTOCK , M.; O GIEVETSKY, V.; H EER , J. D3 Data-Driven Documents. IEEE Transactions on Visualization and Computer Graphics, 17(12):2301–2309, Dec. 2011. [5] B ROOKS , F. P. The Mythical Man-Month: Essays on Software Engineering. Addison-Wesley, anniversary edition, Aug. 1975. [6] B ROOKS , F. P. No Silver Bullet: Essence and Accidents of Software Engineering. IEEE Computer, 20:10–19, 1987. [7] B UJA , A.; S WAYNE , D. F.; L ITTMAN , M. L.; D EAN , N.; H OFMANN , H.; C HEN , L. Data Visualization with Multidimensional Scaling. Journal of Computational and Graphical Statistics, 17(2):444–472, 2008. [8] C ANONICAL LTD.. Sítio do Launchpad – Plataforma de Colaboração de Software. https://launchpad.net. [Acesso em 11 de Dezembro de 2012]. [9] C HARNES , A.; C OOPER , W. W.; R HODES , E. Measuring the Efficiency of Decision Making Units. European Journal of Operational Research, 2(6):429–444, November 1978. [10] C ÍCERO, J. R. Projetos de Pesquisa e Políticas Nacionais de Ciência, Tecnologia e Inovação – O Caso do Instituto Nacional de Tecnologia em 2010. Master’s thesis, Centro Federal de Educação Tecnológica Celso Suckow da Fonseca CEFET/RJ, Rio de Janeiro – Rio de Janeiro, 2011. Referências Bibliográficas 93 [11] C OCKBURN , A.; K ARLSON , A.; B EDERSON , B. B. A Review of Overview+Detail, Zooming, and Focus+Context Interfaces. ACM Compututing Surveys, 41(1):2:1– 2:31, Jan. 2009. [12] D E M ARCO, T.; L ISTER , T. Peopleware: Productive Projects and Teams. Dorset House Publishing Co., Inc. New York, NY, USA, 1987. [13] DO N ASCIMENTO, H. A. D. Uma Abordagem para Desenho de Grafos Baseada na Utilização de Times Assíncronos. Master’s thesis, Instituto de Computação – UNICAMP, Campinas – São Paulo, 1997. [14] E VANS DATA C ORPORATION . More than 1.1 million developers in north america now working on open source projects. http://www.evansdata.com/press/ viewRelease.php?pressID=64, 2013. [Acesso em 27 de Março de 2013]. [15] F LANAGAN , D.; M ATSUMOTO, Y. The Ruby Programming Language. O’Reilly Media, Incorporated, 2008. [16] G ILBERT, E.; K ARAHALIOS , K. CodeSaw: A Social Visualization of Distributed Software Development. In: Proceedings of the 11th IFIP TC 13 international conference on Humancomputer interactionVolume Part II, Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics), p. 303–316. Springer-Verlag, 2007. [17] G IRBA , T.; K UHN , A.; S EEBERGER , M.; D UCASSE , S. Software Evolution. How Developers Drive In: Proceedings of the Eighth International Workshop on Principles of Software Evolution, IWPSE ’05, p. 113–122, Washington, DC, USA, 2005. IEEE Computer Society. [18] G ODFREY, P.; S HIPLEY, R.; G RYZ , J. Algorithms and Analyses for Maximal Vector Computation. The VLDB Journal, 16:5–28, 2007. [19] G OOGLE C O.. Sítio do Google Code – Projeto de hospedagem que provê desenvolvimento colaborativo livre em um ambiente de código aberto. https: //code.google.com. [Acesso em 11 de Dezembro de 2012]. [20] G RUNE , D. Concurrent Versions System, A Method for Independent Cooperation. Technical report, IR 113, Vrije Universiteit, 1986. [21] H UANG , S.-K.; L IU, K.- M . Mining Version Histories to Verify the Learning Process of Legitimate Peripheral Participants. ACM SIGSOFT Software Engineering Notes, 30(4):1, jul 2005. Referências Bibliográficas 94 [22] H UNT, J. W.; M CILROY, M. D. An Algorithm for Differential File Comparison. Technical Report 41, Bell Laboratories Computing Science, jul 1976. [23] J ERMAKOVICS , A.; S COTTO, M.; S UCCI , G. Evolution Patterns. Visual Identification of Software In: Ninth international workshop on Principles of software evolution: in conjunction with the 6th ESEC/FSE joint meeting, IWPSE ’07, p. 27– 30, New York, NY, USA, 2007. ACM. [24] J ERMAKOVICS , A.; S ILLITTI , A.; S UCCI , G. Mining and Visualizing Developer Networks from Version Control Systems. In: Proceeding of the 4th international workshop on Cooperative and human aspects of software engineering - CHASE ’11, p. 24, New York, New York, USA, may 2011. ACM Press. [25] K AGDI , H.; Y USUF, S.; M ALETIC, J. I. Mining Sequences of Changed-files from Version Histories. In: Proceedings of the 2006 international workshop on Mining software repositories - MSR ’06, p. 47, New York, New York, USA, may 2006. ACM Press. [26] K RUSKAL , J.; S EERY, J. Designing Network Diagrams. In: Proc. First General Conference on Social Graphics, p. 22–50, 1980. [27] L AVE , J.; W ENGER , E. Situated Learning: Legitimate Peripheral Participation. Cambridge University Press, 1 edition, sep 1991. [28] L OPEZ -F ERNANDEZ , L.; R OBLES , G.; G ONZALEZ -B ARAHONA , J. M. Applying Social Network Analysis to the Information in CVS Repositories. “International Workshop on Mining Software Repositories (MSR 2004)” W17S Workshop - 26th International Conference on Software Engineering, 2004:101–105, 2004. [29] M INTO, S.; M URPHY, G. C. Recommending Emergent Teams. In: Proceedings of the Fourth International Workshop on Mining Software Repositories, MSR ’07, Washington, DC, USA, 2007. IEEE Computer Society. [30] M OCKUS , A.; H ERBSLEB , J. D. Expertise Browser: A Quantitative Approach to Identifying Expertise. Proceedings of the 24th International Conference on Software Engineering ICSE 2002, p. 503–512, 2002. [31] Naur, P.; Randell, B., editors. Software Engineering: Report of a conference sponsored by the NATO Science Committee, jan 1968. [32] PANÇARDES , J. R. R.; DE S OUZA J ÚNIOR , P. R. Legalidade da adoção pela administração pública federal do programa de implantação do software livre Referências Bibliográficas 95 (psl-brasil) e suas consequências nos processos licitatórios. Revista Científica do Centro Universitário de Barra Mansa, 9(17):98, Jul 2007. [33] P ILATO, C. M.; C OLLINS -S USSMAN , B.; F ITZPATRICK , B. W. Version Control with Subversion. O’Reilly Media, 2 edition, Sept. 2008. [34] P RESTON -W ERNER , T.; WANSTRATH , C.; H YETT, P. Sítio do Github – Ambiente de compartilhamento de código. https://github.com. [Acesso em 11 de Dezembro de 2012]. [35] Randell, B.; Buxton, J. N., editors. Software Engineering Techniques: Report of a conference sponsored by the NATO Science Committee. Scientific Affairs Division, Roma - Italy, Oct. 1969. [36] R AYMOND, D. R. Reading Source Code. In: Proceedings of the 1991 conference of the Centre for Advanced Studies on Collaborative research, CASCON ’91, p. 3–16. IBM Press, 1991. [37] R OCHKIND, M. J. The Source Code Control System. IEEE Trans. Software Eng., 1(4):364–370, 1975. [38] R ODRIGUES , R. F. Times Assíncronos para a Resolução de Problemas de Otimização Combinatória Multiobjetivo. Master’s thesis, Instituto de Computação – UNICAMP, Campinas – São Paulo, 1996. [39] R OSENBERG , L.; H YATT, L. Software Quality Metrics for Object-Oriented Environments. Crosstalk Journal, April, 1997. [40] RUAN , L.; WANG , Y.; WANG , Q.; L I , M.; YANG , Y.; X IE , L.; L IU, D.; Z ENG , H.; Z HANG , S.; X IAO, J.; Z HANG , L.; N ISAR , M. W.; DAI , J. Empirical Study on Benchmarking Software Development Tasks. In: Wang, Q.; Pfahl, D.; Raffo, D. M., editors, ICSP, volume 4470 de Lecture Notes in Computer Science, p. 221–232. Springer, 2007. [41] S ARMA , A.; M ACCHERONE , L.; WAGSTROM , P.; H ERBSLEB , J. Tesseract: Interactive Visual Exploration of Socio-technical Relationships in Software Development. In: Software Engineering, 2009. ICSE 2009. IEEE 31st International Conference on, p. 23–33. IEEE, 2009. [42] S CHULER , D.; Z IMMERMANN , T. Mining Usage Expertise from Version Archives. In: Proceedings of the 2008 international workshop on Mining software repositories MSR ’08, p. 121, New York, New York, USA, may 2008. ACM Press. Referências Bibliográficas 96 [43] S TADLER , W. A Survey of Multicriteria Optimization or The Vector Maximum Problem, part I: 1776–1960. Journal of Optimization Theory and Applications, 29:1– 52, 1979. [44] S WAYNE , D. F.; B UJA , A.; L ANG , D. T. Exploratory Visual Analysis of Graphs in GGobi, 2003. [45] S WAYNE , D. F.; L ANG , D. T.; B UJA , A.; C OOK , D. GGobi: evolving from XGobi into an extensible framework for interactive data visualization. Computational Statistics & Data Analysis, 43(4):423–444, August 2003. [46] T HOMAS , D.; F OWLER , C.; H UNT, A. Programming Ruby 1.9: The Pragmatic Programmers Guide. Pragmatic Bookshelf, 3rd edition, 2009. [47] T ICHY, W. F. RCS: A System for Version Control. Software-Practice & Experience, 1985. [48] T URING , A. Computing Machinery and Intelligence. Mind, 59(236):433–460, 1950. [49] VOINEA , L.; L UKKIEN , J.; T ELEA , A. Visual Assessment of Software Evolution. Science of Computer Programming, 65(3):222–248, apr 2007. [50] VOINEA , L.; T ELEA , A. An Open Framework for CVS repository Querying, Analysis and Visualization. In: Proceedings of the 2006 international workshop on Mining software repositories - MSR ’06, p. 33, New York, New York, USA, may 2006. ACM Press. [51] Y E , Y.; K ISHIDA , K. Toward an Understanding of The Motivation Open Source Software Developers. In: Proceedings of the 25th International Conference on Software Engineering, ICSE ’03, p. 419–429, Washington, DC, USA, 2003. IEEE Computer Society. [52] Z HANG , S.; WANG , Y.; TONG , J.; Z HOU, J.; RUAN , L. Evaluation of Project Quality: A DEA-Based Approach. In: Wang, Q.; Pfahl, D.; Raffo, D. M.; Wernick, P., editors, SPW/ProSim, volume 3966 de Lecture Notes in Computer Science, p. 88–96. Springer, 2006. [53] Z HANG , S.; WANG , Y.; X IAO, J. Mining Individual Performance Indicators in Collaborative Development Using Software Repositories. In: Software Engineering Conference, 2008. APSEC ’08. 15th Asia-Pacific, p. 247 –254, dec 2008. [54] Z HANG , S.; WANG , Y.; YANG , Y.; X IAO, J. Capability Assessment of Individual Software Development Processes Using Software Repositories and DEA. In: Referências Bibliográficas 97 Wang, Q.; Pfahl, D.; Raffo, D. M., editors, Making Globally Distributed Software Development a Success Story, volume 5007 de Lecture Notes in Computer Science, p. 147–159. Springer Berlin Heidelberg, 2008. APÊNDICE A Apêndice Cada página desse apêndice contem uma tabela de métricas em sua versão absoluta e relativa de relacionamento entre os desenvolvedores. Os desenvolvedores estão dispostos nas linhas e colunas formando a matriz de relacionamento. Para interpretação dos resultados, deve-se considerar os desenvolvedores das colunas como agentes de mundaça nos desenvolvedores das linhas, ou seja, os desenvolvedores dispostos nas linhas sofreram alterações do desenvolvedores que estão dispostos nas colunas. Ao final, todas as métricas que foram formalizadas no Capítulo 3 são apresentadas para o projeto Weby. Na sequência, existe também, uma tabela de três páginas que revela o valor das métricas de todos os desenvolvedores. Dessa vez, os desenvolvedores estão disposto nas linhas e as colunas correspondem as métricas. Apêndice A 99 Weby Commits d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 269 41 2 46 10 29 21 33 4 5 14 d2 40 64 0 12 4 7 5 18 4 4 1 d3 1 1 0 0 0 0 0 0 0 0 0 d4 55 13 0 44 2 11 10 29 1 1 4 d5 9 5 0 3 7 2 3 0 1 0 0 d6 26 4 0 11 3 31 9 3 1 2 9 d7 25 5 0 11 2 5 13 0 0 0 0 d8 28 16 0 32 2 5 0 80 1 5 14 d9 3 6 0 1 0 2 0 1 5 1 1 d10 1 3 0 4 0 2 0 5 2 6 1 d11 17 1 0 6 0 5 0 14 1 0 28 Weby Commits_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,2079 0,0317 0,0015 0,0355 0,0077 0,0224 0,0162 0,0255 0,0031 0,0039 0,0108 d2 0,0309 0,0495 0,0000 0,0093 0,0031 0,0054 0,0039 0,0139 0,0031 0,0031 0,0008 d3 0,0008 0,0008 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0425 0,0100 0,0000 0,0340 0,0015 0,0085 0,0077 0,0224 0,0008 0,0008 0,0031 d5 0,0070 0,0039 0,0000 0,0023 0,0054 0,0015 0,0023 0,0000 0,0008 0,0000 0,0000 d6 0,0201 0,0031 0,0000 0,0085 0,0023 0,0240 0,0070 0,0023 0,0008 0,0015 0,0070 d7 0,0193 0,0039 0,0000 0,0085 0,0015 0,0039 0,0100 0,0000 0,0000 0,0000 0,0000 d8 0,0216 0,0124 0,0000 0,0247 0,0015 0,0039 0,0000 0,0618 0,0008 0,0039 0,0108 d9 0,0023 0,0046 0,0000 0,0008 0,0000 0,0015 0,0000 0,0008 0,0039 0,0008 0,0008 d10 0,0008 0,0023 0,0000 0,0031 0,0000 0,0015 0,0000 0,0039 0,0015 0,0046 0,0008 d11 0,0131 0,0008 0,0000 0,0046 0,0000 0,0039 0,0000 0,0108 0,0008 0,0000 0,0216 Apêndice A 100 Weby Arquivo_Cri_Mod d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 780 34 1 10 1 3 13 15 0 0 0 d2 2 3635 0 0 0 2 2 0 0 0 0 d3 0 0 1 0 0 0 0 0 0 0 0 d4 8 2 0 405 0 0 2 0 0 0 0 d5 1 0 0 4 52 4 0 0 0 0 0 d6 10 3 0 4 0 2162 0 2 0 0 6 d7 1 2 0 0 0 0 17 0 0 0 0 d8 14 7 0 0 1 12 0 5953 0 1 1 d9 0 0 0 0 0 0 0 1 0 0 0 d10 0 0 0 1 0 0 0 2 0 10 0 d11 0 0 0 0 0 0 0 0 0 0 10 Weby Arquivo_Cri_Mod_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,0437 0,0019 0,0001 0,0006 0,0001 0,0002 0,0007 0,0008 0,0000 0,0000 0,0000 d2 0,0001 0,2036 0,0000 0,0000 0,0000 0,0001 0,0001 0,0000 0,0000 0,0000 0,0000 d3 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0004 0,0001 0,0000 0,0227 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 d5 0,0001 0,0000 0,0000 0,0002 0,0029 0,0002 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0006 0,0002 0,0000 0,0002 0,0000 0,1211 0,0000 0,0001 0,0000 0,0000 0,0003 d7 0,0001 0,0001 0,0000 0,0000 0,0000 0,0000 0,0010 0,0000 0,0000 0,0000 0,0000 d8 0,0008 0,0004 0,0000 0,0000 0,0001 0,0007 0,0000 0,3334 0,0000 0,0001 0,0001 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0001 0,0000 0,0006 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0006 Apêndice A 101 Weby Arquivo_Cri_Rem d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 32 7 0 3 1 16 0 2 0 0 0 d2 2 2 0 0 0 0 0 0 0 0 0 d3 1 0 0 0 0 0 0 0 0 0 0 d4 8 0 0 0 0 0 0 0 0 0 0 d5 0 0 0 1 0 0 2 0 0 0 0 d6 0 0 0 0 0 4 0 0 0 0 1 d7 3 0 0 0 0 0 1 0 0 0 0 d8 2 0 0 52 0 0 0 20 0 0 0 d9 0 0 0 0 0 0 0 0 0 0 0 d10 0 0 0 0 0 2 0 0 0 0 0 d11 0 0 0 0 0 0 0 0 0 0 2 Weby Arquivo_Cri_Rem_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,0018 0,0004 0,0000 0,0002 0,0001 0,0009 0,0000 0,0001 0,0000 0,0000 0,0000 d2 0,0001 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d3 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0004 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d5 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 d6 0,0000 0,0000 0,0000 0,0000 0,0000 0,0002 0,0000 0,0000 0,0000 0,0000 0,0001 d7 0,0002 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 d8 0,0001 0,0000 0,0000 0,0029 0,0000 0,0000 0,0000 0,0011 0,0000 0,0000 0,0000 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 Apêndice A 102 Weby Arquivo_Mod_Mod d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 950 131 6 162 33 89 154 144 12 17 27 d2 157 176 0 19 4 19 17 45 5 6 3 d3 5 1 0 0 0 0 0 0 0 0 0 d4 160 15 0 196 2 23 28 83 3 4 28 d5 22 5 0 13 8 6 8 8 0 3 0 d6 76 10 0 21 5 115 17 15 0 1 30 d7 125 27 0 25 13 14 135 13 0 0 0 d8 133 45 0 90 2 27 0 342 4 22 23 d9 9 4 0 3 1 0 0 3 7 3 3 d10 11 7 0 7 0 2 0 21 2 14 4 d11 13 2 0 7 0 36 0 12 1 1 75 Weby Arquivo_Mod_Mod_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,0532 0,0073 0,0003 0,0091 0,0018 0,0050 0,0086 0,0081 0,0007 0,0010 0,0015 d2 0,0088 0,0099 0,0000 0,0011 0,0002 0,0011 0,0010 0,0025 0,0003 0,0003 0,0002 d3 0,0003 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0090 0,0008 0,0000 0,0110 0,0001 0,0013 0,0016 0,0046 0,0002 0,0002 0,0016 d5 0,0012 0,0003 0,0000 0,0007 0,0004 0,0003 0,0004 0,0004 0,0000 0,0002 0,0000 d6 0,0043 0,0006 0,0000 0,0012 0,0003 0,0064 0,0010 0,0008 0,0000 0,0001 0,0017 d7 0,0070 0,0015 0,0000 0,0014 0,0007 0,0008 0,0076 0,0007 0,0000 0,0000 0,0000 d8 0,0074 0,0025 0,0000 0,0050 0,0001 0,0015 0,0000 0,0192 0,0002 0,0012 0,0013 d9 0,0005 0,0002 0,0000 0,0002 0,0001 0,0000 0,0000 0,0002 0,0004 0,0002 0,0002 d10 0,0006 0,0004 0,0000 0,0004 0,0000 0,0001 0,0000 0,0012 0,0001 0,0008 0,0002 d11 0,0007 0,0001 0,0000 0,0004 0,0000 0,0020 0,0000 0,0007 0,0001 0,0001 0,0042 Apêndice A 103 Weby Arquivo_Mod_Rem d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 20 3 0 1 0 5 0 2 0 2 0 d2 2 2 0 0 0 1 3 7 0 0 0 d3 0 0 0 0 0 1 0 0 0 0 0 d4 3 0 0 1 0 2 0 2 0 0 0 d5 0 0 0 0 0 0 0 0 0 0 0 d6 1 0 0 0 0 4 0 0 0 0 0 d7 9 0 0 4 0 0 9 0 0 0 0 d8 3 0 0 1 0 0 0 9 0 1 0 d9 0 0 0 0 0 0 0 0 0 0 0 d10 0 0 0 0 0 0 0 1 0 2 0 d11 0 0 0 0 0 0 0 1 0 0 1 Weby Arquivo_Mod_Rem_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,0011 0,0002 0,0000 0,0001 0,0000 0,0003 0,0000 0,0001 0,0000 0,0001 0,0000 d2 0,0001 0,0001 0,0000 0,0000 0,0000 0,0001 0,0002 0,0004 0,0000 0,0000 0,0000 d3 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0002 0,0000 0,0000 0,0001 0,0000 0,0001 0,0000 0,0001 0,0000 0,0000 0,0000 d5 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0001 0,0000 0,0000 0,0000 0,0000 0,0002 0,0000 0,0000 0,0000 0,0000 0,0000 d7 0,0005 0,0000 0,0000 0,0002 0,0000 0,0000 0,0005 0,0000 0,0000 0,0000 0,0000 d8 0,0002 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0005 0,0000 0,0001 0,0000 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0001 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0001 Apêndice A 104 Weby Linha_Cri_Mod d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 113598 526 31 445 14 139 238 958 89 25 38 d2 110 4451 0 23 5 28 45 109 13 16 1 d3 9 0 26 0 0 0 0 0 0 0 0 d4 211 25 0 44343 2 11 36 170 19 1 73 d5 34 46 0 42 1776 20 59 73 0 6 3 d6 126 30 0 50 6 52088 7 192 0 0 12 d7 111 32 0 8 2 22 1206 25 11 1 4 d8 170 138 0 96 1 272 0 86866 23 16 49 d9 5 8 0 2 1 0 0 9 106 0 2 d10 6 0 0 20 0 12 0 10 1 577 6 d11 1 0 0 17 0 49 0 27 0 0 1270 Weby Linha_Cri_Mod_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,2931 0,0014 0,0001 0,0011 0,0000 0,0004 0,0006 0,0025 0,0002 0,0001 0,0001 d2 0,0003 0,0115 0,0000 0,0001 0,0000 0,0001 0,0001 0,0003 0,0000 0,0000 0,0000 d3 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0005 0,0001 0,0000 0,1144 0,0000 0,0000 0,0001 0,0004 0,0000 0,0000 0,0002 d5 0,0001 0,0001 0,0000 0,0001 0,0046 0,0001 0,0002 0,0002 0,0000 0,0000 0,0000 d6 0,0003 0,0001 0,0000 0,0001 0,0000 0,1344 0,0000 0,0005 0,0000 0,0000 0,0000 d7 0,0003 0,0001 0,0000 0,0000 0,0000 0,0001 0,0031 0,0001 0,0000 0,0000 0,0000 d8 0,0004 0,0004 0,0000 0,0002 0,0000 0,0007 0,0000 0,2241 0,0001 0,0000 0,0001 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0003 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0015 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0001 0,0000 0,0000 0,0033 Apêndice A 105 Weby Linha_Cri_Rem d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 51616 341 158 319 84 891 512 773 0 58 38 d2 174 240 0 5 0 50 46 424 0 27 8 d3 5 0 0 0 0 12 0 0 0 0 0 d4 814 23 0 453 0 87 65 357 1 0 76 d5 27 52 0 47 60 48 35 24 0 2 1 d6 246 3 0 16 1 624 2 153 0 50 25 d7 149 11 0 20 0 21 166 169 0 0 0 d8 269 341 0 95 2 256 0 2169 0 154 13 d9 17 1 0 1 0 0 0 1 12 0 0 d10 19 1 0 31 0 130 0 54 0 122 4 d11 0 0 0 0 0 30 0 10 0 0 62 Weby Linha_Cri_Rem_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,1332 0,0009 0,0004 0,0008 0,0002 0,0023 0,0013 0,0020 0,0000 0,0001 0,0001 d2 0,0004 0,0006 0,0000 0,0000 0,0000 0,0001 0,0001 0,0011 0,0000 0,0001 0,0000 d3 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0021 0,0001 0,0000 0,0012 0,0000 0,0002 0,0002 0,0009 0,0000 0,0000 0,0002 d5 0,0001 0,0001 0,0000 0,0001 0,0002 0,0001 0,0001 0,0001 0,0000 0,0000 0,0000 d6 0,0006 0,0000 0,0000 0,0000 0,0000 0,0016 0,0000 0,0004 0,0000 0,0001 0,0001 d7 0,0004 0,0000 0,0000 0,0001 0,0000 0,0001 0,0004 0,0004 0,0000 0,0000 0,0000 d8 0,0007 0,0009 0,0000 0,0002 0,0000 0,0007 0,0000 0,0056 0,0000 0,0004 0,0000 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0001 0,0000 0,0003 0,0000 0,0001 0,0000 0,0003 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0002 Apêndice A 106 Weby Linha_Mod_Mod d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 1746 221 0 150 22 148 210 323 21 36 20 d2 396 246 0 41 5 31 30 173 29 4 1 d3 7 0 0 0 0 0 0 0 0 0 0 d4 146 19 0 154 1 18 49 343 0 1 17 d5 43 8 0 8 9 5 7 7 0 1 0 d6 81 2 0 22 3 200 8 184 0 0 13 d7 186 9 0 22 16 5 144 22 16 0 6 d8 216 108 0 137 15 136 0 853 0 17 138 d9 3 1 0 1 0 0 0 1 171 0 0 d10 24 1 0 5 0 14 0 16 1 37 6 d11 1 0 0 4 0 23 0 13 0 0 20 Weby Linha_Mod_Mod_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,0045 0,0006 0,0000 0,0004 0,0001 0,0004 0,0005 0,0008 0,0001 0,0001 0,0001 d2 0,0010 0,0006 0,0000 0,0001 0,0000 0,0001 0,0001 0,0004 0,0001 0,0000 0,0000 d3 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0004 0,0000 0,0000 0,0004 0,0000 0,0000 0,0001 0,0009 0,0000 0,0000 0,0000 d5 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0002 0,0000 0,0000 0,0001 0,0000 0,0005 0,0000 0,0005 0,0000 0,0000 0,0000 d7 0,0005 0,0000 0,0000 0,0001 0,0000 0,0000 0,0004 0,0001 0,0000 0,0000 0,0000 d8 0,0006 0,0003 0,0000 0,0004 0,0000 0,0004 0,0000 0,0022 0,0000 0,0000 0,0004 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0004 0,0000 0,0000 d10 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0001 Apêndice A 107 Weby Linha_Mod_Rem d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 839 439 7 56 10 654 241 201 0 18 12 d2 70 60 0 1 0 12 68 39 0 2 2 d3 2 0 0 0 0 22 0 0 0 0 0 d4 57 36 0 88 0 22 7 30 0 1 8 d5 11 2 0 0 1 2 3 5 0 2 0 d6 80 0 0 6 0 250 2 68 0 0 22 d7 180 6 0 16 7 6 68 23 1 0 0 d8 135 27 0 67 40 92 0 751 0 33 17 d9 1 3 0 0 0 1 0 0 1 0 0 d10 3 1 0 3 0 7 0 18 0 7 0 d11 0 0 0 1 0 8 0 11 0 0 20 Weby Linha_Mod_Rem_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,0022 0,0011 0,0000 0,0001 0,0000 0,0017 0,0006 0,0005 0,0000 0,0000 0,0000 d2 0,0002 0,0002 0,0000 0,0000 0,0000 0,0000 0,0002 0,0001 0,0000 0,0000 0,0000 d3 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0001 0,0001 0,0000 0,0002 0,0000 0,0001 0,0000 0,0001 0,0000 0,0000 0,0000 d5 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0002 0,0000 0,0000 0,0000 0,0000 0,0006 0,0000 0,0002 0,0000 0,0000 0,0001 d7 0,0005 0,0000 0,0000 0,0000 0,0000 0,0000 0,0002 0,0001 0,0000 0,0000 0,0000 d8 0,0003 0,0001 0,0000 0,0002 0,0001 0,0002 0,0000 0,0019 0,0000 0,0001 0,0000 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0001 Apêndice A 108 Weby Métricas commits efet_cri efet_mod esfo_cri esfo_rem esfo_dist_mod efet_cri_div_esfo_cri efet_mod_div_esfo_dist_mod lin_files_add_mod d1 474 102817 539 110208 54714 2129 0,932935903 0,2531705026 77 d2 159 3188 294 4340 1587 482 0,734562212 0,6099585062 6 d3 2 0 0 26 165 0 0 0 0 d4 170 41929 410 44014 1225 901 0,952628709 0,4550499445 12 d5 30 1185 21 1736 205 48 0,6826036866 0,4375 9 d6 99 50630 479 51678 3225 593 0,9797205774 0,8077571669 25 d7 61 483 163 1117 1215 266 0,4324082363 0,6127819549 3 d8 183 83409 1302 85677 5280 2058 0,9735284849 0,6326530612 36 d9 20 55 211 102 15 241 0,5392156863 0,8755186722 1 d10 24 225 43 542 476 71 0,4151291513 0,6056338028 3 d11 72 1053 315 1190 308 312 0,8848739496 1,0096153846 0 Apêndice A 109 Weby Métricas lin_files_add_del lin_files_mod_mod lin_files_mod_del col_files_add_mod col_files_add_del col_files_mod_mod col_files_mod_del lin_lines_add_mod 29 775 13 36 16 711 18 2503 2 275 13 48 7 247 3 350 1 6 1 1 0 6 0 9 8 346 7 19 56 347 6 548 3 65 0 2 1 60 0 283 1 175 1 21 18 216 9 423 3 217 13 17 2 224 3 216 54 346 5 20 2 344 13 765 0 26 0 0 0 27 0 27 2 54 1 1 0 57 3 55 0 72 1 7 1 118 0 94 Apêndice A 110 Weby Métricas lin_lines_add_del lin_lines_mod_mod lin_lines_mod_del col_lines_add_mod col_lines_add_del col_lines_mod_mod col_lines_mod_del 3174 1151 1638 783 1720 1103 539 734 710 194 805 773 369 514 17 7 24 31 158 0 7 1423 594 161 703 534 390 150 236 79 25 31 87 62 57 496 313 178 553 1525 380 826 370 282 239 385 660 304 321 1130 767 411 1573 1965 1082 395 20 6 5 156 1 67 1 239 67 32 65 291 59 56 40 41 20 188 165 201 61 APÊNDICE B Apêndice Semelhante ao apêndice anterior, cada página desse apêndice contem uma tabela de métricas em sua versão absoluta e relativa de relacionamento entre os desenvolvedores. Os desenvolvedores estão dispostos nas linhas e colunas formando a matriz de relacionamento. Para interpretação dos resultados, deve-se considerar os desenvolvedores das colunas como agentes de mundaça nos desenvolvedores das linhas, ou seja, os desenvolvedores dispostos nas linhas sofreram alterações do desenvolvedores que estão dispostos nas colunas. Ao final, todas as métricas que foram formalizadas no Capítulo 3 são apresentadas para o projeto Solicite. Na sequência, existe também, uma tabela de três páginas que revela o valor das métricas de todos os desenvolvedores. Dessa vez, os desenvolvedores estão disposto nas linhas e as colunas correspondem as métricas. Apêndice B 112 Solicite Commits d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 303 34 73 66 2 1 1 14 0 0 0 d2 34 72 0 0 0 0 0 0 0 0 0 d3 73 0 120 45 3 3 0 0 0 0 0 d4 67 0 47 306 2 0 1 17 0 16 1 d5 1 0 4 2 5 0 0 0 0 0 0 d6 1 0 0 3 0 1 0 0 0 0 0 d7 1 0 0 1 0 0 3 0 0 0 0 d8 13 0 0 17 0 0 0 111 1 0 0 d9 0 0 0 1 0 0 0 0 21 0 0 d10 0 0 0 16 0 0 0 0 0 145 3 d11 0 0 0 0 0 0 0 0 0 4 2 Solicite Commits_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,1829 0,0205 0,0441 0,0398 0,0012 0,0006 0,0006 0,0084 0,0000 0,0000 0,0000 d2 0,0205 0,0435 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d3 0,0441 0,0000 0,0724 0,0272 0,0018 0,0018 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0404 0,0000 0,0284 0,1847 0,0012 0,0000 0,0006 0,0103 0,0000 0,0097 0,0006 d5 0,0006 0,0000 0,0024 0,0012 0,0030 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0006 0,0000 0,0000 0,0018 0,0000 0,0006 0,0000 0,0000 0,0000 0,0000 0,0000 d7 0,0006 0,0000 0,0000 0,0006 0,0000 0,0000 0,0018 0,0000 0,0000 0,0000 0,0000 d8 0,0078 0,0000 0,0000 0,0103 0,0000 0,0000 0,0000 0,0670 0,0006 0,0000 0,0000 d9 0,0000 0,0000 0,0000 0,0006 0,0000 0,0000 0,0000 0,0000 0,0127 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0097 0,0000 0,0000 0,0000 0,0000 0,0000 0,0875 0,0018 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0024 0,0012 Apêndice B 113 Solicite Arquivo_Cri_Mod d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 1154 4 2 5 0 0 0 0 0 0 0 d2 12 180 2 108 0 0 0 0 0 0 0 d3 0 0 57 37 0 0 0 0 0 0 0 d4 2 0 0 767 0 0 0 0 0 47 0 d5 0 0 1 0 6 0 0 0 0 0 0 d6 0 0 0 0 0 8 0 0 0 0 0 d7 0 0 0 2 0 0 2 0 0 0 0 d8 0 0 0 28 0 0 0 54 0 0 0 d9 0 0 0 0 0 0 0 0 0 0 0 d10 0 0 0 1 0 0 0 0 0 47 0 d11 0 0 0 0 0 0 0 0 0 0 0 Solicite Arquivo_Cri_Mod_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,1582 0,0005 0,0003 0,0007 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d2 0,0016 0,0247 0,0003 0,0148 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d3 0,0000 0,0000 0,0078 0,0051 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0003 0,0000 0,0000 0,1052 0,0000 0,0000 0,0000 0,0000 0,0000 0,0064 0,0000 d5 0,0000 0,0000 0,0001 0,0000 0,0008 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0000 0,0000 0,0000 0,0000 0,0000 0,0011 0,0000 0,0000 0,0000 0,0000 0,0000 d7 0,0000 0,0000 0,0000 0,0003 0,0000 0,0000 0,0003 0,0000 0,0000 0,0000 0,0000 d8 0,0000 0,0000 0,0000 0,0038 0,0000 0,0000 0,0000 0,0074 0,0000 0,0000 0,0000 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0064 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 Apêndice B 114 Solicite Arquivo_Cri_Rem d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 31 0 0 1 0 0 0 0 0 0 0 d2 2 3 0 0 0 0 0 0 0 0 0 d3 0 0 0 0 0 0 0 0 0 0 0 d4 0 0 0 4 0 0 0 0 0 0 0 d5 0 0 0 0 1 0 0 0 0 0 0 d6 0 0 0 0 0 0 0 0 0 0 0 d7 0 0 0 0 0 0 0 0 0 0 0 d8 0 0 0 0 0 0 0 0 0 0 0 d9 0 0 0 0 0 0 0 0 0 0 0 d10 0 0 0 0 0 0 0 0 0 0 0 d11 0 0 0 0 0 0 0 0 0 0 0 Solicite Arquivo_Cri_Rem_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,0043 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d2 0,0003 0,0004 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d3 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0000 0,0000 0,0000 0,0005 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d5 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d7 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d8 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 Apêndice B 115 Solicite Arquivo_Mod_Mod d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 1298 52 140 131 5 0 1 14 0 0 0 d2 58 114 10 3 0 0 0 0 0 0 0 d3 127 0 557 84 7 0 0 3 0 0 0 d4 90 0 50 983 0 0 7 70 0 49 0 d5 4 0 8 2 2 0 0 0 0 0 0 d6 0 0 0 0 0 0 0 0 0 0 0 d7 1 0 0 5 0 0 4 2 0 0 0 d8 17 0 0 69 0 0 0 99 0 0 0 d9 0 0 0 0 0 0 0 0 0 0 0 d10 0 0 0 60 0 0 0 0 0 342 0 d11 0 0 0 0 0 0 0 0 0 0 0 Solicite Arquivo_Mod_Mod_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,1780 0,0071 0,0192 0,0180 0,0007 0,0000 0,0001 0,0019 0,0000 0,0000 0,0000 d2 0,0080 0,0156 0,0014 0,0004 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d3 0,0174 0,0000 0,0764 0,0115 0,0010 0,0000 0,0000 0,0004 0,0000 0,0000 0,0000 d4 0,0123 0,0000 0,0069 0,1348 0,0000 0,0000 0,0010 0,0096 0,0000 0,0067 0,0000 d5 0,0005 0,0000 0,0011 0,0003 0,0003 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d7 0,0001 0,0000 0,0000 0,0007 0,0000 0,0000 0,0005 0,0003 0,0000 0,0000 0,0000 d8 0,0023 0,0000 0,0000 0,0095 0,0000 0,0000 0,0000 0,0136 0,0000 0,0000 0,0000 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0082 0,0000 0,0000 0,0000 0,0000 0,0000 0,0469 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 Apêndice B 116 Solicite Arquivo_Mod_Rem d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 33 0 0 0 0 0 0 0 0 0 0 d2 3 1 0 0 0 0 0 0 0 0 0 d3 1 0 1 0 0 0 0 0 0 0 0 d4 1 0 0 0 0 0 0 0 0 0 0 d5 0 0 0 0 0 0 0 0 0 0 0 d6 0 0 0 0 0 0 0 0 0 0 0 d7 0 0 0 0 0 0 0 0 0 0 0 d8 0 0 0 0 0 0 0 0 0 0 0 d9 0 0 0 0 0 0 0 0 0 0 0 d10 0 0 0 0 0 0 0 0 0 0 0 d11 0 0 0 0 0 0 0 0 0 0 0 Solicite Arquivo_Mod_Rem_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,0045 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d2 0,0004 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d3 0,0001 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d5 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d7 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d8 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 Apêndice B 117 Solicite Linha_Cri_Mod d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 16592 21 35 0 0 0 0 0 0 0 0 d2 62 2347 0 0 0 0 0 0 0 0 0 d3 1 0 280 0 0 0 0 0 0 0 0 d4 0 0 0 90223 0 0 0 0 0 4352 0 d5 0 0 0 0 10 0 0 0 0 0 0 d6 0 0 0 0 0 0 0 0 0 0 0 d7 0 0 0 0 0 0 0 0 0 0 0 d8 0 0 0 0 0 0 0 0 0 0 0 d9 0 0 0 0 0 0 0 0 0 0 0 d10 0 0 0 95 0 0 0 0 0 12640 0 d11 0 0 0 0 0 0 0 0 0 0 0 Solicite Linha_Cri_Mod_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,1239 0,0002 0,0003 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d2 0,0005 0,0175 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d3 0,0000 0,0000 0,0021 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0000 0,0000 0,0000 0,6737 0,0000 0,0000 0,0000 0,0000 0,0000 0,0325 0,0000 d5 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d7 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d8 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0007 0,0000 0,0000 0,0000 0,0000 0,0000 0,0944 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 Apêndice B 118 Solicite Linha_Cri_Rem d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 1123 9 33 20 0 0 0 0 0 0 0 d2 261 1279 0 0 0 0 0 0 0 0 0 d3 35 0 162 0 0 0 0 0 0 0 0 d4 0 0 0 825 0 0 0 0 0 1258 0 d5 0 0 0 0 10 0 0 0 0 0 0 d6 0 0 0 0 0 0 0 0 0 0 0 d7 0 0 0 0 0 0 0 0 0 0 0 d8 0 0 0 0 0 0 0 0 0 0 0 d9 0 0 0 0 0 0 0 0 0 0 0 d10 0 0 0 36 0 0 0 0 0 883 0 d11 0 0 0 0 0 0 0 0 0 0 0 Solicite Linha_Cri_Rem_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,0084 0,0001 0,0002 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d2 0,0019 0,0095 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d3 0,0003 0,0000 0,0012 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0000 0,0000 0,0000 0,0062 0,0000 0,0000 0,0000 0,0000 0,0000 0,0094 0,0000 d5 0,0000 0,0000 0,0000 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d7 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d8 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0003 0,0000 0,0000 0,0000 0,0000 0,0000 0,0066 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 Apêndice B 119 Solicite Linha_Mod_Mod d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 100 5 10 0 0 0 0 0 0 0 0 d2 8 6 0 0 0 0 0 0 0 0 0 d3 3 0 4 0 0 0 0 0 0 0 0 d4 0 0 0 46 0 0 0 0 0 26 0 d5 0 0 0 0 0 0 0 0 0 0 0 d6 0 0 0 0 0 0 0 0 0 0 0 d7 0 0 0 0 0 0 0 0 0 0 0 d8 0 0 0 0 0 0 0 0 0 0 0 d9 0 0 0 0 0 0 0 0 0 0 0 d10 0 0 0 93 0 0 0 0 0 485 0 d11 0 0 0 0 0 0 0 0 0 0 0 Solicite Linha_Mod_Mod_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,0007 0,0000 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d2 0,0001 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d3 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0000 0,0000 0,0000 0,0003 0,0000 0,0000 0,0000 0,0000 0,0000 0,0002 0,0000 d5 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d7 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d8 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0007 0,0000 0,0000 0,0000 0,0000 0,0000 0,0036 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 Apêndice B 120 Solicite Linha_Mod_Rem d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 333 1 5 0 0 0 0 0 0 0 0 d2 41 26 0 0 0 0 0 0 0 0 0 d3 48 0 35 0 0 0 0 0 0 0 0 d4 0 0 0 4 0 0 0 0 0 1 0 d5 0 0 0 0 0 0 0 0 0 0 0 d6 0 0 0 0 0 0 0 0 0 0 0 d7 0 0 0 0 0 0 0 0 0 0 0 d8 0 0 0 0 0 0 0 0 0 0 0 d9 0 0 0 0 0 0 0 0 0 0 0 d10 0 0 0 5 0 0 0 0 0 53 0 d11 0 0 0 0 0 0 0 0 0 0 0 Solicite Linha_Mod_Rem_Rel d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d1 0,0025 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d2 0,0003 0,0002 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d3 0,0004 0,0000 0,0003 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d4 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d5 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d6 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d7 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d8 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d9 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 d10 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0004 0,0000 d11 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 Apêndice B 121 Solicite Métricas commits efet_cri efet_mod esfo_cri esfo_rem esfo_dist_mod efet_cri_div_esfo_cri efet_mod_div_esfo_dist_mod lin_files_add_mod d1 493 16167 0 16304 1841 8 0,9915971541 0 11 d2 106 1946 0 2295 1315 3 0,8479302832 0 122 d3 244 196 0 239 235 0 0,820083682 0 37 d4 457 83481 188 89118 890 1199 0,9367467852 0,1567973311 49 d5 12 10 0 10 10 0 1 0 1 d6 5 0 0 0 0 0 0 0 0 d7 5 0 0 0 0 0 0 0 2 d8 142 0 0 0 0 0 0 0 28 d9 22 0 0 0 0 0 0 0 0 d10 165 11509 4285 11650 2195 5435 0,9878969957 0,7884084637 1 d11 6 0 0 0 0 0 0 0 0 Apêndice B lin_files_add_del Solicite Métricas lin_files_mod_mod lin_files_mod_del col_files_add_mod col_files_add_del 1 343 0 14 2 71 3 4 0 221 1 5 0 266 1 181 0 14 0 0 0 0 0 0 0 8 0 0 0 86 0 0 0 0 0 0 0 60 0 47 0 0 0 0 122 2 0 0 1 0 0 0 0 0 0 0 col_files_mod_mod col_files_mod_del lin_lines_add_mod 297 5 56 52 0 62 208 0 1 354 0 4352 12 0 0 0 0 0 8 0 0 89 0 0 0 0 0 49 0 95 0 0 0 Apêndice B 123 Solicite Métricas lin_lines_add_del lin_lines_mod_mod lin_lines_mod_del col_lines_add_mod col_lines_add_del col_lines_mod_mod col_lines_mod_del 62 15 6 63 296 11 89 261 8 41 21 9 5 1 35 3 48 35 33 10 5 1258 26 1 95 56 93 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 93 5 4352 1258 26 1 0 0 0 0 0 0 0