SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
Um Estudo em Larga Escala
sobre o Uso de API’s Internas
Emerson Viera
Autores
● Aline Brito
● André Hora
● Marco Túlio Valente
ASERG(Applied Software Engineering Research Group) Group –
Departamento de Ciência da Computação (DCC)
Universidade Federal de Minas Gerais (UFMG)
Agenda
● Introdução
● Metodologia
● Resultados
● Comentários de Provedores e Clientes de Interfaces Internas
-Consulta aos Clientes de Interfaces Internas
- Consulta aos Provedores de Interfaces Internas
● Riscos à validade
● Trabalhos Relacionados
● Conclusões
Introdução
● Popularidade do uso de bibliotecas e APIs(Application Programming Interfaces).
● Provedores dessas bibliotecas dividem suas APIs em dois tipos, internas e públicas.
● Para distinguir APIs internas e públicas, alguns provedores incluem pacotes específicos.
● Na IDE Eclipse, APIs internas são implementadas em pacotes que possuem o nome
“internal”.. Já o JDK utiliza o prefixo “sun”.
- Para melhor quantificar o cenário que motiva esse trabalho, realizou-se um estudo ´
preliminar onde minerou-se a quantidade de projetos que utilizam pelo menos uma API
com as nomenclaturas citadas.
- Analisou-se 263.425 projetos Java GitHub. Foram encontrados 17.910 projetos
(6.8%) usando APIs internas. Assim, estuda-se neste artigo duas questões de
pesquisa centrais relativas ao uso de APIs internas. Adicionalmente o estudo inclui o
feedback de provedores e clientes de interfaces internas.
Introdução
QP #1. Qual a frequência de utilização de interfaces internas?
QP #2. Qual a distribuição do uso das interfaces internas de uma biblioteca?
QP(Questão de Pesquisa)
- São analisadas 17 bibliotecas e suas APIs internas usadas por clientes, em um dataset
com aproximadamente 260 mil projetos Java GitHub e 131 milhões de APIs.
- Para melhor entendimento, o estudo proposto nesse artigo concentra-se em dois níveis
de granularidade: APIs (por exemplo, quantos clientes estão usando
org.junit.internal.AssumptionViolatedException?) e bibliotecas (por exemplo, quantos
clientes JUnit estão usando interfaces internas?).
Metodologia
Analisam-se 17 bibliotecas Java e o uso das suas interfaces internas em sistemas clientes. Para
verificar o uso dessas interfaces, utiliza-se um dataset composto por 263.425 projetos e 16.386.193
arquivos Java, minerados através da infra-estrutura Boa. Essa infraestrutura inclui diversos datasets do
GitHub, assim como uma DSL (Domain Specific Language) para minerar repositórios de software e
uma interface Web para executar os scripts de mineração. Criou-se um script Boa para minerar
projetos que fazem uso de pelo menos uma interface/biblioteca em um arquivo Java válido.
Os metadados obtidos, foram então, inseridos em um banco de dados onde criou-se um script para
agrupar as interfaces encontradas e contabilizar seus sistemas clientes. Em seguida minerou-se as
interfaces internas. Para a biblioteca JDK, avalia-se interfaces que possuem o prefixo sun.* . Para as
demais bibliotecas considera-se o respectivo prefixo e o pacote internal.
Resultados
A Tabela 1 apresenta o total de clientes de cada biblioteca que usam pelo menos uma
interface interna.
Resultados
A Figura 1 apresenta as 5 bibliotecas como maior número de clientes usando
interfaces internas.
Resultados
A Figura 2 apresenta a distribuição das interfaces mais usadas, para as bibliotecas com o maior percentual
de clientes usando interfaces internas.
Resultados
Figura 3 apresenta a distribuição considerando todos os projetos.
Comentários de Provedores e Clientes de Interfaces
Internas
Consulta aos Clientes de Interfaces Internas
- Nessa consulta, verifica-se o conhecimento dos clientes sobre as interfaces internas usadas em
seus sistemas. Para tanto, foram consultados 10 desenvolvedores ativos de sistemas clientes
cadastrados no GitHub. Para cada desenvolvedor criou-se uma issue com as perguntas
descritas a seguir.
1. You used an internal interface in “name1” class of your project. Do you know that it is an
internal interface of the “name2” library? (Você usou uma interface interna na classe "nome1" do seu
projeto. Você sabe que é uma interface interna da biblioteca "name2"?)
2. Are you aware that internal interfaces are unstable and may change without
backwardcompatibility? (Você está ciente de que as interfaces internas são instáveis e podem
mudar sem compatibilidade com versões anteriores?)
Consulta aos Clientes de Interfaces Internas
Obteve-se 4 respostas (40%). O primeiro desenvolvedor usou a interface
com.android.internal.telephony.Phone em seu projeto, e alegou que era um codigo-fonte de terceiros.
Provavelmente esse desenvolvedor copiou o código-fonte da biblioteca para o seu projeto. O
segundo desenvolvedor utilizou a interface interna org.hamcrest.internal.ArrayIterator, e justificou o
seu uso devido a uma sugestão da IDE utilizada. O terceiro desenvolvedor utilizou a interface
sun.misc.BASE64Encoder. Em sua resposta, ele informou que não sabia que tratava-se de uma
interface interna do JDK. O texto a seguir apresenta um trecho da sua resposta.
“I was unaware of how unstable internal interfaces were. From looking into this I have noticed
that Oracle have released a Base64 encoder/decoder in the java.util package, so I am now using
that instead.” ("Eu não sabia como as interfaces internas eram instáveis. De olhar para isso eu notei
que a Oracle lançou um codificador / decodificador Base64 no pacote java.util, então eu estou
usando agora isso em vez disso. ")
Consulta aos Clientes de Interfaces Internas
Por fim, o quarto desenvolvedor utilizou a interface com.google.inject.internal.Lists. Em sua resposta
ele alegou que tinha conhecimento sobre interfaces internas mas não percebeu que estava
utilizando. O texto a seguir apresenta um trecho da suas resposta.
“1. I had not noticed it is an internal. 2. Yes. Now that you have pointed it out, I will probably change it.
”("1. Eu não tinha notado que é um interno. 2. Sim. Agora que você o apontou, eu provavelmente vou
mudar isso. ")
Assim, observa-se que o uso de interfaces internas está relacionado com o pouco conhecimento da
biblioteca utilizada.
Consulta aos Provedores de Interfaces Internas
Nessa consulta, tem-se por objetivo verificar o conhecimento dos provedores sobre os clientes que
estão usando suas interfaces internas. Foram criadas ˜ issues em repositórios GitHub de 4 bibliotecas
e obteve-se 3 respostas (75%). Para cada provedor foram realizadas as duas perguntas descritas a
seguir. A issue também incluiu a lista de interfaces internas mineradas nesse estudo e a quantidade
de usuários utilizando as mesmas.
1. Did you know that internal interfaces are used by clients? (Você sabia que as interfaces internas são
usadas pelos clientes?)
2. From the presented interfaces, there is some interface that is a candidate to be promoted
to the public one? (A partir das interfaces apresentadas, há alguma interface que é um candidato a ser
promovido para o público?)
Consulta aos Provedores de Interfaces Internas
JUnit. 1 Quatro desenvolvedores da biblioteca JUnit responderam a issue que foi aberta,
sendo um deles um membro core do projeto. O texto a seguir apresenta um trecho da sua resposta.
“Yes, we are aware that many of the originally internal interfaces are used by clients. It’s one
of the reasons why we’re using a different approach of annotating APIs instead of using package
names for JUnit 5. ("Sim, estamos cientes de que muitas das interfaces originalmente internas são
usadas pelos clientes. É uma das razões pelas quais estamos usando uma abordagem diferente de
anotar APIs em vez de usar nomes de pacotes para JUnit 5.)
Mockito. 2 Dois desenvolvedores da biblioteca Mockito responderam a issue que foi
aberta. Obteve-se duas respostas.
“It seems that quite some internal classes are used instead of relying on the implementation provided
by the Mockito.* method. E.g. Times should be obtained via Mockito.times(). I am not sure
if we can do something about that.” ("Parece que algumas classes internas são usadas em vez de
depender da implementação fornecida pelo método Mockito. *. Por exemplo. Os tempos devem ser
obtidos via Mockito.times (). Eu não tenho certeza se podemos fazer algo sobre isso. ")
Consulta aos Provedores de Interfaces Internas
Google Gson.3 Um dos desenvolvedores da biblioteca Google Gson informou que não tinha
conhecimento da quantidade de clientes usando as interfaces internas, entretanto não
surpreendeu-se com essa má prática adotada por alguns desenvolvedores clientes. Segundo ele,
nenhuma das interfaces listadas por nós na issue são candidatas a promoção para o público. O
texto a seguir apresenta um trecho da suas resposta.
“I didn’t quite know this, but am not very surprised. None of these are candidates for promotion
to public APIs.” ("Eu não sabia muito bem disso, mas não estou muito surpreso. Nenhum desses
candidatos são candidatos à promoção de APIs públicas. ")
Assim, após a consulta aos desenvolvedores de sistemas provedores de interfaces internas,
observa-se que essa má prática é conhecida. As respostas dos desenvolvedores JUnit levantam
também uma discussão em torno de outra atividade crítica, além do uso de interfaces internas,
sistemas clientes estão usando interfaces internas depreciadas.
Riscos à validade
Validade externa. Os resultados desse estudo estão restritos a projetos Java GitHub, ou seja, eles
não podem ser generalizados para outras linguagens e outros repositórios de código-fonte. Além
disso, dentre os 260 mil sistemas analisados, alguns podem ser repositórios GitHub das bibliotecas
analisadas nesse trabalho.
Validade interna. Projetos que importaram somente a biblioteca não foram considerados clientes
das interfaces, já que a importação de uma biblioteca não assegura o uso de todas as suas
interfaces no código-fonte.
Validade de construção. ˜ O script Boa recuperou apenas interfaces/bibliotecas que foram
importadas no código-fonte, e algumas dessas importações podem ser classes do próprio projeto.
Além disso, pode-se ter interfaces que não foram utilizadas ( ˜ warning”), e projetos que copiaram o
código-fonte da biblioteca.
Trabalhos Relacionados
Existem estudos que concentram-se na evolução e uso de interfaces e bibliotecas [Hora and Valente
2015, Mileva et al. 2010, McDonnell et al. 2013]. Adicionalmente alguns trabalhos relatam o uso
indevido de interfaces por sistemas clientes, como por exemplo, a má prática de programação
relacionada ao uso de interfaces internas [Businge et al. 2015, Mastrangelo et al. 2015]. Outros
estudos concentram-se na promoção dessas interfaces internas para o p ˜ ublico [Hora et al. 2016].
Um estudo relacionado ao uso de interfaces internas da biblioteca Eclipse serviu de inspiração para
esse trabalho [Businge et al. 2015, Businge et al. 2013]. O mesmo analisa releases de 512 plug-ins
Eclipse do repositório SourceForge, com o objetivo de investigar motivos que levam ao uso (ou
desuso) de interfaces internas. Os autores também realizam entrevistas com alguns clientes. Outro
estudo nessa área concentra-se no uso da interface interna sun.misc.Unsafe provida pelo JDK
[Mastrangelo et al. 2015]. O artigo identifica 14 razões que levam clientes a usarem essa interface e
analisa cerca de 86 mil arquivos Java. Ao contrário dos trabalhos mencionados, que concentram-se
em bibliotecas específicas, este trabalho analisa o uso de interfaces internas na linguagem Java, e o
conhecimento de clientes e provedores sobre o uso dessas interfaces. Além disso o trabalho faz uso
de um dataset maior, com aproximadamente 260 mil projetos, 131 milhões de APIs e 16 milhões de
arquivos
Conclusões
Este trabalho apresentou um estudo empírico em larga escala sobre a utilização de interfaces internas
em 260 mil projetos Java. Na primeira questão de pesquisa, investigou- se a frequência com que
clientes usam interfaces internas. Na segunda quest ˆ ao de pesquisa analisou-se a distribuição do
uso dessas interfaces por biblioteca. Além disso, realizou-se através de uma análise qualitativa, uma
consulta aos clientes e provedores de interfaces internas. Apresenta-se a seguir os principais
resultados desse estudo:
QP #1. Verificou-se que algumas bibliotecas têm mais de 20% dos seus clientes usando
interfaces internas.
QP #2. Verificou-se que algumas interfaces internas das bibliotecas atraem mais clientes.
Além disso, observou-se que as 50 interfaces internas mais usadas pertencem às bibliotecas JDK,
Action Bar Sherlock e Android.
Entrevista. Na consulta com os provedores de algumas bibliotecas, observou-se que o uso de
interfaces internas por sistemas clientes e conhecido, sendo considerada uma má prática de
programação pelos desenvolvedores. Entre os clientes consultados, observou-se que o uso de
interfaces internas e motivado pela falta de conhecimento da biblioteca.
Como trabalho futuro, pretende-se analisar o total de interfaces internas de cada biblioteca, e quantas
dessas interfaces são usadas por clientes. Pesquisa foi financiada pela FAPEMIG e pelo CNPq.
Referências

Mais conteúdo relacionado

Destaque

Destaque (10)

자료구조 – 트리 (Tree)
자료구조 – 트리 (Tree)자료구조 – 트리 (Tree)
자료구조 – 트리 (Tree)
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
OCA Java SE 8 Exam Chapter 3 Core Java APIs
OCA Java SE 8 Exam Chapter 3 Core Java APIsOCA Java SE 8 Exam Chapter 3 Core Java APIs
OCA Java SE 8 Exam Chapter 3 Core Java APIs
 
OCA Java SE 8 Exam Chapter 4 Methods Encapsulation
OCA Java SE 8 Exam Chapter 4 Methods EncapsulationOCA Java SE 8 Exam Chapter 4 Methods Encapsulation
OCA Java SE 8 Exam Chapter 4 Methods Encapsulation
 
Construindo um micro-serviço Java 100% funcional em 15 minutos
Construindo um micro-serviço Java 100% funcional em 15 minutosConstruindo um micro-serviço Java 100% funcional em 15 minutos
Construindo um micro-serviço Java 100% funcional em 15 minutos
 
Flora and Fauna-geography
Flora and Fauna-geography Flora and Fauna-geography
Flora and Fauna-geography
 
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev FedorProgramming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
Programming Java - Lection 04 - Generics and Lambdas - Lavrentyev Fedor
 
Applications of Integrated Models to Watershed and Sub-Watershed Scale Analys...
Applications of Integrated Models to Watershed and Sub-Watershed Scale Analys...Applications of Integrated Models to Watershed and Sub-Watershed Scale Analys...
Applications of Integrated Models to Watershed and Sub-Watershed Scale Analys...
 
Issues and Strategies for Integrated Model Calibration
Issues and Strategies for Integrated Model CalibrationIssues and Strategies for Integrated Model Calibration
Issues and Strategies for Integrated Model Calibration
 
Incorporating a Dynamic Irrigation Demand Module into an Integrated Surface ...
Incorporating a Dynamic Irrigation Demand Module into an Integrated Surface ...Incorporating a Dynamic Irrigation Demand Module into an Integrated Surface ...
Incorporating a Dynamic Irrigation Demand Module into an Integrated Surface ...
 

Semelhante a Um Estudo em Larga Escala Sobre o Uso de API's Internas

Testes automatizados.pptx
Testes automatizados.pptxTestes automatizados.pptx
Testes automatizados.pptx
Carlos Gonzaga
 

Semelhante a Um Estudo em Larga Escala Sobre o Uso de API's Internas (20)

Escalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLIDEscalando apps com React e Type Script e SOLID
Escalando apps com React e Type Script e SOLID
 
Introdução a Plataforma Android
Introdução a Plataforma AndroidIntrodução a Plataforma Android
Introdução a Plataforma Android
 
Java e Software Livre
Java e Software LivreJava e Software Livre
Java e Software Livre
 
Eng.ª do Software - 2. Requisitos
Eng.ª do Software - 2. RequisitosEng.ª do Software - 2. Requisitos
Eng.ª do Software - 2. Requisitos
 
10-codigo-limpo-parte-3.pdf
10-codigo-limpo-parte-3.pdf10-codigo-limpo-parte-3.pdf
10-codigo-limpo-parte-3.pdf
 
Desenvolvendo com Java Open Source
Desenvolvendo com Java Open SourceDesenvolvendo com Java Open Source
Desenvolvendo com Java Open Source
 
Fundamentos Java - 01
Fundamentos Java - 01Fundamentos Java - 01
Fundamentos Java - 01
 
React Native - Experiência Nativa para o usuário e experiência Web para o des...
React Native - Experiência Nativa para o usuário e experiência Web para o des...React Native - Experiência Nativa para o usuário e experiência Web para o des...
React Native - Experiência Nativa para o usuário e experiência Web para o des...
 
Aula 1a.ppt
Aula 1a.pptAula 1a.ppt
Aula 1a.ppt
 
Aplicativos hibridos-com-ionic-voce-tambem-pode-comecar-a-desenvolver-agora-t...
Aplicativos hibridos-com-ionic-voce-tambem-pode-comecar-a-desenvolver-agora-t...Aplicativos hibridos-com-ionic-voce-tambem-pode-comecar-a-desenvolver-agora-t...
Aplicativos hibridos-com-ionic-voce-tambem-pode-comecar-a-desenvolver-agora-t...
 
Engenharia de Software Aula 1 - Intro
Engenharia de Software Aula 1 - IntroEngenharia de Software Aula 1 - Intro
Engenharia de Software Aula 1 - Intro
 
[TDC - Testes] Estratégia de automação dos testes em microserviços
[TDC - Testes] Estratégia de automação dos testes em microserviços [TDC - Testes] Estratégia de automação dos testes em microserviços
[TDC - Testes] Estratégia de automação dos testes em microserviços
 
Testes automatizados.pptx
Testes automatizados.pptxTestes automatizados.pptx
Testes automatizados.pptx
 
Tendências e Dicas para o Desenvolvimento de Software
Tendências e Dicas para o Desenvolvimento de SoftwareTendências e Dicas para o Desenvolvimento de Software
Tendências e Dicas para o Desenvolvimento de Software
 
1409243945064
14092439450641409243945064
1409243945064
 
Integração Contínua
Integração ContínuaIntegração Contínua
Integração Contínua
 
Predição de bugs
Predição de bugsPredição de bugs
Predição de bugs
 
Collaborative Filtering por Fatores Latentes - Recomendação para o GlobosatPlay
Collaborative Filtering por Fatores Latentes - Recomendação para o GlobosatPlayCollaborative Filtering por Fatores Latentes - Recomendação para o GlobosatPlay
Collaborative Filtering por Fatores Latentes - Recomendação para o GlobosatPlay
 
Construção de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em JavaConstrução de Frameworks com Annotation e Reflection API em Java
Construção de Frameworks com Annotation e Reflection API em Java
 
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e ZendAnálise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
 

Último

Último (8)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
COI CENTRO DE OPERAÇÕES INDUSTRIAIS NAS USINAS
COI CENTRO DE OPERAÇÕES INDUSTRIAIS NAS USINASCOI CENTRO DE OPERAÇÕES INDUSTRIAIS NAS USINAS
COI CENTRO DE OPERAÇÕES INDUSTRIAIS NAS USINAS
 
EAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIA
EAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIAEAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIA
EAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIA
 
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
 
Palestras sobre Cibersegurança em Eventos - Paulo Pagliusi
Palestras sobre Cibersegurança em Eventos - Paulo PagliusiPalestras sobre Cibersegurança em Eventos - Paulo Pagliusi
Palestras sobre Cibersegurança em Eventos - Paulo Pagliusi
 
Entrevistas, artigos, livros & citações de Paulo Pagliusi
Entrevistas, artigos, livros & citações de Paulo PagliusiEntrevistas, artigos, livros & citações de Paulo Pagliusi
Entrevistas, artigos, livros & citações de Paulo Pagliusi
 
ATIVIDADE 1 - GESTÃO DE PESSOAS E DESENVOLVIMENTO DE EQUIPES - 52_2024.docx
ATIVIDADE 1 - GESTÃO DE PESSOAS E DESENVOLVIMENTO DE EQUIPES - 52_2024.docxATIVIDADE 1 - GESTÃO DE PESSOAS E DESENVOLVIMENTO DE EQUIPES - 52_2024.docx
ATIVIDADE 1 - GESTÃO DE PESSOAS E DESENVOLVIMENTO DE EQUIPES - 52_2024.docx
 
ATIVIDADE 1 - CÁLCULO DIFERENCIAL E INTEGRAL II - 52_2024.docx
ATIVIDADE 1 - CÁLCULO DIFERENCIAL E INTEGRAL II - 52_2024.docxATIVIDADE 1 - CÁLCULO DIFERENCIAL E INTEGRAL II - 52_2024.docx
ATIVIDADE 1 - CÁLCULO DIFERENCIAL E INTEGRAL II - 52_2024.docx
 

Um Estudo em Larga Escala Sobre o Uso de API's Internas

  • 1. Um Estudo em Larga Escala sobre o Uso de API’s Internas Emerson Viera
  • 2. Autores ● Aline Brito ● André Hora ● Marco Túlio Valente ASERG(Applied Software Engineering Research Group) Group – Departamento de Ciência da Computação (DCC) Universidade Federal de Minas Gerais (UFMG)
  • 3. Agenda ● Introdução ● Metodologia ● Resultados ● Comentários de Provedores e Clientes de Interfaces Internas -Consulta aos Clientes de Interfaces Internas - Consulta aos Provedores de Interfaces Internas ● Riscos à validade ● Trabalhos Relacionados ● Conclusões
  • 4. Introdução ● Popularidade do uso de bibliotecas e APIs(Application Programming Interfaces). ● Provedores dessas bibliotecas dividem suas APIs em dois tipos, internas e públicas. ● Para distinguir APIs internas e públicas, alguns provedores incluem pacotes específicos. ● Na IDE Eclipse, APIs internas são implementadas em pacotes que possuem o nome “internal”.. Já o JDK utiliza o prefixo “sun”. - Para melhor quantificar o cenário que motiva esse trabalho, realizou-se um estudo ´ preliminar onde minerou-se a quantidade de projetos que utilizam pelo menos uma API com as nomenclaturas citadas. - Analisou-se 263.425 projetos Java GitHub. Foram encontrados 17.910 projetos (6.8%) usando APIs internas. Assim, estuda-se neste artigo duas questões de pesquisa centrais relativas ao uso de APIs internas. Adicionalmente o estudo inclui o feedback de provedores e clientes de interfaces internas.
  • 5. Introdução QP #1. Qual a frequência de utilização de interfaces internas? QP #2. Qual a distribuição do uso das interfaces internas de uma biblioteca? QP(Questão de Pesquisa) - São analisadas 17 bibliotecas e suas APIs internas usadas por clientes, em um dataset com aproximadamente 260 mil projetos Java GitHub e 131 milhões de APIs. - Para melhor entendimento, o estudo proposto nesse artigo concentra-se em dois níveis de granularidade: APIs (por exemplo, quantos clientes estão usando org.junit.internal.AssumptionViolatedException?) e bibliotecas (por exemplo, quantos clientes JUnit estão usando interfaces internas?).
  • 6. Metodologia Analisam-se 17 bibliotecas Java e o uso das suas interfaces internas em sistemas clientes. Para verificar o uso dessas interfaces, utiliza-se um dataset composto por 263.425 projetos e 16.386.193 arquivos Java, minerados através da infra-estrutura Boa. Essa infraestrutura inclui diversos datasets do GitHub, assim como uma DSL (Domain Specific Language) para minerar repositórios de software e uma interface Web para executar os scripts de mineração. Criou-se um script Boa para minerar projetos que fazem uso de pelo menos uma interface/biblioteca em um arquivo Java válido. Os metadados obtidos, foram então, inseridos em um banco de dados onde criou-se um script para agrupar as interfaces encontradas e contabilizar seus sistemas clientes. Em seguida minerou-se as interfaces internas. Para a biblioteca JDK, avalia-se interfaces que possuem o prefixo sun.* . Para as demais bibliotecas considera-se o respectivo prefixo e o pacote internal.
  • 7. Resultados A Tabela 1 apresenta o total de clientes de cada biblioteca que usam pelo menos uma interface interna.
  • 8. Resultados A Figura 1 apresenta as 5 bibliotecas como maior número de clientes usando interfaces internas.
  • 9. Resultados A Figura 2 apresenta a distribuição das interfaces mais usadas, para as bibliotecas com o maior percentual de clientes usando interfaces internas.
  • 10. Resultados Figura 3 apresenta a distribuição considerando todos os projetos.
  • 11. Comentários de Provedores e Clientes de Interfaces Internas Consulta aos Clientes de Interfaces Internas - Nessa consulta, verifica-se o conhecimento dos clientes sobre as interfaces internas usadas em seus sistemas. Para tanto, foram consultados 10 desenvolvedores ativos de sistemas clientes cadastrados no GitHub. Para cada desenvolvedor criou-se uma issue com as perguntas descritas a seguir. 1. You used an internal interface in “name1” class of your project. Do you know that it is an internal interface of the “name2” library? (Você usou uma interface interna na classe "nome1" do seu projeto. Você sabe que é uma interface interna da biblioteca "name2"?) 2. Are you aware that internal interfaces are unstable and may change without backwardcompatibility? (Você está ciente de que as interfaces internas são instáveis e podem mudar sem compatibilidade com versões anteriores?)
  • 12. Consulta aos Clientes de Interfaces Internas Obteve-se 4 respostas (40%). O primeiro desenvolvedor usou a interface com.android.internal.telephony.Phone em seu projeto, e alegou que era um codigo-fonte de terceiros. Provavelmente esse desenvolvedor copiou o código-fonte da biblioteca para o seu projeto. O segundo desenvolvedor utilizou a interface interna org.hamcrest.internal.ArrayIterator, e justificou o seu uso devido a uma sugestão da IDE utilizada. O terceiro desenvolvedor utilizou a interface sun.misc.BASE64Encoder. Em sua resposta, ele informou que não sabia que tratava-se de uma interface interna do JDK. O texto a seguir apresenta um trecho da sua resposta. “I was unaware of how unstable internal interfaces were. From looking into this I have noticed that Oracle have released a Base64 encoder/decoder in the java.util package, so I am now using that instead.” ("Eu não sabia como as interfaces internas eram instáveis. De olhar para isso eu notei que a Oracle lançou um codificador / decodificador Base64 no pacote java.util, então eu estou usando agora isso em vez disso. ")
  • 13. Consulta aos Clientes de Interfaces Internas Por fim, o quarto desenvolvedor utilizou a interface com.google.inject.internal.Lists. Em sua resposta ele alegou que tinha conhecimento sobre interfaces internas mas não percebeu que estava utilizando. O texto a seguir apresenta um trecho da suas resposta. “1. I had not noticed it is an internal. 2. Yes. Now that you have pointed it out, I will probably change it. ”("1. Eu não tinha notado que é um interno. 2. Sim. Agora que você o apontou, eu provavelmente vou mudar isso. ") Assim, observa-se que o uso de interfaces internas está relacionado com o pouco conhecimento da biblioteca utilizada.
  • 14. Consulta aos Provedores de Interfaces Internas Nessa consulta, tem-se por objetivo verificar o conhecimento dos provedores sobre os clientes que estão usando suas interfaces internas. Foram criadas ˜ issues em repositórios GitHub de 4 bibliotecas e obteve-se 3 respostas (75%). Para cada provedor foram realizadas as duas perguntas descritas a seguir. A issue também incluiu a lista de interfaces internas mineradas nesse estudo e a quantidade de usuários utilizando as mesmas. 1. Did you know that internal interfaces are used by clients? (Você sabia que as interfaces internas são usadas pelos clientes?) 2. From the presented interfaces, there is some interface that is a candidate to be promoted to the public one? (A partir das interfaces apresentadas, há alguma interface que é um candidato a ser promovido para o público?)
  • 15. Consulta aos Provedores de Interfaces Internas JUnit. 1 Quatro desenvolvedores da biblioteca JUnit responderam a issue que foi aberta, sendo um deles um membro core do projeto. O texto a seguir apresenta um trecho da sua resposta. “Yes, we are aware that many of the originally internal interfaces are used by clients. It’s one of the reasons why we’re using a different approach of annotating APIs instead of using package names for JUnit 5. ("Sim, estamos cientes de que muitas das interfaces originalmente internas são usadas pelos clientes. É uma das razões pelas quais estamos usando uma abordagem diferente de anotar APIs em vez de usar nomes de pacotes para JUnit 5.) Mockito. 2 Dois desenvolvedores da biblioteca Mockito responderam a issue que foi aberta. Obteve-se duas respostas. “It seems that quite some internal classes are used instead of relying on the implementation provided by the Mockito.* method. E.g. Times should be obtained via Mockito.times(). I am not sure if we can do something about that.” ("Parece que algumas classes internas são usadas em vez de depender da implementação fornecida pelo método Mockito. *. Por exemplo. Os tempos devem ser obtidos via Mockito.times (). Eu não tenho certeza se podemos fazer algo sobre isso. ")
  • 16. Consulta aos Provedores de Interfaces Internas Google Gson.3 Um dos desenvolvedores da biblioteca Google Gson informou que não tinha conhecimento da quantidade de clientes usando as interfaces internas, entretanto não surpreendeu-se com essa má prática adotada por alguns desenvolvedores clientes. Segundo ele, nenhuma das interfaces listadas por nós na issue são candidatas a promoção para o público. O texto a seguir apresenta um trecho da suas resposta. “I didn’t quite know this, but am not very surprised. None of these are candidates for promotion to public APIs.” ("Eu não sabia muito bem disso, mas não estou muito surpreso. Nenhum desses candidatos são candidatos à promoção de APIs públicas. ") Assim, após a consulta aos desenvolvedores de sistemas provedores de interfaces internas, observa-se que essa má prática é conhecida. As respostas dos desenvolvedores JUnit levantam também uma discussão em torno de outra atividade crítica, além do uso de interfaces internas, sistemas clientes estão usando interfaces internas depreciadas.
  • 17. Riscos à validade Validade externa. Os resultados desse estudo estão restritos a projetos Java GitHub, ou seja, eles não podem ser generalizados para outras linguagens e outros repositórios de código-fonte. Além disso, dentre os 260 mil sistemas analisados, alguns podem ser repositórios GitHub das bibliotecas analisadas nesse trabalho. Validade interna. Projetos que importaram somente a biblioteca não foram considerados clientes das interfaces, já que a importação de uma biblioteca não assegura o uso de todas as suas interfaces no código-fonte. Validade de construção. ˜ O script Boa recuperou apenas interfaces/bibliotecas que foram importadas no código-fonte, e algumas dessas importações podem ser classes do próprio projeto. Além disso, pode-se ter interfaces que não foram utilizadas ( ˜ warning”), e projetos que copiaram o código-fonte da biblioteca.
  • 18. Trabalhos Relacionados Existem estudos que concentram-se na evolução e uso de interfaces e bibliotecas [Hora and Valente 2015, Mileva et al. 2010, McDonnell et al. 2013]. Adicionalmente alguns trabalhos relatam o uso indevido de interfaces por sistemas clientes, como por exemplo, a má prática de programação relacionada ao uso de interfaces internas [Businge et al. 2015, Mastrangelo et al. 2015]. Outros estudos concentram-se na promoção dessas interfaces internas para o p ˜ ublico [Hora et al. 2016]. Um estudo relacionado ao uso de interfaces internas da biblioteca Eclipse serviu de inspiração para esse trabalho [Businge et al. 2015, Businge et al. 2013]. O mesmo analisa releases de 512 plug-ins Eclipse do repositório SourceForge, com o objetivo de investigar motivos que levam ao uso (ou desuso) de interfaces internas. Os autores também realizam entrevistas com alguns clientes. Outro estudo nessa área concentra-se no uso da interface interna sun.misc.Unsafe provida pelo JDK [Mastrangelo et al. 2015]. O artigo identifica 14 razões que levam clientes a usarem essa interface e analisa cerca de 86 mil arquivos Java. Ao contrário dos trabalhos mencionados, que concentram-se em bibliotecas específicas, este trabalho analisa o uso de interfaces internas na linguagem Java, e o conhecimento de clientes e provedores sobre o uso dessas interfaces. Além disso o trabalho faz uso de um dataset maior, com aproximadamente 260 mil projetos, 131 milhões de APIs e 16 milhões de arquivos
  • 19. Conclusões Este trabalho apresentou um estudo empírico em larga escala sobre a utilização de interfaces internas em 260 mil projetos Java. Na primeira questão de pesquisa, investigou- se a frequência com que clientes usam interfaces internas. Na segunda quest ˆ ao de pesquisa analisou-se a distribuição do uso dessas interfaces por biblioteca. Além disso, realizou-se através de uma análise qualitativa, uma consulta aos clientes e provedores de interfaces internas. Apresenta-se a seguir os principais resultados desse estudo: QP #1. Verificou-se que algumas bibliotecas têm mais de 20% dos seus clientes usando interfaces internas. QP #2. Verificou-se que algumas interfaces internas das bibliotecas atraem mais clientes. Além disso, observou-se que as 50 interfaces internas mais usadas pertencem às bibliotecas JDK, Action Bar Sherlock e Android. Entrevista. Na consulta com os provedores de algumas bibliotecas, observou-se que o uso de interfaces internas por sistemas clientes e conhecido, sendo considerada uma má prática de programação pelos desenvolvedores. Entre os clientes consultados, observou-se que o uso de interfaces internas e motivado pela falta de conhecimento da biblioteca. Como trabalho futuro, pretende-se analisar o total de interfaces internas de cada biblioteca, e quantas dessas interfaces são usadas por clientes. Pesquisa foi financiada pela FAPEMIG e pelo CNPq.