Google 面试

坚持完成这套学习手册,你就能够去 Google 面试

 

这是?

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

白板上编程 ———— 来自 HBO 频道的剧集,“硅谷”

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


目录

—————- 下面的内容是可选的 —————-java


为什么要用到它?

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

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

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

如何使用它

下面全部的东西都只是一个概述。所以,你须要由上而下逐一地去处理它。程序员

在学习过程当中,我是使用 GitHub 特殊的语法特性 markdown flavor 去检查计划的进展,包括使用任务列表。(注:因极客头条的 markdown 并不支持此语法,所以在下方作了删除处理)github

更多关于 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 和其余前端技术

平常计划

部分问题可能会花费一天的时间去学习,而部分则会花费多天。固然,有些学习并不须要咱们懂得如何实现。

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

C —— 使用结构体和函数,该函数会接受一个结构体指针 * 及其余数据做为参数。
C++ —— 不使用内建的数据类型。
C++ —— 使用内建的数据类型,如使用 STL 的 std::list 来做为链表。
Python ——  使用内建的数据类型(为了持续练习 Python),并编写一些测试去保证本身代码的正确性。有时,只须要使用断言函数 assert() 便可。
此外,你也可使用 Java 或其余语言。以上只是个人我的偏好而已。

为什么要在这些语言上分别实现一次?

由于能够练习,练习,练习,直至我厌倦它,并完美地实现出来。(如有部分边缘条件没想到时,我会用书写的形式记录下来并去记忆)
由于能够在纯原生的条件下工做(不需垃圾回收机制的帮助下,分配/释放内存(除了 Python))
由于能够利用上内建的数据类型,以使得我拥有在现实中使用内建工具的经验(在生产环境中,我不会去实现本身的链表)

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

在这里,你能够查看到个人代码:

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

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

必备知识

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

数据结构

更多的知识

树(Trees)

排序(Sorting)

图(Graphs)

图论能解决计算机科学里的不少问题,因此这一节会比较长,像树和排序的部分同样。

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

更多知识

相关文章
相关标签/搜索