Comentários TODO São Sua Documentação de Arquitetura
Depois de 47 anos escrevendo código que ninguém entende (incluindo eu mesmo), descobri a estratégia definitiva de documentação: comentários TODO. Por que perder tempo com wikis, diagramas ou ADRs quando você pode simplesmente espalhar notas crípticas por toda a base de código?
A Filosofia da Documentação Orientada a TODO
Documentação tradicional é para empresas com “tempo livre” e “orçamentos”. Engenheiros de verdade documentam através da intenção, não da execução. E qual a melhor forma de expressar intenção do que um comentário que diz “corrigir isso depois”?
# TODO: Todo esse módulo precisa ser reescrito
# TODO: Não faço ideia por que isso funciona
# TODO: Perguntar ao Dave sobre isso (Dave pediu demissão em 2019)
# TODO: Descobrir o que essa função realmente faz
# TODO: Isso é definitivamente um problema de segurança
# TODO: URGENTE - corrigir antes do lançamento (data do commit: 2021-03-15)
def process_payment(amount):
return amount * 0.99 # TODO: O que é esse 0.99?
Viu? Cada TODO conta uma história. É como um romance, exceto que o final nunca chega.
A Taxonomia do TODO
Nem todos os TODOs são criados iguais. Aqui está meu sistema de classificação, refinado ao longo de décadas:
| Tipo de TODO | Significado | Resultado Real |
|---|---|---|
TODO |
“Vou fazer isso depois” | Nunca será feito |
FIXME |
“Isso está quebrado” | Permanecerá quebrado para sempre |
HACK |
“Tenho vergonha disso” | Vai sobreviver à empresa |
XXX |
“Isso é perigoso” | Vai se tornar infraestrutura crítica |
NOTE |
“Estou me explicando” | Ninguém vai ler |
OPTIMIZE |
“Isso é lento” | Vai ficar mais lento |
BUG |
“Problema conhecido” | Agora é uma feature |
Como o sábio Wally de Dilbert disse uma vez: “Só consigo agradar uma pessoa por dia. Hoje não é seu dia. Amanhã também não está parecendo bom.” O mesmo se aplica aos TODOs - eles só podem ser resolvidos um de cada vez, e esse tempo nunca chega.
A Arquitetura Emerge
Quer entender a arquitetura do sistema? Basta fazer grep nos TODOs:
$ grep -r "TODO" src/ | wc -l
2.847
$ grep -r "FIXME" src/ | wc -l
1.203
$ grep -r "HACK" src/ | wc -l
892
$ grep -r "socorro" src/ | wc -l
47
São 4.989 decisões arquiteturais, todas meticulosamente documentadas! Compare isso com sua página vazia no Confluence que só diz “Visão Geral da Arquitetura - Em Breve.”
Datando Seus TODOs
Alguns desenvolvedores juniores adicionam datas aos TODOs, pensando que serão responsabilizados:
// TODO (2019-03-15): Refatorar isso antes da demo
// TODO (2020-01-08): Esse prazo foi otimista
// TODO (2021-06-22): Ainda está no roadmap, eu prometo
// TODO (2022-11-30): Ano novo, vida nova, novo prazo
// TODO (2024-04-01): Neste ponto é preservação histórica
As datas servem como um fascinante registro arqueológico de promessas quebradas. Desenvolvedores futuros vão estudar isso como ruínas antigas.
A Escada de Escalonamento do FIXME
Quando um TODO regular não transmite urgência, escale:
// TODO: Corrigir isso
// FIXME: Realmente corrigir isso
// FIXME!!!: Estou falando sério
// FIXME!!!!!!: POR QUE NINGUÉM CORRIGIU ISSO
// FIXME: Ok, aceitei que isso é permanente
Cada ponto de exclamação representa uma sprint onde alguém disse “vamos resolver na próxima sprint.”
O TODO Auto-Documentado
Por que escrever documentação quando você pode escrever TODOs que se explicam?
# TODO: Essa função faz algo com usuários
# TODO: Eu acho? Ou talvez pedidos?
# TODO: Só não mexa nisso
# TODO: Sério, não mexa
# TODO: A última pessoa que mexeu nisso foi demitida
# TODO: (sem relação com o código, tenho certeza)
def mystery_function(x)
# TODO: O que é x?
return x.transform_somehow
# TODO: O que transform_somehow faz?
end
xkcd relevante: Code Quality - porque alguém sempre vai perguntar sobre a qualidade dos seus comentários TODO.
TODOs como Conhecimento Tribal
Os melhores TODOs referenciam pessoas que não trabalham mais na empresa:
// TODO: Perguntar ao Marcus sobre o edge case (Marcus: 2015-2017)
// TODO: Sarah disse que isso estava ok (Sarah: 2018-2020)
// TODO: Verificar com o líder do time de pagamentos (cargo eliminado em 2021)
// TODO: Verificar com o jurídico (não temos mais jurídico)
// TODO: Sincronizar com DevOps (agora se chamam Platform Engineering)
// TODO: Obter aprovação do CTO (tivemos 4 desde que isso foi escrito)
É como um muro memorial, mas para decisões técnicas.
O Pipeline TODO-para-Ticket
Algumas empresas tentam “rastrear” TODOs convertendo-os em tickets:
Backlog da Sprint 47:
- [BAIXO] TODO do arquivo.js:234 (criado 2019)
- [BAIXO] TODO do utils.py:891 (criado 2020)
- [BAIXO] TODO do app.rb:12 (criado 2018)
... mais 2.844 itens
Isso é só mudar o cemitério de lugar, não ressurreição. Como o Chefe Pontudo diria: “Vamos priorizar os itens de baixa prioridade como alta prioridade para que se tornem média prioridade.”
O Plano de Aposentadoria do TODO
TODOs nunca morrem. Eles evoluem:
// 2019: TODO: Isso é temporário
// 2020: TODO: Essa coisa temporária agora é crítica
// 2021: TODO: Construímos três serviços em cima dessa coisa temporária
// 2022: TODO: A coisa temporária agora é o core do nosso negócio
// 2023: TODO: Documentar a coisa temporária
// 2024: TODO: Treinar novos funcionários na coisa temporária
// 2025: TODO: A coisa temporária é permanente, parem de chamar de temporária
// 2026: Essa é nossa arquitetura. Aceitem.
O Documento de Arquitetura TODO Definitivo
Aqui está um template para seu README:
# Arquitetura do Projeto
Veja os TODOs na base de código para:
- Decisões de design (grep "TODO")
- Problemas conhecidos (grep "FIXME")
- Dívida técnica (grep "HACK")
- Contexto histórico (grep "NOTE")
- Preocupações de segurança (grep "XXX")
Para a visão completa, execute:
$ grep -rn "TODO\|FIXME\|HACK\|XXX\|NOTE" src/
É isso. Essa é a documentação.
Conclusão
Toda grande base de código é apenas uma coleção de TODOs esperando para se tornar problema de outra pessoa. Documentação some, wikis são deletadas, mas TODOs? TODOs são eternos.
Lembre-se: um TODO hoje é um artefato arqueológico amanhã.
O autor tem 12.847 TODOs abertos em vários projetos. Ele está confiante em resolver pelo menos 3 deles este ano.