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.
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:
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ívelRepare 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:
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 combinarSão quinze linhas — quase um terço da folha — e nenhuma delas diz o que a Marina sabe fazer. Depois do corte, quatro linhas:
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.devA 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:
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 geralSete 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:
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:
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órioPreenchido, o primeiro projeto da Marina ficou assim:
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-sorrisoA 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:
- Objetivo profissional. Todo mundo escreve a mesma coisa, então não informa nada. O cargo no topo já fez esse trabalho.
- Dados pessoais. Nascimento, estado civil, nacionalidade, RG, CPF. Não ajuda na triagem e cria risco à toa.
- Resumo feito de adjetivos. “Proativa, dinâmica, esforçada” é a versão escrita de nada. Troque por três linhas de fato.
- 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.
- Cursos curtos em lista. Oito cursos de dez horas ocupam oito linhas e dizem menos que um projeto publicado.
- Hobbies e informações adicionais. Só entram se a vaga pedir cultura fit explicitamente, e mesmo aí em uma linha.
- 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:
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:
node caca-cliche.mjs antes.txtTrinta 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:
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:
node medir-curriculo.mjs antes.txtDuas 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:
node medir-curriculo.mjs depois.txtCabe, 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:
node medir-curriculo.mjs final.txtSobrar 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.
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 tradutorO 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:
diff -U0 final.txt vaga-react.txtQuatro 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.
DevClub no YouTubeProgramador INICIANTE - Como fazer um currículo perfeitoAssistir a aula
DevClub no YouTubeCURRÍCULO PERFEITO PARA CONSEGUIR EMPREGO COMO PROGRAMADORAssistir a aula
Perguntas frequentes
Currículo de programador pode ter duas páginas?
Preciso colocar foto no currículo?
Devo enviar em PDF ou em Word?
Como nomear o arquivo do currículo?
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?
Dúvidas e comentários
Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.
Entrar para perguntarÉ o mesmo login gratuito dos cursos.
Nenhuma dúvida por aqui ainda — a primeira pode ser a sua.
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
- GitHub Docs — Gerenciando o README do seu perfil — docs.github.com
- Node.js — fsPromises.readFile — nodejs.org



