Тайлбар байхгүй

newt0n 77261ac565 + 完成 711 到 1318 行翻译 8 жил өмнө
extras c86e268f6b Marking items read. 8 жил өмнө
.gitignore d5f1061812 Added my own checkmarked copy to the ignore list. Checkmarks to be unchecked today. 8 жил өмнө
LICENSE.txt a9b8ff0843 Added Creative Commons license. 8 жил өмнө
README-cn.md 77261ac565 + 完成 711 到 1318 行翻译 8 жил өмнө
README.md 1daf277e0e Reorganized Rabin-Karp. Added video on efficient implementation of rolling hashes. 8 жил өмнө
programming-language-resources.md b054fbabc0 Add Go Proverbs & its video 8 жил өмнө

README-cn.md

Google Interview University

What is it?

This is my multi-month study plan for going from web developer (self-taught, no CS degree) to Google software engineer.

Coding at the whiteboard - from HBO's Silicon Valley

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.


Table of Contents

---------------- Everything below this point is optional ----------------


Why use it?

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.

How to use it

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.

  • Create a new branch so you can check items like this, just put an x in the brackets: [x]

More about Github-flavored markdown

Get in a Googley Mood

Print out a "future Googler" sign (or two) and keep your eyes on the prize.

future Googler sign

Did I Get the Job?

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.

Follow Along with Me

I'm on the journey, too. Follow along on my blog at GoogleyAsHeck.com

John Washam - Google Interview University

Don't feel you aren't smart enough

About Google

About Video Resources

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.

Interview Process & General Interview Prep

Pick One Language for the Interview

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:

  • C++
  • Java
  • Python

You could also use these, but read around first. There may be caveats:

  • JavaScript
  • Ruby

You need to be very comfortable in the language, and be knowledgeable.

Read more about choices:

See language resources here

You'll see some C, C++, and Python learning included below, because I'm learning. There are a few books involved, see the bottom.

Before you Get Started

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.

1. You Won't Remember it All

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).

2. Use Flashcards

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:

  • Flashcards site repo
  • My flash cards database: Keep in mind I went overboard and have cards covering everything from assembly language and Python trivia to machine learning and statistics. It's way too much for what's required by Google.

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.

3. Review, review, review

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.

4. Focus

There are a lot of distractions that can take up valuable time. Focus and concentration is hard.

What you won't see covered

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:

  • SQL
  • Javascript
  • HTML, CSS, and other front-end technologies

The Daily Plan

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.

Prerequisite Knowledge

Algorithmic complexity / Big-O / Asymptotic analysis

Data Structures

More Knowledge

Trees

Sorting

图论能解决计算机科学里的很多问题,所以这一节会比较长,像树和排序的部分一样。

可以从 Skiena 的书(参考下面的书推荐小节)和面试书籍中学习更多关于图的实践。

更多知识


终面

这一部分有一些短视频,你可以快速的观看和复习大多数重要概念。
这对经常性的巩固很有帮助。

综述:

  • 2-3 分钟的短视频系列 (23 个)
  • 2-5 分钟的短视频系列 - Michael Sambol (18 个):

排序:

书籍

Google Coaching 里提到的

阅读并做练习:

  • [ ] 算法设计手册 (Skiena)

    read and do exercises from the books below. Then move to coding challenges (further down below) 一旦你理解了每日计划里的所有内容,就去读上面所列的书并完成练习,然后开始读下面所列的书并做练习,之后就可以开始实战写代码了(本文再往后的部分)

首先阅读:

然后阅读 (这本获得了很多推荐, 但是不在 Google coaching 的文档里):

附加书单

这些没有被 Google 推荐阅读,不过我因为需要这些背景知识所以也把它们列在了这里。

如果你有时间

编码练习和挑战

一旦你学会了理论基础,就应该把它们拿出来练练。 尽量坚持每天做编码练习,越多越好。

编程问题预备:

编码练习平台:

当你临近面试时

你的简历

当面试来临的时候

随着下面列举的问题思考下你可能会遇到的 20 个面试问题
每个问题准备 2-3 种回答
准备点故事,不要只是摆一些你完成的事情的数据,相信我,人人都喜欢听故事
  • 你为什么想得到这份工作?
  • 你解决过的最有难度的问题是什么?
  • 面对过的最大挑战是什么?
  • 见过的最好或者最坏的设计是怎么样的?
  • 对某项 Google 产品提出改进建议。
  • 你作为一个个体同时也是团队的一员,如何达到最好的工作状态?
  • 你的什么技能或者经验是你的角色中不可或缺的?为什么?
  • 你在某份工作或某个项目中最享受的是什么?
  • 你在某份工作或某个项目中面临过的最大挑战是什么?
  • 你在某份工作或某个项目中遇到过的最蛋疼的 Bug 是什么样的?
  • 你在某份工作或某个项目中学到了什么?
  • 你在某份工作或某个项目中哪些地方还可以做的更好?

问面试官的问题

我会问的一些:(可能我已经知道了答案但我想听听面试官的看法或者了解团队的前景):
  • 团队多大规模?
  • 开发周期是怎样的? 会使用瀑布流/极限编程/敏捷开发么?
  • 经常会为 deadline 加班么? 或者是有弹性的?
  • 团队里怎么做技术选型?
  • 每周平均开多少次会?
  • 你觉得工作环境有助于员工集中精力吗?
  • 目前正在做什么工作?
  • 喜欢这些事情吗?
  • 工作期限是怎么样的?

当你获得了梦想的职位

我还能说些什么呢,恭喜你!

坚持继续学习。

得到这份工作只是一个开始。


*****************************************************************************************************
*****************************************************************************************************

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.

*****************************************************************************************************
*****************************************************************************************************

Additional Learning

--

Additional Detail on Some Subjects

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?

Video Series

Sit back and enjoy. "netflix and skill" :P

Computer Science Courses