MÓDULO 01 · CONCEITO 08 DE 8

GitHub Flow & PR workflow

Como times maduros operam: branches curtos, PRs pequenos, review como prática de design.

Tempo de leitura ~20 min Pré-requisito Git como ferramenta de pensamento Próximo Módulo 02 — Testes & TDD

Conhecer Git é necessário, mas não suficiente. A maior parte do seu trabalho como engenheiro sênior em time não é mexer em git rebase sozinho — é colaborar de forma que o resto do time consiga avançar com você sem se atrapalhar. Essa colaboração tem um nome convencional na indústria: pull request workflow. É o conjunto de práticas pelas quais mudanças propostas viram mudanças aceitas, no mais legível, revisável e seguro caminho possível.

Quem trata PR como "etapa burocrática antes do merge" perde a metade do valor. Quem trata como conversa técnica sobre design, espaço de aprendizado mútuo, e mecanismo de qualidade ganha cumulativamente. Times maduros têm PR culture que torna review uma das experiências mais formativas do dia. Times imaturos têm review como gargalo, ressentimento, e feedback raso. A diferença não é tempo investido — é como ele é investido.

GitHub Flow — o modelo simples que funciona

GitHub Flow é o workflow proposto pela própria GitHub em 2011, e adotado por enorme parte da indústria desde então. A regra é desconfortavelmente simples:

  1. Branch main é sempre deployable.
  2. Para qualquer mudança, crie um branch a partir de main.
  3. Faça commits no seu branch.
  4. Abra um Pull Request quando estiver pronto para discussão.
  5. Após review e CI verde, merge no main.
  6. Deploy.

Note o que não tem: nenhum branch develop, nenhum release/*, nenhum hotfix/*. A simplicidade é proposital — o overhead cerimonial do Git Flow é desnecessário quando main é deployable continuamente. Para times com CI/CD maduro, GitHub Flow é o caminho.

O tamanho do PR importa muito

A variável mais importante na qualidade de um PR é o seu tamanho. PRs grandes são quase inevitavelmente review ruim — e isso é estatisticamente bem-documentado. Estudos do Google e Microsoft mostram que efetividade de revisão cai dramaticamente após ~200 linhas de diff: revisores começam a "passar o olho" em vez de ler com atenção, deixam passar bugs óbvios, e dão feedback superficial.

A heurística prática:

Uma "feature" não-trivial frequentemente cabe em 5-10 PRs pequenos: um cria a interface, outro adiciona implementação básica, outro adiciona casos extra, outro adiciona telemetria, outro liga ao endpoint. Cada PR é verde, deployável, com escopo contido. Isso requer disciplina — e frequentemente feature flags para integrar peças incompletas — mas o ganho é grande.

heurística do sênior

Quando estiver começando uma feature grande, planeje os PRs antes de codar. "Isso vai virar 6 PRs: A, B, C, D, E, F." Isso muda como você escreve o código — em incrementos integráveis em vez de tudo emaranhado. É design no nível de processo.

Anatomia de um bom PR

Um PR bem-feito tem cinco partes que ajudam quem revisa:

1. Título descritivo

Mesma disciplina de mensagem de commit: imperativo, conciso, específico. "Add retry logic to PaymentClient" em vez de "updates" ou "fix bug". Lembre que esse título eventualmente vira parte do changelog ou release notes.

2. Descrição com contexto

Estrutura útil:

## Por quê
[Contexto: que problema isso resolve, motivação,
referência ao ticket/issue]

## O quê
[Mudanças principais. Bullet points são ok, mas seja
específica sobre intenção, não só listagem do diff]

## Como testar
[Passos para revisor reproduzir, ou link para teste
automático se claro o suficiente]

## Notas
[Decisões de design não-óbvias, trade-offs, alternativas
consideradas e descartadas]

Esse texto é especialmente valioso para mudanças não-triviais. Para PRs de uma linha (typo, lint), é overhead — não force. A regra: tanta descrição quanto for útil para quem vai revisar.

3. Commits limpos

Antes de abrir PR, limpe o histórico local com rebase interativo. Uma sequência de "WIP", "more fixes", "actually fix it" no histórico pollui a história permanentemente (mesmo após merge, se for via merge commit). Squash em commits atômicos antes de pedir review.

4. CI verde

Não submeta PR para review com CI vermelho. É desrespeitoso com o tempo do revisor — você está pedindo que ele revise código que você sabe que tem problema. Se está testando alguma coisa em CI antes do PR estar pronto, use draft PR (botão explícito no GitHub) que sinaliza "trabalho em andamento, ainda não revise".

5. Self-review antes de pedir review

Antes de marcar revisores, abra o seu próprio PR no GitHub e leia-o como se fosse de outra pessoa. Você vai pegar coisas: comentário desatualizado, debug print esquecido, função grande demais, nome ruim. Self-review é o momento em que você aplica a auto-crítica antes de gastar tempo de outros. ROI altíssimo.

Como fazer code review bem

Code review é tanto técnica quanto interpessoal. A versão técnica pergunta: o código está correto, está bem estruturado, está testável? A versão interpessoal pergunta: como dou feedback que ajuda em vez de aborrecer? Ambas importam.

O lado técnico — o que olhar

Hierarquia de prioridades em review:

  1. Correção: faz o que diz que faz? Tem bugs? Casos extremos cobertos?
  2. Segurança: introduz vulnerabilidade? Validação de input? Secrets em código? SQL injection?
  3. Design: estrutura faz sentido? Coesão e acoplamento ok? Está respeitando convenções do codebase?
  4. Testes: cobertura adequada para o que está mudando? Testes verificam comportamento, não implementação?
  5. Performance: alguma operação O(n²) no caminho quente? Query N+1 no ORM? Alocação excessiva?
  6. Legibilidade: nomes claros? Lógica fácil de seguir? Comentários onde necessário?
  7. Estilo: convenções de código? Linter passou? (Se linter passou, não comente sobre formatting — é trabalho de máquina).

Quando bater conflito entre estilo e correção, foque em correção primeiro. Comentários sobre estilo em PRs com bugs são sintoma de revisor que está passando o olho.

O lado interpessoal — como comentar

Princípios que valem internalizar:

Como receber review

Receber feedback bem é tão importante quanto dá-lo. Princípios:

Conventional Commits — disciplina automatizada

Conventional Commits é uma convenção de mensagens que dá estrutura máquina-legível ao histórico:

<type>[optional scope]: <description>

[optional body]

[optional footer(s)]

Tipos comuns:

Exemplos:

feat(auth): add support for refresh tokens

fix: prevent crash when user has no email

refactor!: rename UserService.find to findById

  BREAKING CHANGE: callers must update method name

O ! ou o footer BREAKING CHANGE: sinalizam mudanças incompatíveis. Ferramentas como semantic-release consomem isso para automaticamente bumpar versão (major em breaking, minor em feat, patch em fix), gerar changelog, e publicar releases. O custo é pequeno; o ganho em automação é grande.

Nem todo time adota Conventional Commits — funciona melhor em bibliotecas/SaaS publicado externamente. Para times internos, mensagens descritivas livres podem ser suficientes. Mas conhecer a convenção é útil — você vai encontrá-la em projetos open source.

CI/CD — o aliado silencioso

PR workflow só funciona bem com CI/CD funcionando bem. Mínimo aceitável em CI:

Plus desejável:

O ponto de tensão clássico: tempo de CI. Suíte de 30+ minutos significa que cada PR pequeno paga 30 min de espera para feedback. Time grande, muitas merges, fila acumula. Investir em paralelização, cache de dependências, testes mais rápidos é trabalho infraestrutural com retorno enorme. Times maduros têm engenheiros dedicados a isso (DevX, Developer Experience).

Branch protection — defesa explícita

No GitHub (e GitLab, e Bitbucket), você pode configurar branch protection em main: regras automatizadas que ninguém pode burlar acidentalmente:

Configurar isso uma vez, no início do projeto, evita uma série inteira de problemas. Mesmo em times pequenos onde "todos confiam um no outro", branch protection é red lines explícitas — protege contra erros acidentais (rebase no main esquecido, force push pra branch errada).

Como praticar

  1. Faça self-review num PR seu antes de marcar revisores. Pegue um PR aberto seu, faça o exercício de ler como estranho. Anote o que muda. Em duas semanas, vai virar reflexo.
  2. Ofereça-se para revisar PRs de áreas que você não conhece. Em codebase grande, sair da sua zona é onde você aprende. Comentar com perguntas em vez de afirmações funciona perfeitamente — você está de fato investigando.
  3. Reescreva uma feature sua em PRs pequenos. Pegue uma coisa que você fez em 1 PR de 2000 linhas. Reflita: como isso teria sido em 8 PRs de 250 linhas? Faça o exercício mental — você vai ver onde a feature flag, onde o caminho incremental, onde a interface primeiro. Esse exercício muda como você desenha próximas features.

O Módulo 01 fecha aqui. Você passou de fundamentos de código (Módulo 00) para fundamentos de sistema — processos, memória, I/O, rede, Linux, containers, Git, colaboração. Esses dois módulos juntos formam a base sobre a qual os próximos sete módulos vão construir: testes, bancos, concorrência, AOP, cache, escalabilidade, resiliência, comunicação, observabilidade, segurança, cloud, AI-assisted, e por fim system design. A trilha é longa; o terreno foi preparado.

Referências para aprofundar

  1. livro Accelerate — Forsgren, Humble, Kim (2018). Pesquisa quantitativa sobre o que diferencia times de alto desempenho. PR workflow e trunk-based aparecem com força. Leitura curta, formativa.
  2. livro The DevOps Handbook (2nd ed.) — Kim, Humble, Debois, Willis (2021). Tratamento amplo da prática moderna. Capítulos sobre PR, CI/CD, branch strategy.
  3. livro The Programmer's Brain — Felienne Hermans (2021). Sobre como cérebros lêem código — diretamente aplicável a code review. Por que reviews longos são ruins, cognitivamente.
  4. artigo How Google Does Code Review — Caitlin Sadowski et al. research.google/pubs/pub47340/ — paper sobre o sistema interno do Google. Heurísticas que escalam para milhões de mudanças/ano.
  5. artigo Best Practices for Code Review — SmartBear. smartbear.com/learn/code-review/best-practices-for-peer-code-review — síntese de pesquisa empírica sobre tamanho ideal de PR, fadiga de revisor, etc.
  6. artigo Conventional Comments. conventionalcomments.org — convenção para prefixar comentários em review (nit:, suggestion:, question:, blocker:). Leitura de 5 minutos.
  7. artigo Code Review Pyramid — Gunnar Morling. morling.dev/blog/the-code-review-pyramid/ — visualização útil da hierarquia de coisas para olhar em review. Fixe na cabeça.
  8. docs GitHub Flow. docs.github.com/en/get-started/using-github/github-flow — fonte primária do workflow. Curto, direto.
  9. docs Conventional Commits. conventionalcommits.org — especificação. Inclui FAQ útil.
  10. docs Google Engineering Practices Documentation. google.github.io/eng-practices/ — guia público do Google sobre code review. Texto curto, prático, formativo.
  11. vídeo How to Make Your Code Reviewer Fall in Love with You — Michael Lynch. YouTube. Apresentação carismática com heurísticas práticas para autor de PR. Boa para compartilhar com time.
  12. paper Modern Code Review at Microsoft — Bacchelli & Bird. FSE 2013. Estudo qualitativo de o que torna code review efetivo. Citado em quase tudo escrito depois.