原先我为了成为一个软件工程师而建立这份简单的学习主题清单, 但这份清单随着时间的推移而膨胀成今天这样。在做完这份清单上的每个目标后,我成为了 Amazon 的软件开发工程师! 你或许不需要像我一样学习这么多。但是,让你成为一位称职工程师所需要的知识都在这里了。
我每天自学8~12小时,这样持续了好几个月。这是我的故事:为什么我为了 Google 面试而自学了8个月。
请注意: 你不需要像我一样那么努力学习。我在一些不必要的事情上浪费了很多时间。关于这个问题下面有更多信息。我会帮助你节省宝贵的时间,让你达到目标。 在这份清单内的主题会让你拥有足够的知识去面对几乎每家软件公司的技术面试,包括科技巨头:Amazon、Facebook、Google,以及 Microsoft。
祝你好运!
这是我为成为一家大公司的软件工程师制定的多月学习计划。
要求:
注意,这是一份关于 软件工程 的学习计划,而不是前端工程或全栈开发。 这些职业路径有很多详细的路线图和课程资料可以在其他地方找到(请参阅 https://roadmap.sh/ 获取更多信息)。
在大学计算机科学专业中,有很多知识需要学习,但是只掌握大约75%的内容就足够应对面试了,这也是我在这里涵盖的内容。 如果你想进行完整的自学计算机科学项目,可以参考Kamran Ahmed的计算机科学路线图:https://roadmap.sh/computer-science
---------------- 以下所有内容均为可选项 ----------------
如果你想在一家大公司担任软件工程师,这些是你必须了解的事情。
如果你错过了计算机科学的学位,就像我一样,这将帮助你迎头赶上,并节省四年的时间。
当我开始这个项目时,我对堆栈和堆没有任何了解, 也不知道大O表示法或者关于树的任何东西,也不知道如何遍历图形。 如果让我编写一个排序算法,相信我它会很糟糕。 我曾经使用过的每种数据结构都是内置在语言中的,并且我完全不知道它们在底层是如何工作的。 除非运行中的进程出现“内存不足”错误,否则我从来没有管理过内存,并且那时候就需要找到一种解决方法。 在我的生活中,我使用过一些多维数组和成千上万个关联数组,但从未从头开始创建数据结构。
这是一个漫长的计划,以至于花费了我数月的时间。若你早已熟悉大部分的知识,那么也许能节省大量的时间。
下面所有的东西都只是一个概述。因此,你需要由上而下逐一地去处理它。
在学习过程中,我使用 GitHub 特殊语法的 Markdown 去检查计划的进展,包括使用包含任务进度的任务列表。
在该页面上,单击顶部附近的 Code 按钮,然后单击“Download ZIP”。解压文件,就可以使用文本文件了。
如果你打开一个代码编辑器,你会看到所有格式都很好。
创建一个新的分支,这样你就可以检查类似这样的项目了,只需在方括号中放入一个x:[x]
在 GitHub 上 Fork 该仓库: 点击 Fork 按钮,将 https://github.com/jwasham/coding-interview-university
仓库复制到你的 GitHub 账号中。
克隆项目到本地:
git clone git@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 remote set-url --push upstream DISABLE # 这样你就不会将个人进展推回到原始仓库了。
在你完成了一些修改后,在框框中打 x:
git commit -am "Marked personal progress"
git pull upstream main # 将您的分支与原始仓库中的更改保持最新
git push # just pushes to your fork
部分视频只能通过在 Coursera 或者 Edx 课程上注册登录才能观看。 这些视频被称为网络公开课程(MOOC)。有时候某些课程需要等待好几个月才能获取,这期间你无法观看这些课程的影片。
很感谢你能帮我把网络公开课程的视频链接转换成公开的,可持续访问的视频源, 比如 YouTube 视频,以代替那些在线课程的视频。 此外,一些大学的讲座视频也是我所青睐的。
你需要为你做的编程面试选择一种编程语言, 但你也需要找到一种可以用来学习计算机科学概念的语言。
最好是同一种语言,这样你只需精通其中一种。
在这个学习计划中,我主要使用了两种编程语言:C和Python。
这是我的个人喜好,当然你可以根据自己的偏好来选择。
也许你并不需要,但以下是一些学习新编程语言的网站:
你可以在编程这一环节,使用一种自己用起来较为舒适的语言去完成编程,但对于大公司,你只有三种固定的选择:
你也可以使用下面两种编程语言,但可能会有某些限制,你需要事先查明:
这是我写的一篇关于选择面试语言的文章: 为编程面试选择一种语言。 这是我发布帖子所基于的原始文章: Choosing a Programming Language for Interviews
你需要对你所选择的语言感到非常舒适且足够了解。
更多关于语言选择的阅读:
这本书将为你的计算机科学打下基础。
只需选择一种你感到舒适的语言。你将会进行大量阅读和编码工作。
你的选择:
你的选择:
你不需要买一堆这些。老实说,《破解编程面试》可能已经足够了, 但我买了更多来给自己更多的练习。但我总是做得太多。
这两个都是我买的,他们给了我大量的练习。
选择一个:
这个列表在很多个月里不断增长,是的,它变得失控了。
以下是我犯过的一些错误,这样你就能有更好的体验。而且你将节省数月时间。
我看了数小时的视频并做了大量笔记,几个月后有很多东西我都不记得了。 我花了三天时间浏览我的笔记并制作闪卡,以便进行复习。其实,并不需要那么多知识。
请阅读以下的文章以免重蹈覆辙:
为了解决善忘的问题,我制作了一个抽认卡的网页,用于添加两种抽认卡:一般的及带有代码的。每种卡都会有不同的格式设计。 而且,我还以移动设备为先去设计这些网页,以使得在任何地方,我都能通过我的手机及平板去回顾知识。
你也可以免费制作属于你自己的抽认卡网站:
我不建议使用我的闪卡。它们太多了,而且大部分都是你不需要的琐事。
但是如果你不想听我的话,那就随你吧:
有一点需要记住的是,我做事有点过头,以至于卡片都覆盖到所有的东西上,从汇编语言和 Python 的细枝末节,到机器学习和统计都被覆盖到卡片上。 而这种做法,对于要求来说是多余的。
在抽认卡上做笔记: 若你第一次发现你知道问题的答案时,先不要急着把其标注成“已知”。 反复复习这张抽认卡,直到每次都能答对后才是真正学会了这个问题。 反复地问答可帮助你深刻记住该知识点。
这里有个替代我抽认卡的网站 Anki,很多人向我推荐过它。 这个网站用同一个字卡重复出现的方式让你牢牢地记住知识。 这个网站非常容易使用,支持多平台,并且有云端同步功能。在 iOS 平台上收费25美金,其他平台免费。
这是我用 Anki 这个网站里的格式所储存的抽认卡资料库: https://ankiweb.net/shared/info/25173560 (感谢 @xiewenya)。
一些学生提到了关于空白间距的格式问题,可以通过以下方法进行修复:打开卡片组,编辑卡片,点击"卡片"选项,选择"样式"单选按钮,在卡片类中添加成员 "white-space: pre;"。
这非常重要。
在学习数据结构和算法的同时,开始做编程面试题。
你需要将所学知识应用于解决问题,否则你会忘记。我曾经犯过这个错误。
一旦你学完一个主题,并且对它有了一定的掌握,比如 链表(linked lists):
在学习这些内容的过程中不断做问题,而不是之后。
你被雇佣的不是因为你的知识,而是因为你如何应用这些知识。
下面列出了许多资源供你参考。继续前进吧。
在学习的过程中,往往会有许多令人分心的事占据着我们宝贵的时间。 因此,专注和集中注意力是非常困难的。放点纯音乐能帮上一些忙。
有一些熟悉且普遍的技术在此未被谈及到:
这门课涵盖了很多主题。每个主题可能需要你几天的时间,甚至可能需要一周或更长时间。这取决于你的日程安排。
每天,按照列表中的下一个主题,观看一些关于该主题的视频, 然后用你选择的语言为这门课程编写该数据结构或算法的实现。
在这里你可以查看到我的代码:
你不需要记住每个算法。你只需要能够理解它,以便能够编写自己的实现即可。
这是为什么?我还没有准备好面试。
为什么你需要练习编程问题:
在面试中,有一种方法论的、有交流的问题解决方法。你可以从编程面试书籍中了解这些, 但我发现下面这个网站也非常出色: 算法设计画布
在白板或纸上写代码,而不是在计算机上。使用一些样例输入进行测试。然后在计算机上键入并进行测试。
如果家里没有白板,请从艺术用品店购买一个大型的绘图本。 你可以坐在沙发上练习。这就是我的"沙发白板"。照片中我加了一支笔来衡量尺寸。如果你使用钢笔,你会希望能擦除。 会很快变得凌乱, 我用铅笔和橡皮擦。
编程问题练习并不是为了记住解决编程问题的答案。
别忘了参考你的主要编程面试书籍这里.
解决问题:
编程面试问题视频:
挑战/练习网站:
好了,说得够多了,让我们学习吧!
但在学习的同时,不要忘记做上面的编码问题!
好吧,差不多就到这里了。
当你阅读《破解编程面试》时,有一个章节专门讲述此事,并在最后进行了一次测验, 以测试你是否能够确定不同算法的运行时间复杂度。这是一个非常全面的复习和测试。
[ ] 视频:
[ ] 在线课程:
[ ] 使用线性探测法的数组实现
[ ] 笔记:
关于堆排序,请查看前文堆的数据结构部分。堆排序很强大,不过是非稳定排序。
[ ] 加州大学伯克利分校:
[ ] 冒泡排序(视频)
[ ] 冒泡排序分析(视频)
[ ] 插入排序 & 归并排序(视频)
[ ] 插入排序(视频)
[ ] 归并排序(视频)
[ ] 快排(视频)
[ ] 选择排序(视频)
[ ] 归并排序代码:
[ ] 快速排序代码:
[ ] 实现:
[ ] 有兴趣的话,还有一些补充,但并不是必须的:
总结一下,这是15种排序算法的可视化表示。 如果你需要有关此主题的更多详细信息,请参阅“一些主题的额外内容”中的“排序”部分。
图表可以用来表示计算机科学中的许多问题,所以这一部分很长,就像树和排序一样。
笔记:
MIT(视频):
[ ] Skiena 教授的课程 - 很不错的介绍:
[ ] 图 (复习和其他):
完整的 Coursera 课程:
我会实现:
如果你需要有关此主题的更多详细信息,请参阅“一些主题的额外内容”中的“字符串匹配”部分。
本节将包含一系列短视频,您可以迅速观看,以便复习大部分重要概念。
如果您经常需要温习知识,这会很有帮助。
模拟面试:
随着下面列举的问题思考下你可能会遇到的 20 个面试问题,每个问题准备 2-3 种回答。 准备点故事,不要只是摆一些你完成的事情的数据,相信我,人人都喜欢听故事。
我会问的一些:(可能我已经知道了答案但我想听听面试官的看法或者了解团队的前景):
恭喜你!
继续学习。
活到老,学到老。
*****************************************************************************************************
*****************************************************************************************************
下面的内容都是可选的。
通过学习这些内容,你将会得到更多的有关 CS 的概念,并将为所有的软件工程工作做更好的准备。
你将会成为一个更全面的软件工程师。
*****************************************************************************************************
*****************************************************************************************************
你可以从以下的书单挑选你有兴趣的主题来研读。
如果您有4年以上的工作经验,可以预期会遇到系统设计问题。
我把它们加进来是为了让你成为更全方位的软件工程师,并且留意一些技术以及算法,让你拥有更大的工具箱。
AVL 树
伸展树
红黑树
2-3查找树
2-3-4树 (亦称2-4树)
N 叉树(K 叉树、M 叉树)
B 树
我添加了这些内容来加强上面已经提出的一些观点,但是不想把它们放在上面,因为那样会太多。
对于一个主题来说,过度处理很容易。
你希望在本世纪被雇佣吗?
SOLID
Union-Find
动态规划的更多内容 (视频)
图形处理进阶 (视频)
MIT 概率论 (过于数学,进度缓慢,但这对于数学的东西却是必要之恶) (视频):
字符串匹配
排序
NAND 到 Tetris: 从第一原理构建现代计算机
坐下来,尽情享受。