substantivo masculino [informal, gíria]
feminino: fubanga
-
Pessoa e/ou coisa considerada desprovida de graça, desajeitada ou de aparência descuidada.
Ser humano de estética duvidosa, dono de um visual que parece ter sido montado às pressas durante um apagão.
“O cara era todo fubango, mas tinha um bom coração.”
“O bicho apareceu todo fubango na festa, com a camisa florida laranja e papete do Gustavo Kuerten azul.”
-
Indivíduo tido como cafona ou de gosto duvidoso no modo de se vestir ou se comportar.
Pessoa com gosto peculiar, que acredita piamente que brilho combina com oncinha e perfume forte é sinal de respeito.
“Aquele terno amarelo ficou muito fubango.”
“A fubanga chegou iluminando o bar inteiro com aquele salto de acrílico.”
Etimologia: origem incerta; possivelmente criação popular de tom zombeteiro, associada à sonoridade expressiva. Talvez inventada num boteco entre um gole e outro, quando alguém precisava de uma palavra pra descrever o indescritível.
Sinônimos: brega, cafona, feioso, desengonçado, bagaceiro (pop.).
Antônimos: estiloso, elegante, bonito.
FubanGo é um repositório educacional que ensina Golang através de anti-padrões e exemplos negativos.
Este projeto tem como objetivo ensinar Golang de uma maneira única: mostrando primeiro como não fazer as coisas. Para cada conceito, apresentamos:
- Um problema a ser resolvido;
- Uma implementação propositalmente ruim;
- Análise detalhada de por que a implementação é problemática;
- A forma correta de implementação;
- Comparação entre as duas abordagens.
/exemplos
/01-basicos
/variaveis
/estruturas-de-controle
/funcoes
/02-intermediario
/error-handling
/concorrencia
/interfaces
/03-avancado
/goroutines
/channels
/context
/04-casos-reais
/api-design
/database
/testes
Cada diretório contém:
ruim.go- Implementação propositalmente ruimanalise.md- Análise detalhada dos problemasbom.go- Implementação seguindo as melhores práticasbenchmark_test.go- Testes de performance (quando aplicável)
- Leia o problema proposto
- Analise o código ruim em
ruim.go - Leia a análise detalhada em
analise.md - Compare com a solução correta em
bom.go - Execute os benchmarks para ver a diferença de performance
- Nomes de Variáveis Não Descritivos -
ruim.go:7 - Não Aproveitando Inferência de Tipo -
ruim.go:11 - Declarações Redundantes -
ruim.go:17 - Variáveis Não Utilizadas -
ruim.go:22 - Escopo Global Desnecessário -
ruim.go:26 - Conversões Desnecessárias -
ruim.go:30 - Shadowing de Variáveis -
ruim.go:35 - Valores Mágicos -
ruim.go:42 - Falta de Agrupamento Lógico -
ruim.go:47
- If's Aninhados Excessivamente -
ruim.go:7 - Switch Mal Estruturado -
ruim.go:19 - For com Continue/Break Desnecessários -
ruim.go:33 - Loop Infinito com Break -
ruim.go:47 - Range com Índice Não Utilizado -
ruim.go:61 - Condições Complexas -
ruim.go:67
- Muitos Parâmetros e Retornos -
ruim.go:9 - Uso de Variáveis Globais -
ruim.go:7 - Código Repetitivo -
ruim.go:23 - Função que Faz Muitas Coisas -
ruim.go:34 - Recursão Mal Implementada -
ruim.go:53 - Tratamento de Erros Ignorado -
ruim.go:60 - Função Anônima Complexa -
ruim.go:66
- Ignorar Erros -
ruim.go:10 - Uso Inadequado de Panic -
ruim.go:18 - Erros Genéricos -
ruim.go:25 - Perda de Contexto -
ruim.go:34 - Mistura de Erros e Logs -
ruim.go:43 - Falta de Agrupamento de Erros -
ruim.go:51 - Recover Indiscriminado -
ruim.go:64
- Race Conditions -
ruim.go:9 - Deadlocks -
ruim.go:21 - Goroutine Leaks -
ruim.go:44 - Uso Incorreto de Canais -
ruim.go:53 - Compartilhamento sem Sincronização -
ruim.go:63 - Select Mal Implementado -
ruim.go:75 - WaitGroup Mal Usado -
ruim.go:91 - Mutex por Valor -
ruim.go:104
- Interface Grande e Não Coesa -
ruim.go:7 - Exposição de Detalhes de Implementação -
ruim.go:16 - Dependência de Tipos Concretos -
ruim.go:24 - Violação do ISP -
ruim.go:33 - Uso Excessivo de interface{} -
ruim.go:48 - Erro Personalizado Incorreto -
ruim.go:54 - Container Genérico Ruim -
ruim.go:65 - Embedding Excessivo -
ruim.go:75
- Goroutines Sem Controle de Término -
ruim.go:11 - Compartilhamento de Variáveis da Closure -
ruim.go:21 - Número Excessivo de Goroutines -
ruim.go:32 - Comunicação Através de Variáveis Compartilhadas -
ruim.go:41 - Vazamento de Goroutines em Loops -
ruim.go:58 - Panic em Goroutine Sem Recuperação -
ruim.go:69 - CPU-Bound com Muitas Goroutines -
ruim.go:82 - Sincronização Incorreta com WaitGroup -
ruim.go:96 - Deadlock com Canais -
ruim.go:110 - Ordem de Execução Não Garantida -
ruim.go:120 - Timeout Mal Implementado -
ruim.go:132 - Recurso Compartilhado Sem Proteção -
ruim.go:146
- Canal Sem Buffer Quando Necessário -
ruim.go:9 - Fechamento Múltiplo -
ruim.go:21 - Envio para Canal Fechado -
ruim.go:35 - Select Bloqueante -
ruim.go:48 - Canal Compartilhado -
ruim.go:58 - Direção Não Especificada -
ruim.go:72 - Loop Infinito -
ruim.go:78 - Range Sem Fechamento -
ruim.go:90
- Uso de Timer Sem Cancelamento -
ruim.go:9 - Operação Bloqueante Sem Context -
ruim.go:19 - Ignorar Função Cancel de Context -
ruim.go:27 - Context Como Interface Genérica -
ruim.go:36 - Passar Context por Cópia Incorreta -
ruim.go:42
- Side-Effects em Endpoints GET -
ruim.go:11 - Vazamento de Dados Sensíveis -
ruim.go:20 - Falta de Autenticação e Autorização -
ruim.go:43 - Mistura de Responsabilidades -
ruim.go:51 - Falta de Versionamento -
ruim.go:72 - Ausência de Contratos Claros -
ruim.go:79 - Falta de Tratamento de Erros Consistente -
ruim.go:85
- Abrir e Fechar Conexão Por Requisição -
ruim.go:11 - SQL Injection por Concatenação de Strings -
ruim.go:21 - Ignorar Erros de Operações de Banco -
ruim.go:31 - Transação Sem Rollback em Caso de Erro -
ruim.go:47 - Falta de Context com Timeout -
ruim.go:64 - Não Usar Prepared Statements -
ruim.go:73 - Ausência de Migrations e Versionamento de Schema -
ruim.go:80
- Testes Dependentes de Ordem e Estado Global -
ruim.go:11 - Testes Lentos Sem Mocks -
ruim.go:25 - Uso de Sleep em Testes -
ruim.go:43 - Falta de Assertions e Validações -
ruim.go:59 - Testes Não Isolados (Sem Setup/Teardown) -
ruim.go:75 - Ausência de Table-Driven Tests -
ruim.go:98 - Não Rodar com Race Detector -
ruim.go:117 - Cobertura de Testes Não Medida -
ruim.go:134 - Mocks Mal Implementados -
ruim.go:151
Total: 87 anti-padrões documentados 🚫
Contribuições são bem-vindas! Se você tem um exemplo de código ruim que pode ser educativo, sinta-se à vontade para abrir um PR.
ruim.go é propositalmente ruim e NÃO deve ser usado em produção!
Este repositório é principalmente um conjunto de exemplos para leitura. A única parte "executável" são os benchmarks em cada exemplo. Para rodá-los localmente siga as instruções abaixo.
Pré-requisitos:
- Go 1.18+ instalado (recomendo 1.20+)
Passos rápidos:
- Inicialize o módulo (já incluí um
go.modmínimo no repositório). Se você quiser usar outro módulo, ajuste conforme necessário:
# se quiser recriar o módulo com outro path
go mod init github.com/SEU_USUARIO/fubango- Baixe dependências (se houver):
go mod tidy- Execute todos os benchmarks do projeto (recomendado):
go test -bench . ./exemplos/... -benchmem- Executar benchmarks de um pacote específico (ex.: variables):
go test -bench . ./exemplos/01-basicos/variaveis -benchmemDicas:
- Para rodar com detector de race (útil ao comparar implementações ruins/boas):
go test -race -bench . ./exemplos/... -benchmem- Para coletar resultados em formato compatível com benchstat você pode gravar saídas em arquivos e comparar:
go test -bench . ./exemplos/01-basicos/variaveis -benchmem > ruim.txt
go test -bench . ./exemplos/01-basicos/variaveis -benchmem -run BenchmarkGood -benchmem > bom.txt
benchstat ruim.txt bom.txtObservação: alguns benchmarks ilustrativos podem depender de pacotes externos (por exemplo golang.org/x/sync/errgroup) — rode go mod tidy para buscar as dependências necessárias antes de executar os benchs.
Para ver o plano completo de evolução do projeto, incluindo próximas fases, metas e cronograma detalhado, consulte o ROADMAP.md.
Status Atual: Fase 1 - 100% Completa ✅ | Ver detalhes →
Este projeto está licenciado sob a MIT License - veja o arquivo LICENSE para mais detalhes.
Copyright © 2025 Lucas Rafaldini
Feito com ❤️ para a comunidade Go
"Aprendendo com os erros, evoluindo com os acertos"