Originalmente eu criei isso como uma pequena lista to-do de tópicos de estudo para se tornar um engenheiro de software, mas isso cresceu para a grande lista que você vê hoje. Após passar por esse plano de estudo, Eu fui contratado como Engenheiro de Desenvolvimento de Software na Amazon! Você provavelmente não vai precisar estudar tanto quanto eu. De qualquer maneira, tudo que você precisa está aqui.
Os itens listados aqui irão preparar você muito bem para uma entrevista em praticamente qualquer empresa de software, incluindo as gigantes: Amazon, Facebook, Google ou Microsoft.
Boa sorte para todos vocês!
Original: Inglês
Tradutores: Marlon Aviz (Contribuições), marceloogeda (Contribuições), laris151 (Contribuições)
Traduções:
Traduções em progresso:
Esse é o meu plano de estudo mensal para ir de desenvolvedor web (autodidata, sem formação em Ciência da Computação) à engenheiro de software para uma grande empresa.
Essa longa lista foi extraída e expandida a partir das anotações de treinamento da Google, então essas são as coisas que você precisa saber. Eu adicionei alguns itens extras no final que podem aparecer na entrevista ou serem úteis para resolver um problema. Muitos itens são da obra “Get that job at Google” (Consiga aquele trabalho na Google) de Steve Yegge's e às vezes são expressados palavra-por-palavra nas anotações de treinamento da Google.
Isso é direcionado à engenheiros de software novos ou àqueles que estão migrando de desenvolvimento de software/web para engenharia de software (onde conhecimento de ciência da computação é necessário). Se você tem vários anos de experiência e está alegando muitos anos de experiência com engenharia de software, pode esperar por uma entrevista mais difícil.
Se você tem vários anos de experiência com desenvolvimento de software/web, observe que grandes empresas como Google, Amazon, Facebook e Microsoft consideram engenharia de software como algo distinto de desenvolvimento de software/web e elas requerem conhecimento de ciência da computação.
Se você quer ser um engenheiro de confiabilidade ou engenheiro de sistemas, estude mais da lista opcional (rede, segurança).
---------------- Tudo abaixo é opcional ----------------
Quando eu comecei esse projeto, eu não sabia diferenciar memória dinâmica de memória estática, não sabia notação Big-O, árvores, ou como percorrer um grafo. Se eu tivesse que escrever um algoritmo de ordenação, eu posso te dizer que ele não seria muito bom. Todas as estruturas de dados que eu já usei eram construídas dentro da linguagem, e eu não sabia como elas funcionavam por debaixo dos panos. Eu nunca tive que gerenciar memória a não ser que um processo que eu estava rodando desse um erro de "memória insuficiente", nesse caso eu teria que dar um jeito. Eu já usei alguns arrays multidimensionais na minha vida e milhares de arrays associativos, mas eu nunca criei estruturas de dados do zero.
É um longo plano. Você vai levar meses. Se você já é familiarizado com muitas dessas coisas, você vai precisar de muito menos tempo.
Tudo abaixo é um esboço, e você deve abordar os itens em ordem de cima para baixo.
Eu estou usando a sintaxe de markdown especial do Github, incluindo listas de tarefas para verificar o progresso.
Crie um novo branch para você verificar itens assim, apenas coloque um x entre os colchetes: [x]
Bifurque (fork) um branch e siga os comandos abaixo
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all
Marque todas as caixas com X depois que você completar suas alterações
git add .
git commit -m "Marked x"
git rebase jwasham/master
git push --force
Mais sobre a sintaxe de markdown especial do Github
Alguns vídeos estão disponíveis somente ao ingressar em um curso no Coursera, EdX, ou Lynda.com. Esses são chamados de MOOCs (Curso Online Aberto e Massivo). Às vezes as aulas não estão em sessão, nesse caso você terá que esperar alguns meses, portanto não terá acesso até lá. Os cursos da Lynda.com não são gratuitos.
Eu agradeceria a ajuda de vocês em adicionar recursos públicos gratuitos que sempre estejam disponíveis, como vídeos do YouTube para acompanhar os vídeos de curso online.
Eu gosto de usar palestras de universidades;
Whiteboarding (Usando O Quadro Branco)
Effective Whiteboarding during Programming Interviews (Usando o Quadro Branco Efetivamente durante Entrevistas de Programação)
Demystifying Tech Recruiting (Desmistificando Recrutamento Técnico)
Decifrando A Entrevista de Programação Série 1:
Como Conseguir um Emprego em uma das 4 Gigantes:
Cursos de Preparação:
Você pode escolher uma linguagem com a qual você esteja confortável para fazer a parte de programação (parte prática) da entrevista, mas para grandes empresas, essas são ótimas opções:
Você também poderia usar essas, mas dê uma lida por aí antes. Podem haver ressalvas:
Você precisa estar confortável com a linguagem e ser bem informado.
Leia mais sobre as escolhas:
Veja recursos de linguagens aqui
Você vai ver aprendizado de C, C++ e Python incluído abaixo, porque é o que estou aprendendo. Tem alguns livros envolvidos, veja no final.
Essa é uma lista menor comparada à que eu usei. Está abreviada para economizar seu tempo.
Se você tem muito tempo sobrando:
Se estiver com pouco tempo:
Se você tem mais tempo (eu quero esse livro):
Você precisa escolher uma linguagem para a entrevista (veja acima). Aqui estão minhas recomendações por linguagem. Eu não tenho recursos para todas as linguagens. Contribuições são bem-vindas.
Se você ler um desses, você deverá ter todo conhecimento de estrutura de dados e algoritmos que precisará para começar a resolver problemas de programação. Você pode pular todas as aulas em vídeo nesse projeto, a não ser que você queira uma revisão.
Recursos adicionais específicos a cada linguagem aqui.
Eu não li esses dois, mas eles são muito bem avaliados e escritos por Sedgewick. Ele é incrível.
Se você tiver uma recomendação melhor para C++, por favor me informe. Busco por recursos completos.
OU:
Algumas pessoas recomendam esses, mas eu acho que está além do necessário, a não ser que você tenha muitos anos de experiência em engenharia de software e está esperando por uma entrevista muito mais difícil:
Algorithm Design Manual (Skiena) (Manual de Design de Algoritmo)
Introduction to Algorithms (Introdução à Algoritmos)
Programming Pearls (Pérolas de Programação)
"Algorithms and Programming: Problems and Solutions" by Shen ("Algoritmos e Programação: Problemas e Soluções" por Shen)
Essa lista cresceu por longos meses, e sim, ela meio que saiu do controle.
Aqui estão alguns erros que eu cometi para que você tenha uma experiência melhor.
Assisti a horas de vídeos e fiz anotações e meses depois havia muito que eu não lembrava. Eu passei 3 dias revisando minhas anotaçes e fazendo flashcards para que eu pudesse relembrar.
Por favor, leia para que você não cometa os meus erros:
Retaining Computer Science Knowledge
Para solucionar o problema, eu fiz um pequeno site de flashcards onde eu poderia adicionar dois tipos de flashcards: genérico e código.
Cada cartão tem formatação diferente.
Eu fiz um website focado em mobile para que eu pudesse rever no meu celular, tablet, onde quer que eu esteja.
Faça o seu próprio, grátis:
Tenha em mente que eu exagerei e tenho cartões abrangendo desde linguagem assembly e trivialidades de Python até aprendizado de máquina e estatísticas. É demais para o que é requerido.
Nota: A primeira vez que você reconhece que sabe a resposta, não a marque como conhecida. Você tem que ver o mesmo cartão e respondê-lo várias vezes corretamente antes de realmente conhecê-lo. A repetição colocará esse conhecimento mais aprodundado em seu cérebro.
Uma alternativa ao uso do meu site de flashcards é Anki, que me foi recomendado várias vezes. Ele usa um sistema de repetição para ajuda-lo a se lembrar. É fácil de usar, está disponível em todas as plataformas e possui um sistema de sincronização em nuvem. Ele custa 25 dólares no iOS, mas é gratuito em outras plataformas.
Meu banco de dados de flashcards em formato Anki: https://ankiweb.net/shared/info/25173560 (obrigado @xiewenya)
Eu mantenho um conjunto de anotações em ASCII, OSI stack, Notações Big-O, e muito mais. Eu os estudo quando tenho algum tempo livre.
Faça uma pausa durante os problemas de programação por meia hora e passe por seus flashcards.
Há um monte de distrações que podem ocupar um tempo valioso. Foco e concentração são difíceis.
Essas são tecnologias predominantes, mas não são partes desse plano de estudo:
Alguns temas levam um dia, e alguns vão levar vários dias. Alguns são apenas aprendizado sem nada para implementar.
A cada dia eu pego um tema da lista abaixo, assisto vídeos sobre aquele tema, e escrevo uma implementação em:
Você não precisa de todas essas linguagens. Você precisa de apenas uma linguagem para a entrevista.
Por que programar em todas essas linguagens?
Talvez eu não tenha tempo para fazer tudo isso para cada tema, mas eu vou tentar.
Você pode ver meu código aqui:
Você não precisa memorizar os detalhes intrínsecos de cada algoritmo.
Escreva código em um quadro branco ou papel, não em um computador. Teste com umas amostras de valores de entrada (input). Depois teste em um computador.
Aprenda C
Como computadores processam um programa:
nada para implementar
Harvard CS50 - Asymptotic Notation (video) (Harvard CS50 - Notação Assintótica - vídeo)
Big O Notations (general quick tutorial) (video) (Notações Big-O (rápido tutorial geral) - vídeo)
Big O Notation (and Omega and Theta) - best mathematical explanation (video) (Notação Big-O (e Omega e Theta) - melhor explicação matemática - vídeo)
Skiena:
A Gentle Introduction to Algorithm Complexity Analysis (Uma Introdução Gentil a Análise de Complexidade Algoritmica)
Orders of Growth (video) (Ordens de Crescimento - vídeo)
Asymptotics (video) (Assintóticas - vídeo)
UC Berkeley Big O (video) (Big-O - Universidade da Califórnia em Berkeley - vídeo)
UC Berkeley Big Omega (video) (Grande Omega - Universidade da Califórnia em Berkeley - vídeo)
Amortized Analysis (video) (Análise Amortizada - vídeo)
Illustrating "Big O" (video) (Ilustrando "Big-O" - vídeo)
TopCoder (inclui relações de recorrência e teorema mestre):
Cheat sheet (Folha de Consultas)
Se alguma das aulas forem muito "matemáticas", você pode pular para o final e ver o vídeo de matemática discreta para ganhar um conhecimento base.
vídeos:
Cursos Online:
implementar com array usando sondagem linear
Anotações:
Para heapsort, veja estrutura de dados heap acima. Heapsort é ótimo, mas não é estável.
Sedgewick - Mergesort (5 vídeos)
Sedgewick - Quicksort (4 vídeos)
Universidade da Califórnia em Berkeley:
Bubble Sort (video) (Ordenação por Bolha - vídeo)
Analyzing Bubble Sort (video) (Analisando Ordenação por Bolha - vídeo)
Insertion Sort, Merge Sort (video) (Ordenação por Inserção, Ordenação por Mistura - vídeo)
Insertion Sort (video) (Ordenação por Inserção - vídeo)
Merge Sort (video) (Ordenação por Mistura - vídeo)
Selection Sort (video) (Ordenação por Seleção - vídeo)
Código de ordenação por mistura:
Código de algoritmo de ordenação quicksort:
Implementar:
Não é requisitado, mas eu recomendo esses:
Como um resumo, aqui está uma representação visual de 15 algoritmos de ordenação. Se você precisa de mais detalhes sobre o assunto, veja a seção "Ordenação" em Detalhes Adicionais Sobre Alguns Assuntos
Grafos podem ser usados para representar muitos problemas na Ciência da Computação, então essa seção é longa, assim como árvores e ordenação também foram.
Anotações:
Aulas do Skiena - ótima introdução:
Grafos (revisão e mais):
Curso Completo do Coursera:
Irei implementar:
Você ganhará mais prática com grafos no livro do Skiena (veja a seção de livros abaixo) e os livros da entrevista
Se você precisa de mais detalhes sobre esse assunto, veja a seção "String Matching" em Detalhes Adicionais Sobre Alguns Assuntos
Essa seção terá vídeos mais curtos que você pode assistir rapidamente para revisar a maioria dos conceitos importantes.
É legal se você quiser dar uma refrescada na memória.
Agora que você sabe todos os temas de Ciência da Computação acima, é hora de praticar respondendo problemas de programação.
Prática com Questõs de Programação não é sobre memorizar respostas para problemas de programação.
Por que você precisa praticar com problemas de programação:
Tem uma introdução ótima para resolução de problema metódica e comunicativa em uma entrevista. Você vai adquirir isso dos livros de entrevista de programação, também, mas eu acho isso aqui excelente: Algorithm design canvas (Quadro de design de algoritmo)
Não tem quadro branco em casa? Faz sentido. Eu sou um estranho e tenho um grande quadro branco. Ao invés de um quadro branco, pegue um grande caderno de desenho de uma loja de arte. Você pode sentar no sofá e praticar. Esse é o meu "sofá de quadro branco". Eu adicionei a caneta na foto para comparação de dimensões. Se você usar uma caneta, você vai desejar que você pudesse apagar. Fica uma bagunça bem rápido.
Suplementar:
Leia e Faça os Problemas de Programação (nessa ordem):
Veja a Lista de Livros acima
Depois que você enche o cérebro com novos aprendizados, é hora de botar ele para trabalhar. Faça desafios de programação todo dia, o máximo que você puder.
Vídeos de Questões de Entrevista de Programação:
Websites de desafios:
Repositórios de desafios:
Entrevistas Simuladas:
Pense em 20 questões da entrevista que você vai ter, seguindo a linha de raciocínio dos itens abaixo. Tenha 2-3 respostas para cada. Tenha uma história, não apenas dados, sobre algo que você realizou.
Algumas das minhas (eu posso já saber a resposta, mas o quero a opinião deles ou a perspectiva da equipe):
Parabéns!
Continue aprendendo.
O aprendizado nunca para.
*****************************************************************************************************
*****************************************************************************************************
Tudo abaixo deste ponto é opcional.
Ao estudar o que vem a seguir, você vai ter maior exposição a mais conceitos de Ciência da Computação, e está mais bem preparado para
qualquer trabalho de engenharia de software. Você será um engenheiro de software muito mais completo.
*****************************************************************************************************
*****************************************************************************************************
Esses tópicos provavelmente não aparecerão em uma entrevista, mas eu adicionei eles para ajudar você a se tornar um engenheiro de software mais completo, e para você ficar ciente de certas tecnologias e algoritmos, assim você terá mais ferramentas a disposição.
Saiba pelo menos um tipo de árvore binária balanceada (e saiba como ela é implementada):
"Entre as Árvores de Busca Balanceadas, AVL e árvore 2/3 agora são passado, e árvores red-black (rubro-negras) parecem mais populares. Uma estrutura de dados auto-organizada particularmente interessante é a árvore splay, a qual usa rotações para mover qualquer chave acessada para a raiz."
Dessas, eu escolhi implementar a árvore splay. Com base no que eu li, você não vai implementar uma árvore de busca balanceada na sua entrevista. Mas eu queria uma certa exposição à programação de uma dessas árvoes e convenhamos, árvores splay são muito legais. Eu li muito código de árvores rubro-negras.
Eu quero aprender mais sobre a Árvore B, já que ela é amplamente usada com enormes conjuntos de dados.
Self-balancing binary search tree (Árvore binária de busca auto-balanceada)
Árvores AVL
Árvores Splay
Árvores Rubro-Negras
Árvores de busca 2-3
Árvores 2-3-4 (também conhecidas como árvores 2-4)
Árvores N-ary (K-ary, M-ary)
Árvores B
--
Eu adicionei esses detalhes para reforçar algumas ideias já apresentadas acima, mas não quis incluir elas
acima porque aí é simplesmente demais. É fácil exagerar em um tema.
Você quer ser contratado nesse século, certo?
Union-Find
Mais Programação Dinâmica (vídeos)
Processamento de Gráfos Avançado (vídeos)
MIT Probabilidade (bem matemático, e bem lento, o que é bom para coisas bem matemáticas) (vídeos):
Simonson: Approximation Algorithms (video) (Simonson: Algoritmos de Aproximação - vídeo)
Correspondência de String
Ordenação
Sente-se e aproveite. "Netflix e habilidade" :P
Lista de problemas individuais de Programação Dinâmica (cada um é curto)
MIT 18.06 Linear Algebra, Spring 2005 (35 videos) (MIT 18.06 Álgebra Linear, Primavera de 2005 - 35 vídeos)
Excelente - MIT Calculus Revisited: Single Variable Calculus (Cálculo de MIT Revisto: Cálculo de Variável Única)
Computer Science 70, 001 - Spring 2015 - Discrete Mathematics and Probability Theory (Ciência da Computação 70, 001 - Primavera de 2005 - Matemática Discreta e Teoria de Probabilidade)
Discrete Mathematics by Shai Simonson (19 videos) (Matemática Discreta por Shai Simonson - 19 vídeos)
Discrete Mathematics Part 1 by Sarada Herke (5 videos) (Matemática Discreta Parte 1 por Sarada Herke - 5 vídeos)
CSE373 - Análise de Algoritmos (25 vídeos)
UC Berkeley 61B (Spring 2014): Data Structures (25 videos) (Universidade da Califórnia em Berkeley 61B (Primavera de 2014): Estrutura de Dados - 25 vídeos)
UC Berkeley 61B (Fall 2006): Data Structures (39 videos) (Universidade da Califórnia em Berkeley 61B (Outono de 2006): Estrutura de Dados - 39 vídeos)
UC Berkeley 61C: Machine Structures (26 videos) (Universidade da Califórnia em Berkeley 61C: Estruturas de Máquina - 26 vídeos)
OOSE: Software Dev Using UML and Java (21 videos) (OOSE (Engenharia de Software Orientada a Objetos): Desenvolvimento de Software Usando UML e Java - 21 vídeos)
UC Berkeley CS 152: Computer Architecture and Engineering (20 videos) (Universidade da Califórnia em Berkeley CS 152: Arquitetura e Engenharia de Computador - 20 vídeos)
MIT 6.004: Computation Structures (49 videos) (MIT 6.004: Estruturas de Computação - 49 vídeos)
Carnegie Mellon - Computer Architecture Lectures (39 videos) (Carnegie Mellon - Aulas de Arquitetura de Computador - 39 vídeos)
MIT 6.006: Intro to Algorithms (47 videos) (MIT 6.006: Introdução a Algoritmos - 47 vídeos)
MIT 6.033: Computer System Engineering (22 videos) (MIT 6.033: Engenharia de Sistema de Computador - 22 vídeos)
MIT 6.034 Artificial Intelligence, Fall 2010 (30 videos) (MIT 6.034 Inteligência Artificial, Outono de 2010 - 30 vídeos)
MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25 videos) (MIT 6.042J: Matemática para Ciência da Computação, Outono de 2010 - 25 vídeos)
MIT 6.046: Design and Analysis of Algorithms (34 videos) (MIT 6.046: Design e Análise de Algoritmos - 34 vídeos)
MIT 6.050J: Information and Entropy, Spring 2008 (19 videos) (MIT 6.050J: Informação e Entropia, Primavera de 2008 - 19 vídeos)
MIT 6.851: Advanced Data Structures (22 videos) (MIT 6.851: Estrutura de Dados Avançadas - 22 vídeos)
MIT 6.854: Advanced Algorithms, Spring 2016 (24 videos) (MIT 6.854: Algoritmos Avançados, Primavera de 2016 - 24 vídeos)
Harvard COMPSCI 224: Advanced Algorithms (25 videos) (Harvard COMPSCI 224: Algoritmos Avançados - 25 vídeos)
MIT 6.858 Computer Systems Security, Fall 2014 (MIT 6.858 Segurança de Sistemas de Computador, Outono de 2014)
Stanford: Programming Paradigms (27 videos) (Stanford: Paradigmas de Programação - 27 vídeos)
Introduction to Cryptography by Christof Paar (Introdução a Criptografia por Christof Paar)
Mining Massive Datasets - Stanford University (94 videos) (Minerando Conjuntos de Dados Massivos - Universidade de Stanford - 94 vídeos)
Graph Theory by Sarada Herke (67 videos) (Teoria de Grafos por Sarada Herke - 67 vídeos)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。