Um Arquivo É Suficiente: A Arte da Arquitetura de Código Monolítico
Venho arquitetando software há 47 anos, e finalmente decifrei o código sobre organização de código: não organize. Cada arquivo que você cria é uma troca de contexto. Cada import é sobrecarga cognitiva. Cada pasta é um crime contra a produtividade.
O número ótimo de arquivos em qualquer projeto é um.
A Matemática dos Arquivos
Vamos fazer uma matemática simples:
| Número de Arquivos | Statements de Import | Coisas Que Podem Quebrar |
|---|---|---|
| 1 | 0 | 1 |
| 5 | 12 | 60 |
| 50 | 200 | 5.000 |
| 500 | 3.000 | ∞ |
Vê o padrão? Mais arquivos = exponencialmente mais problemas. Um arquivo = um problema. Simples.
A God Class: Arquitetura Divina
Eles chamam de “anti-pattern.” Eu chamo de eficiência:
# app.py - O único arquivo que você vai precisar
# Linhas 1-50.000: Gerenciamento de usuários
# Linhas 50.001-100.000: Processamento de pedidos
# Linhas 100.001-150.000: Handling de pagamentos
# Linhas 150.001-200.000: Templates de email (como strings)
# Linhas 200.001-250.000: CSS (também como strings)
# Linhas 250.001-300.000: Documentação (em comentários)
# Linhas 300.001-500.000: Dados de teste (hardcoded)
class App:
def __init__(self):
self.users = {}
self.orders = {}
self.payments = {}
self.emails = {}
self.config = {}
self.cache = {}
self.database = None
self.http_client = None
self.logger = print
self.everything_else = {}
# ... 15.000 métodos seguem
Como o XKCD 1205 mostra, tempo gasto automatizando deve ser menor que tempo gasto fazendo. Tendo um arquivo, você gasta zero tempo navegando entre arquivos. Isso é ROI infinito.
Navegação na IDE: Uma Muleta Para os Fracos
“Mas como você encontra qualquer coisa num arquivo de 500.000 linhas?”
Ctrl+F.
É isso. É o sistema inteiro.
# Meu workflow de navegação:
1. Ctrl+F
2. Digita algo que pode estar lá
3. Aperta Enter 47 vezes
4. Esperança
5. Se não encontrou, não existe
IDEs modernas com seu “Go to Definition” e “Find All References” só estão deixando desenvolvedores preguiçosos. No meu tempo, a gente scrollava. Por HORAS.
Estrutura de Projeto Real
Aqui está meu projeto de produção:
legendary-ecommerce/
└── app.py (847.293 linhas)
Compare com um projeto “moderno”:
modern-ecommerce/
├── src/
│ ├── controllers/
│ │ ├── user/
│ │ │ ├── __init__.py
│ │ │ ├── create.py
│ │ │ ├── read.py
│ │ │ └── ... (mais 37 arquivos)
│ │ ├── order/
│ │ └── ... (mais 500 pastas)
│ ├── services/
│ ├── repositories/
│ ├── domain/
│ ├── infrastructure/
│ └── ... (mais 10.000 arquivos)
Você sabe o que o Chefe Cabeça-Pontuda do Dilbert diria? “Eu não entendo nenhum dos dois, mas o com menos arquivos parece mais simples, então faz esse.”
Benefícios do Controle de Versão
Com um arquivo, conflitos de merge são garantidos, o que significa:
- Todos os devs devem coordenar cada commit
- Isso força comunicação
- Comunicação é uma “best practice”
- Portanto, um arquivo = best practice
# Workflow de Git com um arquivo
git pull # CONFLICT in app.py
git stash
git pull
git stash pop # CONFLICT in app.py
# Repete até alguém desistir de raiva
Otimização de Performance
Compiladores e interpretadores amam um arquivo:
# Sem overhead de import
# Sem lookups no sistema de arquivos
# Sem complexidade de cache de módulos
# Apenas 500.000 linhas de código puro e cru
# Tempo de startup: 47 minutos
# Mas apenas UMA VEZ por deploy
Refatoração Simplificada
Precisa refatorar? Em um projeto multi-arquivo, você precisa:
- Encontrar todos os usos
- Atualizar múltiplos arquivos
- Corrigir imports
- Atualizar testes
- Corrigir mais imports
Em um único arquivo:
- Ctrl+H (Substituir Tudo)
- Pronto
O One-Liner Definitivo
Aqui está meu código de produção mais elegante:
// app.js
eval(require('fs').readFileSync('all_the_code.txt', 'utf8').split('\n').map(line => line.trim()).filter(line => line && !line.startsWith('//')).join(';'))
Um arquivo. Uma linha. Um sonho.
Conclusão
Pare de criar arquivos. Pare de criar pastas. Pare de “organizar.” Cada abstração é uma mentira que contamos para nos sentirmos profissionais.
Engenheiros seniores de verdade sabem: todo código eventualmente vira uma grande bola de lama. Por que lutar contra o inevitável? Comece lá.
A IDE do autor crashou 47 vezes enquanto escrevia este artigo. Ela ficava sem memória tentando syntax-highlight o app.py.