coding-interview-university - 一个如何成为软件工程师的完整、科学的学习计划。

Created at: 2016-06-06 10:34:12
Language:
License: CC-BY-SA-4.0

编码面试大学

我最初创建这个作为成为软件工程师的学习主题的简短待办事项列表, 但它发展到你今天看到的大名单。在完成这个学习计划后,我被录用了 作为亚马逊的软件开发工程师! 你可能不必像我一样学习那么多。无论如何,你需要的一切都在这里。

我每天学习大约8-12个小时,持续了几个月。这是我的故事:为什么我为了谷歌面试而全日制学习了 8 个月

请注意:你不需要像我一样学习那么多。我浪费了很多时间在不需要知道的事情上。有关这方面的更多信息如下。我会帮助你到达那里,而不会浪费你宝贵的时间。

这里列出的项目将为你在几乎任何软件公司的技术面试做好充分准备, 包括巨头:亚马逊、Facebook、谷歌和Microsoft。

祝你好运!

翻译:
翻译中:

这是什么?

在白板上编码 - 来自 HBO 的硅谷

这是我成为一家大公司软件工程师的多月学习计划。

必填:

  • 有一点编码经验(变量、循环、方法/函数等)
  • 耐心
  • 时间

请注意,这是软件工程的学习计划,而不是前端工程或全栈开发。真的有 其他地方这些职业道路的超级路线图和课程作业(有关更多信息,请参阅 https://roadmap.sh/)。

在大学计算机科学课程中要学很多东西,但只有知道大约 75% 就足以面试,所以这就是我在这里介绍的内容。 对于一个完整的 CS 自学课程,我的学习计划的资源已包含在 Kamran Ahmed 的计算机科学路线图中: https://roadmap.sh/computer-science


目录

学习计划

学习课题

找到工作

---------------- 低于此点的所有内容都是可选的----------------

可选的额外主题和资源


为什么要使用它?

如果你想在一家大公司担任软件工程师,这些是你必须知道的事情。

如果你像我一样错过了获得计算机科学学位的机会,这将赶上你并挽救你四年的生命。

当我开始这个项目时,我不了解堆中的堆栈,也不了解 Big-O 的任何东西,也不了解任何关于树的知识,也不知道如何 遍历图形。如果我必须编写一个排序算法,我可以告诉你,这将是可怕的。 我曾经使用过的每个数据结构都内置在语言中,我不知道它们是如何工作的 在引擎盖下。我从来不需要管理内存,除非我正在运行的进程会给出“out of memory“错误,然后我必须找到解决方法。我在我的生活中使用了一些多维数组, 数以千计的关联数组,但我从未从头开始创建数据结构。

这是一个漫长的计划。这可能需要几个月的时间。如果你已经熟悉其中的很多内容,那么花费的时间会少得多。

如何使用它

下面的一切都是一个大纲,你应该按照从上到下的顺序处理这些项目。

我正在使用 GitHub 的特殊 markdown 风格,包括任务列表来跟踪进度。

如果你不想使用 git

在此页面上,单击顶部附近的“代码”按钮,然后单击“下载 ZIP”。解压缩文件,即可使用文本文件。

如果你在理解 Markdown 的代码编辑器中打开,你会看到所有内容的格式都很好。

如何将存储库下载为 zip 文件

如果你对 git 感到满意

创建一个新分支,以便你可以检查这样的项目,只需在括号中放置一个 x:[x]

  1. 分叉 GitHub 存储库:通过单击“分叉”按钮。

    https://github.com/jwasham/coding-interview-university

    分叉 GitHub 存储库

  2. 克隆到本地存储库:

    git clone https://github.com/<YOUR_GITHUB_USERNAME>/coding-interview-university.git
    cd coding-interview-university
    git remote add upstream https://github.com/jwasham/coding-interview-university.git
    git remote set-url --push upstream DISABLE  # so that you don't push your personal progress back to the original repo
  3. 完成更改后,用 X 标记所有框:

    git commit -am "Marked personal progress"
    git pull upstream main  # keep your fork up-to-date with changes from the original repo
    
    git push # just pushes to your fork

不要觉得自己不够聪明

关于视频资源的说明

某些视频只能通过注册 Coursera 或 EdX 课程来获得。这些被称为MOOC。 有时课程不在上课,因此你必须等待几个月,因此你无法访问。

用免费且始终可用的公共资源替换在线课程资源会很棒, 例如YouTube视频(最好是大学讲座),以便你可以随时学习这些, 而不仅仅是在特定的在线课程上课时。

选择编程语言

你需要为你所做的编码面试选择一种编程语言, 但是,你还需要找到一种可以用来学习计算机科学概念的语言。

最好是相同的语言,这样你只需要精通一种。

对于这个学习计划

当我制定学习计划时,我大部分时间都使用了 2 种语言:C 和 Python

  • C:非常低的水平。允许你处理指针和内存分配/解除分配,因此你可以感受到数据结构 和你骨子里的算法。在 Python 或 Java 等高级语言中,这些对你是隐藏的。在日常工作中,这太棒了, 但是,当你了解这些低级数据结构是如何构建的时,感觉亲近金属真是太好了。
    • C无处不在。在学习期间,你会书籍、讲座、视频中看到示例。
    • C 编程语言,第 2 版
      • 这是一本简短的书,但它会让你很好地掌握 C 语言,如果你稍微练习一下 你很快就会熟练掌握。了解 C 有助于你了解程序和内存的工作原理。
      • 你不需要深入研究这本书(甚至不需要读完它)。只需达到你喜欢用 C 语言阅读和写作的地方。
  • Python:现代且非常有表现力,我之所以学习它,是因为它非常有用,还允许我在面试中编写更少的代码。

这是我的偏好。当然,你可以做你喜欢的事情。

你可能不需要它,但这里有一些学习新语言的网站:

对于你的编码面试

你可以使用你熟悉的语言来完成面试的编码部分,但对于大公司来说,这些是可靠的选择:

  • C++
  • 爪哇岛

你也可以使用这些,但请先阅读。可能有一些注意事项:

  • JavaScript的
  • 红宝石

这是我写的一篇关于为面试选择语言的文章:为编码面试选择一种语言。 这是我的帖子所基于的原始文章:为面试选择编程语言

你需要对语言感到非常熟悉并且知识渊博。

阅读更多关于选择的信息:

在此处查看特定于语言的资源

数据结构和算法书籍

本书将奠定你计算机科学的基础。

只需选择一种你熟悉的语言即可。你将进行大量阅读和编码。

C

爪哇岛

你的选择:

C++

你的选择:

面试准备书籍

你不需要买一堆这些。老实说,“破解编码面试”可能就足够了, 但我买了更多,让自己得到更多的练习。但我总是做得太多了。

我买了这两个。他们给了我大量的练习。

如果你有大量的额外时间:

选择一项:

不要犯我的错误

这个名单在几个月内不断增长,是的,它失控了。

以下是我犯的一些错误,以便你获得更好的体验。而且,你将节省数月的时间。

1. 你不会记住这一切

我看了几个小时的视频,做了大量的笔记,几个月后,我还有很多不记得了。我花了 3 天时间去 通过我的笔记和制作抽认卡,这样我就可以复习了。我不需要所有这些知识。

请阅读,这样你就不会犯我的错误:

保留计算机科学知识

2.使用抽认卡

为了解决这个问题,我做了一个小抽认卡网站,可以在其中添加 2 种类型的抽认卡:通用和代码。 每张卡都有不同的格式。我制作了一个移动优先的网站,这样无论我身在何处,都可以在手机或平板电脑上进行评论。

免费制作自己的:

我不建议使用我的抽认卡。太多了,其中大多数都是你不需要的琐事。

但如果你不想听我的话,那就去吧:

请记住,我做得太过分了,卡片涵盖了从汇编语言和 Python 琐事到机器学习和统计学的所有内容。 对于需要的东西来说,这太多了。

关于抽认卡的注意事项:当你第一次意识到你知道答案时,不要把它标记为已知。你必须看到 同一张牌,在你真正知道之前正确回答几次。重复将使这些知识更深入 你的大脑。

使用抽认卡网站的另一种方法是 Anki,它已经多次推荐给我。 它使用重复系统来帮助你记住。它用户友好,可在所有平台上使用,并具有云同步系统。 它在 iOS 上售价 25 美元,但在其他平台上是免费的。

我的 Anki 格式的抽认卡数据库:https://ankiweb.net/shared/info/25173560(感谢@xiewenya)。

一些学生提到了空白的格式问题,可以通过执行以下操作来解决:打开牌组,编辑卡片,单击卡片,选择“样式”单选按钮,然后将成员“white-space: pre;”添加到卡片类中。

3. 在学习时做编码面试问题

这非常重要。

在学习数据结构和算法的同时开始编写面试问题。

你需要运用你所学的知识来解决问题,否则你会忘记。我犯了这个错误。

一旦你学习了一个主题,并且对它感到有些舒服,例如,链表

  1. 打开其中一本编码面试书(或下面列出的编码问题网站)
  2. 做 2 或 3 个关于链表的问题。
  3. 转到下一个学习主题。
  4. 稍后,返回并再做 2 或 3 个链表问题。
  5. 对你学习的每个新主题都这样做。

在你学习所有这些东西的时候继续做问题,而不是在学习之后。

你被雇用不是为了知识,而是为了你如何应用知识。

下面列出了许多资源。继续前进。

4. 专注

有很多干扰会占用宝贵的时间。专注力和专注力很难。打开一些音乐 没有歌词,你就能很好地集中注意力。

你不会看到涵盖的内容

这些是流行的技术,但不是本研究计划的一部分:

  • Javascript的
  • HTML、CSS 和其他前端技术
  • SQL算法

每日计划

本课程涉及很多科目。每个可能需要几天,甚至一周或更长时间。这取决于你的日程安排。

每天,选择列表中的下一个主题,观看有关该主题的一些视频,然后编写实现 你为本课程选择的语言的数据结构或算法。

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

你不需要记住每个算法。你只需要能够充分理解它,就可以编写你自己的实现。

编码问题练习

Why is this here? I'm not ready to interview.

然后回去读这个。

为什么你需要练习做编程问题:

  • 问题识别,以及正确的数据结构和算法适合的位置
  • 收集问题的要求
  • 像面试中一样用自己的方式解决问题
  • 在白板或纸上编码,而不是在计算机上编码
  • 为你的解决方案提出时间和空间复杂性(请参阅下面的 Big-O)
  • 测试解决方案

在面试中有一个很好的介绍,可以有条不紊地解决问题。你会从编程中得到这个 采访书也是如此,但我发现这个很出色:算法设计画布

在白板或纸上写代码,而不是在计算机上写代码。使用一些示例输入进行测试。然后键入它并在计算机上进行测试。

如果你家里没有白板,那就从艺术商店买一个大画板。你可以坐在沙发上练习。 这是我的“沙发白板”。我在照片中添加了笔只是为了缩放。如果你用笔,你会希望你能擦掉。 很快就会变得凌乱。我用铅笔和橡皮擦。

我的沙发白板

编码问题练习不是记住编程问题的答案。

编码问题

不要忘记你的关键编码面试书在这里。

解决问题:

编码面试问题视频:

挑战/练习地点:

让我们开始吧

好了,说得够多了,我们来学习吧!

但是,在学习时不要忘记从上面做编码问题!

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

嗯,这已经足够了。

当你通过“破解编码面试”时,有一章是关于这个的,最后有一个测验要看 如果可以识别不同算法的运行时复杂性。这是一个超级评论和测试。

数据结构

更多知识

排序

作为总结,这里是 15 种排序算法的可视化表示。 如果你需要有关此主题的更多详细信息,请参阅某些主题的其他详细信息中的“排序”部分

图形可以用来表示计算机科学中的许多问题,所以这一部分很长,就像树和排序一样。

更多知识


终审

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

更新你的简历

面试过程和一般面试准备

模拟面试:

想想面试什么时候来

想想你会得到大约 20 个面试问题,以及下面几行的项目。每个答案至少有一个。 有一个关于你完成的事情的故事,而不仅仅是数据。

  • 你为什么想要这份工作?
  • 你解决的难题是什么?
  • 面临的最大挑战是什么?
  • 见过最好/最差的设计吗?
  • 改进现有产品的想法
  • 作为个人和团队的一员,你如何才能最好地工作?
  • 你的哪些技能或经验将成为该职位的资产,为什么?
  • 在[工作 x / 项目 y],你最喜欢什么?
  • 你在 [工作 x / 项目 y] 中面临的最大挑战是什么?
  • 你在 [job x / project y] 中遇到的最困难的错误是什么?
  • 你在 [工作 x / 项目 y] 学到了什么?
  • 在[工作 x / 项目 y] 中,你会做得更好吗?

有问题要问面试官

我的一些人(我可能已经知道答案,但想要他们的意见或团队观点):

  • 你的团队有多大?
  • 你的开发周期是什么样的?你做瀑布/冲刺/敏捷吗?
  • 匆匆赶到最后期限很常见吗?还是有灵活性?
  • 你的团队是如何做出决策的?
  • 你每周开多少次会议?
  • 你觉得你的工作环境有助于你集中注意力吗?
  • 你在做什么?
  • 你喜欢它什么?
  • 工作生活是怎样的?
  • 工作/生活如何平衡?

一旦你得到这份工作

祝贺!

不断学习。

你永远不会真正完成。


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

Everything below this point is optional. It is NOT needed for an entry-level interview.
However, by studying these, you'll get greater exposure to more CS concepts and will be better prepared for
any software engineering job. You'll be a much more well-rounded software engineer.

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

其他书籍

These are here so you can dive into a topic you find interesting.
  • Unix 编程环境
    • 老歌,但好东西
  • Linux 命令行:完整介绍
    • 现代选择
  • TCP/IP 图解系列
  • 头部优先设计模式
    • 对设计模式的温和介绍
  • 设计模式:可重用面向对象软件的元素
    • 又名“四人帮”书或 GOF
    • 规范设计模式书
  • 算法设计手册(Skiena)
    • 作为复习和问题识别
    • 算法目录部分远远超出了你在面试中获得的难度范围
    • 本书分为两部分:
      • 数据结构与算法类教科书
        • 优点:
          • 是一本很好的评论,就像任何算法教科书一样
          • 他在工业界和学术界解决问题的经验中的好故事
          • C语言代码示例
        • 缺点:
          • 可以像 CLRS 一样密集或难以穿透,在某些情况下,CLRS 可能是某些主题的更好选择
          • 第 7、8 和 9 章尝试学习可能会很痛苦,因为有些项目解释得不好,或者需要比我更多的大脑
          • 不要误会我的意思:我喜欢斯基纳,他的教学风格和举止,但我可能不是石溪的材料
      • 算法目录:
        • 这就是你买这本书的真正原因。
        • 这本书更适合作为算法参考,而不是你从头到尾阅读的东西。
    • 可以在Kindle上租借
    • 答案:
    • 勘误表
  • 算法(Jeff Erickson)
  • 编写出色的代码:第 1 卷:了解机器
    • 这本书出版于 2004 年,有些过时了,但它是简要了解计算机的绝佳资源
    • 作者发明了 HLA,所以对 HLA 中的提及和例子持保留态度。没有被广泛使用,但组装的样子的不错例子
    • 这些章节值得一读,为你提供一个很好的基础:
      • 第 2 章 - 数字表示
      • 第 3 章 - 二进制算术和位运算
      • 第 4 章 - 浮点表示
      • 第 5 章 - 字符表示
      • 第 6 章 - 内存组织和访问
      • 第 7 章 - 复合数据类型和内存对象
      • 第 9 章 - CPU 架构
      • 第 10 章 - 指令集架构
      • 第 11 章 - 内存架构和组织
  • 算法简介
    • 重要:阅读这本书的价值有限。这本书是对算法和数据结构的一个很好的评论,但不会教你如何写出好的代码。你必须能够有效地编写一个像样的解决方案
    • 又名CLR,有时是CLRS,因为Stein在比赛中迟到了
  • 计算机体系结构,第六版:定量方法
    • 为了更丰富、更最新(2017 年),但治疗时间更长

系统设计、可扩展性、数据处理

如果你有 4+ 多年的经验,你可以期待系统设计问题。

其他学习

I added them to help you become a well-rounded software engineer and to be aware of certain
technologies and algorithms, so you'll have a bigger toolbox.

关于某些主题的更多细节

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.

计算机科学课程

算法实现

文件

许可证

CC-BY-SA-4.0的