Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA
LiçãoIniciantecódigo testado

Currículo de programador iniciante: o que cortar e o que pôr

A estrutura de uma página que recrutador brasileiro lê em 30 segundos, o que fazer sem experiência e as seções que só ocupam espaço.

Rodolfo Mori14 min de leitura

O currículo de uma pessoa desenvolvedora iniciante é um documento de evidências, não uma autobiografia. Em uma página, ele precisa responder a três perguntas: o que você sabe fazer, o que já construiu com isso e como entrar em contato.

Pense nele como a vitrine de uma loja pequena. Os melhores produtos ficam na altura dos olhos; o estoque inteiro não vai para a janela. Projetos publicados e resultados concretos ocupam a parte nobre; dados pessoais irrelevantes, objetivo genérico e barrinhas de habilidade saem. Na leitura técnica, essa vitrine vira uma sequência simples que recrutador e ATS conseguem percorrer sem desembaralhar colunas ou adivinhar o que “JavaScript 80%” significa.

Toda linha que não prova habilidade, entrega ou contato é candidata ao corte.

O currículo deste artigo é o da Marina, recepcionista há sete anos em uma clínica odontológica e em transição para front-end. Ela é um exemplo composto de um perfil frequente na trilha de carreira: experiência real fora de TI, projetos próprios recentes e nenhum emprego de dev no histórico. Nome, contato e link são fictícios de propósito — o que você copia é a estrutura, linha por linha.

Ao longo do caminho tem dois scripts em Node, curtos e copiáveis: um caça as frases vazias, o outro mede se o currículo cabe mesmo em uma folha A4. A saída dos dois é real, rodada nas duas versões — a de antes e a de depois.

A ordem das seções em uma página só

Quem tria currículo lê de cima para baixo e para quando encontra motivo para parar. Por isso a ordem importa mais que o conteúdo das últimas seções: as quinze primeiras linhas decidem se as outras trinta serão lidas.

Esta ordem coloca primeiro as provas mais úteis para quem ainda não trabalhou com programação:

text
1. Topo          nome, cargo pretendido, cidade, telefone, e-mail, GitHub, LinkedIn
2. Resumo        3 linhas: de onde você vem, para onde vai, o que já entregou
3. Projetos      2 ou 3, cada um com stack, decisão técnica e resultado
4. Experiência   o que você já fez, traduzido para linguagem de trabalho
5. Formação      curso em andamento conta; ensino médio só se for o único
6. Habilidades   uma linha de tecnologias + idioma, sem escala de nível

Repare que Projetos vem antes de Experiência. Essa inversão é o ponto inteiro do currículo de quem está começando: a seção mais forte tem que aparecer primeiro, e a sua seção mais forte é o que você construiu, não o balcão em que você trabalhou. Quem já tem emprego de dev inverte de volta.

O bloco de topo: nome, cargo, contato e nada mais

O topo do currículo da Marina começou assim:

text
CURRICULUM VITAE

Marina Bispo de Andrade
Data de nascimento: 14/03/1994 - 32 anos
Estado civil: casada
Nacionalidade: brasileira
RG: 41.882.309-7 / CPF: 388.221.470-05
Endereço: Rua das Acácias, 214, apto 32, Bloco B - Jardim São Bento - São Paulo/SP - CEP 04785-120
Telefone residencial: (11) 4002-8922
Celular / WhatsApp: (11) 98812-4477
E-mail: marininha_lindona94@hotmail.com
Skype: marininha.andrade
Carteira de motorista: categoria B
Disponibilidade para viagens: sim
Pretensão salarial: a combinar

São quinze linhas — quase um terço da folha — e nenhuma delas diz o que a Marina sabe fazer. Depois do corte, quatro linhas:

text
Marina Bispo de Andrade
Desenvolvedora Front-end (React) | São Paulo/SP | híbrido ou remoto
(11) 98812-4477 | marina.andrade.dev@gmail.com
github.com/marinabispo | linkedin.com/in/marinabispo | marinabispo.dev

A segunda linha é a que mais trabalha. Ela declara o cargo que você quer, não o cargo que você tem — é assim que a pessoa que abre o arquivo sabe em qual pilha te colocar em dois segundos. Cidade e modelo de trabalho entram na mesma linha porque muita vaga é filtrada por região antes de qualquer outra coisa.

O e-mail virou nome e sobrenome. Isso não é frescura: um endereço de adolescência é a primeira coisa que sinaliza descuido, e trocar custa cinco minutos.

Os três links do fim só valem se estiverem vivos. Perfil do GitHub sem README de apresentação e sem repositório com commit recente derruba mais do que levanta; outros materiais de candidatura ficam reunidos na categoria de carreira.

Sem experiência em TI: o que entra no lugar do histórico

A pergunta que mais aparece é essa: “não tenho experiência, o que eu coloco?”. A resposta é que você tem, sim — só não tem experiência paga em programação. E o espaço que sobra é ocupado por projeto.

O que vem logo depois do topo muda conforme a sua situação:

onde você está primeira seção depois do topo por quê
estudando, sem emprego de dev Projetos é a única prova de código que você tem
estagiando ou fazendo freela Experiência, com o freela em cima trabalho pago pesa mais que projeto de estudo
já foi dev e ficou um tempo fora Experiência o histórico responde sozinho
trabalha em TI, mas não programando Projetos, depois Experiência o suporte conta, mas não prova que você codifica

Essa tabela é minha leitura, não regra de mercado. O critério por trás dela é simples: primeiro vem a evidência mais difícil de forjar. Código publicado é difícil de forjar. Adjetivo, não.

Traduzir o emprego anterior para a linguagem de tecnologia

O erro clássico é achar que o emprego antigo não conta e despachá-lo numa lista de tarefas genéricas, como a Marina fez:

text
Clínica Odontológica Sorriso Vivo - São Paulo/SP
Recepcionista
Março de 2019 até os dias atuais
- Atendimento ao público
- Atendimento telefônico
- Agendamento de consultas
- Organização de documentos
- Recebimento de pagamentos
- Controle de estoque de materiais
- Apoio administrativo em geral

Sete bullets que descrevem qualquer recepção do Brasil. Ninguém aprende nada sobre a Marina lendo isso. A versão reescrita tem três linhas de conteúdo e conta uma história diferente:

text
Clínica Odontológica Sorriso Vivo - Recepcionista | 03/2019 - atual
  Opero o sistema de gestão da clínica: cadastro, agenda, convênio e emissão de guia.
  Escrevi o passo a passo de uso do sistema que hoje treina toda recepcionista nova.
  Automatizei a conferência diária de convênios em planilha, de 40 para 8 minutos.

A fórmula de cada linha é verbo na primeira pessoa + o que exatamente + o número que mudou. “Atendimento ao público” não tem nenhum dos três. “Automatizei a conferência diária de convênios, de 40 para 8 minutos” tem os três.

Alguns exemplos de tradução que valem para qualquer área de origem:

o que você fazia como quase todo mundo escreve como escrever
usava o sistema da empresa todo dia “Apoio administrativo em geral” “Opero o sistema de gestão: cadastro, agenda e emissão de guia”
ensinou o colega novo “Trabalho em equipe” “Escrevi o passo a passo que treina toda pessoa nova na função”
montou uma planilha esperta “Conhecimento em Excel avançado” “Automatizei a conferência diária, de 40 para 8 minutos”
aguentava o pico do movimento “Trabalho bem sob pressão” “Caixa em turno de pico, até 300 clientes por dia”

Nenhuma das linhas da direita é mentira nova: é a mesma verdade, escrita de um jeito que dá para conferir. Esse é o teste — se ninguém consegue conferir, não está pronto.

Projeto no currículo: três linhas e um resultado

Projeto listado como “Projeto de agendamento — React” não vale a linha que ocupa. O formato que funciona é um cabeçalho, três linhas de conteúdo e os links:

text
Nome do projeto - o que é e para quem (stack principal)
  Contexto: quem usa, quantos, com que frequência.
  Decisão técnica: o problema difícil e como você resolveu.
  Resultado: o número que mudou, ou o comportamento que mudou.
  link do deploy | link do repositório

Preenchido, o primeiro projeto da Marina ficou assim:

text
Agenda Sorriso - agendamento de consultas (React, Vite, Node, PostgreSQL)
  Substituiu a agenda de papel da clínica: 4 dentistas, 380 consultas por mês.
  Horário em conflito é bloqueado no back-end; remarcação por duplicidade caiu de 11
  para 2 casos no primeiro mês.
  marinabispo.dev/agenda | github.com/marinabispo/agenda-sorriso

A linha da decisão técnica é a que separa projeto de portfólio de projeto de tutorial. “Bloqueado no back-end” diz que ela pensou em validação do lado certo; qualquer pessoa técnica lê isso e já tem a primeira pergunta da entrevista.

Vale escolher projetos que nasçam de um problema que você viveu. Os três da Marina saíram da recepção onde ela trabalha, e é por isso que ela consegue falar de número de consulta e de taxa de falta sem inventar nada. Se ainda precisa de um projeto para demonstrar, comece por uma aplicação pequena e publicável, como o passo a passo de React com Vite.

As sete seções que o recrutador pula

Estas são as seções que eu corto primeiro, sempre, e o motivo de cada uma:

  1. Objetivo profissional. Todo mundo escreve a mesma coisa, então não informa nada. O cargo no topo já fez esse trabalho.
  2. Dados pessoais. Nascimento, estado civil, nacionalidade, RG, CPF. Não ajuda na triagem e cria risco à toa.
  3. Resumo feito de adjetivos. “Proativa, dinâmica, esforçada” é a versão escrita de nada. Troque por três linhas de fato.
  4. Escala de nível de habilidade. Barrinha, estrelinha ou “básico/intermediário/avançado”: o seu intermediário não é o meu. Liste as tecnologias e deixe o projeto mostrar a profundidade.
  5. Cursos curtos em lista. Oito cursos de dez horas ocupam oito linhas e dizem menos que um projeto publicado.
  6. Hobbies e informações adicionais. Só entram se a vaga pedir cultura fit explicitamente, e mesmo aí em uma linha.
  7. Referências e “disponíveis mediante solicitação”. Ninguém liga antes da entrevista, e a frase ocupa espaço para dizer o óbvio.

Cinco desses sete dá para caçar por texto: o 1, o 2, o 3, o 6 e o 7. Este script varre um currículo salvo em .txt e aponta os adjetivos vazios e os dados que deveriam sair:

js
import { readFile } from 'node:fs/promises';

// Adjetivo que toda pessoa escreve e ninguém comprova.
const VAZIOS = [
  'proativ', 'dinâmic', 'esforçad', 'dedicad', 'comunicativ', 'pontual',
  'organizad', 'vontade de aprender', 'trabalho em equipe', 'sob pressão',
  'empresa sólida', 'crescer profissionalmente', 'relacionamento interpessoal',
  'facilidade para aprender', 'superação de metas', 'busco uma oportunidade',
];

// Dado que só serve para expor você — ou para o recrutador nem precisar ler.
const NAO_DEVERIA_ESTAR = [
  'cpf', 'rg:', 'estado civil', 'data de nascimento', 'nacionalidade',
  'pretensão salarial', 'referências', 'skype', 'telefone residencial',
  'carteira de motorista', 'hobbies', 'curriculum vitae', 'endereço:',
];

const arquivo = process.argv[2];
const linhas = (await readFile(arquivo, 'utf8')).replace(/\n$/, '').split('\n');

const achados = { vazio: [], dado: [] };

linhas.forEach((linha, i) => {
  const minuscula = linha.toLowerCase();
  for (const termo of VAZIOS) {
    if (minuscula.includes(termo)) achados.vazio.push({ linha: i + 1, termo });
  }
  for (const termo of NAO_DEVERIA_ESTAR) {
    if (minuscula.includes(termo)) achados.dado.push({ linha: i + 1, termo });
  }
});

console.log(`arquivo: ${arquivo}`);
console.log(`adjetivo vazio: ${achados.vazio.length} ocorrência(s)`);
for (const a of achados.vazio) console.log(`  linha ${a.linha}: "${a.termo}"`);
console.log(`dado que sai do currículo: ${achados.dado.length} ocorrência(s)`);
for (const a of achados.dado) console.log(`  linha ${a.linha}: "${a.termo}"`);

Rodando na versão original da Marina:

bash
node caca-cliche.mjs antes.txt
arquivo: antes.txt adjetivo vazio: 18 ocorrência(s) linha 19: "empresa sólida" linha 19: "busco uma oportunidade" linha 20: "proativ" linha 20: "crescer profissionalmente" linha 21: "dinâmic" linha 21: "trabalho em equipe" linha 21: "superação de metas" linha 25: "proativ" linha 25: "dinâmic" linha 25: "esforçad" linha 25: "dedicad" linha 25: "comunicativ" linha 25: "pontual" linha 25: "organizad" linha 26: "vontade de aprender" linha 26: "sob pressão" linha 26: "relacionamento interpessoal" linha 96: "facilidade para aprender" dado que sai do currículo: 13 ocorrência(s) linha 1: "curriculum vitae" linha 4: "data de nascimento" linha 5: "estado civil" linha 6: "nacionalidade" linha 7: "cpf" linha 7: "rg:" linha 8: "endereço:" linha 9: "telefone residencial" linha 12: "skype" linha 13: "carteira de motorista" linha 15: "pretensão salarial" linha 96: "hobbies" linha 99: "referências"

Trinta e uma ocorrências, concentradas em três parágrafos e num bloco de topo. Não é falta de capricho: é o modelo de currículo que a escola ensinou, e que continua sendo copiado. Na versão reescrita o mesmo script devolve zero dos dois lados.

Medir se cabe mesmo em uma página

“Uma página” costuma virar palpite. Dá para medir. Uma folha A4 em retrato tem 297 mm de altura e 210 mm de largura; com margem de 20 mm de cada lado sobram 257 mm de altura útil e 170 mm de largura útil. Numa fonte proporcional de 11 pt com entrelinha 1,25, cada linha ocupa cerca de 4,85 mm de altura, e cada caractere ocupa em média meio em de largura.

Isso vira um script que conta quantas linhas o seu texto realmente ocupa — e linha comprida não some, ela quebra e vira duas:

js
import { readFile } from 'node:fs/promises';

// Modelo da folha: A4 em retrato, fonte proporcional de 11pt.
const FOLHA = {
  alturaUtilMm: 257, // 297mm de A4 menos 20mm de margem em cima e embaixo
  larguraUtilMm: 170, // 210mm de A4 menos 20mm de margem de cada lado
  fontePt: 11,
  entrelinha: 1.25,
  larguraMediaDoCaractereEm: 0.5, // média de Arial/Calibri em texto corrido
};

const PT_EM_MM = 25.4 / 72;
const alturaDaLinhaMm = FOLHA.fontePt * FOLHA.entrelinha * PT_EM_MM;
const larguraDoCaractereMm = FOLHA.fontePt * FOLHA.larguraMediaDoCaractereEm * PT_EM_MM;

const colunaEmCaracteres = Math.floor(FOLHA.larguraUtilMm / larguraDoCaractereMm);
const linhasPorFolha = Math.floor(FOLHA.alturaUtilMm / alturaDaLinhaMm);

const arquivo = process.argv[2];
const texto = await readFile(arquivo, 'utf8');
const linhas = texto.replace(/\n$/, '').split('\n');

// Linha longa não some: ela quebra e ocupa duas alturas de linha na folha.
let alturaEmLinhas = 0;
const estouram = [];

linhas.forEach((linha, i) => {
  const ocupa = linha.length === 0 ? 1 : Math.ceil(linha.length / colunaEmCaracteres);
  alturaEmLinhas += ocupa;
  if (ocupa > 1) estouram.push({ numero: i + 1, caracteres: linha.length, ocupa });
});

const folhas = alturaEmLinhas / linhasPorFolha;

console.log(`arquivo: ${arquivo}`);
console.log(`coluna:  ${colunaEmCaracteres} caracteres | folha: ${linhasPorFolha} linhas`);
console.log(`escrito: ${linhas.length} linhas | impresso: ${alturaEmLinhas} linhas`);
console.log(`ocupa:   ${folhas.toFixed(2)} folha(s) -> ${folhas <= 1 ? 'CABE' : 'NAO CABE'}`);

if (estouram.length) {
  console.log(`linhas que quebram (${estouram.length}):`);
  for (const l of estouram) {
    console.log(`  linha ${l.numero}: ${l.caracteres} caracteres, vira ${l.ocupa} linhas`);
  }
}

O currículo original, medido:

bash
node medir-curriculo.mjs antes.txt
arquivo: antes.txt coluna: 87 caracteres | folha: 52 linhas escrito: 103 linhas | impresso: 113 linhas ocupa: 2.17 folha(s) -> NAO CABE linhas que quebram (10): linha 8: 98 caracteres, vira 2 linhas linha 19: 97 caracteres, vira 2 linhas linha 20: 97 caracteres, vira 2 linhas linha 21: 99 caracteres, vira 2 linhas linha 25: 101 caracteres, vira 2 linhas linha 26: 96 caracteres, vira 2 linhas linha 27: 97 caracteres, vira 2 linhas linha 62: 95 caracteres, vira 2 linhas linha 96: 100 caracteres, vira 2 linhas linha 97: 98 caracteres, vira 2 linhas

Duas folhas e um pedaço. E repare em quais linhas estouram: 8 é o endereço completo, 19 a 21 é o objetivo profissional, 25 a 27 é o resumo de adjetivos, 96 e 97 são as informações adicionais. Nove das dez linhas que transbordam estão justamente nas seções que a gente decidiu cortar — largura demais e conteúdo demais costumam ser o mesmo defeito, visto de dois ângulos.

A décima é a exceção que ensina o resto: a linha 62 é o curso de Análise e Desenvolvimento de Sistemas, e essa linha fica. Quando o conteúdo é necessário e mesmo assim estoura, o corte deixa de ser na seção e passa a ser na redação da linha — é o que acontece com ela daqui a pouco.

Depois da reescrita, com a mesma medida:

bash
node medir-curriculo.mjs depois.txt
arquivo: depois.txt coluna: 87 caracteres | folha: 52 linhas escrito: 44 linhas | impresso: 46 linhas ocupa: 0.88 folha(s) -> CABE linhas que quebram (2): linha 13: 88 caracteres, vira 2 linhas linha 39: 88 caracteres, vira 2 linhas

Cabe, mas duas linhas ainda passam um caractere do limite — uma delas por causa de “da clínica onde trabalho”, a outra por causa de “Universidade Cruzeiro do Sul” por extenso. Essa segunda é a velha conhecida: é a mesma linha 62 que estourava na versão original, e que sobreviveu ao corte de seções. “Univ. Cruzeiro do Sul” resolve sem perder informação nenhuma. Encurtando as duas, o arquivo bate exatamente com o que foi escrito:

bash
node medir-curriculo.mjs final.txt
arquivo: final.txt coluna: 87 caracteres | folha: 52 linhas escrito: 44 linhas | impresso: 44 linhas ocupa: 0.85 folha(s) -> CABE

Sobrar 15% da folha é bom. É a margem que absorve a fonte um pouco maior, o cabeçalho que o exportador acrescenta e a linha extra que você vai querer somar no mês que vem.

O currículo inteiro, do jeito que foi enviado

Este é o arquivo completo, as 44 linhas medidas acima. É o template: troque os dados, mantenha a estrutura.

text
Marina Bispo de Andrade
Desenvolvedora Front-end (React) | São Paulo/SP | híbrido ou remoto
(11) 98812-4477 | marina.andrade.dev@gmail.com
github.com/marinabispo | linkedin.com/in/marinabispo | marinabispo.dev

RESUMO
Recepcionista há 7 anos em clínica odontológica, em transição para desenvolvimento
front-end. Publiquei três aplicações em React que resolvem problemas que eu vivi na
recepção: agendamento, fila de espera e relatório de faltas.

PROJETOS
Agenda Sorriso - agendamento de consultas (React, Vite, Node, PostgreSQL)
  Substituiu a agenda de papel da clínica: 4 dentistas, 380 consultas por mês.
  Horário em conflito é bloqueado no back-end; remarcação por duplicidade caiu de 11
  para 2 casos no primeiro mês.
  marinabispo.dev/agenda | github.com/marinabispo/agenda-sorriso

Fila Viva - painel de chamada da sala de espera (React, WebSocket)
  Painel em TV que chama o paciente por senha e atualiza sem recarregar a página.
  Em uso há 4 meses na recepção; acabou com a chamada em voz alta.
  github.com/marinabispo/fila-viva

Faltômetro - relatório de faltas por convênio (JavaScript, Chart.js, CSV)
  Lê o CSV do sistema da clínica e mostra falta por convênio e por dia da semana.
  Expôs 34% de falta nas segundas de manhã, que virou política de confirmação no dia
  anterior.
  github.com/marinabispo/faltometro

EXPERIÊNCIA
Clínica Odontológica Sorriso Vivo - Recepcionista | 03/2019 - atual
  Opero o sistema de gestão da clínica: cadastro, agenda, convênio e emissão de guia.
  Escrevi o passo a passo de uso do sistema que hoje treina toda recepcionista nova.
  Automatizei a conferência diária de convênios em planilha, de 40 para 8 minutos.

Padaria Pão de Ouro - Atendente de balcão | 01/2016 - 02/2019
  Caixa e atendimento em turno de pico, até 300 clientes por dia.

FORMAÇÃO
Análise e Desenvolvimento de Sistemas - Univ. Cruzeiro do Sul - conclusão 12/2027
Formação Front-end - DevClub - 2025 (HTML, CSS, JavaScript, React, Git)

HABILIDADES
JavaScript, React, HTML, CSS, Git e GitHub, Node.js, PostgreSQL, consumo de API REST
Inglês: leio documentação técnica sem tradutor

O ensino médio e o técnico em administração saíram, e o estágio de 2014 também. Nada disso é vergonha: é só informação que perdeu a vez quando surgiu coisa mais recente e mais relevante. A padaria ficou porque atendimento em pico é um dado concreto; a loja de 2015 saiu porque repetia o mesmo tipo de tarefa com menos força.

O mesmo currículo, recortado para uma vaga específica

Enviar o mesmo arquivo para cinquenta vagas é o jeito mais rápido de não ser chamado para nenhuma. Mas adaptar também não é reescrever tudo — na prática são quatro ou cinco linhas.

Suponha uma vaga que pede React, TypeScript, consumo de API REST e cita teste como diferencial. Comparando o currículo base com a versão recortada:

bash
diff -U0 final.txt vaga-react.txt
--- final.txt 2026-08-22 16:09:04 +++ vaga-react.txt 2026-08-22 16:09:55 @@ -2 +2 @@ -Desenvolvedora Front-end (React) | São Paulo/SP | híbrido ou remoto +Desenvolvedora Front-end Júnior - React e TypeScript | São Paulo/SP | híbrido @@ -7,3 +7,3 @@ -Recepcionista há 7 anos em clínica odontológica, em transição para desenvolvimento -front-end. Publiquei três aplicações em React que resolvem problemas que eu vivi na -recepção: agendamento, fila de espera e relatório de faltas. +Recepcionista há 7 anos em clínica odontológica, em transição para front-end. Três +aplicações React publicadas, todas consumindo API REST própria; a mais recente foi +migrada para TypeScript e tem teste automatizado nas regras de agendamento. @@ -14,2 +14,2 @@ - Horário em conflito é bloqueado no back-end; remarcação por duplicidade caiu de 11 - para 2 casos no primeiro mês. + Horário em conflito é bloqueado no back-end e coberto por teste (Vitest); a + remarcação por duplicidade caiu de 11 para 2 casos no primeiro mês. @@ -43 +43 @@ -JavaScript, React, HTML, CSS, Git e GitHub, Node.js, PostgreSQL, consumo de API REST +React, TypeScript, JavaScript, consumo de API REST, Git e GitHub, Vitest, HTML, CSS

Quatro trechos: a linha de cargo, o resumo, uma linha de projeto e a linha de habilidades. O resto do arquivo é idêntico. Em cinco minutos você tem uma versão que fala a língua daquela vaga.

O limite é rígido: só entra no recorte o que já é verdade. Se o projeto não tivesse teste, a linha do teste não existiria, e a adaptação teria ficado no cargo e na ordem das habilidades — o que já ajuda. Currículo adaptado é recorte do que existe, não vitrine do que a vaga pediu.

A ordem das habilidades também mudou: React e TypeScript foram para a frente porque é assim que quem lê procura. Ler o anúncio antes é o passo que muita gente pula. Na triagem automática, mantenha uma coluna, texto selecionável e os termos verdadeiros da vaga; não esconda palavra-chave em imagem ou gráfico.

O que fazer com o seu hoje

Exporte o seu currículo atual para .txt, rode os dois scripts nele e olhe os números antes de mudar qualquer coisa. Depois faça três cortes na ordem: objetivo, dados pessoais, escala de nível. Só então reescreva a experiência linha por linha, com verbo e número.

Para verificar a melhora, escolha uma vaga real e marque no anúncio cinco termos que você de fato domina. Eles devem aparecer naturalmente no cargo, resumo, projeto ou habilidades do PDF. Extraia o PDF novamente como texto e confirme a ordem; depois cronometre uma leitura de 30 segundos. Ao terminar, você precisa conseguir repetir cargo, dois projetos e um resultado sem voltar ao documento.

Quando a página estiver de pé, faça o LinkedIn contar a mesma história — os dois são lidos juntos, e uma contradição entre eles custa caro. O caminho do estudo à candidatura está na categoria de carreira, e as lições em ordem ficam na trilha de carreira.

Prefere aprender em vídeo?

Tem aula sobre este assunto no nosso canal.

Ver todos os vídeos do canal
  • carreira
  • curriculo
  • primeiro emprego
  • recrutamento

Perguntas frequentes

Currículo de programador pode ter duas páginas?
Para quem está começando, não. Duas páginas só se justificam com muitos anos de experiência relevante, e mesmo aí a segunda página costuma ser histórico antigo que ninguém lê. Se o seu está em duas, o problema quase nunca é falta de espaço — é excesso de linha que não prova nada.
Preciso colocar foto no currículo?
Não. Em vaga de tecnologia no Brasil a foto não é esperada, ocupa espaço útil e abre uma porta para viés que não te ajuda em nada. A exceção é a empresa pedir explicitamente no formulário da vaga.
Devo enviar em PDF ou em Word?
PDF, sempre, a não ser que a vaga peça outra coisa. O .docx muda de formatação conforme a versão do Word de quem abre, e um currículo que chega com a diagramação quebrada perde a briga antes de ser lido.
Como nomear o arquivo do currículo?
Nome e cargo, sem acento e sem espaço - por exemplo marina-andrade-front-end.pdf. Quem recebe salva dezenas de arquivos na mesma pasta, e "curriculo.pdf" ou "cv_atualizado_final2.pdf" some.
Aquele template bonito de duas colunas atrapalha?
Pode atrapalhar. Muita triagem automática lê o PDF como um fluxo único de texto e embaralha as duas colunas, misturando habilidade com data. Uma coluna só, com texto de verdade e não caixas de imagem, chega inteira dos dois lados.

Dúvidas e comentários

Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.

Todo o código deste artigo foi executado em Node 24.16.0, e as saídas exibidas são as reais — como produzimos este conteúdo.

Fontes consultadas

  1. GitHub Docs — Gerenciando o README do seu perfil — docs.github.com
  2. Node.js — fsPromises.readFile — nodejs.org

Continue por aqui