|
hace 8 años | |
---|---|---|
extras | hace 8 años | |
.gitignore | hace 8 años | |
LICENSE.txt | hace 8 años | |
README-cn.md | hace 8 años | |
README.md | hace 8 años | |
programming-language-resources.md | hace 8 años |
这是我为了从 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 去检查计划的进展,包括使用任务列表。
更多关于 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 树
[ ] 红黑树
[ ] Notes:
For heapsort, see Heap data structure above. Heap sort is great, but not stable.
[ ] Stanford lectures on sorting:
[ ] Shai Simonson, Aduni.org:
[ ] Steven Skiena lectures on sorting:
[ ] UC Berkeley:
[ ] - Merge sort code:
[ ] - Quick sort code:
[ ] Implement:
[ ] For curiosity - not required:
Graphs can be used to represent many problems in computer science, so this section is long, like trees and sorting were.
Notes from Yegge:
[ ] Skiena Lectures - great intro:
[ ] Graphs (review and more):
Full Coursera Course:
Yegge: If you get a chance, try to study up on fancier algorithms:
I'll implement:
You'll get more graph practice in Skiena's book (see Books section below) and the interview books
Scalability and System Design are very large topics with many topics and resources, since there is a lot to consider when designing a software/hardware system that can scale. Expect to spend quite a bit of time on this.
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)
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):
These were not suggested by Google but I added because I needed the background knowledge
[ ] C Programming Language, Vol 2
[ ] C++ Primer Plus, 6th Edition
[ ] Introduction to Algorithms
[ ] Elements of Programming Interviews
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:
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
Some of mine (I already may know answer to but want their opinion or team perspective):
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.
*****************************************************************************************************
*****************************************************************************************************
--
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 Dynamic Programming (videos)
[ ] Advanced Graph Processing (videos)
[ ] MIT Probability (mathy, and go slowly, which is good for mathy things) (videos):
坐下来享受一下吧。"netflix and skill" :P
[ ] 离散数学 (19 个视频)
[ ] CSE373 - 算法分析 (25 个视频)
[ ] 斯坦福: 编程范例 (17 个视频)
[ ] 密码学导论