Replicação de Código: Quando a Simplicidade de Copiar e Colar Faz Sentido

Após termos visto, em nosso artigo introdutório, diferentes estratégias para reunirmos coesão em um ecossistema de microserviços, replicação de código talvez seja a mais simples—e, ao mesmo tempo, uma das mais polêmicas. Por que deliberadamente copiar e colar trechos de lógica em cada serviço, se estamos acostumados a ver isso como um “cheiro de código”? Neste artigo, vamos explorar:

  1. O que é replicação de código e como funciona na prática.
  2. Tabela de trade-offs (vantagens e desvantagens).
  3. Analogia com situações fora da programação.
  4. Cenários em que a replicação de código é aplicável e onde evitar.

1. O que é Replicação de Código em Microserviços?

Replicação de código consiste em copiar parte de uma lógica (funções, classes, utilitários) para cada serviço que precisar da mesma funcionalidade, em vez de:

  • Criar uma biblioteca compartilhada, ou
  • Subir uma API única que todos chamem.

É a forma mais “manual” e descentralizada de reutilizar algum código comum, pois cada microserviço passa a ter a sua própria cópia de tal funcionalidade.

Por Que Alguém Faria Isso?

  • Autonomia total: Cada serviço modifica seu pedaço sem depender de versão de biblioteca ou do deploy de um serviço central.
  • Velocidade e simplicidade: Menos burocracia; se é apenas uma função de utilitários pequena, pode ser mais rápido copiá-la do que manter uma lib oficial ou depender de um microserviço.

2. Tabela de Trade-Offs

Para facilitar a visualização, segue uma tabela resumindo os prós e contras da replicação de código:

Critério Vantagens Desvantagens
Simplicidade - Fácil de implementar (copiar e colar).
- Evita overhead de pipeline de lib ou serviço
- Atualizações manuais em vários lugares.
- Risco de inconsistência (cada cópia evolui diferente).
Autonomia - Cada microserviço não depende de uma lib externa ou serviço compartilhado - Se há correções críticas, é preciso lembrar de atualizar em todos os lugares
Escalabilidade Organizacional - Times podem prosseguir sem “synch” com um time dono de biblioteca ou serviço - Possível divergência de lógicas semelhantes, gerando “rotas” de evolução distintas
Manutenção - Zero dependência externa.
- Se raramente muda, não gera dor
- Se a lógica for mutável, cada mudança exige reimplementar/testar em cada serviço
Governança de Qualidade - Sem versionamento ou CI/CD adicional - Dificulta padronizar boas práticas (se um bug for encontrado, todas as réplicas precisam fix)
Tempo Curto vs. Longo Prazo - Curto prazo: rápida e funcional - Longo prazo: risco de explosão de divergências e retrabalho duplicado

3. Analogia Fora da Programação

Podemos comparar replicação de código a:

  • Uma receita de bolo:
    • Se você tem uma receita de bolo que vários cozinheiros precisam usar, poderia criar um “livro de receitas” oficial (equivalente a “biblioteca compartilhada”), ou cada cozinheiro guarda uma cópia impressa.
    • A vantagem de cada um ter sua cópia é que eles não precisam esperar a edição nova do livro para mudar algo. Já se surge uma correção (ex.: reduzir açúcar), cada cozinheiro precisa alterar manualmente sua folha.
    • Se for uma receita estável, sem muitas mudanças, a cópia pessoal não dá problema. Mas se a receita muda frequentemente, cada “cópia” pode ficar defasada ou divergente.

4. Onde é Aplicável (e Onde Evitar)

4.1 Cenários Aplicáveis

  1. Funções Pouco Mutáveis: Lógica que não deve sofrer revisões frequentes.
  2. Trechos Simples: Pequenos utilitários ou helpers, sem grande complexidade ou risco de bugs críticos.
  3. Equipes com Autonomia Alta: Cada time não quer depender de pipelines externos ou de manter uma biblioteca formal.
  4. Prazo Curto / Prova de Conceito: Se o objetivo é agilidade, e a duplicação não causará custos grandes a longo prazo (ou será descartada após o experimento).

4.2 Onde Evitar

  1. Lógica Crítica: Qualquer bug pode ter grande impacto. A replicação torna correção mais arriscada (ex.: é preciso atualizar múltiplos serviços).
  2. Funcionalidades em Constante Evolução: Ex.: validações fiscais, algoritmos de segurança, regras de negócio voláteis. A divergência pode criar caos.
  3. Times com Governança Rigorosa: Se há cultura de “uma única fonte de verdade”, duplicar código viola esse princípio.
  4. Dependência Forte entre Serviços: Se eles precisam exatamente da mesma implementação, manter múltiplas cópias pode gerar inconsistências de comportamento.

Conclusão

A replicação de código pode surpreender por ser, em certos casos, intencional e vantajosa quando a funcionalidade compartilhada é mínima, estável e não demanda atualizações frequentes. Evita-se o overhead de manter bibliotecas compartilhadas ou serviços comuns que possam gerar acoplamento.

Entretanto, deve-se tomar cuidado com:

  • Manutenção no médio/longo prazo: qualquer mudança requer esforço duplicado/triplicado, há risco de inconsistência se nem todos atualizarem.
  • Escopo de duplicação: se o pedaço é grande ou crítico, a estratégia se torna perigosa e o retrabalho cresce exponencialmente.

Nos próximos artigos, aprofundaremos em outra estratégia — Biblioteca Compartilhada.

Notas Bibliográficas

  1. Arquitetura de Software: As Partes Difíceis. Editora Alta Books.