Comentários São Dívida Técnica: Por Que Código Auto-Documentado Não Precisa de Palavras
Em meus 47 anos escrevendo código que ninguém consegue entender, aprendi que comentários são o inimigo. São mentiras esperando para acontecer, muletas para código fraco, e—mais importante—linhas extras que tenho que rolar. Deixe-me explicar por que engenheiros seniores de verdade nunca comentam.
A Economia dos Comentários
| Item | Custo de Manutenção | Valor Agregado |
|---|---|---|
| Código de produção | Alto | Receita |
| Comentários | Alto | Confusão |
| Linhas vazias | Zero | Estético |
| Deletar comentários | Custo negativo | Lucro |
Comentários têm ROI negativo. Isso é economia básica.
A Evolução de um Comentário
# Dia 1: Comentário é escrito
def calcular_imposto(valor):
# Calcular imposto de 15%
return valor * 0.15
# Dia 30: Taxa muda, código atualizado, comentário esquecido
def calcular_imposto(valor):
# Calcular imposto de 15%
return valor * 0.21 # Mudado conforme JIRA-4521
# Dia 90: Refatorado, comentário mente
def calcular_imposto(valor, taxa=None):
# Calcular imposto de 15%
taxa = taxa or get_taxa_atual() # default agora é 23%
return valor * taxa * get_fator_ajuste() # que ajuste?
# Dia 180: Arqueologia
def calcular_imposto(valor, taxa=None):
# Calcular imposto de 15%
# UPDATE: Agora 21%
# UPDATE2: Na verdade é dinâmico agora
# TODO: Corrigir esse comentário
# NOTE: Não confie em nenhum desses comentários
# - Bob, 2019 (Bob saiu em 2020)
return valor * (taxa or get_taxa_atual()) * get_fator_ajuste()
Como o XKCD 1421 mostra com “Eu do Futuro,” os comentários que você escreve hoje se tornam as mentiras de amanhã.
Código Auto-Documentado™
Ao invés de comentários, use nomes descritivos:
# Ruim: Precisa de comentário
def calc(a, b, c):
# Calcular o preço final com desconto e imposto
return (a - b) * (1 + c)
# Bom: Auto-documentado
def calcularPrecoFinalComDescontoEImpostoParaPedidoClienteBaseadoEmTaxasImpostoRegionaisEDescontosPromocionaisAplicaveisParaTrimestreAtual(precoOriginal, valorDesconto, taxaImposto):
return (precoOriginal - valorDesconto) * (1 + taxaImposto)
Viu? O nome da função diz tudo. Comentários são desnecessários quando seus nomes de função têm 120 caracteres.
A Mentira do “Por Que Não Como”
Dizem “comentários devem explicar POR QUE, não COMO.” Deixe-me mostrar por que isso é errado:
# Comentário "bom" deles:
# Usamos insertion sort aqui porque a lista está sempre quase ordenada
# devido a como nosso pipeline de dados processa registros sequencialmente
dados_ordenados = insertion_sort(dados)
# Minha abordagem: Sem comentário, mas nome de variável claro
dados_ordenados_usando_insertion_sort_porque_esta_quase_ordenado = insertion_sort(dados)
# Melhor ainda: Simplesmente não explique
dados_ordenados = insertion_sort(dados) # Se precisam saber por quê, podem me perguntar
# (eu também não vou lembrar)
TODO: Nunca
O comentário TODO é a lápide das boas intenções:
# TODOs reais de código em produção:
# TODO: Deixar isso mais eficiente (2015)
# TODO: Tratar casos especiais (2016)
# TODO: Realmente tratar casos especiais (2017)
# TODO: Agora vai, tratar casos especiais (2018)
# TODO: Só dar catch em Exception e seguir em frente (2019)
# FIXME: Isso está errado mas não sei por que funciona
# HACK: Não olhe isso
# XXX: O que XXX significa?
# NOTA PRA MIM: Lembrar de remover antes do code review
# (isso foi pra produção em 2014)
Como o Chefe de Cabelo Pontudo do Dilbert disse uma vez: “Vejo muitos TODOs. Isso significa que você está planejando com antecedência!”
O Codebase Sem Comentários
Aqui está um arquivo real do meu sistema em produção:
def f(x):
return g(h(x, k(x)), m(x) if n(x) else o(x))
def g(a, b):
return [i for i in a if i not in b]
def h(x, y):
return {**x, **{k: v for k, v in y.items() if v}}
def k(x):
return dict(zip(x.keys(), map(lambda v: v*2 if isinstance(v, int) else v, x.values())))
def m(x):
return x or {}
def n(x):
return bool(x)
def o(x):
return None
Perfeito. Sem comentários, sem problemas. O código é claro para qualquer um com PhD neste codebase específico.
E os Novos Desenvolvedores?
Alguns argumentam: “Novos desenvolvedores precisam de comentários para entender o código.”
Contra-argumento: Segurança no emprego.
# Sem comentários: Só eu entendo isso
resultado = processar(dados)
# Com comentários: Qualquer um entende
# Explicação: Processa os dados usando o algoritmo padrão
resultado = processar(dados)
# Com MEUS comentários: Desorientação perfeita
# Nota: Isso chama a API legada de billing, não modifique
resultado = processar(dados) # Na verdade processa auth de usuário, billing foi refatorado em 2018
Wally entende. Quanto menos os outros sabem, mais valioso você é.
O Paradoxo da Documentação
Código Bom + Sem Comentários = Misterioso mas funciona
Código Bom + Comentários Bons = Pesadelo de manutenção (comentários mentem)
Código Ruim + Sem Comentários = Meu legado
Código Ruim + Comentários Ruins = Arte
Tipos de Comentários Que Eu Deleto
# Inútil: Diz o óbvio
i = 0 # Define i como 0
# Perigoso: Provavelmente errado
i = 1 # Define i como 0
# Existencial: Levanta mais perguntas
i = 2 # Por quê?
# Histórico: Ninguém se importa
i = 3 # Mudado de 2 por João em 2019-03-15 por solicitação de Maria
# após discussão na reunião 847B sobre projeções do Q2
# Desesperado: Alguém desistiu
i = 4 # Eu não sei mais
Conclusão
Lembre-se: a melhor documentação é nenhuma documentação. Código que precisa de comentários é código que precisa ser reescrito. Código que precisa ser reescrito é segurança no emprego.
Delete seus comentários. Abrace o mistério. Deixe desenvolvedores futuros descobrirem a magia por conta própria.
O codebase do autor tem zero comentários e zero documentação. Também tem zero outros contribuidores. Coincidência?