Google –成为软件工程师的完整计算机科学学习计划

2020-12-17 02:27:26

我最初将其创建为成为软件工程师的一小部分研究主题,但如今已发展为今天看到的大清单。在完成了这项学习计划之后,我在亚马逊聘请了一名软件开发工程师!您可能不必像我一样多地学习。无论如何,您需要的一切都在这里。

我每天学习大约8到12个小时,持续了几个月。这是我的故事:为什么我全职学习了8个月以接受Google采访

此处列出的项目将为您在几乎所有软件公司(包括巨头,亚马逊,Facebook,谷歌和微软)进行技术面试提供充分的准备。

这是我为期数月的学习计划,目的是从Web开发人员(自学成才,没有CS学历)到一家大型公司的软件工程师。

这适用于新软件工程师或从软件/ Web开发切换到软件工程(需要计算机科学知识)的人员。如果您有很多年的经验,并且声称拥有多年的软件工程经验,那么期待进行一次更艰难的采访。

如果您具有多年的软件/网站开发经验,请注意,大型软件公司(例如Google,Amazon,Facebook和Microsoft)将软件工程视为不同于软件/网站开发的,并且它们需要计算机科学知识。

如果您想成为可靠性工程师或运营工程师,请从可选列表(网络,安全性)中学习更多。

当我开始这个项目时,我不知道堆中的堆栈,也不知道Big-O的任何知识,关于树的知识或如何遍历图形。如果必须编写排序算法,我可以告诉你它不是很好,我曾经使用过的每个数据结构都内置在该语言中,但我不知道它们如何在幕后工作。除非我正在运行的进程将提供内存不足的信息,否则我永远不必管理内存。错误,然后必须找到解决方法。我一生中使用了一些多维数组以及数千个关联数组,但是我从未从头开始创建数据结构。

这是一个长期计划。可能要花几个月的时间。如果您已经熟悉了很多内容,那么将减少您的时间。

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

创建一个新分支,以便您可以检查类似这样的项目,只需在方括号中添加一个x:[x]

成功的软件工程师很聪明,但是许多人并不安全,因为他们不够聪明。

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

非常感谢您的帮助,以添加免费且始终可用的公共资源,例如YouTube视频以及在线课程视频。我喜欢使用大学讲座。

预备课程:软件工程师面试发布(收费课程):从前Google面试官那里学习如何做好软件工程师面试的准备。

适用于数据结构,算法和面试的Python(收费课程):以Python为中心的面试准备课程,内容涉及数据结构,算法,模拟面试等等。

数据结构和算法纳米度! (由Udacity支付的Nanodegree):通过专门的导师获得100多种数据结构和算法练习及指导的动手练习,以帮助您为面试和在职场景做好准备。

进行行为面试(免费的教育课程):很多时候,不是您的技术能力会阻碍您完成理想的工作,而是行为面试的表现。

您可以使用自己喜欢的语言来进行面试的编码部分,但是对于大公司而言,这些是不错的选择:

这是我写的关于选择面试语言的文章:为编码面试选择一种语言。

您将在下面看到一些C,C ++和Python学习,因为我正在学习。其中涉及几本书,请参阅底部。

这是比我使用的列表更短的列表。 缩写是为了节省您的时间。 编写公开访谈的程序:通过第4版进行访谈的方式不太困难,大多数问题可能比您在访谈中看到的要容易(根据我的阅读) 这是我按语言提出的建议。 我没有所有语言的资源。 我欢迎添加。 如果您通读其中之一,则应该具有开始进行编码问题所需的所有数据结构和算法知识。 除非您希望进行评论,否则您可以跳过此项目中的所有视频讲座。 我没有读过这两本书,但是它们得到了Sedgewick的高度评价和撰写。 他很棒。 如果您对C ++有更好的建议,请告诉我。 寻找全面的资源。 Java中的数据结构和算法,请参见下面有关Python版本的书本报告。 这本书涵盖了相同的主题

这个列表增长了许多个月,是的,它有些失控。

我看了几个小时的视频并记了很多笔记,几个月后,我不记得了很多。我花了3天的时间浏览笔记并制作抽认卡,因此可以进行审核。

为了解决这个问题,我做了一个小小的抽认卡站点,可以在其中添加两种类型的抽认卡:普通卡和代码卡,每张卡都有不同的格式。

我建立了行动优先网站,因此无论身在何处,我都可以在手机和平​​板电脑上进行浏览。

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

关于抽认卡的注意事项:首次识别出答案时,请勿将其标记为已知。您必须先看到同一张卡片并正确回答几次,然后才能真正知道它。重复将使这些知识更深入您的大脑。

Anki是使用我的抽认卡网站的替代方法,Anki已多次向我推荐。它使用重复系统来帮助您记住。它易于使用,可在所有平台上使用,并具有云同步系统。它在iOS上的售价为25美元,但在其他平台上是免费的。

您需要将所学的知识运用到解决问题上,否则您会忘记的。我犯了这个错误。一旦您学习了一个主题,并对它感到满意,例如链表,请打开其中一本编码访谈书,并就链表做几个问题。然后转到下一个学习主题。然后,再回去做另一个链表问题,或递归问题,等等。但是,在学习过程中,请继续解决问题。您不是因为知识而被雇用,而是因为您如何应用知识。我推荐了几本书和网站。有关更多信息,请参见此处:编码问题练习。

我在ASCII,OSI堆栈,Big-O表示法等上保留了一组备忘单。我有空的时候会研究它们。

从编程问题中休息一个半小时,然后仔细阅读一下抽认卡。

有很多干扰因素可能会占用宝贵的时间。专注和专心很难。打开一些没有歌词的音乐,您将可以很好地聚焦。

有些主题需要一天,有些则需要几天。有些只是学习而没有实现。

每天,我从下面的列表中选修一个主题,观看有关该主题的视频,并用以下内容编写实现:

C-使用带有struct *和其他参数的结构和函数作为args

并编写测试以确保我做对了,有时只是使用简单的assert()语句 练习,练习,练习,直到我厌倦了它,并且可以毫无问题地做到这一点(有些需要记住很多极端情况和簿记细节) 在原始约束下工作(无需垃圾收集即可分配/释放内存(Python或Java除外)) 利用内置类型,因此我有使用内置工具进行实际使用的经验(不会在生产中编写自己的链表实现) 我可能没有时间针对每个主题进行所有这些操作,但是我会尽力的。 在白板或纸上,而不是计算机上写代码。 用一些样本输入进行测试。 然后在计算机上进行测试。 C编程语言,第2卷这是一本简短的书,但是它可以使您很好地掌握C语言,并且如果您稍加练习,就会很快熟练。 理解C可帮助您了解程序和内存的工作方式

这里有很多视频。 只要看够,直到您了解它。 您随时可以回来查看 如果有些讲座太数学了,您可以跳到最底下,观看离散的数学视频以获取背景知识。 实现向量(具有自动调整大小的可变数组):练习使用数组和指针进行编码,并通过指针数学练习跳转到索引而不是使用索引。 分配了内存的新原始数据数组以16开头,如果起始编号更大,则使用2-16、32、64、128的幂 insert(index,item)-在index处插入item,将该index的值和尾随元素向右移动 remove(item)-查找值并删除保存它的索引(即使在多个地方) find(item)-查找值并返回具有该值的第一个索引,如果未找到则返回-1

所需空间=(数组容量,> = n)*项目大小,但即使2n,仍为O(n)

C代码(视频)-不是整个视频,仅是有关节点结构和内存分配的部分

不可思议:您需要指向指针知识的指针:(用于当您将指针传递给可能更改该指针指向的地址的函数时)此页面仅用于了解ptr到ptr。我不推荐这种列表遍历样式。易读性和可维护性由于聪明而受到损害。

实现(我使用尾指针&不使用):insert(index,value)-在索引处插入值,因此该索引处的当前项由索引处的新项指向

value_n_from_end(n)-返回从列表末尾起第n个位置的节点的值

成本:使用链表的不好实现,因为您需要倒数第二个元素,导致每个出队都经过遍历,因此您在头入队而在尾出队将是O(n)

实现一个最大堆:heap_sort()-使用一个未排序的数组,并使用最大堆或最小堆将其转换为就地排序的数组

作为总结,以下是15种排序算法的直观表示。如果您需要有关此主题的更多信息,请参见"排序"。 有关某些主题的其他详细信息中的 图可以用来表示计算机科学中的许多问题,因此本节很长,就像树和排序一样。 BFS和DFS-了解它们的计算复杂性,权衡以及如何在真实代码中实现它们 当被问到问题时,请先寻找基于图的解决方案,然后继续寻找(如果没有) 您可能不会在面试中看到任何动态编程问题,但是值得将一个问题识别为动态编程的候选人。 这个主题可能非常困难,因为必须将每个DP可解决问题定义为递归关系,并且提出这个问题可能很棘手。 我建议您查看许多DP问题的示例,直到您对所涉及的模式有深入的了解。

Head First设计模式我知道规范书是" Design Patterns:可重用的面向对象软件的元素&#34 ;,但是Head First对于面向OO的初学者来说非常有用。

了解最著名的NP完全问题类别,例如旅行推销员和背包问题,并在面试官变相询问您时能够识别它们。

涵盖:线程资源需求(在同一进程中与其他线程共享(高于(减去堆栈))份额,但每个线程都有自己的pc,堆栈计数器,寄存器和堆栈)

分叉实际上是写时复制(只读),直到新进程写入内存,然后才进行完整复制。

可伸缩性和系统设计是非常大的主题,包含许多主题和资源,因为在设计可扩展的软件/硬件系统时要考虑很多因素。期望在此上花费大量时间

系统设计面试-这一方面有很多资源。浏览文章和示例。我把其中一些放在下面

练习系统设计过程:这里有一些可以尝试在纸上尝试的想法,每个想法都有一些有关如何在现实世界中进行处理的文档:流程:考虑约束条件:询问每秒有多少个请求(他们可以自愿或提出请求)你算算)

本部分将提供较短的视频,您可以很快地观看它们,以复习大多数重要概念。如果您经常需要进修,这很好。

既然您已经了解了上面所有的计算机科学主题,就该练习回答编码问题了。

采访中有系统地,交流性地解决问题的精彩介绍。您也可以从《编程访谈》书中获得此信息,但我发现了这一点:算法设计画布

家里没有白板?这就说得通了。我是个怪人,有一块大白板。代替白板,从艺术品商店拿起一个大的绘图板。您可以坐在沙发上练习。这是我的" sofa白板"。我在照片中添加了笔以进行缩放。如果您使用钢笔,则希望您可以擦除。快速变得凌乱。我用铅笔和橡皮擦。

一旦学会了大脑,就可以发挥作用。每天要承担尽可能多的编码挑战。

LeetCode我最喜欢的编码问题站点。您可能准备的1-2个月的订阅费用值得

Gainlo.co:来自大公司的模拟面试官-我使用了它,它帮助我放松了电话屏幕和现场采访

Refdash:模拟面试和加急面试-跳过与科技公司的多次面试,还帮助求职者快速追踪

访谈ing.io:与高级工程师进行模拟面试-与来自FAANG的高级工程师进行匿名匿名算法/系统设计访谈。

请参阅“破解编码面试”和“编程面试的背面”中的恢复准备项目。

考虑一下您会遇到的20个面试问题,以及以下各行的内容。每个答案都有2-3个答案,不仅要有数据,还要有关于您完成的事情的故事。

我的一些(我可能已经知道答案了,但需要他们的意见或团队角度):

****************************************************** ****************************************************** ****************************************************** ****************************************************** **以下所有内容都是可选的。通过研究这些内容,您将可以更深入地了解更多CS概念,并且将为任何软件工程工作做好更好的准备。您将是一个更加全面的软件工程师。*************************************** ****************************************************** ****************************************************** ****************************************************** *****************

算法目录部分远远超出了您在面试中遇到的困难范围

本书分为两部分:关于数据结构和算法的课堂教科书缺点:可以像CLRS一样密集或难以理解,在某些情况下,CLRS对于某些主题可能是更好的选择

遵循第7、8、9章可能会很痛苦,因为有些项目无法很好地解释或需要比我更多的头脑

不要误会我的意思:我喜欢斯基耶纳(Skiena),他的教学风格和举止,但我可能不是斯托尼·布鲁克(Stony Brook)的作品

算法目录:关于这一部分。一旦完成操作,将在这里更新

该书于2004年出版,虽然有些过时,但是对于简要了解计算机而言,这是一个了不起的资源

作者是发明HLA的,因此在HLA中加入了一些盐。没有广泛使用,但是汇编外观的示例不错

重要提示:读这本书的价值有限。本书很好地回顾了算法和数据结构,但不会教您如何编写良好的代码。您必须能够有效地编写一个不错的解决方案

前几章介绍了解决编程问题(某些非常老的使用数据磁带)的巧妙解决方案,但这只是一个介绍。这是关于程序设计和体系结构的指南

我添加它们是为了帮助您成为一名全面的软件工程师,并了解某些技术和算法,因此您将拥有一个更大的工具箱。

给定具有m位和k个哈希函数的Bloom过滤器,插入和成员资格测试均为O(k)

MD5或SHA的反义词,用于确定2个文档/字符串是否完全相同

"在平衡搜索树中,现在已经过时了AVL和2/3树,红黑树似乎更受欢迎。splay树是一个特别有趣的自组织数据结构,它使用旋转来移动任何访问的键扎根。" -斯基耶纳

其中,我选择实现一个八叉树。根据我的阅读,您不会在面试中实现平衡的搜索树。但是我想暴露一个编码,让我们面对现实,八角树是蜜蜂的膝盖。我确实读了很多红黑树代码

Splay树:插入,搜索,删除功能如果最终实现红色/黑色树,请尝试以下方法:

我想了解更多有关B-Tree的信息,因为它已经在非常大的数据集中广泛使用

在实践中:据我所知,这些在实践中没有太多使用,但我可以看到它们的用途:AVL树是另一个支持O(log n)搜索,插入和删除的结构。它比红黑树更严格地平衡,导致插入和移除速度较慢,但​​检索速度较快。这对于可能一次构建并在不进行重构的情况下加载的数据结构具有吸引力,例如语言词典(或程序词典,例如汇编器或解释器的操作码)。

在实践中:在Windows NT(在虚拟内存,网络和文件系统中),缓存树通常用于实现缓存,内存分配器,路由器,垃圾收集器,数据压缩,绳索(用于替换长文本字符串的字符串)。代码)等

在实践中:红黑树为插入时间,删除时间和搜索时间提供最坏的保证。这不仅使它们在时间敏感的应用程序(例如实时应用程序)中有价值,而且使它们成为有价值的构建基块。其他提供最坏情况保证的数据结构;例如,计算几何中使用的许多数据结构可以基于红黑树,而当前Linux内核中使用的完全公平调度程序使用红黑树。在Java版本8中,对HashMap集合进行了修改,以便使用Red-Black树代替使用LinkedList存储具有较差哈希码的相同元素。

在实践中:2-3棵树插入速度更快,但搜索速度较慢(因为高度比AVL树高)。

您很少使用2-3树,因为其实现涉及不同类型的节点。相反,人们使用红黑树。

实践中:对于每2-4棵树,都有对应的红黑树,其数据元素的顺序相同。在2-4棵树上的插入和删除操作也等效于红黑树中的颜色翻转和旋转。这使得2-4棵树成为理解红黑树背后逻辑的重要工具,这就是为什么尽管在实践中不经常使用2-4棵树,但许多介绍性算法文本却在红黑树之前引入了2-4棵树。

有趣的事实:这是一个谜 ......