A dívida neste repositório
Um curso sobre comunicar dívida técnica não vale nada sem dívida para comunicar. Então aqui está a desta aplicação, encontrada rodando as ferramentas em vez de perguntar a opinião de alguém.
O que o grep encontra
$ grep -rn "TODO\|FIXME\|HACK\|XXX" app/ lib/
Uma linha, e não é um marcador. É o lib/tasks/course_ruby.rake batendo com uma regex que procura a palavra TODO, como parte do próprio ferramental de autoria de cursos deste repositório. Os 258 arquivos Ruby e 101 templates da aplicação em si têm zero.
Vale parar nisso, porque o instinto é ler como "esta base de código não tem dívida." Significa que esta base de código não tem dívida que alguém tenha escrito. Os marcadores registram o que um desenvolvedor notou enquanto digitava. Eles não conseguem registrar o que ninguém notou, o que foi decidido numa reunião, ou o que virou dívida depois que o código foi escrito e estava correto.
Cada item abaixo é real, e nenhum deles tem um TODO.
O que as ferramentas encontram, e o que já aconteceu com duas delas
O job de lint estava vermelho, e já foi consertado.
$ bin/rubocop
422 files inspected, 22 offenses detected, 11 offenses autocorrectable
22 Layout/SpaceInsideArrayLiteralBrackets [Safe Correctable]
22 Total in 6 files
Isso é o que este repositório reportava no dia em que este registro foi compilado pela primeira vez. O .github/workflows/ci.yml roda bin/rubocop -f github como um dos três jobs. E um job que ficou vermelho ensinou as pessoas a parar de lê-lo, que é o argumento inteiro da aula 2. Foi consertado na mesma semana, no commit df99fec, tocando os seis arquivos que o scan nomeou. Rode bin/rubocop hoje e ele reporta zero ocorrências em 601 arquivos.
O scanner de segurança tinha seis avisos, e as duas classes deles já foram consertadas.
$ bin/brakeman
46 controllers, 28 models, 82 templates scanned in 1.2s
Security Warnings: 6
3 x Format Validation (ValidationRegex), High confidence
3 x SQL Injection, Medium confidence
Os três de alta confiança eram o mesmo erro em três arquivos: format: { with: %r{\Ahttps?://}i } sem âncora \z. Os três de confiança média estavam todos em app/queries/catalog/search_query.rb, que construía uma expressão jsonb interpolando um nome de tabela. Os dois foram consertados na mesma semana que o job de lint. O commit e30c2a3 deu à validação de URL um único dono (Partners::UrlPolicy), e o commit ee9fa06 trocou o SQL interpolado por um hash de busca literal. Rode bin/brakeman hoje e ele reporta zero avisos.
Três de oito itens consertados dentro de uma semana, nenhum deles marcado com TODO e nenhum deles discutido neste curso antes de agora, o que já é digno de nota. Dívida pequena, segura e com evidência é paga em silêncio, como a aula 6 argumenta. Ela não precisa deste curso para acontecer.
flowchart TB
G["grep TODO/FIXME/HACK"] --> Z["nada no código da aplicação"]
T["as ferramentas"] --> A["rubocop: eram 22 ocorrências, consertado em 2026-09-06"]
T --> B["brakeman: eram 6 avisos, consertados em 2026-09-06 em dois commits"]
T --> C["ci.yml: 3 jobs, nenhum roda os 1.206 exemplos"]
Z --> D["dívida que ninguém escreveu ainda é dívida"]
O que os cursos anteriores encontraram
Mais três, cada um estabelecido por um experimento numa aula anterior desta série, e os três continuam abertos hoje:
A política de senha não é testada. MIN_LENGTH, MAX_LENGTH e a regra de caractere especial em FORMAT podem cada uma ser enfraquecidas e todos os 1.206 exemplos continuam verdes.
As configurações de segurança do RSpec estão comentadas. O spec/spec_helper.rb tem ordenação aleatória, persistência de --only-failures e filtragem por :focus dentro de um bloco =begin.
Os caminhos de erro do buscador de ícones de site não são testados. O Partners::FetchSiteIconService resgata cinco classes de exceção e nenhum exemplo dispara qualquer uma delas.
O registro
| # | Item | Evidência | Esforço | Status |
|---|---|---|---|---|
| 1 | Job de lint falhando | bin/rubocop |
Minutos | Consertado em 2026-09-06 |
| 2 | Ordenação e persistência de falhas do RSpec desligadas | spec/spec_helper.rb |
Minutos | Aberto |
| 3 | 3 avisos de alta confiança do Brakeman, \z faltando |
bin/brakeman |
Uma hora | Consertado em 2026-09-06 |
| 4 | Constantes da política de senha não testadas | Rodada de mutação | Uma hora | Aberto |
| 5 | Sem job de teste na CI | ci.yml |
Horas | Aberto |
| 6 | Caminhos de erro HTTP não testados | fetch_site_icon_service.rb |
Meio dia | Aberto |
| 7 | 3 avisos de confiança média de SQL na busca | bin/brakeman |
Meio dia, com cuidado | Consertado em 2026-09-06 |
| 8 | :unsafe_inline no style_src da CSP |
Inicializador da CSP | Dias | Aberto |
Oito itens foram encontrados, cada um com um comando que produz a evidência. Cinco continuam abertos.
Essa coluna de evidência é o que torna isto um registro em vez de uma reclamação. "O código tem dívida" é uma opinião. "bin/rubocop sai com código não-zero, e a CI roda ele" é um fato que qualquer um pode checar em dez segundos. E a diferença decide se a conversa da aula 5 vai a algum lugar. O resto deste curso trabalha a partir das cinco linhas ainda abertas. As três já consertadas aparecem de novo na aula 6, como o exemplo mais claro do que "não pergunte" parece na prática.
Pontos-chave
- Zero marcadores reais de
TODO/FIXME/HACKnos 258 arquivos Ruby e 101 templates desta aplicação. - Medido, e desde então consertado (2026-09-06): 22 ocorrências do rubocop em 6 arquivos, e 6 avisos do Brakeman em duas causas-raiz.
- Cinco itens continuam abertos: configurações de segurança do RSpec, a política de senha, sem job de teste, caminhos de erro HTTP, e
:unsafe_inline. - A CI tem três jobs e nenhum deles roda os 1.206 exemplos.
- Um registro precisa de evidência e esforço por linha; sem eles é uma reclamação em vez de uma lista. E um bom registro derruba uma linha assim que ela é consertada.
Continue com a aula 2
O que a dívida de fato custa
Principal é o trabalho de consertar, juros é o custo até lá, e como quantificar sem inventar números.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.