Go é simples — e é exatamente por isso que ele atropela arquiteturas complicadas

A Dor Real — Quando a arquitetura pesa mais que o problema

Não existe nada mais irritante do que abrir um projeto e perceber que ele tem mais camadas que funcionalidade. A tal “arquitetura corporativa avançada” vira um castelo de cartas: DIP para todo lado, interfaces vazias, camadas que só repassam chamadas, e a famigerada “flexibilidade” que nunca é usada.

O pior é que o dev das trincheiras sofre. Debug fica lento. Código vira burocracia. A entrega do negócio emperra. **Complexidade acidental vira dívida técnica disfarçada de boas práticas.**

Go foi criado justamente para evitar isso. Como já disse Rob Pike, simplicidade é difícil. Mas quando você acerta, ela vira poder.

A Solução Pragmática — Go força você a pensar no essencial

Go não incentiva abstrações desnecessárias. Não pede herança. Não empurra mágica. Não permite que você esconda sua própria bagunça em uma floresta de padrões.

O resultado? Serviços diretos, legíveis, previsíveis e fáceis de manter.

Quando o foco do projeto é entregar valor e não montar um museu de padrões, Go brilha. Especialmente em sistemas distribuídos, concorrência e serviços de backend que precisam ser rápidos, confiáveis e simples de operar.

Implementação de Senior — Como a simplicidade se traduz no código

Aqui vai um exemplo direto de como criar um serviço HTTP limpo, testável e sem “gourmetizações”:

package main

import (
    "encoding/json"
    "log"
    "net/http"
)

type HealthResponse struct {
    Status string `json:"status"`
}

func healthHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(HealthResponse{Status: "ok"})
}

func main() {
    http.HandleFunc("/health", healthHandler)
    log.Println("Server running on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Sem framework gigantesco. Sem camadas artificiais. Só o necessário para entregar um endpoint funcional, claro e com manutenção barata.

Quer testar? É simples, porque a função é pura e direta.

func TestHealthHandler(t *testing.T) {
    req := httptest.NewRequest("GET", "/health", nil)
    w := httptest.NewRecorder()

    healthHandler(w, req)

    if w.Code != http.StatusOK {
        t.Fatalf("expected 200, got %d", w.Code)
    }
}

O código fala por si. Quando a linguagem já te empurra para o simples, abusar vira mais difícil.

O Custo da Escolha — Quando a simplicidade não é suficiente

Nem tudo são flores. Usar Go significa aceitar algumas trocas:

  • Você não tem herança nem generics complexos (e isso é bom na maior parte do tempo).
  • Frameworks “full stack” não são a vibe da linguagem — você vai precisar escrever mais código explícito.
  • Se sua equipe está acostumada a padrões pesados, a transição pode gerar atrito.

Mas o ponto é simples: **o custo de adotar Go quase sempre é menor que o custo causado por arquiteturas desnecessariamente complexas.**

Direto das Trincheiras — 3 lições reais

  • Se a camada existe apenas para “seguir padrões”, provavelmente ela não precisa existir.
  • Em Go, teste é substituto melhor de abstração. Teste muito, abstraia pouco.
  • Simplicidade não é falta de técnica — é disciplina para cortar tudo que não traz valor.

Fontes utilizadas

dotGo 2015 – Rob Pike – A simplicidade é complicada : r/golang,
Por que Go? : r/golang – Reddit,
Simplexity — A incrível missão de extrair a simplicidade da complexidade (GoCool),
Escreva um código Go melhor — ferramentas de análise estática

Obrigado por acompanhar essa reflexão até o fim!

Espero que esses pontos ajudem você a tomar decisões mais lúcidas no seu próximo projeto. Não deixe de conferir outros artigos aqui no blog, onde descasquemos outros hypes da nossa área.

Valeu e até a próxima! 😉

Facebook
Twitter
LinkedIn
Gestão Estratética de TI

O mito da ‘agilidade’ em 47 microserviços: por que sua equipe está ficando mais lenta

Quando uma equipe acha que dividir tudo em microserviços é sinônimo de maturidade técnica, o desastre já começou. O hype promete autonomia, escalabilidade e deploy contínuo. A realidade? Dependências cruzadas, arquitetura Frankenstein e metade da sprint resolvendo quebra-cabeças de infraestrutura. Neste artigo, eu — Rei Nascimento — explico como o uso excessivo de microserviços virou fábrica de dívida técnica e destruidor de foco. E, mais importante, mostro como sair desse buraco.

Mindset Ágil

Scrum Não é Cura Milagrosa: Como a Agilidade Mal Aplicada Está Quebrando Times Inteiros

Scrum virou mantra corporativo. Todo mundo repete, poucos entendem, e quase ninguém percebe o rastro de frustração, dívida técnica e desperdício que aparece quando se usa agilidade como religião. Neste artigo, falo direto das trincheiras: onde o método se perde, como resgatar o foco em valor real e por que times experientes estão abandonando cerimônias inúteis para voltar a priorizar contexto de negócio e entrega de software de verdade.

Test Driven Development

Quando Kubernetes Vira Inimigo da Simplicidade nas Startups

Startup não tem luxo para brincar de cloud enterprise. Ainda assim, vejo time pequeno se atolando em YAML, operators e clusters gerenciados que custam mais que a folha salarial. Kubernetes resolve problemas reais — mas quase nunca os problemas que uma startup tem no início. Neste artigo, vou direto à dor, sem gourmetização, mostrando onde o hype dói, como simplificar e como TDD ajuda a evitar a armadilha de arquiteturas grandes demais para negócios ainda pequenos.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *