|
8 жил өмнө | |
---|---|---|
extras | 8 жил өмнө | |
.gitignore | 8 жил өмнө | |
LICENSE.txt | 8 жил өмнө | |
README-cn.md | 8 жил өмнө | |
README.md | 8 жил өмнө | |
programming-language-resources.md | 8 жил өмнө |
This is my multi-month study plan for going from web developer (self-taught, no CS degree) to Google software engineer.
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. Many items are from Steve Yegge's "Get that job at Google" and are reflected sometimes word-for-word in Google's coaching notes.
---------------- Everything below this point is optional ----------------
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 project, 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 into 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 progress.
More about Github-flavored markdown
Print out a "future Googler" sign (or two) and keep your eyes on the prize.
I haven't applied yet.
I still have a few days in the learning phase (finishing up this crazy list), and starting next week all I'll be doing is programming questions all day long. That will continue for a few weeks, and then I'll apply through a referral I've been holding onto since February (yes, February).
Thanks for the referral, JP.
I'm on the journey, too. Follow along on my blog at GoogleyAsHeck.com
Some videos are available only by enrolling in a Coursera, EdX, or Lynda.com class. These are called MOOCs. It is free to do so, but sometimes the classes are not in session so you have to wait a couple of months, so you have no access.
I'd appreciate your help converting the MOOC video links to public sources to replace the online course videos over time. I like using university lectures.
[ ] Videos:
[ ] Articles:
[ ] Additional (not suggested by Google but I added):
I wrote this short article about it: Important: Pick One Language for the Google Interview
You can use a language you are comfortable in to do the coding part of the interview, but for Google, these are solid choices:
You could also use these, but read around first. There may be caveats:
You need to be very comfortable in the language, and be knowledgeable.
Read more about choices:
You'll see some C, C++, and Python learning included below, because I'm learning. There are a few books involved, see the bottom.
This list grew over many months, and yes, it kind of got out of hand.
Here are some mistakes I made so you'll have a better experience.
I watched hours of videos and took copious notes, and months later there was much I didn't remember. I spent 3 days going through my notes and making flashcards so I could review (see below).
To solve the problem, I made a little flashcards site where I could add flashcards of 2 types: general and code. Each card has different formatting.
I made a mobile-first website so I could review on my phone and tablet, whereever I am.
Make your own for free:
Note on flashcards: The first time you recognize you know the answer, don't mark it as known. You have to see the same card and answer it several times correctly before you really know it. Repetition will put that knowledge deeper in your brain.
I keep a set of cheatsheets on ASCII, OSI stack, Big-O notations, and more. I study them when I have some spare time.
Take a break from programming problems for a half hour and go through your flashcards.
There are a lot of distractions that can take up valuable time. Focus and concentration is hard.
This big list all started as a personal to-do list made from Google interview coaching notes. These are prevalent technologies but were not mentioned in those notes:
Some subjects take one day, and some will take multiple days. Some are just learning with nothing to implement.
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 can see my code here:
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.
[ ] How computers process a program:
[ ] Compilers
[ ] How floating point numbers are stored:
[ ] Cheat sheet
If some of the lectures are too mathy, you can jump down to the bottom and watch the discrete mathematics videos to get the background knowledge.
[ ] Videos:
[ ] Online Courses:
[ ] implement with array using linear probing
[ ] AVL trees
[ ] Splay trees
[ ] 2-3 search trees
[ ] 2-3-4 Trees (aka 2-4 trees)
[ ] B-Trees
[ ] Red/black trees
[ ] Notes:
关于堆排序,请查看前文堆的数据结构部分。堆排序很强大,不过是非稳定排序。
[ ] 冒泡排序 (video)
[ ] 冒泡排序分析 (video)
[ ] 插入排序 (video)
[ ] 归并排序 (video)
[ ] 快排 (video)
[ ] 选择排序 (video)
[ ] 斯坦福大学关于排序算法的视频:
[ ] Shai Simonson 视频, Aduni.org:
[ ] Steven Skiena 关于排序的视频:
[ ] 加州大学伯克利分校(UC Berkeley) 大学课程:
[ ] - 归并排序:
[ ] - 快速排序:
[ ] 实现:
[ ] 有兴趣的话,还有一些补充 - 但并不是必须的:
图论能解决计算机科学里的很多问题,所以这一节会比较长,像树和排序的部分一样。
Yegge 的笔记:
[ ] Skiena 教授的课程 - 很不错的介绍:
[ ] 图 (复习和其他):
完整的 Coursera 课程:
Yegge: 如果有机会,可以试试研究更酷炫的算法:
我会实现:
可以从 Skiena 的书(参考下面的书推荐小节)和面试书籍中学习更多关于图的实践。
我建议先阅读和学习足够多的动态规划的例子,以便对解决 DP 问题的一般模式有个扎实的理解。
[ ] 视频:
[ ] Yale 课程笔记:
[ ] Coursera 课程:
系统设计以及可伸缩性,要把软硬件的伸缩性设计的足够好有很多的东西要考虑,所以这是个包含非常多内容和资源的大主题。需要花费相当多的时间在这个主题上。
这一部分有一些短视频,你可以快速的观看和复习大多数重要概念。
这对经常性的巩固很有帮助。
阅读并做练习:
[ ] 算法设计手册 (Skiena)
read and do exercises from the books below. Then move to coding challenges (further down below) 一旦你理解了每日计划里的所有内容,就去读上面所列的书并完成练习,然后开始读下面所列的书并做练习,之后就可以开始实战写代码了(本文再往后的部分)
首先阅读:
然后阅读 (这本获得了很多推荐, 但是不在 Google coaching 的文档里):
这些没有被 Google 推荐阅读,不过我因为需要这些背景知识所以也把它们列在了这里。
[ ] C Programming Language, Vol 2
[ ] C++ Primer Plus, 6th Edition
[ ] Elements of Programming Interviews
一旦你学会了理论基础,就应该把它们拿出来练练。 尽量坚持每天做编码练习,越多越好。
编程问题预备:
编码练习平台:
随着下面列举的问题思考下你可能会遇到的 20 个面试问题
每个问题准备 2-3 种回答
准备点故事,不要只是摆一些你完成的事情的数据,相信我,人人都喜欢听故事
我会问的一些:(可能我已经知道了答案但我想听听面试官的看法或者了解团队的前景):
我还能说些什么呢,恭喜你!
坚持继续学习。
得到这份工作只是一个开始。
*****************************************************************************************************
*****************************************************************************************************
Everything below this point is optional. These are my recommendations, not Google's.
By studying these, you'll get greater exposure to more CS concepts, and will be better prepared for
any software engineering job.
*****************************************************************************************************
*****************************************************************************************************
--
I added these to reinforce some ideas already presented above, but didn't want to include them
above because it's just too much. It's easy to overdo it on a subject.
You want to get hired in this century, right?
[ ] More 动态规划 (videos)
[ ] Advanced Graph Processing (videos)
[ ] MIT Probability (mathy, and go slowly, which is good for mathy things) (videos):
Sit back and enjoy. "netflix and skill" :P
[ ] Excellent - MIT Calculus Revisited: Single Variable Calculus
[ ] Computer Science 70, 001 - Spring 2015 - Discrete Mathematics and Probability Theory
[ ] CSE373 - Analysis of Algorithms (25 videos)
[ ] UC Berkeley 61B (Spring 2014): Data Structures (25 videos)
[ ] UC Berkeley 61B (Fall 2006): Data Structures (39 videos)
[ ] UC Berkeley CS 152: Computer Architecture and Engineering (20 videos)
[ ] Carnegie Mellon - Computer Architecture Lectures (39 videos)
[ ] MIT 6.034 Artificial Intelligence, Fall 2010 (30 videos)
[ ] MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25 videos)
[ ] MIT 6.046: Design and Analysis of Algorithms (34 videos)
[ ] MIT 6.050J: Information and Entropy, Spring 2008 (19 videos)
[ ] Stanford: Programming Paradigms (17 videos)
[ ] Mining Massive Datasets - Stanford University (94 videos)