Análise de Software com Moose

Gabriel Ullmann
4 min readJul 3, 2023

--

Exemplo de visualização e logo da plataforma Moose. Arquivo pessoal.

No mês passado, voltei ao Brasil para visitar a família e amigos. Aproveitei a oportunidade para matar a saudade e conversar com vários amigos e amigas que trabalham com desenvolvimento de software. Falei sobre um dos meus tópicos de pesquisa, recuperação de arquitetura de software, e foi então que percebi algo que me deixou preocupado: embora muitas ferramentas para recuperação e análise de arquitetura existam, há poucos tutoriais amigáveis para quem quer começar nessa área.

Sendo assim, decidi gravar um tutorial em vídeo sobre a Moose, uma plataforma open-source de análise de software que gosto muito e para a qual colaboro. Nesse post, vou explicar como a Moose funciona e como ela pode ajudar desenvolvedores e arquitetos. Se você quiser pular direto para a pŕatica, recomendo assistir o vídeo abaixo (em inglês). Por outro lado, se você quiser saber mais sobre o funcionamento dessa plataforma, convido você para um “crash course” de Moose e Pharo à seguir.

O que é Moose? É uma plataforma de análise de software. Além de nos fornecer várias ferramentas que nos permitem visualizar e entender código-fonte, ela nos permite também criar nossas próprias ferramentas utilizando a linguagem Pharo, da qual falaremos mais adiante.

Como Moose pode ajudar? Através das funcionalidades de consulta e visualização da Moose, um arquiteto de software pode responder várias perguntas sobre um sistema, tais como:

  • Quais pacotes, classes e métodos existem no sistema?
  • Quais partes do sistema dependem umas das outras?
  • Quais classes e métodos são chamados com maior frequência?
  • Quais classes e métodos são os mais complexos?
  • Existem estruturas duplicadas ou não utilizadas no sistema?

As respostas dessas perguntas podem ajudar desenvolvedores e arquitetos a entenderem melhor os sistemas com os quais trabalham, tomando assim decisões de arquitetura mais assertivas. Mas como a Moose consegue entender a relação entre as partes de um sistema apenas pela análise do código-fonte? Tudo começa com um meta-modelo.

O que é um meta-modelo? Imagine um meta-modelo como a “receita de bolo” de uma linguagem de programação. Por exemplo, que estruturas existem dentro da linguagem Java? Pacotes, classes, métodos, atributos, variáveis, etc. Qualquer repositório com código-fonte Java terá essas estruturas (também chamadas de entidades), e portanto elas servem de referência para representarmos qualquer sistema escrito em Java.

Embora eu tenha utilizado Java como exemplo, existem meta-modelos também para outras linguagens, como C++ e TypeScript. Existe também o meta-modelo Famix, que é mais genérico e pode ser utilizado para representar diversas linguagens. Independente da linguagem, o objetivo do meta-modelo é o mesmo: permitir a criação de modelos.

O que é um modelo? É a representação de um determinado sistema, seguindo os moldes de um meta-modelo. Para entender a diferença entre modelo e meta-modelo, utilizemos novamente a analogia do bolo:

- Meta-modelo diz: “um bolo qualquer leva farinha, fermento, ovos, açúcar, óleo e algum tipo de cobertura.”

- Modelo diz: “o bolo formigueiro leva 2 xícaras de farinha, 1 colher de fermento, cobertura de chocolate amargo, etc.”

Modelos Moose são descritos em arquivos MSE, que possuem uma estrutura similar a um XML: cada tag descreve uma entidade. Para transformarmos o código-fonte do sistema que queremos analisar em um arquivo MSE, precisamos utilizar um parser.

O que é um parser? É um programa que irá ler o código-fonte e transformá-lo em um modelo. Vários parsers existem, como o VerveineJ para Java (utilizado no tutorial) e o VerveineC-Cpp para C++. Enquanto escrever um parser pode não ser tarefa fácil, existem frameworks como o PetitParser que podem ajudar.

Tanto os meta-modelos descritos aqui quanto a plataforma Moose são escritos em Pharo. Embora você não precise saber Pharo para começar a utilizar a Moose, é importante entender um pouco sobre o ecossistema da linguagem antes de começar.

O que é Pharo? É uma linguagem de programação baseada em Smalltalk e também um ambiente de desenvolvimento que suporta várias aplicações, entre elas a Moose. Pharo é compatível com Windows, Mac e Linux e roda dentro de uma máquina virtual. Como explica o artigo “Smalltalk est l’avenir du code” publicado pela revista Nootrix em 2020:

[Pharo] salva o conteúdo de sua memória de trabalho em um diretório chamado de imagem. Ao ser executada, a máquina virtual Pharo transfere o conteúdo do diretório imagem para a memória RAM. Dessa forma, todos os objetos salvos são recuperados e ficam disponíveis para uso.

Considerações finais

Se você chegou até aqui, imagino que você tenha interesse em utilizar a Moose ou saber mais sobre Recuperação de Arquitetura. Nesse sentido, recomendo o blog e a wiki oficial da Moose, que você encontra em https://modularmoose.org/. Pretendo escrever mais textos e tutoriais sobre esse assunto no futuro, então fique ligado e sinta-se à vontade para deixar seus comentários e sugestões no vídeo ou neste post.

Referências

--

--

Gabriel Ullmann

Pesquisador de Engenharia de Software, sempre garimpando por coisas interessantes no código de video games e apps em geral. Atualmente em Montreal, Canada.