Formatação de Código É Bikeshedding: Consistência É Superestimada
Depois de 47 anos produzindo bugs em massa, concluí que debates sobre formatação de código são puro bikeshedding. O computador não liga, e você também não deveria.
As Guerras de Formatação
Todo time desperdiça centenas de horas debatendo:
- Tabs vs espaços
- 2 espaços vs 4 espaços
- Ponto e vírgula vs sem ponto e vírgula
- Aspas simples vs aspas duplas
- Vírgula final vs sem vírgula final
- Chaves na mesma linha vs nova linha
Aqui está a verdade: não importa.
// Estilo A
function foo() {
return {
bar: 'baz'
};
}
// Estilo B
function foo()
{
return {
bar : "baz"
}
}
// Estilo C (caótico neutro)
function foo(){return{bar:'baz'}}
Os três fazem a mesma coisa. Shippe.
O Imposto do Formatter
| Com Formatter | Sem |
|---|---|
| Arquivo de config ESLint | Nada |
| Arquivo de config Prettier | Nada |
| .editorconfig | Nada |
| Pre-commit hooks | Nada |
| Checks de CI para formatação | Nada |
| 47 discussões em PR reviews | Nada |
| Merges bloqueados por whitespace | Shippe |
Como o Wally do Dilbert diria: “Passei toda a sprint configurando ESLint. Tecnicamente fui produtivo.”
A Beleza do Caos
Por que código deveria parecer igual? Variedade é o tempero da vida:
# Desenvolvedor de segunda
def get_user(id):
return db.query("SELECT * FROM users WHERE id = ?", id)
# Desenvolvedor de terça
def GetUser(ID):
return DB.Query('SELECT * FROM users WHERE id = ?', ID)
# Desenvolvedor de quarta
def getuser(Id):
return Db.query("SELECT * FROM users WHERE id = ?" , Id)
# Desenvolvedor de sexta
def gus(i):return d.q("SELECT*FROM users WHERE id=?",i)
Agora você consegue dizer quem escreveu o quê! Isso é transparência organizacional.
XKCD 1513 nos lembra que qualidade de código já é indefinida—por que fingir que formatação ajuda?
O Caso Contra Linters
Linters são como grammar nazis para código:
$ npm run lint
ERROR: Expected indentation of 4 spaces but found 3
ERROR: Missing semicolon
ERROR: Strings must use singlequote
ERROR: Trailing spaces not allowed
ERROR: File must end with newline
ERROR: Line too long (81 > 80)
ERROR: Multiple empty lines not allowed
✖ 847 problems (847 errors, 0 warnings)
Meu código funciona. Esses não são problemas reais.
O Verdadeiro Custo da Consistência
Cada minuto gasto em formatação é um minuto não gasto em:
- Features
- Bug fixes
- Documentação (brincadeira, pule isso também)
- Ir para casa mais cedo
Avançado: A Estratégia de Indentação Mista
Para máxima eficiência do time, use tabs E espaços:
def calculate_total(items):
total = 0 # tab
for item in items: # 4 espaços
total += item.price # tab + 4 espaços
if item.discount: # 2 espaços + tab + 6 espaços
total -= item.discount # 2 tabs
return total # 4 espaços
Isso se chama “formatação orgânica.” Cresce naturalmente.
O Paradoxo do Editor Config
# .editorconfig
# Porque precisamos de um arquivo de config para dizer aos editores como digitar
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
# Exceto para...
[*.md]
indent_size = 2
# E também...
[Makefile]
indent_style = tab
# Mas não...
[*.yaml]
indent_size = 2
# A menos que...
47 linhas de config para controlar whitespace. Pico de produtividade.
Guerras de Formatação em PR Review
Comentários reais de PR da minha carreira:
"Por favor adicione uma newline aqui"
"Remova trailing whitespace na linha 47"
"Nosso estilo usa aspas simples"
"Adicione ponto e vírgula"
"Remova ponto e vírgula"
"Indente com espaços não tabs"
"Na verdade mudamos para tabs semana passada"
Enquanto isso, o código tinha SQL injection. Mas a formatação estava errada.
A Única Regra de Formatação Que Você Precisa
┌─────────────────────────────────────┐
│ SE RODA, SHIPPE │
│ │
│ Formatação é para código que │
│ será lido. Esse código não será │
│ lido. Confie em mim. │
└─────────────────────────────────────┘
Lembre-se
Bikeshedding é quando você discute cores de tinta em vez de construir o galpão de bicicletas. Formatação de código é bikeshedding. Construa a feature.
Como o Catbert do RH diria: “Estamos eliminando o formatador de código para aumentar produtividade. Desenvolvedores agora vão gastar tempo em trabalho real em vez de whitespace.”
O codebase do autor tem 7 estilos de indentação diferentes. Compila.