|
8 ani în urmă | |
---|---|---|
extras | 8 ani în urmă | |
.gitignore | 8 ani în urmă | |
LICENSE.txt | 8 ani în urmă | |
README-cn.md | 8 ani în urmă | |
README.md | 8 ani în urmă | |
programming-language-resources.md | 8 ani în urmă |
- 原文地址:Google Interview University
- 原文作者:John Washam
- 译文出自:掘金翻译计划
- 译者:Aleen,Newton,bobmayuze,Jaeger,sqrthree
这是我为了从 web 开发者(自学、非计算机科学学位)蜕变至 Google 软件工程师所制定的计划,其内容历时数月。
这一长列表是从 Google 的指导笔记 中萃取出来并进行扩展。因此,有些事情你必须去了解一下。我在列表的底部添加了一些额外项,用于解决面试中可能会出现的问题。这些额外项大部分是来自于 Steve Yegge 的“得到在 Google 工作的机会”。而在 Google 指导笔记的逐字间,它们有时也会被反映出来。
---------------- 下面的内容是可选的 ----------------
我一直都是遵循该计划去准备 Google 的面试。自 1997 年以来,我一直从事于 web 程序的构建、服务器的构建及创业型公司的创办。对于只有着一个经济学学位,而不是计算机科学学位(CS degree)的我来说,在职业生涯中所取得的都非常成功。然而,我想在 Google 工作,并进入大型系统中,真正地去理解计算机系统、算法效率、数据结构性能、低级别编程语言及其工作原理。可一项都不了解的我,怎么会被 Google 所应聘呢?
当我创建该项目时,我从一个堆栈到一个堆都不了解。那时的我,完全不了解 Big-O 、树,或如何去遍历一个图。如果非要我去编写一个排序算法的话,我只能说我所写的肯定是很糟糕。一直以来,我所用的任何数据结构都是内建于编程语言当中。至于它们在背后是如何运作,对此我一概不清楚。此外,以前的我并不需要对内存进行管理,最多就只是在一个正在执行的进程抛出了“内存不足”的错误后,采取一些权变措施。而在我的编程生活中,也甚少使用到多维数组,可关联数组却成千上万。而且,从一开始到现在,我都还未曾自己实现过数据结构。
就是这样的我,在经过该学习计划后,已然对被 Google 所雇佣充满信心。这是一个漫长的计划,以至于花费了我数月的时间。若您早已熟悉大部分的知识,那么也许能节省大量的时间。
下面所有的东西都只是一个概述。因此,你需要由上而下逐一地去处理它。
在学习过程中,我是使用 GitHub 特殊的语法特性 markdown flavor 去检查计划的进展,包括使用任务列表。
更多关于 Github-flavored markdown 的详情
把一个(或两个)印有“future Googler”的图案打印出来,并用你誓要成功的眼神盯着它。
我还没去应聘。
因为我离完成学习(完成该疯狂的计划列表)还需要数天的时间,并打算在下周开始用一整天的时间,以编程的方式去解决问题。当然,这将会持续数周的时间。然后,我才通过使用在二月份所得到的一个介绍资格,去正式应聘 Google(没错,是二月份时就得到的)。
感谢 JP 的这次介绍。
目前我仍在该计划的执行过程中,如果你想跟随我脚步去学习的话,可以登进我在 GoogleyAsHeck.com 上所写的博客。
下面是我的联系方式:
部分视频只能通过在 Coursera、Edx 或 Lynda.com class 上注册登录才能观看。这些视频被称为网络公开课程(MOOC)。即便是免费观看,部分课程可能会由于不在时间段内而无法获取。因此,你需要多等待几个月。
很感谢您能帮我把网络公开课程的视频链接转换成公开的视频源,以代替那些在线课程的视频。此外,一些大学的讲座视频也是我所青睐的。
[ ] 视频:
[ ] 文章:
[ ] 附加的(虽然 Google 不建议,但我还是添加在此):
在这,我就以下话题写一篇短文 —— 重点:为在 Google 的面试选择一种语言
在大多数公司的面试当中,你可以在编程这一环节,使用一种自己用起来较为舒适的语言去完成编程。但在 Google,你只有三种固定的选择:
有时你也可以使用下面两种,但需要事先查阅说明。因为,说明中会有警告:
你需要对你所选择的语言感到非常舒适且足够了解。
更多关于语言选择的阅读:
由于,我正在学习C、C++ 和 Python。因此,在下面你会看到部分关于它们的学习资料。相关书籍请看文章的底部。
该列表已经持续更新了很长的一段时间,所以,我们的确很容易会对其失去控制。
这里列出了一些我所犯过的错误,希望您不要重滔覆辙。
就算我查看了数小时的视频,并记录了大量的笔记。几个月后的我,仍然会忘却其中大部分的东西。所以,我翻阅了我的笔记,并将可回顾的东西制作成抽认卡(flashcard)(请往下看)
为了解决善忘的问题,我制作了一些关于抽认卡的页面,用于添加两种抽认卡:正常的及带有代码的。每种卡都会有不同的格式设计。
而且,我还以移动设备为先去设计这些网页,以使得在任何地方的我,都能通过我的手机及平板去回顾知识。
你也可以免费制作属于你自己的抽认卡网站:
在抽认卡上做笔记: 若你第一次发现你知道问题的答案时,先不要急着把其标注成“已懂”。你需要做的,是去查看一下是否有同样的抽认卡,并在你真正懂得如何解决问题之前,多问自己几次。重复地问答可帮助您深刻记住该知识点。
我留有一组 ASCII 码表、OSI 堆栈、Big-O 记号及更多的小抄纸,以便在空余的时候可以学习。
每编程半个小时就要休息一下,并去回顾你的抽认卡。
在学习的过程中,往往会有许多令人分心的事占据着我们宝贵的时间。因此,专注和集中注意力是非常困难的。
由于,这个巨大的列表一开始是作为我个人从 Google 面试指导笔记所形成的一个事件处理列表。因此,有一些我熟悉且普遍的技术在此都未被谈及到:
部分问题可能会花费一天的时间去学习,而部分则会花费多天。当然,有些学习并不需要我们懂得如何实现。
因此,每一天我都会在下面所列出的列表中选择一项,并查看相关的视频。然后,使用以下的一种语言去实现:
C —— 使用结构体和函数,该函数会接受一个结构体指针 * 及其他数据作为参数。
C++ —— 不使用内建的数据类型。
C++ —— 使用内建的数据类型,如使用 STL 的 std::list 来作为链表。
Python —— 使用内建的数据类型(为了持续练习 Python),并编写一些测试去保证自己代码的正确性。有时,只需要使用断言函数 assert() 即可。
此外,你也可以使用 Java 或其他语言。以上只是我的个人偏好而已。
为何要在这些语言上分别实现一次?
因为可以练习,练习,练习,直至我厌倦它,并完美地实现出来。(若有部分边缘条件没想到时,我会用书写的形式记录下来并去记忆)
因为可以在纯原生的条件下工作(不需垃圾回收机制的帮助下,分配/释放内存(除了 Python))
因为可以利用上内建的数据类型,以使得我拥有在现实中使用内建工具的经验(在生产环境中,我不会去实现自己的链表)
就算我没有时间去每一项都这么做,但我也会尽我所能的。
在这里,你可以查看到我的代码:
你不需要记住每一个算法的内部原理。
在一个白板上写代码,而不要直接在计算机上编写。在测试完部分简单的输入后,到计算机上再测试一遍。
[ ] 计算机是如何处理一段程序:
[ ] 编译器
[ ] 浮点数是如何存储的:
[ ] 速查表(Cheat sheet)
如果部分课程过于学术性,你可直接跳到文章底部,去查看离散数学的视频以获取相关背景知识。
[ ] 视频:
[ ] 在线课程:
[ ] 使用线性探测的数组去实现
[ ] 自平衡二叉查找树
[ ] AVL 树
[ ] 伸展树
[ ] 2-3查找树
[ ] 2-3-4树 (亦称2-4树)
[ ] B 树
[ ] 红黑树
[ ] 笔记:
关于堆排序,请查看前文堆的数据结构部分。堆排序很强大,不过是非稳定排序。
[ ] 冒泡排序 (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 种回答
准备点故事,不要只是摆一些你完成的事情的数据,相信我,人人都喜欢听故事
我会问的一些:(可能我已经知道了答案但我想听听面试官的看法或者了解团队的前景):
我还能说些什么呢,恭喜你!
坚持继续学习。
得到这份工作只是一个开始。
*****************************************************************************************************
*****************************************************************************************************
下面的内容都是可选的。这些是我的推荐,不是 Google 的。
通过学习这些内容,你将会得到更多的有关 CS 的概念,并将为所有的软件工程工作做更好的准备。
*****************************************************************************************************
*****************************************************************************************************
--
我为前面提到的某些主题增加了一些额外的内容,之所以没有直接添加到前面,是因为这样很容易导致某个主题内容过多。毕竟你想在本世纪找到一份工作,对吧?
[ ] 动态规划的更多内容 (视频)
[ ] 图形处理进阶 (视频)
[ ] MIT 概率论 (mathy, and go slowly, which is good for mathy things) (视频):
坐下来享受一下吧。"netflix and skill" :P
[ ] 离散数学 (19 个视频)
[ ] CSE373 - 算法分析 (25 个视频)
[ ] 斯坦福: 编程范例 (17 个视频)
[ ] 密码学导论