Skip to content

lucasrafaldini/FubanGo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FubanGo 🚫✨

fubango

substantivo masculino [informal, gíria]
feminino: fubanga

  1. 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.”

  2. 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.

Propósito

Este projeto tem como objetivo ensinar Golang de uma maneira única: mostrando primeiro como não fazer as coisas. Para cada conceito, apresentamos:

  1. Um problema a ser resolvido;
  2. Uma implementação propositalmente ruim;
  3. Análise detalhada de por que a implementação é problemática;
  4. A forma correta de implementação;
  5. Comparação entre as duas abordagens.

Estrutura do Projeto

/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 ruim
  • analise.md - Análise detalhada dos problemas
  • bom.go - Implementação seguindo as melhores práticas
  • benchmark_test.go - Testes de performance (quando aplicável)

Como Usar

  1. Leia o problema proposto
  2. Analise o código ruim em ruim.go
  3. Leia a análise detalhada em analise.md
  4. Compare com a solução correta em bom.go
  5. Execute os benchmarks para ver a diferença de performance

Índice de Anti-Padrões Documentados

📁 01-Básicos

  1. Nomes de Variáveis Não Descritivos - ruim.go:7
  2. Não Aproveitando Inferência de Tipo - ruim.go:11
  3. Declarações Redundantes - ruim.go:17
  4. Variáveis Não Utilizadas - ruim.go:22
  5. Escopo Global Desnecessário - ruim.go:26
  6. Conversões Desnecessárias - ruim.go:30
  7. Shadowing de Variáveis - ruim.go:35
  8. Valores Mágicos - ruim.go:42
  9. Falta de Agrupamento Lógico - ruim.go:47
  1. If's Aninhados Excessivamente - ruim.go:7
  2. Switch Mal Estruturado - ruim.go:19
  3. For com Continue/Break Desnecessários - ruim.go:33
  4. Loop Infinito com Break - ruim.go:47
  5. Range com Índice Não Utilizado - ruim.go:61
  6. Condições Complexas - ruim.go:67
  1. Muitos Parâmetros e Retornos - ruim.go:9
  2. Uso de Variáveis Globais - ruim.go:7
  3. Código Repetitivo - ruim.go:23
  4. Função que Faz Muitas Coisas - ruim.go:34
  5. Recursão Mal Implementada - ruim.go:53
  6. Tratamento de Erros Ignorado - ruim.go:60
  7. Função Anônima Complexa - ruim.go:66

📁 02-Intermediário

  1. Ignorar Erros - ruim.go:10
  2. Uso Inadequado de Panic - ruim.go:18
  3. Erros Genéricos - ruim.go:25
  4. Perda de Contexto - ruim.go:34
  5. Mistura de Erros e Logs - ruim.go:43
  6. Falta de Agrupamento de Erros - ruim.go:51
  7. Recover Indiscriminado - ruim.go:64
  1. Race Conditions - ruim.go:9
  2. Deadlocks - ruim.go:21
  3. Goroutine Leaks - ruim.go:44
  4. Uso Incorreto de Canais - ruim.go:53
  5. Compartilhamento sem Sincronização - ruim.go:63
  6. Select Mal Implementado - ruim.go:75
  7. WaitGroup Mal Usado - ruim.go:91
  8. Mutex por Valor - ruim.go:104
  1. Interface Grande e Não Coesa - ruim.go:7
  2. Exposição de Detalhes de Implementação - ruim.go:16
  3. Dependência de Tipos Concretos - ruim.go:24
  4. Violação do ISP - ruim.go:33
  5. Uso Excessivo de interface{} - ruim.go:48
  6. Erro Personalizado Incorreto - ruim.go:54
  7. Container Genérico Ruim - ruim.go:65
  8. Embedding Excessivo - ruim.go:75

📁 03-Avançado

  1. Goroutines Sem Controle de Término - ruim.go:11
  2. Compartilhamento de Variáveis da Closure - ruim.go:21
  3. Número Excessivo de Goroutines - ruim.go:32
  4. Comunicação Através de Variáveis Compartilhadas - ruim.go:41
  5. Vazamento de Goroutines em Loops - ruim.go:58
  6. Panic em Goroutine Sem Recuperação - ruim.go:69
  7. CPU-Bound com Muitas Goroutines - ruim.go:82
  8. Sincronização Incorreta com WaitGroup - ruim.go:96
  9. Deadlock com Canais - ruim.go:110
  10. Ordem de Execução Não Garantida - ruim.go:120
  11. Timeout Mal Implementado - ruim.go:132
  12. Recurso Compartilhado Sem Proteção - ruim.go:146
  1. Canal Sem Buffer Quando Necessário - ruim.go:9
  2. Fechamento Múltiplo - ruim.go:21
  3. Envio para Canal Fechado - ruim.go:35
  4. Select Bloqueante - ruim.go:48
  5. Canal Compartilhado - ruim.go:58
  6. Direção Não Especificada - ruim.go:72
  7. Loop Infinito - ruim.go:78
  8. Range Sem Fechamento - ruim.go:90
  1. Uso de Timer Sem Cancelamento - ruim.go:9
  2. Operação Bloqueante Sem Context - ruim.go:19
  3. Ignorar Função Cancel de Context - ruim.go:27
  4. Context Como Interface Genérica - ruim.go:36
  5. Passar Context por Cópia Incorreta - ruim.go:42

📁 04-Casos Reais

  1. Side-Effects em Endpoints GET - ruim.go:11
  2. Vazamento de Dados Sensíveis - ruim.go:20
  3. Falta de Autenticação e Autorização - ruim.go:43
  4. Mistura de Responsabilidades - ruim.go:51
  5. Falta de Versionamento - ruim.go:72
  6. Ausência de Contratos Claros - ruim.go:79
  7. Falta de Tratamento de Erros Consistente - ruim.go:85
  1. Abrir e Fechar Conexão Por Requisição - ruim.go:11
  2. SQL Injection por Concatenação de Strings - ruim.go:21
  3. Ignorar Erros de Operações de Banco - ruim.go:31
  4. Transação Sem Rollback em Caso de Erro - ruim.go:47
  5. Falta de Context com Timeout - ruim.go:64
  6. Não Usar Prepared Statements - ruim.go:73
  7. Ausência de Migrations e Versionamento de Schema - ruim.go:80
  1. Testes Dependentes de Ordem e Estado Global - ruim.go:11
  2. Testes Lentos Sem Mocks - ruim.go:25
  3. Uso de Sleep em Testes - ruim.go:43
  4. Falta de Assertions e Validações - ruim.go:59
  5. Testes Não Isolados (Sem Setup/Teardown) - ruim.go:75
  6. Ausência de Table-Driven Tests - ruim.go:98
  7. Não Rodar com Race Detector - ruim.go:117
  8. Cobertura de Testes Não Medida - ruim.go:134
  9. Mocks Mal Implementados - ruim.go:151

Total: 87 anti-padrões documentados 🚫

Contribuindo

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.

Aviso

⚠️ O código em arquivos ruim.go é propositalmente ruim e NÃO deve ser usado em produção!

Rodando os Benchmarks (parte executável)

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:

  1. Inicialize o módulo (já incluí um go.mod mí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
  1. Baixe dependências (se houver):
go mod tidy
  1. Execute todos os benchmarks do projeto (recomendado):
go test -bench . ./exemplos/... -benchmem
  1. Executar benchmarks de um pacote específico (ex.: variables):
go test -bench . ./exemplos/01-basicos/variaveis -benchmem

Dicas:

  • 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.txt

Observaçã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.

Roadmap

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 →

Licença

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"

About

Um repositório para aprender Golang a partir dos piores exemplos possíveis (código fubango).

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Sponsor this project

 

Packages

 
 
 

Contributors

Languages