TCC2
TCC2
TCC2
Professor
Convidado 1
Professor
Convidado 2
Gostaria de agradecer especialmente aos meus pais, avôs e irmã, pois foi através deles
que aprendi a dar o melhor em tudo aquilo que faço.
Deixo também, meus agradecimentos a minha esposa, familiares e amigos. Sempre me
apoiaram e se colocaram a disposição, auxiliando em todos os momentos de dificuldade. Acre-
ditem que parte dessa conquista são de vocês, estarei sempre disposto a retribuir e conquistar
novos sonhos com cada um.
Agradeço ao Prof.Dr.Otavio Augusto Lazzarini Lemos, por aceitar ser meu orientador,
me guiar compartilhando seu conhecimento ao longo da realização desse trabalho de TCC.
“O analfabeto do século XXI não será aquele que não consegue ler e escrever,
mas aquele que não consegue aprender,
desaprender e reaprender."
(Alvin Toffler)
Resumo
Recentemente pesquisadores implementaram uma ferramenta nomeada como rea-
per, que possibilita os usuários selecionar projetos que possuem indícios de que são proje-
tos sólidos, segundo dimensões de engenharia de software. No trabalho em questão, foram
utilizados dois métodos de classificação, o random forest e um classificador baseado em
pontuação, o trabalho classifica o projeto, e não trechos de código individuais.
Em seguida, outra pesquisa investigou se algoritmos de Machine Learning (ML)
são capazes de identificar diferenças entre códigos. Assim sendo, classificar se determinado
trecho de código segue ou não boas práticas. Os resultados indicam a existência de padrões
que distinguem trechos de códigos engineered (funções que seguem boas práticas) e non-
engineered (funções que não seguem boas práticas).
A pesquisa citada anteriormente apresentou bons resultados na classificação de
códigos de funções, porém o processo para classificar o código possui etapas manuais e
não possui uma interface que possibilita o usuário realizar a classificação do seu código.
Portanto, para este trabalho é proposto um complemento às pesquisas realizadas,
implementando uma ferramenta que permite o usuário usufruir do modelo de classificação
de forma fácil, automatizada e através de interfaces web. A aplicação recebe um trecho de
código, em seguida retorna sua classificação (segue ou não boas práticas), retorna também
o valor das métricas de software que foram analisadas.
IA Inteligência Artificial
ML Aprendizado de Máquina
LR Regressão Logística
TS TypeScript
1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.1 Contextualização e Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2 Definição do Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3 Justificativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4.1 Objetivo Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4.2 Objetivos Específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.6 Estrutura do Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2 Aprendizado de máquina . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1 Aprendizado Supervisionado . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2 Pré-processamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3 Algoritmos de Machine Learning (ML) . . . . . . . . . . . . . . . . . . . . . 17
2.3.1 Redes Neurais Artificiais . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3.2 Logistic Regression (LR) . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.3 k-Nearest Neighbours (k-NN) . . . . . . . . . . . . . . . . . . . . . . 20
3 Engenharia de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.1 Métricas de software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2 Arquitetura de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.3 A Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
1 Introdução
ter contato com o código. Este trabalho tem como objetivo desenvolver um sistema web capaz
de classificar, se um trecho de código segue ou não boas práticas. Por fim, a ferramenta que de-
senvolvida pode servir como uma base de análise de código, fornecendo indícios de qualidade.
Por fim, fornecer uma interface web para facilitar a experiência do usuário. Foi desen-
volvido o front-end e o back-end que faz a integração do extrator de métricas e o modelo de
classificação.
1.3 Justificativas
Neste trabalho é proposto um complemento às pesquisas já realizadas, implementando
uma ferramenta que permite ao usuário usufruir do modelo de classificação desenvolvido por
(LEMOS, 2019) de forma fácil e automatizada através de interfaces do sistema.
Além de fomentar os desenvolvedores a considerarem a qualidade de seus códigos, a
aplicação também gera mais visibilidade para o estudo.
1.4 Objetivos
1.4.1 Objetivo Geral
Esse trabalho tem como objetivo desenvolver uma aplicação Web para predição da qua-
lidade de código de funções, assim contribuir com a comunidade de desenvolvedores.
A proposta é reunir conhecimentos de Engenharia de Software e Aprendizado de Má-
quina para a criação de um sistema Web que utiliza um modelo de classificação desenvolvido
por (LEMOS, 2019) que seja capaz de classificar se um trecho de código (função) segue ou não
boas práticas de programação.
É previsto também que o sistema forneça as métricas utilizadas no modelo de classifi-
cação, esse retorno pode ser servir como base para possíveis melhorias no código submetido.
14 Capítulo 1. Introdução
1.5 Metodologia
Serão descritas as etapas seguidas para que o objetivo deste trabalho seja alcançado, as
ferramentas computacionais que serão utilizadas e a divisão das tarefas.
O projeto consiste na implementação de um sistema de predição de qualidade de código,
o modelo classifica um trecho de código como engineered ou non-engineered.
É utilizado como base o algoritmo desenvolvido por (LEMOS, 2019), ele é capaz de
classificar códigos de funções. O modelo recebe como entrada um conjunto de métricas de soft-
ware e foi desenvolvido em linguagem Python. O algoritmo que realiza a extração das métricas
foi desenvolvido em linguagem Java.
Neste trabalho será desenvolvido um sistema que integre as etapas manuais no processo
de classificação do trabalho desenvolvido por (LEMOS, 2019). Extrair as métricas para que
possam ser fornecidas ao modelo. Além do gerenciamento de ambas as etapas (extração de
métricas e classificação), o sistema fornece uma interface de entrada para código de função,
facilitando a interação com os usuários.
A implementação foi realizada em quatro etapas: Estudo dos algoritmos já desenvol-
vidos (extrator e classificador), desenvolvimento do back-end, desenvolvimento do front-end e
testes de verificação dos resultados obtidos.
A seguir é descrito em tópicos algumas ferramentas utilizadas. Estão descritos alguns
termos, etapas do desenvolvimento e as tecnologias juntamente as estratégias aplicadas.
possibilita ter uma cópia do seu versionamento local na nuvem. Neste trabalho Git/Github
é utilizado para fazer o versionamento do código e manter esse histórico na nuvem.
• Back-End da aplicação: O back-end é uma parte que compõe o sistema, nesta etapa
de implementação é utilizado TypeScript como linguagem e estruturado com a Clean
Architecture.
Fonte: o autor.
mínio. Então o algoritmo de classificação se dá quando o domínio for um conjunto que assume
valores discretos (FACELI et al., 2011).
2.2 Pré-processamento
O pré-processamento é uma etapa que realiza a preparação dos dados para a classifica-
ção. Basicamente esta fase consiste em um conjunto de transformações que são realizadas no
conjunto de exemplo fornecidos para o preditor com o intuito de transformar em uma repre-
sentação adequada, ou seja uma representação de vetor de dados que pode ser consumido pelos
algoritmos de classificação. No livro de (FACELI et al., 2011) é abordado algumas técnicas
como amostragem, tratamento para dados desbalanceados, modificações para adequação dos
tipos de atributo, limpeza dos dados, transformação dos dados e redução de dimensionalidade.
processamento é conhecida como neurônio artificial. Os neurônios são responsáveis por com-
putarem funções matemáticas, eles são distribuídos em camadas.
As conexões na maioria das arquiteturas fazem analogia com as sinapses biológicas
possuindo pesos associados, sendo que esses pesos podem assumir valores positivos ou negati-
vos dependendo da conexão. Os pesos têm seus valores ajustados no processo de aprendizado
que ao final representam o conhecimento adquirido. Conhecimento descrito em (FACELI et al.,
2011).
Fonte: o autor.
• Sinais funcionais: São os estímulos que chegam como entrada para um neurônio, estes
são chamados de sinais funcionais pois passam por uma função dentro de cada nó, a saída
dessa função é então passada como entrada ao nó da próxima camada, se propagando
neurônio a neurônio através da rede até a camada de saída (HAMILTON ONTARIO, ).
2.3. Algoritmos de Machine Learning (ML) 19
Cada vizinho antes do teste já pertence a uma classe conhecida, então cada vizinho
selecionado, vota em sua classe, os retornos dos k vizinhos são agregados contribuindo para
a classificação. Nos problemas de classificação o nó de teste recebe a classe que teve mais
retornos (FACELI et al., 2011).
A seguir na figura 5 é apresentada uma ilustração do algoritmo k-Nearest Neighbours,
é possível observar duas classes (vermelha e azul), considerando a bolinha preta como objeto
que será classificado. No caso de k = 3 ele seria classificado como vermelho, porém com k = 5
ele seria considerado como azul.
Fonte: O autor.
Quanto a escolha do valor k, pode ser definido pelo usuário e deve sempre ser ímpar
para evitar empates. Evidente que os resultados podem ser diferentes dependendo do k, existem
outras duas formas consideradas na literatura para definir esse valor. Estimar o k por validação
cruzada ou associar um peso para cada vizinho, nessa opção o peso atribuído consiste em um
valor inversamente proporcional à distância do objeto em teste (FACELI et al., 2011).
3 Engenharia de Software
• Avaliações estruturais
• Medição de qualidade
• Métricas de segurança
• Avaliação da complexidade
3.1. Métricas de software 23
Arquitetura Limpa
Nesta seção será apresentado o conceito de Arquitetura Limpa baseado no livro “Clean
Architecture: A Craftsman’s Guide to Software Structure and Design.”, escrito por Robert Mar-
tin (MARTIN, 2018).
A Clean Architecture é um padrão de arquitetura que define uma forma de organização
estrutural que mantém os elementos do sistema como citado na seção anterior dispostos em uma
determinada organização.
Na figura 6 é possível observar um diagrama que representa a ideia da arquitetura limpa,
que na verdade é uma tentativa de integrar conceitos de diversas arquiteturas (MARTIN, 2018),
como por exemplo:
• Testável: Significa que as regras de negócios do sistema possam ser testadas sem interfe-
rência de qualquer elemento externo (Ex: Banco de Dados, servidor web).
• Camada de Estruturas e Drivers: É a camada mais externa, que pode ser composta por
estruturas da web, banco de dados, UI, entre outros.
3.3 A Web
A palavra web significa rede, no contexto de computação a web é basicamente uma rede
que conecta computadores. A web fornece diversos dados, informações, análises, blogs, tudo
isso poderia ser instalado pelo usuário e ter um programa para cada coisa em específico. Em
vez de instalar vários programas no computador, é utilizado um navegador web para acessar
esses serviços (RICHARDSON; RUBY, 2007). O navegador recebe códigos HTML enviados
pelo servidor e os interpreta de forma gráfica. A web se baseia no protocolo HTTP, XML e mais
recentemente JSON.
Segundo (WEBBER; PARASTATIDIS; ROBINSON, 2010) REST é um estilo de arqui-
tetura utilizado na Web. Essa arquitetura foca em construir aplicações distribuídas que podem
ser escaladas, com baixo acoplamento e que podem fornecer serviços que podem ser compostos
por outros serviços.
27
Nesta seção são apresentados trabalhos relacionados a temática desenvolvida neste tra-
balho, na tabela a seguir é apresentada a lista de artigos contidos neste capítulo de revisão da
literatura, a tabela referência o artigo e o ano de publicação.
dimensão Descrição
D1 Arquitetura, como evidência da organização do código.
D2 Comunidade, como evidência de colaboração.
D3 Integração contínua, como evidência de qualidade.
D4 Documentação, como evidência de sustentabilidade.
D5 História, como evidência de evolução sustentada.
D6 Problemas, como evidência de gerenciamento de projetos.
D7 Licença, como prova de responsabilidade.
D8 Teste de unidade, como evidência de qualidade.
Fonte: O autor
Considerações
Como exposto no trabalho de (AL-JAMIMI; AHMED, 2013) e citado por (LEMOS,
2019) existem muitas possibilidades de estudos na área de engenharia de software que podem
ser abordadas com algoritmos de IA e ML, e isso se dá pois apenas mais recentemente surgiram
trabalhos utilizando IA no contexto de Engenharia de Software.
Neste trabalho de pesquisa será então usado como base o trabalho desenvolvido por
(LEMOS, 2019). A ideia é utilizar o modelo implementado pelo autor, para construir uma fer-
ramenta (sistema web) que possibilite os usuários usufruírem dos resultados obtidos por (LE-
MOS, 2019) para classificação de código de funções através do sistema web.
29
O desenvolvimento das atividades foram divididas em cinco etapas, abaixo está listado
as etapas executadas para a conclusão do trabalho.
• Etapa 1: Módulo de extração de métricas - Rodar o código que extrai as métricas de
funções e encontrar um meio de executar esse código através do TS.
• Etapa 2: Modelo de classificação de código de funções - Rodar o código que treina o
modelo de classificação e implementar uma função em Python que carrega o modelo de classi-
ficação e executa o mesmo.
• Etapa 3: Desenvolvimento do Back-end em TS utilizando clean architecture.
• Etapa 4: Implementação do Front-end da aplicação.
• Etapa 5: Teste da aplicação web.
Os códigos desenvolvidos nas etapas mencionadas anteriormente, podem ser acessados
em https://github.com/cunhafelipe098/web-application-for-classifying-methods-in-java-language.git.
Nesta etapa do projeto foi realizada uma análise do código do extrator de métricas para
verificar as possibilidades de utilizá-lo para extrair as métricas de código.
A ideia foi utilizar este código pois já estava desenvolvido. Após a análise de viabilidade
de utilização foi concluído que seria gerado um arquivo executável do código (arquivo .jar).
Foi utilizada a IDE Eclipse para gerar o executável do extrator de métricas. O arquivo
.jar é executado via chamada de sistema ao Linux pelo back-end que foi escrito em TS. Na
chamada ao extrator é passada a referência de uma função e após a execução são retornados os
valores das métricas juntamente com seus nomes.
No back-end é utilizado o comando ’exec’ do nodeJs para fazer a chamada de sistema.
Foi utilizada a seguinte linha de código:
• await exec(‘java -jar dir/MetricExtractor.jar dir/FunctionSamples.txt dir‘)
Na figura 7 é possível observar a simplificação ao gerar o executável do projeto (extrator
de métricas de código), dessa forma basta executar o arquivo ’MetricExtractor.jar’.
30 Capítulo 5. Aplicação Web para a predição de qualidade de código de funções
Fonte: O autor
Fonte: O autor
Fonte: O autor
Fonte: O autor
Fonte: O autor
Fonte: O autor
ao módulo de extração de métricas que retorna uma coleção de métricas com seus respectivos
valores. Em seguida, as métricas de software são fornecidas ao classificador que retorna a clas-
sificação da função. Após a classificação, a requisição é respondida contendo a classificação da
função e as métricas. Por fim essas informações são apresentadas na tela para o usuário.
Fonte: O autor
36 Capítulo 5. Aplicação Web para a predição de qualidade de código de funções
Fonte: O autor
5.5. Teste e retorno da aplicação 37
Fonte: O autor
Fonte: O autor
6 Conclusão
fornecer indícios mais concretos do motivo dessa classificação e dar sugestões do que refatorar
no código submetido. As análises podem ser baseadas no cruzamento das métricas de software
ou na definição de um range para que as métricas respeitem respectivamente.
Apesar de apresentar bons resultados, a ferramenta é apenas a ponta do Iceberg no
universo de possibilidades. Tanto em aspectos do crescimento da ferramenta, quanto em integrar
avanços de pesquisas em ferramentas acessíveis à comunidade.
Por fim, o objetivo deste trabalho foi contemplado, fornecendo uma interface e inte-
grando as etapas da classificação da pesquisa realizada por (LEMOS, 2019). Também contribui
como uma interface entre avanços da área de pesquisa em IA, através de um aplicação web
guiada por conceitos de Engenharia de Software.
Referências
FENTON, N.; BIEMAN, J. Software metrics: a rigorous and practical approach. [S.l.]: CRC
press, 2014. Citado na página 22.
JR, D. W. H.; LEMESHOW, S.; STURDIVANT, R. X. Applied logistic regression. [S.l.]: John
Wiley & Sons, 2013. Citado na página 20.
KLEINBAUM, D. G. et al. Logistic regression. [S.l.]: Springer, 2002. Citado na página 20.
LEMOS, O. A. L. Learning engineered code from software quality metrics. 2019. Citado 8
vezes nas páginas 13, 14, 27, 28, 30, 36, 38 e 39.
MINELLI, R.; MOCCI, A.; LANZA, M. I know what you did last summer-an investigation
of how developers spend their time. In: IEEE. 2015 IEEE 23rd International Conference on
Program Comprehension. [S.l.], 2015. p. 25–35. Citado na página 12.
MUNAIAH, N. et al. Curating github for engineered software projects. Empirical Software
Engineering, Springer, v. 22, n. 6, p. 3219–3253, 2017. Citado 3 vezes nas páginas 9, 27 e 28.
PRESSMAN, R.; MAXIM, B. Engenharia de Software-8ª Edição. [S.l.]: McGraw Hill Brasil,
2016. Citado na página 24.
RICHARDSON, L.; RUBY, S. RESTful Web Services. Beijing: O’Reilly, 2007. ISBN
978-0-596-52926-0. Disponível em: <https://www.safaribooksonline.com/library/view-
/restful-web-services/9780596529260/>. Citado na página 26.
ROTH, L. M. Understanding architecture: Its elements, history, and meaning. [S.l.]: Routledge,
2018. Citado na página 24.