|
8 years ago | |
---|---|---|
.gitignore | 9 years ago | |
README.md | 8 years ago | |
future-googler-preview.png | 9 years ago | |
future-googler.pdf | 9 years ago |
(formerly known as Project 9894)
This is my multi-month study plan for going from web developer (self-taught, no CS degree) to Google software engineer. Don't let that offend you if you are a web developer. I'm speaking from my experience, not yours.
This long list has been extracted and expanded from Google's coaching notes,
so these are the things you need to know. There are extra items I added at the
bottom that may come up in the interview or be helpful in solving a problem.
I'm following this plan to prepare for my Google interview. I've been building the web, building services, and launching startups since 1997. I have an economics degree, not a CS degree. I've been very successful in my career, but I want to work at Google. I want to progress into larger systems and get a real understanding of computer systems, algorithmic efficiency, data structure performance, low-level languages, and how it all works. And if you don't know any of it, Google won't hire you.
When I started this I didn't know a stack from a heap, didn't know Big-O anything, anything about trees, or how to traverse a graph. If I had to code a sorting algorithm, I can tell ya it wouldn't have been very good. Every data structure I've ever used was built in to the language, and I didn't know how they worked under the hood at all. I've never had to manage memory, unless a process I was running would give an "out of memory" error, and then I'd have to find a workaround. I've used a few multi-dimensional arrays in my life and thousands of associative arrays, but I've never created data structures from scratch.
But after going through this study plan I have high confidence I'll be hired. It's a long plan. It's going to take me months. If you are familiar with a lot of this already it will take you a lot less time.
Everything below is an outline, and you should tackle the items in order from top to bottom.
I'm using Github's special markdown flavor, including tasks lists to check my progress.
I check each task box at the beginning of a line when I'm done with it. When all sub-items in a block are done, I put [x] at the top level, meaning the entire block is done. Sorry you have to remove all my [x] markings to use this the same way. If you search/replace, just replace [x] with [ ]. Sometimes I just put a [x] at top level if I know I've done all the subtasks, to cut down on clutter.
More about Github flavored markdown: https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown
I have a friendly referral already to get my resume in at Google. Thanks JP.
Print out a "future Googler" sign (or two) and keep your eyes on the prize.
I'm on the journey. Follow along at GoogleyAsHeck.com
Some videos are available only by enrolling in a Coursera or EdX class. It is free to do so, but sometimes the classes are no longer in session so you have to wait a couple of months, so you have no access. I'm going to be adding more videos from public sources and replacing the online course videos over time. I like using university lectures.
[x] Videos:
[x] Articles:
[x] Additional (not suggested by Google but I added):
This short section were prerequisites/interesting info I wanted to learn before getting started on the daily plan.
You need to know C, C++, or Java to do the coding part of the interview. They will sometimes make an exception and let you use Python or some other language, but the language must be mainstream and allow you write your code low-level enough to solve the problems. You'll see some C, C++ learning included below.
There are a few books involved, see the bottom.
[x] How computers process a program:
[x] How floating point numbers are stored:
[x] Computer Arch Intro: (first video only - interesting but not required) https://www.youtube.com/watch?v=zLP_X4wyHbY&list=PL5PHm2jkkXmi5CxxI7b3JCL1TWybTDtKq&index=1
[x] C
[x] C++
[x] Python
[x] Compilers
Each subject does not require a whole day to be able to understand it fully, and you can do multiple of these in a day.
Each day I take one subject from the list below, watch videos about that subject, and write an implementation in:
C - using structs and functions that take a struct * and something else as args.
C++ - without using built-in types
C++ - using built-in types, like STL's std::list for a linked list
Python - using built-in types (to keep practicing Python)
and write tests to ensure I'm doing it right, sometimes just using simple assert() statements
You may do Java or something else, this is just my thing.
Why code in all of these?
Practice, practice, practice, until I'm sick of it, and can do it with no problem (some have many edge cases and bookkeeping details to remember)
Work within the raw constraints (allocating/freeing memory without help of garbage collection (except Python))
Make use of built-in types so I have experience using the built-in tools for real-world use (not going to write my own linked list implementation in production)
I may not have time to do all of these for every subject, but I'll try.
You don't need to memorize the guts of every algorithm.
Write code on a whiteboard, not a computer. Test with some sample inputs. Then test it out on a computer to make sure it's not buggy from syntax.
[x] Before you get started:
[x] Algorithmic complexity / Big O / Asymptotic analysis
[x] Arrays: (Implement an automatically resizing vector)
[x] Linked Lists
[x] Stack
[x] Queue
[x] Hash table
[x] Endianness
[x] Binary search:
[x] Bitwise operations
[x] Notes & Background:
[x] Binary search trees: BSTs
[x] Heap / Priority Queue / Binary Heap:
[x] Tries
[x] Balanced search trees
[x] Self-balancing binary search tree: https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree
[x] AVL trees
[x] Splay trees
[x] 2-3 search trees
[x] 2-3-4 Trees (aka 2-4 trees)
[x] B-Trees
[x] Red/black trees
[x] N-ary (K-ary, M-ary) trees
This area is sparse, and I'll be filling it in once I get here.
[ ] Notes:
[ ] https://www.youtube.com/watch?v=yLvp-pB8mak&index=8&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b
[ ] https://www.youtube.com/watch?v=q7K9otnzlfE&index=9&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b
[ ] Implement:
For Curiosity:
This area is sparse (no pun intended), and I'll be filling it in once I get here.
Notes:
Graphs:
Weighted graphs:
Compute Strongly Connected Components
Implement:
For Curiosity:
You'll get more graph practice in Skiena's book (see Books section below) and the interview books
This area is sparse, and I'll be filling it in once I get here.
[ ] Caches
[ ] NP and NP Complete
[ ] Recursion
[ ] open-ended problems
[ ] Combinatorics (n choose k)
[ ] Probability
[ ] Dynamic Programming
[ ] Scheduling
[ ] Weighted random sampling
[ ] Implement system routines
[ ] Design patterns:
[ ] Operating Systems (25 videos):
[ ] Data handling:
[ ] System design
[ ] Familiarize yourself with a unix-based code editor: emacs & vi(m)
[ ] Be able to use unix command line tools:
[ ] Testing
Read and do exercises:
[ ] The Algorithm Design Manual (Skiena)
[ ] Algorithms and Programming: Problems and Solutions: http://www.amazon.com/Algorithms-Programming-Solutions-Alexander-Shen/dp/0817638474
Once you've understood everything in the daily plan, and read and done exercises from the the books above, read and do exercises from the books below. Then move to coding challenges (further down below)
Read first:
Read second:
[x] C Programming Language, Vol 2
[x] C++ Primer Plus, 6th Edition
[ ] The Unix Programming Environment
[ ] Introduction to Algorithms
[ ] Programming Pearls:
If you see people reference "The Google Resume", it was a book replaced by "Cracking the Coding Interview".
Computing Weak Consistency in Polynomial Time
- http://dl.acm.org/ft_gateway.cfm?id=2767407&ftid=1607485&dwn=1&CFID=627637486&CFTOKEN=49290244
How Developers Search for Code: A Case Study
- http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43835.pdf
Borg, Omega, and Kubernetes
- http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44843.pdf
Continuous Pipelines at Google
- http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43790.pdf
AddressSanitizer: A Fast Address Sanity Checker
- http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37752.pdf
Once you've learned your brains out, put those brains to work. Take coding challenges every day, as many as you can.
The Best:
More:
Have a story, not just data, about something you accomplished
Why do you want this job?
What's a tough problem you've solved?
Biggest challenges faced?
Best/worst designs seen?
Ideas for improving an existing Google product.
How do you work best, as an individual and as part of a team?
Which of your skills or experiences would be assets in the role and why?
What did you most enjoy at [job x / project y]?
What was the biggest challenge you faced at [job x / project y]?
What was the hardest bug you faced at [job x / project y]?
What did you learn at [job x / project y]?
What would you have done better at [job x / project y]?
Some of mine (I already may know answer to but want their opinion or team perspective):
Everything below is my recommendation, not Google's, and you may not have enough time to
learn, watch or read them all. That's ok. I may not either.
[ ] Skip lists
[ ] Disjoint Sets:
van Emde Boas Trees
[ ] Treap
[x] Parity & Hamming Code
[ ] Computer Security:
[ ] Information theory:
[ ] Bloom Filter
[ ] Fast Fourier Transform
[ ] Machine Learning:
[ ] Parallel Programming:
[ ] String search algorithms: Knuth-Morris-Pratt (KMP):
- https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm
- https://www.youtube.com/watch?v=2ogqPWJSftE
Boyer–Moore string search algorithm
- https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm
- https://www.youtube.com/watch?v=xYBM0_dChRE
Sit back and enjoy. "netflix and skill" :P
[ ] Scalability:
[ ] CSE373 - Analysis of Algorithms (25 videos):
[ ] UC Berkeley 61B
[ ] MIT 6.042: Math for CS (25 videos):
[ ] MIT 6.006: Intro to Algorithms (47 videos):
[ ] MIT 6.033: Computer System Engineering (22 videos):
[ ] MIT 6.046: Design and Analysis of Algorithms (34 videos):
[ ] MIT 6.858 Computer Systems Security, Fall 2014 ():
[ ] MIT 6.851: Advanced Data Structures (22 videos):
[ ] Stanford: Programming Paradigms (17 videos)
[ ] MIT 6.050J Information and Entropy, Spring 2008 ()
[ ] Introduction to Cryptography:
http://www.gainlo.co/ - Mock interviewers from big companies
For review questions in C book:
https://github.com/lekkas/c-algorithms
This is mainly for me.
[ ] Books:
[x] C++ Seasoning:
[x] Better Code: Data Structures:
[ ] C++ Talks at CPPCon:
[ ] MIT CMS.611J Creating Video Games, Fall 2014
[ ] Compilers:
[ ] Computer and processor architecture:
[ ] Long series of C++ videos:
You're never really done. Keep learning.