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