coding-interview-university/README-cn.md at master · jwasham/coding-interview-university · GitHub

标签: | 发表时间:2019-12-01 20:53 | 作者:
出处:https://github.com

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

xitu

这是?

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

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

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


目录

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


为何要用到它?

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

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

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

如何使用它

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

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

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

更多关于 Github-flavored markdown 的详情

我得到了工作吗?

我还没去应聘。

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

    感谢 JP 的这次介绍。

跟着我的脚步

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

下面是我的联系方式:

John Washam - Coding 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 的书(参考下面的书推荐小节)和面试书籍中学习更多关于图的实践。

更多知识


终面

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

综述:

  • 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 加班么? 或者是有弹性的?
  • 团队里怎么做技术选型?
  • 每周平均开多少次会?
  • 你觉得工作环境有助于员工集中精力吗?
  • 目前正在做什么工作?
  • 喜欢这些事情吗?
  • 工作期限是怎么样的?

当你获得了梦想的职位

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

坚持继续学习。

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


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

下面的内容都是可选的。这些是我的推荐,不是 Google 的。
通过学习这些内容,你将会得到更多的有关 CS 的概念,并将为所有的软件工程工作做更好的准备。

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

附加的学习

--

一些主题的额外内容

    我为前面提到的某些主题增加了一些额外的内容,之所以没有直接添加到前面,是因为这样很容易导致某个主题内容过多。毕竟你想在本世纪找到一份工作,对吧?

视频系列

坐下来享受一下吧。"netflix and skill" :P

计算机科学课程

相关 [coding interview university] 推荐:

coding-interview-university/README-cn.md at master · jwasham/coding-interview-university · GitHub

- -
[译] Coding Interview University 一套完整的学习手册帮助自己准备 Google 的面试. 这是我为了从 web 开发者(自学、非计算机科学学位)蜕变至 Google 软件工程师所制定的计划,其内容历时数月. Google 的指导笔记中萃取出来并进行扩展. 因此,有些事情你必须去了解一下.

zen coding 0.7发布

- adow - islighting
zen coding 更新到0.7版本,这次更新还是很有亮点的. 最令人欣喜的恐怕是群组展开功能,这在以前需要分段来完成,而现在,只要你愿意,可以用一句表达式从头写到尾,一个module几乎可以一气呵成. 另外一个重要的更新是可以编写节点的属性和文本,要编写小段的html也方便许多,如. 更多的更新内容请看0.7 release notes,这里还有一个web版,可以体验下zen coding的强大功能.

Zen Coding – 超快地写网页代码

- - haohtml's blog
上次在北京看到善用佳软的 xBeta 演示 VIM 的时候,@ sfufoet 我就被强烈震撼到了. VIM 的确是个强大的编辑器,它可以折腾出很多种强大的功能. 今天看到这个叫  Zen Coding 的东西,我强烈推荐给经常和 HTML CSS 打交道的朋友. 下面的动态演示图,只是它强大功能的一部分而已.

ABC: Always Be Coding——程序员面试必读

- - 36氪 | 关注互联网创业
@guitardave24">David Byttow是一名程序员,曾在Google和Square等公司工作过. 在正文之前,先让我们回答几个简单的问题:第一,你面试过多少家公司;第二,这些公司中,录取你的有多少. 记下这两个数字,然后代入下面这个算式中(为我自己发明,仅供参考,不具有其他意义):.

Apple University:苹果如何走向后乔布斯时代?

- Derek - 爱范儿 · Beats of Bits
乔布斯是苹果公司的灵魂人物,很少有科技公司如此依赖个人魅力. 当乔布斯不在苹果公司之后,苹果会如何. 关于乔布斯的继任者,各媒体网站都进行了不同的猜测,但综合看来,没有任何一个高管拥有乔布斯的个人魅力. 苹果进入后乔布斯时代究竟会如何,对所有人都是一个不确定的谜团. Online Colleges 网站的一副信息图给我们揭示了“Apple University 的存在”.

访谈四九期:张君钢 InterView 49: Zhang Jungang

- zementary - Jia Za Zhi
每次我开始疑惑摄影到底是什么的时候,我就会到张君钢(k1973)的网站去逛逛,然后就明白,这就是摄影. 就是抱着这样的崇拜,我一直想做一次他的访谈. 这次趁着他的新系列发布,访谈一事终于如愿. 希望借张君钢的这个拍摄于冰天雪地的系列,能给各位带去一丝沁凉. He is such a fabulous photographer that I’ve admired for a long time, and I planned for several times to do an interview with him, but was postponed all the time.

Apple University:苹果如何走向后乔布斯时代?

- Jerry - 互联网的那点事
乔布斯是苹果公司的灵魂人物,很少有科技公司如此依赖个人魅力. 当乔布斯不在苹果公司之后,苹果会如何. 关于乔布斯的继任者,各媒体网站都进行了不同的猜测,但综合看来,没有任何一个高管拥有乔布斯的个人魅力. 苹果进入后乔布斯时代究竟会如何,对所有人都是一个不确定的谜团. Online Colleges 网站的一副信息图给我们揭示了“Apple University 的存在”.

申請博士入學interview面試問題

- - 研究生2.0
12月、1月是許多美國學校決定下一年度博士生錄取名單的時候,所以如果你申請2014入學的話,可能最近就會接到學校要interview的通知. 這篇文章就從老師的觀點來說,列出我可能會問的問題,並簡單說說我的期望. Interview之前會說明一下這個interview的目的,就是讓雙方有個了解,並作最後的決定.

一些PHP Coding Tips[2011/04/02最后更新]

- 硬盘被格 - 风雪之隅
作者: Laruence(. 本文地址: http://www.laruence.com/2011/03/24/858.html. 以下是一些PHP Coding Tips. 当然, 这些Tips并不一定仅仅局限于PHP. 大家有什么好的心得, 欢迎直接回复本文与更多的人分享. 本文长期更新, 请关注PHP Coding Tips.

评判云服务靠谱程度 -- Coding 安全那些事 - Coding.net

- - 博客园_首页
本文依据孙宇聪在 SegmentFault D-Day 北京场的演讲内容整理,并授权首发于“高效运维”公众号. 10月11日,SegmentFault 将在上海举办D-Day,围绕 Docker 主题. Coding.net WebIDE 项目负责杜万将受邀参与分享《Docker Container 磁盘容量限制》.