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的任何东西,或者关于树的任何东西,或者如何遍历图。如果我必须编写一个排序算法,我可以告诉你它会很糟糕。我曾经使用过的每个数据结构都内置于语言中,我根本不知道它们是如何工作的。我永远不必管理内存,除非我正在运行的进程会出现“内存不足”错误,然后我必须找到解决方法。我在生活中使用过一些多维数组和数千个关联数组,但我从未从头开始创建数据结构。

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

如何使用它

下面的所有内容都是大纲,你应该按从上到下的顺序处理这些项目。

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

如果你不想使用 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 课程来观看。这些被称为慕课。有时课程不在课程中,因此你必须等待几个月,因此无法访问。

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

选择编程语言

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

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

对于本学习计划

当我做学习计划时,我大部分使用了2种语言:C和Python。

  • C:非常低的水平。允许你处理指针和内存分配/释放,因此你可以感受到骨骼中的数据结构和算法。在像Python或Java这样的高级语言中,这些对你是隐藏的。在日常工作中,这很棒,但是当你学习如何构建这些低级数据结构时,感觉接近金属是很棒的。
    • C 无处不在。在学习期间,你会在书籍,讲座,视频中随处可见示例。
    • C 编程语言,第 2 版
      • 这是一本简短的书,但它会让你很好地掌握C语言,如果你稍微练习一下,你很快就会精通。了解 C 有助于你了解程序和内存的工作原理。
      • 你不需要在书中走得太深(甚至不需要读完它)。只需到达你习惯用 C 语言阅读和写作的地方即可。
      • 书中问题的答案
  • Python:现代且非常富有表现力,我学会了它,因为它非常有用,并且还可以让我在面试中编写更少的代码。

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

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

为你的编程面试

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

  • C++
  • 爪哇岛

你也可以使用这些,但请先阅读。可能有警告:

  • JavaScript
  • 红宝石

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

你需要非常熟悉该语言并知识渊博。

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

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

数据结构和算法书籍

本书将构成计算机科学的基础。

只需选择一个,用你熟悉的语言。你会做大量的阅读和编码。

C

爪哇岛

你的选择:

C++

你的选择:

面试准备书

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

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

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

选择一项:

不要犯我的错误

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

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

1.你不会记得这一切

我看了几个小时的视频,做了大量的笔记,几个月后,有很多我不记得了。我花了 3 天时间浏览笔记并制作抽认卡,以便复习。我不需要所有这些知识。

请阅读,以免犯我的错误:

保留计算机科学知识

2. 使用抽认卡

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

免费制作自己的:

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

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

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

抽认卡注意事项:当你第一次认识到你知道答案时,不要把它标记为已知。你必须看到同一张卡片并正确回答几次才能真正了解它。重复会把这些知识更深入你的大脑。

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

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

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

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

这一点非常重要。

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

你需要把你学到的东西应用到解决问题上,否则你会忘记的。我犯了这个错误。

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

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

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

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

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

4. 专注

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

你不会看到的内容

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

  • 爪哇语
  • HTML、CSS 和其他前端技术
  • .SQL

每日计划

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

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

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

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

编码问题练习

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

然后回去读这个。

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

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

在面试中,有条不紊、善于交际地解决问题有一个很好的介绍。你也会从编程面试书中得到这个,但我发现这很出色: 算法设计画布

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

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

我的沙发白板

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

编码问题

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

解决问题:

编码面试问题视频:

挑战/练习地点:

让我们开始

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

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

算法复杂度 / 大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]面临的最大挑战是什么?
  • 你在[工作x/项目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
    • 规范设计模式手册
  • 算法设计手册(斯基纳)
    • 作为审查和问题识别
    • 算法目录部分远远超出了你在面试中获得的难度范围
    • 本书共两部分:
      • 数据结构和算法课本
        • 优点:
          • 是一个很好的评论,因为任何算法教科书都是
          • 他解决工业界和学术界问题的经历中的好故事
          • C 语言代码示例
        • 缺点:
          • 可以像 CLRS 一样密集或难以穿透,在某些情况下,CLRS 可能是某些科目的更好选择
          • 第7章,第8章,第9章可能很痛苦,因为有些项目解释得不好,或者需要比我更多的大脑
          • 不要误会我的意思:我喜欢Skiena,他的教学风格和举止,但我可能不是石溪的材料
      • 算法目录:
        • 这就是你买这本书的真正原因。
        • 这本书作为算法参考更好,而不是你从头到尾阅读的东西。
    • 可以在Kindle上租用
    • 答案:
    • 勘误表
  • 算法(杰夫·埃里克森)
  • 编写出色的代码:第 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