Pular para conteúdo

Sustentabilidade Técnica

A sustentabilidade técnica é a capacidade de um projeto FLOSS (Free/Libre and Open Source Software) de continuar evoluindo, sendo mantido e permanecendo utilizável ao longo do tempo do ponto de vista tecnológico.

Ela está relacionada à qualidade da base de código, à arquitetura, à documentação técnica, às ferramentas utilizadas e aos processos de desenvolvimento que permitem que o projeto continue sendo desenvolvido por diferentes pessoas durante seu ciclo de vida.

Em outras palavras, um projeto tecnicamente sustentável é aquele que consegue evoluir sem que cada nova alteração torne sua manutenção progressivamente mais difícil.

Por que ela é importante?

Todo software acumula mudanças ao longo do tempo.

Novas funcionalidades são adicionadas, bugs são corrigidos, dependências evoluem e novas tecnologias surgem. Sem uma base técnica saudável, cada alteração passa a exigir mais esforço, aumentando o custo de manutenção e reduzindo a capacidade de evolução do projeto.

A sustentabilidade técnica ajuda a garantir que o projeto permaneça:

  • fácil de manter;
  • fácil de compreender;
  • fácil de testar;
  • fácil de evoluir;
  • seguro;
  • confiável;
  • preparado para receber novas contribuições.

Ela beneficia tanto as pessoas mantenedoras quanto quem deseja contribuir pela primeira vez.

Sustentabilidade técnica vs. manutenção

Embora estejam diretamente relacionadas, manutenção e sustentabilidade técnica não são sinônimos.

A manutenção corresponde às atividades realizadas para manter um projeto funcionando e evoluindo no dia a dia. Isso inclui corrigir bugs, revisar Pull Requests, responder Issues, atualizar dependências, publicar releases, melhorar a documentação e implementar novas funcionalidades.

Já a sustentabilidade técnica diz respeito à capacidade do projeto de continuar sendo mantido de forma eficiente ao longo do tempo. Ela está relacionada às características da base técnica do projeto que tornam a manutenção mais simples, segura e sustentável.

Em outras palavras:

  • Manutenção responde à pergunta: "O que precisamos fazer para manter o projeto funcionando hoje?"
  • Sustentabilidade técnica responde à pergunta: "O projeto está preparado para continuar sendo mantido daqui a cinco ou dez anos?"

Um projeto pode receber manutenção constante e, ainda assim, apresentar baixa sustentabilidade técnica. Isso acontece, por exemplo, quando possui:

  • arquitetura pouco organizada;
  • documentação insuficiente;
  • ausência de testes automatizados;
  • alta dívida técnica;
  • forte acoplamento entre componentes;
  • dependência excessiva de pessoas específicas.

Nesses casos, cada nova alteração tende a exigir mais tempo e esforço, aumentando gradualmente o custo de manutenção.

Por outro lado, um projeto com boa sustentabilidade técnica normalmente possui uma arquitetura bem definida, testes automatizados, documentação atualizada, processos padronizados e automações que facilitam o trabalho das pessoas mantenedoras. Como consequência, a manutenção torna-se mais simples, previsível e menos suscetível a erros.

Manutenção Sustentabilidade Técnica
Foco nas atividades do dia a dia. Foco na capacidade de evolução do projeto ao longo do tempo.
Corrige problemas e implementa melhorias. Cria condições para que essas atividades sejam realizadas de forma eficiente.
É um conjunto de atividades contínuas. É uma característica da base técnica do projeto.
Atua principalmente no presente. Considera principalmente o longo prazo.

A manutenção e a sustentabilidade técnica são complementares. Enquanto a manutenção garante que o projeto continue funcionando hoje, a sustentabilidade técnica busca garantir que ele possa continuar sendo mantido de forma saudável, eficiente e sustentável nos próximos anos.

Componentes da sustentabilidade técnica

Diversos fatores contribuem para a sustentabilidade técnica de um projeto FLOSS.

Arquitetura

Uma arquitetura bem definida facilita a evolução do software.

Ela deve favorecer:

  • separação de responsabilidades;
  • baixo acoplamento;
  • alta coesão;
  • modularidade;
  • facilidade de extensão.

Uma boa arquitetura reduz o impacto de mudanças futuras.

Qualidade do código

Código limpo e consistente facilita a manutenção.

Algumas práticas importantes incluem:

  • nomenclatura clara;
  • organização consistente;
  • remoção de código morto;
  • refatorações periódicas;
  • adoção de padrões de codificação.

O objetivo é tornar o código compreensível para qualquer pessoa da comunidade.

Documentação técnica

Boa documentação reduz a dependência do conhecimento de indivíduos.

Ela pode incluir:

  • arquitetura do sistema;
  • decisões técnicas;
  • APIs;
  • processos de desenvolvimento;
  • instruções para ambiente local;
  • documentação para contribuidores.

Projetos bem documentados costumam receber novas contribuições com mais facilidade.

Testes automatizados

Testes ajudam a garantir que alterações não introduzam regressões.

Entre os principais tipos estão:

  • testes unitários;
  • testes de integração;
  • testes funcionais;
  • testes end-to-end.

Quanto maior a cobertura de testes relevantes, maior tende a ser a confiança na evolução do software.

Integração Contínua (CI)

Automatizar verificações reduz erros humanos e melhora a qualidade do projeto.

Pipelines de CI costumam executar:

  • testes;
  • linters;
  • análise estática;
  • geração de documentação;
  • verificações de segurança.

Isso ajuda a identificar problemas antes que eles cheguem à branch principal.

Gerenciamento de dependências

Projetos sustentáveis acompanham regularmente suas dependências.

Isso envolve:

  • atualizar bibliotecas;
  • remover dependências obsoletas;
  • monitorar vulnerabilidades;
  • evitar dependências desnecessárias.

Uma gestão adequada reduz riscos de segurança e facilita futuras atualizações.

Versionamento e releases

Versionar corretamente o software facilita sua utilização e manutenção.

Práticas comuns incluem:

  • Semantic Versioning;
  • CHANGELOG.md;
  • Git Tags;
  • Releases documentadas.

Esses elementos tornam a evolução do projeto mais previsível.

Automação

Automatizar tarefas repetitivas reduz trabalho manual e diminui a possibilidade de erros.

Alguns exemplos:

  • publicação de releases;
  • atualização de dependências;
  • geração de documentação;
  • análise de segurança;
  • geração de SBOMs.

O que acontece quando ela não existe?

A ausência de sustentabilidade técnica pode causar diversos problemas.

Entre eles:

  • aumento contínuo da dívida técnica;
  • código difícil de entender e modificar;
  • arquitetura cada vez mais complexa;
  • regressões frequentes;
  • dificuldade para adicionar novas funcionalidades;
  • maior tempo para corrigir bugs;
  • dependências desatualizadas e vulneráveis;
  • dificuldade para receber novas contribuições;
  • perda de produtividade da equipe;
  • aumento do custo de manutenção;
  • maior dependência de pessoas específicas;
  • risco de abandono do projeto.

Com o tempo, pequenas mudanças passam a exigir grande esforço, tornando o projeto cada vez mais difícil de manter.

Exemplos de práticas

Diversos projetos Open Source adotam práticas voltadas para fortalecer sua sustentabilidade técnica.

Entre elas:

  • revisão de código (Code Review);
  • uso de testes automatizados;
  • integração contínua (CI);
  • entrega contínua (CD);
  • documentação técnica atualizada;
  • automação de releases;
  • monitoramento de dependências;
  • utilização de linters e formatadores;
  • geração automática de documentação;
  • monitoramento da saúde do projeto;
  • refatorações contínuas;
  • definição de padrões de arquitetura.

Essas práticas reduzem o custo de manutenção e aumentam a capacidade de evolução do projeto.

Ferramentas

Algumas ferramentas frequentemente utilizadas incluem:

Categoria Exemplos
Controle de versão Git
CI/CD GitHub Actions, GitLab CI/CD, Jenkins
Testes pytest, JUnit, Jest, Go Test
Qualidade de código SonarQube, ESLint, Ruff, Pylint
Formatação Prettier, Black, gofmt, rustfmt
Dependências Dependabot, Renovate
Segurança Trivy, Snyk, Grype
Documentação MkDocs, Docusaurus, Sphinx

Cada projeto utiliza apenas parte dessas ferramentas, conforme sua linguagem, porte e necessidades.

Relação com outros tipos de sustentabilidade

A sustentabilidade técnica está diretamente conectada às demais dimensões da sustentabilidade de um projeto FLOSS.

Por exemplo:

  • uma boa documentação fortalece a sustentabilidade comunitária ao facilitar a entrada de novas pessoas;
  • automações reduzem tarefas repetitivas, contribuindo para a sustentabilidade humana;
  • processos técnicos maduros fortalecem a sustentabilidade organizacional;
  • boas práticas de segurança reduzem riscos e aumentam a confiabilidade do projeto;
  • uma base técnica sólida facilita a obtenção de apoio financeiro e a adoção por organizações.

Essas dimensões são complementares e se fortalecem mutuamente.

Sustentabilidade técnica e dívida técnica

Um dos principais desafios para a sustentabilidade técnica é a dívida técnica.

Ela representa decisões que aceleram o desenvolvimento no curto prazo, mas aumentam o esforço necessário para evoluir o projeto no futuro.

Exemplos incluem:

  • código duplicado;
  • ausência de testes;
  • documentação desatualizada;
  • dependências antigas;
  • arquitetura pouco organizada;
  • soluções temporárias que nunca foram revisadas.

Embora alguma dívida técnica seja inevitável, projetos sustentáveis procuram monitorá-la e reduzi-la continuamente por meio de refatorações, melhorias de arquitetura e atualização de processos.

Sustentabilidade técnica é um investimento contínuo

A sustentabilidade técnica não é uma atividade realizada apenas no início do projeto nem um objetivo que se alcança de uma vez por todas. Ela depende de melhorias contínuas, revisão de processos, atualização de ferramentas e investimento constante na qualidade do software.

Projetos FLOSS que priorizam sua sustentabilidade técnica conseguem evoluir com mais facilidade, adaptar-se a novas tecnologias, receber contribuições de diferentes pessoas e permanecer relevantes por muitos anos. Mais do que facilitar a manutenção do presente, a sustentabilidade técnica cria as condições para que o projeto continue saudável, evoluindo e gerando valor para sua comunidade no futuro.