A criação de ferramentas como o Git pelo Linus Torvalds em apenas 10 dias ou do JavaScript por Brendan Eich no mesmo período parece desafiar a lógica. Enquanto isso, equipes de desenvolvimento podem levar semanas ou meses para entregar funcionalidades aparentemente simples. A diferença não está apenas na competência técnica, mas na complexidade contextual que envolve o dia a dia do desenvolvimento.
1. A raiz da complexidade
O tempo gasto em projetos muitas vezes não está ligado à dificuldade técnica, mas a fatores como:
- Desconhecimento do código existente: Sistemas legados ou grandes codebases exigem tempo para entendimento.
- Falta de documentação: A necessidade de "adivinhar" ou perguntar a colegas consome recursos.
- Tecnologias novas: A curva de aprendizado de ferramentas não dominadas pela equipe.
- Decisões motivadas por interesses pessoais: A tentação de usar tecnologias "da moda" ou de interesse individual, mesmo que não sejam a melhor escolha para o projeto.
O pulo do gato é priorizar simplicidade e resolução direta de problemas, em vez de buscar soluções "perfeitas" ou academicamente elegantes.
2. Os 5 pilares para simplificar o desenvolvimento de software
Pilar 1: Coleta de requisitos
- Entenda o problema real: Converse diretamente com os usuários ou stakeholders para evitar suposições.
Exemplo: Se um relatório demora 1 hora para ser gerado, pergunte se seria desejável gerá-lo em 10 minutos antes de investir em otimizações complexas.
- Evite extremos: Nem sempre é necessário criar uma solução minimalista ou superdimensionada. Foque no mínimo viável que resolve o problema.
Pilar 2: Codificação
- Use ferramentas familiares: Linguagens exóticas ou tecnologias de nicho aumentam a complexidade. Dê preferência a opções dominadas pela equipe ou com amplo suporte da comunidade.
- Clean Code (sem fanatismo): Código legível, com nomes descritivos e funções curtas, facilita a manutenção.
- Abstrações inteligentes: Encapsule recursos como filas (SQS, RabbitMQ) ou armazenamento (S3) em interfaces simples. Isso reduz o acoplamento e torna o código mais modular.
- Screaming Architecture: Estruture pastas e arquivos de forma que qualquer desenvolvedor entenda o propósito do projeto apenas olhando a estrutura de diretórios.
Pilar 3: Testes
- Evite complexidade desnecessária: Ferramentas como LocalStack ou TestContainers são úteis para desenvolvimento local, mas tornam testes lentos. Prefira mocks ou fakes em memória.
- Cuidado com bancos de dados: Mockar consultas SQL pode ignorar regras de negócio embutidas. Em alguns casos, usar SQLite para testes é mais seguro se você estiver usando um banco de dados relacional.
Pilar 4: Arquitetura
- Fuja da "melhor ferramenta para o problema": Escolher tecnologias só porque são "ideais" tecnicamente, sem considerar o conhecimento da equipe, gera dívida técnica.
- Desenhe, avalie riscos, itere:
- Crie um esboço inicial da arquitetura.
- Identifique pontos de risco (ex: alta carga, dependências críticas…).
- Adicione complexidade apenas onde é necessária para mitigar riscos.
- Simplifique componentes que não exigem sofisticação.
Pilar 5: CI/CD
- Mantenha pipelines enxutos: Automatize etapas essenciais (lint, testes, build, deploy…) e elimine passos manuais.
- Velocidade é prioridade: Se um pipeline demora mais de 10 minutos, repense sua estrutura.
A importância da simplicidade
Entregas rápidas não são apenas uma métrica de produtividade, mas um diferenciador competitivo. Software simples reduz retrabalho, facilita a manutenção e permite adaptação ágil a mudanças.
A complexidade, quando inevitável, deve ser justificada por riscos reais (ex: escalabilidade, segurança etc.), nunca por preferências pessoais ou modismos.