Destino Dev

Blog

Entrevistas de pair programming: praticar, ferramentas e exercícios reais

Por John Pires · 14 de março de 2026

Entrevistas de pair programming: praticar, ferramentas e exercícios reais

Quando e por que usar

Contexto de entrevistas e sinais para pair programming

Pair programming em entrevistas é usado quando o avaliador quer observar não só o resultado do código, mas o processo de tomada de decisão, comunicação e colaboração. Empresas que valorizam integração rápida com times e revisão contínua preferem esse formato: ele revela como o candidato explica raciocínio, aceita sugestões e resolve impedimentos em tempo real.

Se você tem entre 1 e 3 anos de experiência, já conhece sintaxe, estruturas de dados básicas e padrões comuns. A diferença nos exercícios de pair interviewing está em expor como você pensa e em mudar rapidamente de papel entre driver e navigator.

Benefício prático para quem contrata e quem entrevista

Do lado do recrutador, pair programming diminui ruído: problemas de ambiente local ou mau entendimento do problema são visíveis e podem ser corrigidos na hora. Para o candidato, é oportunidade para demonstrar clareza, uso de ferramentas, testes e disciplina para manter commits limpos e incrementais.

Usar pair programming durante entrevistas evita avaliações superficiais baseadas em solucionar um problema isolado; permite checar habilidades essenciais como depuração, leitura de código e adaptação a constraints do projeto.

Comparacao com alternativas

Pair vs. teste take-home

Teste take-home dá tempo e ambiente controlado, mas pode mascarar colaboração indevida e não mostra como o candidato se comunica em tempo real. Pair revela a capacidade de articular decisões, aceitar feedback e lidar com pressão imediata.

Se o objetivo for avaliar trabalho solo profundo, take-home é melhor. Para avaliar integração com time, pair é superior.

Pair vs. whiteboard e system design

Whiteboard foca pensamento arquitetural sem código executável; system design avalia visão de alto nível. Pair oferece um meio-termo: mostra modelagem, design e habilidade de transformar ideias em código que roda ou passa em testes unitários.

Preferir pair quando a vaga exige entrega contínua, revisão ativa e conhecimento prático de ferramentas e fluxos de trabalho do dia a dia.

Implementacao progressiva

Setup inicial e contratos de comunicação

Antes da sessão, definir regras claras reduz ruído: tempo total, duração de trocas de papel, quem comanda o teclado por X minutos e quando se muda. Um contrato simples funciona: 15 minutos de exploração, 30 minutos de implementação com trocas a cada 10 minutos, 15 minutos de revisão e perguntas.

Defina expectativas sobre o ambiente: linguagem permitida, frameworks, se testes são obrigatórios e se o compartilhamento será em editor remoto ou via sessão local com vídeo. Isso evita surpresa durante a avaliação.

Exercícios progressivos para praticar

Treine com exercícios incrementais: começar com pequenas refatorações, depois adicionar uma feature simples, por fim resolver um bug que envolve leitura de código legado. Essa progressão simula o dia a dia e permite treinar padrões de comunicação técnica.

Aqui vão exemplos que você pode praticar em pares. Cada exemplo tem contexto, objetivos e critérios mínimos de aceitação.

  1. Refactor: tornar um endpoint mais legível sem alterar comportamento.
  2. Feature: adicionar paginacao e testes ao endpoint existente.
  3. Bugfix: diagnosticar e corrigir leaking de memória em um loop assíncrono.

Exemplo de exercício 1: implementar e testar um endpoint simples

Contexto: sistema mínimo Express que armazena usuários em memória. Objetivo: adicionar POST /users com validação simples e teste unitario usando jest. Critério: 201 criado com body validado e teste cobrindo caso feliz e caso de validação.

O bloco abaixo cria o handler. Após rodar, requests POST com body valido retornam 201 e objeto criado.

const express = require('express')
const bodyParser = require('body-parser')

const app = express()
app.use(bodyParser.json())

const users = []

app.post('/users', (req, res) => {
  const { name, email } = req.body
  if (!name || !email || !email.includes('@')) {
    return res.status(400).json({ error: 'invalid payload' })
  }
  const user = { id: users.length + 1, name, email }
  users.push(user)
  return res.status(201).json(user)
})

module.exports = app

O que acontece depois: o servidor aceita posts e armazena dados na variável users. Em pairing, o navigator pergunta sobre validações adicionais, e o driver implementa testes e refatorações incrementais.

Integracao com ecossistema real

Ferramentas para sessões remotas e locais

Escolha a ferramenta conforme o foco:

  • Para edição colaborativa em tempo real: VS Code Live Share ou CodeTogether.
  • Para pair em terminal: tmux com sessão compartilhada ou tmate.
  • Para ambiente isolado: GitHub Codespaces ou Gitpod quando quiser reproduzir config de projeto.

Cada ferramenta muda a dinâmica: Live Share facilita mover o cursor entre participantes; tmux exige comunicação verbal sobre mudanças. Pratique ambas modalidades.

Fluxo de trabalho com git durante pair

Manter commits pequenos e atômicos é crucial. Combine branch por feature, commits incrementais e mensagens claras. Use co-authored-by para atribuir trabalho quando ambos contribuíram diretamente.

Exemplo prático de comandos para um par trabalhando no mesmo branch remoto, com commits incrementais e co-author:

# iniciar branch
git checkout -b feature/add-users

# primeiro commit pelo driver
git add src/users.js
git commit -m 'add basic users endpoint'

# quando navigator acrescenta testes
git add tests/users.test.js
git commit -m 'add tests for users endpoint'

# ao encerrar a sessao, combinar autoria
git commit --amend --no-edit --author='Nome Par <par@example.com>'

# ou usar trailer
git commit -m 'finalize users feature

Co-authored-by: Nome Par <par@example.com>'

O que acontece depois: o repositório registra contribuições de ambos. Em entrevistas, explicar esse fluxo mostra disciplina em controle de versionamento e colaboração.

Integração com CI e testes automatizados

Durante a sessão, mostre que você sabe rodar testes localmente e interpretar falhas de CI. Se o projeto tem pipeline CI, simule commits que rodem testes e corrija falhas rapidamente. Isso demonstra responsabilidade com qualidade.

Se não houver CI disponível na entrevista, explique como você escreveria um pipeline mínimo: instalar dependências, executar lint, rodar testes e gerar cobertura. Saber priorizar falhas críticas é diferencial.

Checklist de qualidade para producao

Critérios mínimos a demonstrar em uma sessão de pair

Use este checklist durante a prática para garantir que você mostra o essencial:

  • Explique o problema antes de codificar.
  • Faça commits pequenos e bem descritos.
  • Rode testes e interprete falhas.
  • Faça refactorings seguros com testes cobrindo mudanças críticas.
  • Troque de papel regularmente (driver/navigator).

Demonstrar atenção a esses pontos reduz fricção e evidencia mindset de produção desde a entrevista.

Erros comuns, armadilhas e dicas praticas

Seja explícito sobre suposições. Se você precisa instalar algo ou rodar um comando, descreva e peça permissão antes de executar no ambiente do entrevistador.

Erros que vejo com frequência em candidatos intermediários:

  • Começar a codar sem uma rápida estratégia de solução.
  • Cometer grandes blocos de mudança sem testes; torna revisão difícil.
  • Ignorar a troca de papéis: o candidato fica no teclado o tempo todo e perde pontos de colaboração.

Dicas práticas:

  1. Use TDD em exercícios pequenos: escreva um teste que falha, implemente e refatore.
  2. Se a rede está lenta, sincronize o que cada um fará para evitar sobreposição.
  3. Documente decisões rápidas no PR/commit para que o avaliador veja raciocínio.

Exemplo de exercício 2: teste que guia implementação (TDD simples)

Contexto: você escreve um teste que descreve comportamento desejado de função que filtra emails válidos. Implementar a função até o teste passar.

// tests/emailFilter.test.js
const { filterValid } = require('../src/emailFilter')

test('filters only valid emails', () => {
  const input = ['a@x.com', 'nope', 'b@z.org']
  const out = filterValid(input)
  expect(out).toEqual(['a@x.com', 'b@z.org'])
})

// src/emailFilter.js
function filterValid(list) {
  return list.filter(e => typeof e === 'string' && e.indexOf('@') > 0)
}

module.exports = { filterValid }

O que acontece depois: rodando jest o teste passa. Em pair, discuta bordas, performance e possíveis internacionalizacoes do criterio de validação.

Conclusao pratica

Pair programming em entrevistas é uma ferramenta direta para avaliar colaboração, comunicação e entrega. Pratique com exercícios progressivos, domine ferramentas como Live Share e tmux, e mantenha disciplina com git e testes. Mostrar que você pode explicar decisões, dividir trabalho e adaptar-se rapidamente é mais valioso que entregar uma solução perfeita em silêncio.

Use o checklist apresentado nas suas sessões de preparação: explique o problema, escreva testes, faça commits pequenos, troque de papel e registre coautoria quando aplicável. Esses hábitos replicam o fluxo de trabalho em times reais e aumentam sua chance de sucesso.

Pratique os exemplos fornecidos, altere constraints (tempo, ambiente, linguagem) e repita até que a comunicação e os passos técnicos fiquem automáticos. Entrevistas de pair são menos sobre acertar tudo e mais sobre demonstrar como você trabalha em equipe sob pressão.

Resumo das ações imediatas para treinar hoje:

  • Configurar Live Share e tmux e testar uma sessão com um colega.
  • Rodar os dois exercícios de código em par, alternando driver a cada 10 minutos.
  • Simular um PR com commits atômicos e mensagens claras, incluindo trailer Co-authored-by.

Boa prática: grave a sessão (quando permitido) e reveja 10 minutos para identificar padrões de comunicação que podem melhorar. Pequenas mudanças — pedir mais contexto, resumir decisões, confirmar antes de refatorar — trazem ganhos imediatos na percepção do entrevistador.

Assuntos: Carreira, pair-programming, entrevistas-tecnicas, Git, vscode, tdd

Leia também