我最初创建这个作为成为软件工程师的学习主题的简短待办事项列表, 但它发展到你今天看到的大名单。在完成这个学习计划后,我被录用了 作为亚马逊的软件开发工程师! 你可能不必像我一样学习那么多。无论如何,你需要的一切都在这里。
我每天学习大约8-12个小时,持续了几个月。这是我的故事:为什么我为了谷歌面试而全日制学习了 8 个月
请注意:你不需要像我一样学习那么多。我浪费了很多时间在不需要知道的事情上。有关这方面的更多信息如下。我会帮助你到达那里,而不会浪费你宝贵的时间。
这里列出的项目将为你在几乎任何软件公司的技术面试做好充分准备, 包括巨头:亚马逊、Facebook、谷歌和Microsoft。
祝你好运!
这是我成为一家大公司软件工程师的多月学习计划。
必填:
请注意,这是软件工程的学习计划,而不是前端工程或全栈开发。真的有 其他地方这些职业道路的超级路线图和课程作业(有关更多信息,请参阅 https://roadmap.sh/)。
在大学计算机科学课程中要学很多东西,但只有知道大约 75% 就足以面试,所以这就是我在这里介绍的内容。 对于一个完整的 CS 自学课程,我的学习计划的资源已包含在 Kamran Ahmed 的计算机科学路线图中: https://roadmap.sh/computer-science
---------------- 低于此点的所有内容都是可选的----------------
如果你想在一家大公司担任软件工程师,这些是你必须知道的事情。
如果你像我一样错过了获得计算机科学学位的机会,这将赶上你并挽救你四年的生命。
当我开始这个项目时,我不了解堆中的堆栈,也不了解 Big-O 的任何东西,也不了解任何关于树的知识,也不知道如何 遍历图形。如果我必须编写一个排序算法,我可以告诉你,这将是可怕的。 我曾经使用过的每个数据结构都内置在语言中,我不知道它们是如何工作的 在引擎盖下。我从来不需要管理内存,除非我正在运行的进程会给出“out of memory“错误,然后我必须找到解决方法。我在我的生活中使用了一些多维数组, 数以千计的关联数组,但我从未从头开始创建数据结构。
这是一个漫长的计划。这可能需要几个月的时间。如果你已经熟悉其中的很多内容,那么花费的时间会少得多。
下面的一切都是一个大纲,你应该按照从上到下的顺序处理这些项目。
我正在使用 GitHub 的特殊 markdown 风格,包括任务列表来跟踪进度。
在此页面上,单击顶部附近的“代码”按钮,然后单击“下载 ZIP”。解压缩文件,即可使用文本文件。
如果你在理解 Markdown 的代码编辑器中打开,你会看到所有内容的格式都很好。
创建一个新分支,以便你可以检查这样的项目,只需在括号中放置一个 x:[x]
分叉 GitHub 存储库:通过单击“分叉”按钮。
https://github.com/jwasham/coding-interview-university
克隆到本地存储库:
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
完成更改后,用 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
这是我的偏好。当然,你可以做你喜欢的事情。
你可能不需要它,但这里有一些学习新语言的网站:
你可以使用你熟悉的语言来完成面试的编码部分,但对于大公司来说,这些是可靠的选择:
你也可以使用这些,但请先阅读。可能有一些注意事项:
这是我写的一篇关于为面试选择语言的文章:为编码面试选择一种语言。 这是我的帖子所基于的原始文章:为面试选择编程语言
你需要对语言感到非常熟悉并且知识渊博。
阅读更多关于选择的信息:
本书将奠定你计算机科学的基础。
只需选择一种你熟悉的语言即可。你将进行大量阅读和编码。
你的选择:
你的选择:
你不需要买一堆这些。老实说,“破解编码面试”可能就足够了, 但我买了更多,让自己得到更多的练习。但我总是做得太多了。
我买了这两个。他们给了我大量的练习。
选择一项:
这个名单在几个月内不断增长,是的,它失控了。
以下是我犯的一些错误,以便你获得更好的体验。而且,你将节省数月的时间。
我看了几个小时的视频,做了大量的笔记,几个月后,我还有很多不记得了。我花了 3 天时间去 通过我的笔记和制作抽认卡,这样我就可以复习了。我不需要所有这些知识。
请阅读,这样你就不会犯我的错误:
为了解决这个问题,我做了一个小抽认卡网站,可以在其中添加 2 种类型的抽认卡:通用和代码。 每张卡都有不同的格式。我制作了一个移动优先的网站,这样无论我身在何处,都可以在手机或平板电脑上进行评论。
免费制作自己的:
我不建议使用我的抽认卡。太多了,其中大多数都是你不需要的琐事。
但如果你不想听我的话,那就去吧:
请记住,我做得太过分了,卡片涵盖了从汇编语言和 Python 琐事到机器学习和统计学的所有内容。 对于需要的东西来说,这太多了。
关于抽认卡的注意事项:当你第一次意识到你知道答案时,不要把它标记为已知。你必须看到 同一张牌,在你真正知道之前正确回答几次。重复将使这些知识更深入 你的大脑。
使用抽认卡网站的另一种方法是 Anki,它已经多次推荐给我。 它使用重复系统来帮助你记住。它用户友好,可在所有平台上使用,并具有云同步系统。 它在 iOS 上售价 25 美元,但在其他平台上是免费的。
我的 Anki 格式的抽认卡数据库:https://ankiweb.net/shared/info/25173560(感谢@xiewenya)。
一些学生提到了空白的格式问题,可以通过执行以下操作来解决:打开牌组,编辑卡片,单击卡片,选择“样式”单选按钮,然后将成员“white-space: pre;”添加到卡片类中。
这非常重要。
在学习数据结构和算法的同时开始编写面试问题。
你需要运用你所学的知识来解决问题,否则你会忘记。我犯了这个错误。
一旦你学习了一个主题,并且对它感到有些舒服,例如,链表:
在你学习所有这些东西的时候继续做问题,而不是在学习之后。
你被雇用不是为了知识,而是为了你如何应用知识。
下面列出了许多资源。继续前进。
有很多干扰会占用宝贵的时间。专注力和专注力很难。打开一些音乐 没有歌词,你就能很好地集中注意力。
这些是流行的技术,但不是本研究计划的一部分:
本课程涉及很多科目。每个可能需要几天,甚至一周或更长时间。这取决于你的日程安排。
每天,选择列表中的下一个主题,观看有关该主题的一些视频,然后编写实现 你为本课程选择的语言的数据结构或算法。
你可以在这里看到我的代码:
你不需要记住每个算法。你只需要能够充分理解它,就可以编写你自己的实现。
Why is this here? I'm not ready to interview.
为什么你需要练习做编程问题:
在面试中有一个很好的介绍,可以有条不紊地解决问题。你会从编程中得到这个 采访书也是如此,但我发现这个很出色:算法设计画布
在白板或纸上写代码,而不是在计算机上写代码。使用一些示例输入进行测试。然后键入它并在计算机上进行测试。
如果你家里没有白板,那就从艺术商店买一个大画板。你可以坐在沙发上练习。 这是我的“沙发白板”。我在照片中添加了笔只是为了缩放。如果你用笔,你会希望你能擦掉。 很快就会变得凌乱。我用铅笔和橡皮擦。
编码问题练习不是记住编程问题的答案。
不要忘记你的关键编码面试书在这里。
解决问题:
编码面试问题视频:
挑战/练习地点:
好了,说得够多了,我们来学习吧!
但是,在学习时不要忘记从上面做编码问题!
嗯,这已经足够了。
当你通过“破解编码面试”时,有一章是关于这个的,最后有一个测验要看 如果可以识别不同算法的运行时复杂性。这是一个超级评论和测试。
[ ] 视频:
[ ] 在线课程:
[ ] 使用线性探测实现阵列
[ ] 注释:
对于堆排序,请参阅上面的堆数据结构。堆排序很棒,但不稳定
[ ] Sedgewick - Mergesort (5 个视频)
[ ] 加州大学伯克利分校:
[ ] 气泡排序(视频)
[ ] 分析冒泡排序(视频)
[ ] 插入排序、合并排序(视频)
[ ] 插入排序(视频)
[ ] 合并排序(视频)
[ ] 快速排序(视频)
[ ] 选择排序(视频)
[ ] 合并排序代码:
[ ] 快速排序代码:
[ ] 实现:
[ ] 不是必需的,但我推荐了它们:
作为总结,这里是 15 种排序算法的可视化表示。 如果你需要有关此主题的更多详细信息,请参阅某些主题的其他详细信息中的“排序”部分
图形可以用来表示计算机科学中的许多问题,所以这一部分很长,就像树和排序一样。
笔记:
[ ] MIT (视频):
[ ] Skiena 讲座 - 很棒的介绍:
[ ] 图表(评论和更多):
完整的 Coursera 课程:
我将实现:
如果你需要有关此主题的更多详细信息,请参阅某些主题的其他详细信息中的“字符串匹配”部分。
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 个面试问题,以及下面几行的项目。每个答案至少有一个。 有一个关于你完成的事情的故事,而不仅仅是数据。
我的一些人(我可能已经知道答案,但想要他们的意见或团队观点):
祝贺!
不断学习。
你永远不会真正完成。
***************************************************************************************************** ***************************************************************************************************** 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.
如果你有 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.
至少了解一种类型的平衡二叉树(并了解它是如何实现的):
“在平衡的搜索树中,AVL 和 2/3 树现在已经过时,红黑树似乎更受欢迎。 一个特别有趣的自组织数据结构是张开树,它使用旋转 将任何访问的密钥移动到根目录。
其中,我选择实现一个张开树。从我所读到的内容来看,你不会实现一个 面试中的平衡搜索树。但我想接触编码一个 让我们面对现实吧,张开的树是蜜蜂的膝盖。我确实读了很多红黑树代码
我想了解更多关于B-Tree的信息,因为它在非常大的数据集中被广泛使用
AVL 树
张开树
红/黑树
2-3 搜索树
2-3-4 棵树(又名 2-4 棵树)
N-ary(K-ary、M-ary)树
B树
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?
固体
Union-查找
更多动态规划(视频)
高级图形处理(视频)
MIT 概率(数学,慢慢走,这对数学的东西有好处)(视频):
字符串匹配
排序
NAND到俄罗斯方块:从第一性原理构建现代计算机
Sit back and enjoy.
List of individual Dynamic Programming problems (each is short)
Excellent - MIT Calculus Revisited: Single Variable Calculus
Skiena lectures from Algorithm Design Manual - CSE373 2020 - Analysis of Algorithms (26 videos)
Carnegie Mellon - Computer Architecture Lectures (39 videos)
MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25 videos)