Fără Descriere

aleen42 12f9b323e1 modification 8 ani în urmă
extras c86e268f6b Marking items read. 8 ani în urmă
.gitignore d5f1061812 Added my own checkmarked copy to the ignore list. Checkmarks to be unchecked today. 8 ani în urmă
LICENSE.txt a9b8ff0843 Added Creative Commons license. 8 ani în urmă
README-cn.md 12f9b323e1 modification 8 ani în urmă
README.md 1daf277e0e Reorganized Rabin-Karp. Added video on efficient implementation of rolling hashes. 8 ani în urmă
programming-language-resources.md b054fbabc0 Add Go Proverbs & its video 8 ani în urmă

README-cn.md

Google Interview University - 一套完整的学习手册帮助自己准备 Google 的面试

这是?

这是我为了从 web 开发者(自学、非计算机科学学位)蜕变至 Google 软件工程师所制定的计划,其内容历时数月。

这一长列表是从 Google 的指导笔记 中萃取出来并进行扩展。因此,有些事情你必须去了解一下。我在列表的底部添加了一些额外项,用于解决面试中可能会出现的问题。这些额外项大部分是来自于 Steve Yegge 的“得到在 Google 工作的机会”。而在 Google 指导笔记的逐字间,它们有时也会被反映出来。


目录

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


为何要用到它?

我一直都是遵循该计划去准备 Google 的面试。自 1997 年以来,我一直从事于 web 程序的构建、服务器的构建及创业型公司的创办。对于只有着一个经济学学位,而不是计算机科学学位(CS degree)的我来说,在职业生涯中所取得的都非常成功。然而,我想在 Google 工作,并进入大型系统中,真正地去理解计算机系统、算法效率、数据结构性能、低级别编程语言及其工作原理。可一项都不了解的我,怎么会被 Google 所应聘呢?

当我创建该项目时,我从一个堆栈到一个堆都不了解。那时的我,完全不了解 Big-O 、树,或如何去遍历一个图。如果非要我去编写一个排序算法的话,我只能说我所写的肯定是很糟糕。一直以来,我所用的任何数据结构都是内建于编程语言当中。至于它们在背后是如何运作,对此我一概不清楚。此外,以前的我并不需要对内存进行管理,最多就只是在一个正在执行的进程抛出了“内存不足”的错误后,采取一些权变措施。而在我的编程生活中,也甚少使用到多维数组,可关联数组却成千上万。而且,从一开始到现在,我都还未曾自己实现过数据结构。

就是这样的我,在经过该学习计划后,已然对被 Google 所雇佣充满信心。这是一个漫长的计划,以至于花费了我数月的时间。若您早已熟悉大部分的知识,那么也许能节省大量的时间。

如何使用它

下面所有的东西都只是一个概述。因此,你需要由上而下逐一地去处理它。

在学习过程中,我是使用 GitHub 特殊的语法特性 markdown flavor 去检查计划的进展,包括使用任务列表。

  • 创建一个新的分支,以使得你可以像这样去检查计划的进展。直接往方括号中填写一个字符 x 即可:[x]

更多关于 Github-flavored markdown 的详情

拥有一名 Googler 的心态

把一个(或两个)印有“future Googler”的图案打印出来,并用你誓要成功的眼神盯着它。

future Googler sign

我得到了工作吗?

我还没去应聘。

因为我离完成学习(完成该疯狂的计划列表)还需要数天的时间,并打算在下周开始用一整天的时间,以编程的方式去解决问题。当然,这将会持续数周的时间。然后,我才通过使用在二月份所得到的一个介绍资格,去正式应聘 Google(没错,是二月份时就得到的)。

感谢 JP 的这次介绍。

跟随着我

目前我仍在该计划的执行过程中,如果你想跟随我脚步去学习的话,可以登进我在 GoogleyAsHeck.com 上所写的博客。

下面是我的联系方式:

John Washam - Google Interview University

不要自以为自己足够聪明

  • Google 的工程师都是才智过人的。但是,就算是工作在 Google 的他们,仍然会因为自己不够聪明而感到一种不安。
  • 天才程序员的神话

关于 Google

相关视频资源

部分视频只能通过在 Coursera、Edx 或 Lynda.com class 上注册登录才能观看。这些视频被称为网络公开课程(MOOC)。即便是免费观看,部分课程可能会由于不在时间段内而无法获取。因此,你需要多等待几个月。

很感谢您能帮我把网络公开课程的视频链接转换成公开的视频源,以代替那些在线课程的视频。此外,一些大学的讲座视频也是我所青睐的。

面试过程 & 通用的面试准备

为你的面试选择一种语言

在这,我就以下话题写一篇短文 —— 重点:为在 Google 的面试选择一种语言

在大多数公司面试中的编程环节,你可以使用一种用起来较为舒适的语言。但在 Google,只有三种固定的选择:

  • C++
  • Java
  • Python

有时你也可以使用下面两种,但需要事先查阅说明。因为,说明中会有警告:

  • JavaScript
  • Ruby

你需要对你所选择的语言感到非常舒适且足够了解。

关于选择的更多阅读:

在此查看相关语言的资源

由于,我正在学习C、C++ 和 Python,因此,在下面你会看到部分关于它们的学习资料。相关书籍请看文章的底部。

在你开始之前

该列表已经持续更新了很长时间,所以没错,它的确容易会失去控制。

这里列出一些我所犯过的错误,希望您不要重滔覆辙。

1. 你不可能把所有的东西都记住

我查看了数小时的视频,并记录了大量的笔记。可几个月后,我都忘却了其中的大部分东西。所以,我翻阅我的笔记,并将可回顾的东西制作成抽认卡(flashcard)(请往下看)

2. 使用抽认卡

为了解决善忘的问题,我制作了一些抽认卡页面,用于添加两种抽认卡:正常的及带代码的。每种卡都会有不同的格式设计。

而且,我还以移动设备优先去设计网页,以使得在任何地方,我都可以在我的手机及平板上回顾知识。

你也可以免费制作数以你自己的网站:

  • 抽认卡页面的代码仓库
  • 我的抽认卡数据库:有一点需要记住的是,我做事有点过头,以至于把卡片覆盖到所有的东西上。从汇编语言和 Python 的细枝末节,到机器学习和统计。这种性格对于 Google 的要求来说,是的确有点多余。

在抽认卡上做笔记: 若你第一次发现你知道问题的答案时,不要急着把其标注成“已懂”。你需要做的是去查看是否有同样的抽认卡,并在你真正懂得如何解决问题之前,多问自己几次。重复地问答可帮助您深刻记住该知识点。

3. 回顾,回顾,回顾

我留有一组 ASCII 码表、OSI 堆栈、Big-O 记号及更多的小抄纸,以便在空余的时候可以学习。

每编程半个小时就要休息一下,并去回顾一下你的抽认卡。

4. 专注

在学习的过程中,往往会有许多令人分心的事情占据着我们宝贵的时间。因此,专注和集中注意力是非常的苦难的。

你所看不到的

由于,这个巨大的列表是始于一个从 Google 面试指导笔记所形成的的个人事件处理列表。因此,有一些我熟悉且普遍的技术都未被谈及到:

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

日常计划

部分问题可能会花费一天去学习,而部分则会花费都天。有些学习,则不需要使用代码去实现。

因此,每一天我都会在下面所列出的列表中选择一个问题,并查看相关的视频。然后,使用以下的一种语言去实现:

C —— 使用结构体和函数,该函数会接受一个结构体指针 * 及其他数据作为参数。
C++ —— 不适用内建的数据类型。
C++ —— 使用内建的数据类型,如使用 STL 的 std::list 来充当一个链表。
Python ——  使用内建的数据类型(为了持续连续 Python),并编写一些测试去保证自己代码的正确性。有时,只需要使用断言函数 assert() 即可。
此外,你也可以使用 Java 或其他语言,这只是我的偏好而已。

为何要在这些语言上都编程一次?

因为可以练习,练习,练习,直至我已厌倦它,并毫无问题地完成它。(若有部分边缘条件没想到时,则用书写的形式记录下来并去记忆)
因为可以在纯原生的条件下工作(不需垃圾回收机制的帮助下,分配/释放内存(除了 Python))
因为可以利用上内建的数据类型,以使得我拥有在现实世界中使用内建工具的经验(在生产环境中,不会去编码实现自己的链表)

就算我没有时间去每一项都这么做,我也会尽我所能的。

在这里,你可以查看到我的代码:

你不需要记住每一个算法的内部原理。

在一个白板上写代码,而不要在一台计算机上编写。在测试完部分简单输入后,到计算机上再测试一下。

必备知识

算法复杂度 / Big-O / 渐进分析法

数据结构

更多的知识

Sorting

Graphs

Graphs can be used to represent many problems in computer science, so this section is long, like trees and sorting were.

You'll get more graph practice in Skiena's book (see Books section below) and the interview books

Even More Knowledge


Final Review

This section will have shorter videos that can you watch pretty quickly to review most of the important concepts.
It's nice if you want a refresher often.
(More items will be added here)

General:

  • Series of 2-3 minutes short subject videos (23 videos)
  • Series of 2-5 minutes short subject videos - Michael Sambol (18 videos):

Sorts:

Books

Mentioned in Google Coaching

Read and do exercises:

  • [ ] The Algorithm Design Manual (Skiena)

    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 (recommended by many, but not in Google coaching docs):

Additional books

These were not suggested by Google but I added because I needed the background knowledge

If you have time

Coding exercises/challenges

Once you've learned your brains out, put those brains to work. Take coding challenges every day, as many as you can.

Programming Question Prep:

Programming:

Once you're closer to the interview

Your Resume

Be thinking of for when the interview comes

Think of about 20 interview questions you'll get, along the lines of the items below.
Have 2-3 answers for each
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]?

Have questions for the interviewer

Some of mine (I already may know answer to but want their opinion or team perspective):
  • How large is your team?
  • What is your dev cycle look like? Do you do waterfall/sprints/agile?
  • Are rushes to deadlines common? Or is there flexibility?
  • How are decisions made in your team?
  • How many meetings do you have per week?
  • Do you feel your work environment helps you concentrate?
  • What are you working on?
  • What do you like about it?
  • What is the work life like?

Once You've Got The Job

Congratulations!

Keep learning.

You're never really done.


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

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