大家好,我是小牛,上一届签约微软中国的学长,我个人呢,是非科班转行跑来CS的,也拿到了BATTMD多家 offer,sp,ssp都有。我自己有个公众号,后端技术小牛说,会手把手教你重点知识点的回答,学习简历,当然入职后还有各种公司内推等等,欢迎大家关注!

本文全文已经形成了pdf,欢迎大家下载,链接在下面
(手机端牛客是直接打不开百度云的,需要复制链接,用浏览器打开)

链接:https://pan.baidu.com/s/19-NDUsSF67zBOO4bl-LC4Q
提取码:2aef

不要被标题迷惑到,这篇文章不只是写给想去微软的朋友,我是结合了自己微软的经历和去BATTMD实习的同学经验汇总在一起形成的这篇文章。这篇文章其实是从你开始申请实习,到实习需要干什么的一个汇总,这里列个目录吧:

到底要不要实习?
实习面试都面点啥?
那我该咋准备呢?
准备完了,简历该咋写?
写完简历了,怎么投递?
面试有没有小技巧传授一波?
拿到Offer了,我该如何选择?
打算入职了,学长有没有一些实习时候的建议?

准备方向,分为这么三部分:

  1. 基础知识点准备
  2. 算法准备
  3. 岗位特性知识点准备

稍微解释一下
基础知识点准备就是在于计算机网络,操作系统,数据库。
算法准备就是在于刷算法题,面试时手撕代码。
岗位特性知识点准备就在看你所投递的岗位了,投CV的你就得学CV相关知识,投前端的你就得准备前端的知识。

但是,只要你投递的是技术相关的工作,无论是前端后端算法,在1和2上的准备是一致的,只是在第三点的准备方向上有所不一致。

关于基本知识点的准备

众所周知,春招难度是小于秋招的。但是,大家不知道的是,春招对于基础知识的重视程度是不亚于秋招的,唯一区别就在于他们并不是很看重项目实践经历。

所以,对基础知识的学习还是非常有必要的,特别是这么几门基础课:

计算机网络(1-2个月)

我首先学习的科目是计算机网络。计算机网络是互联网大厂考核的重中之重。推荐资料:

  • 书籍:《计算机网络自顶向下方法》、《计算机网络(第7版) (谢希仁著)》
  • 公众号:小林coding

和计算机考研不同的是,互联网面试中,计算机网络考核的核心频次是自顶向下的。如果大家时间紧凑的话,强烈推荐《计算机网络自顶向下方法》,如果大家时间紧凑的话,按着这本书,看到网络层就可以结束学习了。一般网络层以下互联网考核频次极低,大家面试的时候答不上来也没关系。

考核重点:

  • 应用层:DNS原理、HTTPS原理、HTTP状态码、HTTP1.0/1.1/1.2区别
  • 传输层:TCP三次握手四次挥手、TCP与UDP区别、流量控制拥塞控制
  • 其他:OSI七层协议与TCP/IP五层协议

操作系统(2-3个月)

操作系统在后端开发中考核的频次最低,所以可以放在最后准备。这里推荐的资料有:

  • 书籍:《operation system three easy piece》、《操作系统真象还原》
  • 公众号:小林coding
  • 视频:b站Up主Y4NGY

对于初学者,拿小林coding入门是最好不过的了,小林coding讲操作系统的文章可以说是图文并茂,是市面上最好的入门读物。在对操作系统有一定了解后,大家可以针对知识点学习《操作系统真象还原》。这本书是完全用汇编与C语言实现了一个32位的操作系统。通过这本书,大家可以对操作系统某些知识点达到源码级的理解。

针对Linux操作系统的知识点,可以看一下Up主Y4NGY录制的课程,形成一个有体系的理解。

考察重点:

  • 进程管理: 用户态内核态区别、进程,子进程,线程的区别和实现方式、进程调度算法,死锁的条件及解决方式、进程通信方式
  • 内存管理:逻辑地址与物理地址、页表、快表
  • 文件系统: inode、文件、目录、目录项

关系型数据库(1个月)

关系型数据库是后端开发工程师的必备技能。数据库学习分为两部分,第一部分是SQL语句的学习,第二部分是数据库的一些基础知识。推荐资料:

  • 书籍:《SQL必知必会》
  • 视频:B站尚硅谷周阳老师的《MySQL高级》
  • 网站:leetcode

关于SQL语句的学习,大家可以参照《SQL必知必会》,配合leetcode数据库版的练习题加以理解。有一些互联网厂在面试时会出情景题让求职者写SQL语句,这部分需要勤加练习。

关于数据库的一些基础知识,重点需要掌握:

  • 事务:事务特性、事务隔离级别、MVCC概念及实现原理
  • 索引:B树,B+树概念与区别、稀疏索引和稠密索引
  • 数据库引擎:MyISAM和Innodb的使用场景和区别,一条SQL语句的执行过程
  • 数据库语句优化:七种Join方式、最左匹配原则、group by,order by、explain 关键字、优化语句的流程、分库分表、水平切分垂直切分
  • 数据库日志:Undo log、redo log、bin log、update log各自的使用场景

本节最后例行安利学长的公众号:后端技术小牛说,会写点求职干货和技术文,希望大家关注,想和我联系的,公众号后台私信哈。

关于算法的准备

算法刷题一直是面试准备的重中之重,这里我写了个算法学习路线,希望能帮助到大家。

第一阶段(1-2个月)

掌握一门面向对象语言,能熟悉它的语法规则和常用包。

以 Java 为例,Java 是一门面向对象的程序语言,我在这阶段做的工作有:

  • 找一本市面上好评较多的教材熟悉语法规则,这里我用的是《疯狂 Java 讲义》。
  • 下载 IDE 对着敲一下,巩固自己对语言的书写。

在这一部分,很多人就会在意语言的选择,有的程序员说 PHP 是世界上最好的语言,又有人说人生苦短,我用 Python 。有人学了 C++,又去学了 Python, Go 语言,陷入了语言的学习不能自拔。

在这里我给出自己的一个建议:只要是面向对象语言,针对算法来说,学一门足矣。

你也可以选择小众语言 Go, Rust……只要工具包多,教程多都可以,关键是多练习,熟悉这门语言的语法规则,这是这阶段最重要的事。

第二阶段(1-2个月)

熟悉常见数据结构,并且熟悉这个数据结构在你的语言中的使用规则。

以 Java 为例,相当多的数据结构在 Java 的 collection 框架下,我在这个阶段做的工作有:

  • 找一个市面上较好的教程入门,这里我采用的是慕课网《算法与数据结构-综合提升 C++版》视频,由于他采用的语言是C++,我在他的基础上对照着写了个Java版本。
  • 了解自己熟悉语言的常见数据结构使用,包括了解二叉树,字典树,哈希表,集合,并查集等等的基本概念。

这一阶段,重点在数据结构的学习。需要重点掌握的数据结构有:链表、哈希表、集合、栈、队列、堆、二叉树、二叉搜索树、图。 这部分需要做到时间空间复杂度,性质,了如指掌。

其次掌握并查集、字典树,这部分会写就行。最后稍作了解 B 树,B+ 树,红黑树,AVL 树,知道他们的定义和概念即可。

第三阶段(1个月左右)

我们在前两阶段的学习中,已经熟悉了语言语法规则,常见数据结构,为后续的算法打下了基础。

这一阶段我们需要熟悉常见的算法,如 DFS、BFS、DP、各种排序算法等等,并在你使用的语言中加以练习。

以 Java 为例,我采用的学习方法是:

  • 找一本算法书入门,这里推荐 Robert Sedgewick 写的《算法(第四版)》,并且这本书中包含的范例,编程语言都是 Java 。
  • 找一个系统性的算法学习视频进行学习,这里推荐《算法(第四版)》配套视频, Coursera 上可看, bilibili上 有搬运版本。

这一阶段,由于很多知识点会在第二部分学过了。所以这部分的重点在于针对各个算法有一个系统性,体系性的了解。

如果大家不喜欢《算法(第四版)》的风格,推荐大家看一下《大话数据结构与算法》。其中《算法(第四版)》课后题大家可以不做,对他讲述的内容理解即可。

第四阶段(1-2个月)

在前三个阶段的学习中,我们了解了常见的数据结构和算法,并针对算法进行了系统学习,接下来就可以开始我们的刷题之旅了。

这里推荐的资料有:

  • 慕课网 liuyubobobo 《玩转算法面试-- Leetcode真题分门别类讲解》针对他所列举的例题和作业题,进行练习。

这一阶段,我们终于进入了刷题环节,大家记得注册 leetcode 力扣网账户,然后开始自己的刷题之旅把!

第五阶段(2-3个月)

这一阶段希望大家多刷题,达到见多识广的地步。

这里推荐两本书:

  • 《剑指offer》这本书大名鼎鼎,不用多说。书上的题目在 leetcode 网站上也可以刷。
  • 《程序员代码面试指南》这本书罗列的题目也很不错,牛客网可刷。

这个阶段希望大家多做题,多见新题。 这样的话在见新题的过程中做个整理,慢慢的,大家就会发现很多题就是新瓶装旧酒了。

第六阶段(1个月以上)

这一阶段的目的是熟能生巧,多刷好题,经典题。

这里推荐的刷题范围是:

  • leetcode hot 100,hot100
  • leetcode 精选top面试题
  • 《剑指offer》

这阶段的关键点在于多刷,刷遍数。 这个就像背单词一样,多做几遍,对常见题的理解和他的衍生题,都会有一个烂熟于心的程度。针对我这边列举的题单,做到见题目,秒想思路。

这阶段的关键点在于多刷,刷遍数。 这个就像背单词一样,多做几遍,对常见题的理解和他的衍生题,都会有一个烂熟于心的程度。针对我这边列举的题单,做到见题目,秒想思路。但是大家也不用太苛求,有几个hard题的corner case比较难写,大家思路对就行。

第一遍

题目意思能理解,思路没有,或者有一个比较初步的思路,勉勉强强写出来,超时,或击败1%,这种情况下可以参考高赞答案,甚至对着高赞答案一行一行抄也是可以的。

第二遍

看到题目,能大致想出来思路,过一半的case,但很多corner case想不到,此时多关注corner case的写法

第N遍

看到题直接能反推思路,并能列举同类型题和他们对应解法,刷到这里,恭喜你,一线互联网算法题不是事了.

但是大家也不用太苛求,有几个 hard 题的 corner case 比较难写,大家思路对就行。

第七阶段

进阶高级算法。这部分其实如果不是面试 Google 这种公司,完成第六阶段的学习就ok了。如果还想继续精进,可以参考书籍:

  • 《挑战程序设计竞赛》这本书写得极好,无论是列举的习题还是例题都值得反复玩味。
  • 各大OJ平台刷题。

本节最后例行安利学长的公众号:后端技术小牛说,会写点求职干货和技术文,希望大家关注,想和我联系的,公众号后台私信哈。

岗位特性知识点准备

春招由于投递岗位的不同,这部分的准备套路是不相同的。像做算法的,和做Java的,在这部分的准备上略有不同。

这里我就以java后端为例,写一下这部分的准备方略。

java语言特性

重点掌握:

  • 异常,static,final关键字,IO,字符串,
  • 数据结构相关:如set map queue, priorityqueue等等

java多线程

重点掌握:

  • synchronized关键字,volatile关键字
  • 乐观锁
  • 线程池
  • 内存模型
  • AQS相关组件

java虚拟机

重点掌握:

  • 垃圾标记方法
  • 常见的垃圾收集器
  • JVM内存模型
  • 类加载过程及双亲委派机制

以我个人经验,春招java后端语言特性方面没有基础知识问的多。还有框架像spring等,都是加分项,能准备的大家准备一下,b站雷丰阳视频就够了,不能准备的,其实也还行,问题不大。