Quando usar e quando não usar gems?

Placas de trânsito pintadas de preto e branco indicando mão única Photo by Brendan Church on Unsplash

Essa pergunta foi feita pelo Leonardo Fragozo lá no canal Ruby Brasil no Telegram e achei bacana postar a resposta em forma de texto para servir de consulta para quem mais tiver esse tipo de dúvida.

Nesse texto eu falo um pouco sobre a minha forma de pensar quando me deparo com essa questão. Não sei se a minha opinião é a opinião da maioria das pessoas na comunidade Ruby porém espero que você termine de ler esse texto e tenha um pouco mais de insumos para te ajudar a decidir quando usar e quando não usar gems.

Um pouco sobre dependência e como decidir qual usar

Usar uma gem significa ter uma dependência no seu projeto. Significa você ficar dependente de um código externo que você não tem muito controle. Logo, é bom pensar em quem mantém as gems que você tá usando. No caso de usar uma gem, é melhor você usar uma que seja atualizada com alguma frequencia e/ou que tenha uma empresa por trás da manutenção dela.

Um lugar legal que pode ajudar muito a ver como anda a “saúde” de uma gem (“saúde” de uma gem seria se a gem recebe updates, se tem muitas issues abertas, etc.) é o Ruby Toolbox!

Dê uma olhada na categoria Background Jobs (processamento em segundo plano). Na página você verá um gráfico comparando o score de cada gem da categoria (sinceramente, não sei como esse score é calculado 😅). Mais para baixo você encontra todas as gems da categoria com informações como quantidade de downloads, quantidade de estrelas no GitHub e algumas badges falando sobre a saúde do projeto:

Screenshot da tela da categoria Background Jobs do Ruby Toolbox Screenshot da tela da categoria Background Jobs do Ruby Toolbox

Usar ou não usar gems, eis a questão

Eu gosto de usar gems quando eu preciso de uma solução que não seja o foco do meu negócio e que seja para algo mais complexo de lidar. Um exemplo bem bom disso é autenticação. Autenticação dificilmente vai ser core no meu negócio, então eu posso delegar isso para uma gem como o Devise, por exemplo ❤️ .

Outra situação onde eu posso usar uma gem é para validação de CPF. Denovo, isso não é o core do meu negócio e eu posso delegar isso para uma gem. Porém validar CPF não é algo tão complexo como autenticação. Eu posso fazer uma validação mais simples, por exemplo, e não ter uma dependência desse tipo no meu projeto.

Vamos ver outro caso aqui: Eu tenho uma loja online e preciso cotar frete nos correios e em empresas de entregas. Isso é parte do meu negócio, posso delegar para uma gem? Posso (apesar de não conhecer nenhuma gem que faça isso), porém eu teria uma dependência externa de um código que eu não tenho muito controle. Se eu fizer essa pesquisa de frete na minha aplicação, eu tenho muito mais controle das consultas e posso utilizar esses dados com mais inteligência e exibir um comparativo das empresas que fazem entregas, por exemplo.

Um pouco mais de lenha na fogueira 🔥

Antes de finalizar, quero puxar um assunto bacana aqui: As vezes, faz sentido reinventar a roda!

As vezes faz sentindo você implementar algo que não faz parte do seu negócio dentro do seu projeto. Principalmente se você estiver estudando novas tecnologias.

É muito fácil pegar o Devise, por exemplo, e botar ele pra funcionar. Ele só funciona e pronto. Mas ai eu te pergunto, você sabe o que tá acontecendo embaixo dos panos ali?

O próprio README do Devise recomenda não usá-lo se você estiver construindo sua primeira aplicação em Rails (eu AMO essa parte desse README)

Screenshot do README do Devise Screenshot do README do Devise

Tradução: Iniciando com Rails? Se você estiver construindo sua primeira aplicação Rails, nós recomendamos que você não use o Devise. O Devise requer um bom conhecimento do Rails. Nestes casos, nós recomendamos que você começe com uma autenticação feita do zero. Aqui tem algumas fontes que podem te ajudar (fontes em inglês):

Por último, mas de forma alguma menos importante, um grande amigo, o glorioso Paulo Henrique fez uma talk sobre porque, as vezes, é importante “reinventar a roda” e eu recomendo DEMAIS que ela seja assistida:

Concluindo

É um pouco complexo saber quando usar gems ou não. Acho que o que eu escrevi aqui nesse texto pode ajudar mas não deixe de desenvolver seu próprio “faro” para quando usar gems ou não.

Espero que tenham gostado do texto é até uma próxima! 👋