Escolar Documentos
Profissional Documentos
Cultura Documentos
ENTREVISTAS DE
PROGRAMAÇÃO
autor: github.com/leandromoreira
——————————————————————————————————————————
PREPARAÇÃO PARA ENTREVISTAS DE PROGRAMAÇÃO...................................................... 1
TLDR;............................................................................................................................................ 3
você só tem um mês................................................................................................................3
você tem mais tempo...............................................................................................................3
introdução, rejeição e consistência................................................................................................4
processo e planejamento...............................................................................................................6
início da entrevista antes de escrever qualquer código...........................................................8
no meio da entrevista enquanto codifica................................................................................. 8
entender versus aprender............................................................................................................10
repetição espaçada................................................................................................................11
conhecimento em ondas........................................................................................................ 11
recomendação de introdução: estrutura de dados, algoritmos e big oh......................................13
introdução a complexidade algorítmica - big oh.................................................................... 13
introdução a algoritmos e estrutura de dados....................................................................... 14
prática de exercício......................................................................................................................16
pratica de mock........................................................................................................................... 17
recomendação de exercícios.......................................................................................................19
TLDR;
Eis aqui (mais) um guia de como se preparar para entrevistas de código focado em empresas
no estilo FAANG. As sugestões que descrevo e recomendo são sob o meu ponto de vista,
portanto tudo que ler aqui coloque mentalmente "na minha opinião"1 antes de cada parágrafo.
As ideias que apresento "funcionaram" pra mim mas não hesite em adaptar para o seu
contexto. Primeiro alguns pontos que são importantes reconhecer.
● Tenha consciência de que falhar em entrevistas é mais comum do que parece. Ouvi
diversas vezes de pessoas que recrutam que é natural falhar 2x, 3x ou 4x e até casos
de 8x e isto não tem relação com ser uma pessoa inteligente/competente ou não.
○ Muitas amigas e amigos que considero geniais e talentosas não passaram em
alguns destes processos. Enfim, isso é muito habitual.
● Existem empresas que fazem entrevistas mas sem formalmente exigir este estilo de
desafio de programação.2
● Só consegui passar depois de falhar numerosas vezes e persistir/insistir com
consistência em estudar/praticar e simular; que é o que vou descrever aqui.
1
2
no caso na minha, não na sua pessoa que lê 😛
normalmente existem mais tipos de entrevistas como system design, soft skills, e etc
Não acredito em fórmula mágica da paz do estilo "aprenda tudo de Y em X dias"3. Sempre que
obtive aprendizado ou compreensão razoável de um assunto foi por ter errado, estudado,
praticado o assunto por muito tempo.
Fonte:
https://interviewnoodle.com/preparing-for-the-facebook-interview-a-brutally-honest-guide-8e09f3
b8a054
3
exceto quando X é suficientemente grande para realmente aprender 🤡
processo e planejamento
"Meu amor, disciplina é liberdade
Compaixão é fortaleza"
Antes de pensar no que estudar (conteúdo) ou em como estudar (estratégia), acho que vale a
pena comprometer-se com um tempo de estudos e seguir de forma consistente. Exemplos:
● 3 vezes na semana 2h (antes de ter uma entrevista) por 3 meses,
● 5 vezes na semana 1h (com a entrevista marcada) até a entrevista
Seguir um planejamento sem objetivo real é muito difícil. :( Então, talvez o seu primeiro
objetivo pode ser um pré-preparo para entrevistas. E como saber se está pré-preparada?! Uma
forma de avaliar isto pode ser a sua capacidade de responder perguntas easy e medium4 que
cobrem vários algoritmos e estruturas de dados do leetcode.com.
O fato importante é que você precisará de tempo, quanto mais tempo melhor e mais
abrangente será o preparo.
Mas tão importante como ter um planejamento (horário dedicado) é ter um template ou
processo para abordar os problemas nas entrevistas. Gosto muito da proposta da Gayle
Laakmann5.
4
não exatamente todas sempre
5
e recomendo ver este vídeo pra entender a proposta da mesma explicada por ela
Fonte para esquemas/templates de preparo para coding e soft skills.
início da entrevista antes de escrever qualquer código
Mantenha-se verbalmente falando como se estivesse apresentando tudo o que você pensa, até
mesmo o que você pensa ser "bobo":
1. Ouça bem quem entrevista, preste muita atenção em tudo, se quiser anote num
caderninho de lado. Tenha plena certeza que entendeu o problema.
a. Saiba que é comum problemas descritos de forma ambígua, incompleta ou
vaga para gerar uma "conversação inicial" e testar sua capacidade de pensar e
questionar6.
2. Usualmente a pessoa que entrevista te dá um exemplo de entrada e saída esperada,
tenha certeza que entendeu o mesmo MAS além deste exemplo proponha e debugue
outros exemplos mais completos
a. Não escolha um exemplo MUITO GRANDE pois pode tomar seu tempo precioso
3. Proponha uma pseudo solução de força bruta, se possível, normalmente a primeira
que vem a nossa cabeça
a. A proposta ainda é em pseudo código ou graficamente
b. Diga verbalmente qual a complexidade de tempo e memória
4. Proponha e discuta uma pseudo solução otimizada para o problema
a. Aprender a otimizar vem com experiência de se fazer muitos exercícios.
5. Debugue sua pseudo proposta usando os exemplos que você achou mais completos
Recomendo ver sessões simuladas, se possível de empresas similares às que você deseja
aplicar para ter uma noção do que é esperado. Veja como as partes (entrevistadora,
entrevistada) colaboram:
● https://www.youtube.com/watch?v=XKu_SEDAykw
● https://www.youtube.com/watch?v=21pmwl0hrME
6
a pessoa é, muitas vezes, avaliada pelas perguntas que faz ⭐
● https://www.uber.com/pt-BR/blog/coding-interview-dicas-para-o-processo-seletivo-de-en
genharia-da-uber/
Colabore com a pessoa entrevistando como se fosse um par de trabalho7. Converse até
mesmo papo fiado faz bem mas tenha noção do seu tempo, ele é curto.
7
esse foi um conselho de um grande amigo que fez muito sentido pra mim desde o primeiro dia que ele
me contou
entender versus aprender
“If you can't explain it simply, you don't understand it well enough.”
Um exemplo:
● [entendi] Ouvi sobre TCP/IP antes da faculdade e entendi o básico que era:
○ Um conjunto de protocolos de rede para garantir8 a entrega dos dados.
● [entendi] Estudei TCP/IP na faculdade:
○ Aprendi sobre ACK, handshake, paridade de bit, classes IP, sub máscara,
controle de congestão e etc.
● [entendi] No início da vida profissional tive contato superficial (como usuário) com
TCP/IP configurando máquinas (sem DHCP), configurando bancos de dados em
aplicações e etc.
● [aprendi] Ainda na vida profissional (na globo principalmente) tive contato mais
aprofundado de TCP/IP
● [aprendi] Hoje sei que apesar de ter um bom entendimento sobre TCP/IP não sou um
especialista de redes (mesmo sendo interessado e continuamente estudando o
assunto)
O mesmo tive que fazer para estrutura de dados e algoritmos para entrevistas. Me disciplinei9 a
estudar, praticar, ler e reler, ver vídeos no youtube de várias fontes e fazer isso ser parte da
rotina.
Cuidado com a dispersão, pois algumas pessoas10 têm a tendência de abrir muitas "abas de
conhecimento" mas neste momento o importante mesmo é o foco; um assunto por vez.
8
tenta garantir é o termo mais adequado
9
mas como a maioria dos seres humanos, uma semana era menos aplicada do que a outra, mas o que
10
🤡
vale é consistência e persistência
eu
repetição espaçada
Eu criei um sistema11 no qual registro o problema que resolvi, quantas vezes, categoria, como
resolvi e etc. E para memorizar o aprendizado, resolvo problemas "velhos" a cada X12 tempo
sem olhar nas minhas notas, depois, se necessário, olhando as notas. Assim consigo testar o
quanto eu entendi versus aprendi.
Exemplo, esta semana fiz o exercício #3, semana que vem refaço o mesmo exercício. Em tese
esta revisão é rápida e ajuda a fixar na memória.
É importante resolver os problemas se possível explicando para outra pessoa, senão encontrar
outra pessoa, fale consigo como se estivesse apresentando. A habilidade de explicar o
processo de pensamento é importante demais para entrevistas.
conhecimento em ondas
Já teve a impressão de ter encontrado o link/livro/vídeo que explica de forma ótima aquele
assunto que você vem estudando a vida toda?!
😡éX mentira,
11
me inspirei em algum desses links que coloquei no corpo do texto mas não lembro qual foi
12
variando de 1 a 2 semanas, mas às vezes é bom revisar o que já foi feito próximo às entrevistas
O meu conhecimento de TCP/IP foi aumentando13 à medida que dedicava mais e mais ao
assunto, mas não se engane continuo ignorante.
13
o conhecimento aumenta em função da dedicação no tempo f(dedicação, tempo)
14
no sentido de visões / explicações sobre o estudo, várias fontes trazem maior entendimento.
recomendação de introdução: estrutura de dados,
algoritmos e big oh
"The story of a woman on the morning of a war
Remind me if you will exactly what we're fighting for"
TLDR; Veja B e depois A. É importante iniciar a prática dos exercícios o mais rápido
possível e se necessário revise a sessão depois com mais contexto/prática.
Minha sugestão é iniciar com a introdução rápida B e partir pra média A, depois avalie se
conseguiu entender razoavelmente bem, senão explore os demais recursos. O G17 é
extremamente recomendado.
😂
15
na verdade penso que pode ser simultâneamente, ou até revisando posterior a um exercício
🌝
16
como estou fazendo aqui recursivamente
17
introdução a algoritmos e estrutura de dados
TLDR; Veja D depois E. É importante iniciar a prática dos exercícios o mais rápido
possível e se necessário revise a sessão depois com mais contexto/prática.
A. Estruturas de dados
○ Array estática e array dinâmica (1d e 2d)
○ Lista encadeada (simples e duplamente encadeada)
○ Filas
○ Pilhas
○ Hash table / Set
○ Árvores
○ Trie
○ Grafos
■ lista adjacente
■ array 2d
■ sem formato claro
○ Heaps
B. Algoritmos
○ Pelo menos um algoritmo de sorting (ex: merge sort)
○ Busca binária
○ Recursividade
○ Greedy (gulosos)
○ Técnicas ou padrões
■ dois ponteiros
■ janela deslizante
■ monotonic stack
■ duas heaps
■ dois ponteiros rápido e lento para detecção de ciclo
○ BFS
○ DFS
■ pre-order
■ post-order
■ in-order
○ Dijkstra
○ Disjoint set
○ Programação dinâmica
○ Topological sort
Os melhores recursos sobre o assunto:
A. Duração longa - Neetcode - Pago https://neetcode.io/courses
○ E.D., algoritmos e padrões de código para entrevista
B. Duração média - William Fiset - Youtube - Grátis Data structures introduction
○ E.D. e alguns algoritmos
C. Duração longa - Kantan Coding - Youtube - Grátis Algorithmic Patterns: Intro
○ Só padrões de código
D. Duração curta - HackerRank - Youtube - Grátis
Data Structures: Balanced Parentheses in Expression
○ E.D.
E. Duração curta - HackerRank - Youtube - Grátis Algorithms: Recursion
○ Algoritmos
F. Duração longa - Stanford (Tim Roughgarden) - Youtube - Grátis
2 1 The Gist 14 min
○ Algoritmos
G. Duração longa - Steven Skiena - Youtube - Grátis
CSE373 --- Lecture 2: Asymptotic Notation (Fall 2021)
○ Algoritmos
H. Duração média - Alvin Zablan (freeCodeCamp.org) - Youtube - Grátis
Dynamic Programming - Learn to Solve Algorithmic Problems & Coding Challenges
○ Algoritmos especificamente programação dinâmica
I. Duração média - Alvin Zablan (freeCodeCamp.org) - Youtube - Grátis
Graph Algorithms for Technical Interviews - Full Course
○ Algoritmos especificamente grafos
J. Duração média - Alvin Zablan (freeCodeCamp.org) - Youtube - Grátis
Linked Lists for Technical Interviews - Full Course
○ Algoritmos específicos lista encadeada
K. Duração média - Alvin Zablan (freeCodeCamp.org) - Youtube - Grátis
Binary Tree Algorithms for Technical Interviews - Full Course
○ Algoritmos específicos árvores binárias
L. Duração longa - Alving Zablan - Pago https://structy.net/
○ Algoritmos e E.S.
Minha sugestão é iniciar com D e E, e partir para os exercícios. Se quiser uma introdução mais
elaborada e prática de lista encadeada (J), grafos (I), programação dinâmica (H) e árvores
binárias (K) recomendo muito os vídeos do Alvin Zablan, ele é muito didático.
Se preparar para entrevistas de código lembra muito o ato de aprender uma nova língua, por
exemplo Russo, Japonês e etc. Os motivos:
● Não é sua linguagem materna (foge de sua rotina)
● Você pode aprender sozinha mas com suporte você pode acelerar o seu
desenvolvimento (recursos/vídeos)
● Tem gírias e jeitos (padrões de solução) difíceis de aprender sozinha
● Necessita muita prática (exercitar)
Simular a entrevista é muito importante. Basicamente você pode fazer a entrevista com uma
outra pessoa e ela faz de volta com você. Durante a simulação tente respeitar o tempo e o
formato da entrevista, observando para dar e receber feedback.
A plataforma Pramp oferece este mesmo modelo de treinar com outra pessoa. Você pode
escolher fazer entrevistas com pessoas treinando (amigas/amigos ou aleatório) de graça ou
pagar para ser entrevistado por profissionais.
O meu conselho é fazer várias simulações desde o início da preparação. Elas são ótimas para
construir confiança e entender onde você precisa treinar mais18. Eu recomendo fazer 1x
por semana inicialmente e aumentar ou diminuir ao perceber como você reage a uma
simulação de entrevista.
18
ou revisar um conteúdo novamente ou mais profundo
recomendação de exercícios
"My name is 'I love you'
I come from the same place as everyone"
Todos os conselhos anteriores são excelentes mas sem prática eles não servem muito. Aqui é
onde você deve aplicar o que foi visto seguindo um roteiro de exercícios.
O primeiro passo que recomendo é ver uns 10 exercícios comuns utilizados em entrevistas.
Estes exercícios não servem para te aquecer mas para calibrar sobre o que esperar. E pode
ser que estes exercícios te assustem19 mas a ideia é ser exposto ao que é esperado, não se
🚀
desmotive os próximo parágrafo contém um plano para aprender como resolver eles e outros
.
Após ter tido um contato amplo com perguntas e a organização sugiro seguir o roteiro criado no
site Neetcode. Ele está formatado como uma árvore, agrupando os assuntos por categorias.
19
eles me assustaram inicialmente, por não entender alguns deles 😣
A ordem recomendada é iniciar pela raiz e ir descendo. Inicialmente resolvendo todos os
exercícios easy para cada categoria e ir avançando.
O legal desse roadmap20 é que ele tem a solução em vídeo para todos os problemas. A pessoa
é bem didática para resolver estes problemas. Então, caso fique muito tempo bloqueada
num exercício, olhe a solução ali mesmo.
São 150 exercícios, mas acredito que após completar metade você já se sentirá mais
preparada tanto para entrevistas quanto pra continuar praticando. E não se esqueça de
🍀
revisar, se comunicar e fazer mock interviews pra fazer desse processo mais natural e obter
sucesso! Boa sorte!!!
20
além de ser de graça e persistente, basta logar com seu gmail ou github