前期准备
校招在我看来是一件时间特别长的战争,为什么这么说呢,因为从你开始准备校招的那一刻开始,到你正式拿到offer的,并且确定去哪一家公司时,时间差不多一年左右,这个时间其实比考研、公务员等都要长,你可能会问为什么需要这么长的时间,当然,这也跟个人的具体情况相关,每个人也会不一样的,但是,也差不了多少,大神级别的除外了。
这篇文章主要还是讲讲校招的整个流程,需要准备什么,遇到问题时怎么去解决,怎么去调整心态,这些都是很重要的,我也是把我个人的真实经历告诉大家,希望能够对大家有帮助。
选择方向
在我看来,第一件事情应该就是选择你找工作的方向,这件事情应该在你开始找工作的半年前左右确定,比如,你2021年3月开始春招找工作,那么,我建议你最好在现在,也就是2020年10月就确定找工作的方向,为什么要这么早,后面我会具体分析。
说到工作的方向,就现在的互联网公司来说,其实可以选择的方向还是特别多的,也是看个人的选择,当然,也是可以有一些数据来做参考的;现在的校招的主流的方向有:算法,后端开发,前端开发,测试开发,运营开发,客户端开发,测试等等,这些岗位通常来说是选择最多的,对于几个岗位,我也给一下自己的建议,可以供参考。
首先是算法,算法这个方向,在我刚刚读研究生的时候也是有想过的,但是,随着深入的了解,以及对于市场对于这个岗位的需求分析,后来,我就慢慢的放弃了,当然这只是一方面的原因;对于算法岗位,现在比较热门的就是深度学习、机器学习了,由于CV方向特别火爆,这里的火爆并不是说好找工作,而是竞争太大了,就今年的算法岗位来说,或者说从去年开始,基本上就是神仙打架了,没有一两篇顶刊论文,你都不好意思说你是搞算法的,所以,如果你想找算法的工作,我的建议是,第一,是不是研究生,第二,是不是211/985以上,或者更直接点是不是985以上的学校,第三,有没有发过好的期刊的论文,我觉得这三点至少满足两点以上才可以考虑去找算法的工作,否则,建议转开发。
接下来说一下开发,开发现在其实竞争压力也不小,想进大厂的压力其实也很大,因为需求就这么多,当然,跟算法比起来就好很多了,后端毕竟方向很多,语言的选择也是很多的,比如,Java、C++、Python、Go这些语言的方向都是可以选择的,之前也说过,Go现在的需求也是在慢慢变大的,可以考虑一下这个方向,竞争可能小一些,其中,Java的竞争最大,可能是因为大家都觉得Java好找工作吧,导致投递的人数特别多,大厂就更不用说了,想找一个Java岗位的工作真的不容易,从我身边的朋友来看,以及身边同学找工作的感受来看,C++进大厂的难易程度还是小一些的,大家可以考虑一下,当然,这些选择也是看你对哪个方向更喜欢了,或者更熟悉了,这里只是给一些建议。
校招流程
上面说了如何选择的问题,选择好了之后,就应该熟悉一下目前的校招流程了,刚刚开始的时候如果不了解的话,或者没有了解一些经验之类的,还是会犯一些错误的,所以这里给大家总结一下。
在现在的校招的模式下,校招分为春招和秋招,春招基本上是找实习的,还是少量的校招补招的,补招就是上一年秋招没有招满,然后在春招继续招人,而秋招基本上就是应届生找工作的最佳时期了。
在今年的春天,2月份开始吧,春招就开始了,很多的公司就开始招是实习生了,特别是字节跳动,在2月初就开始了提前批,2月底提前批就结束了。
所以,春招找实习的黄金时间就是2-5月了,这个两到三个月的时间都一直会有机会,也是拿实习offer的最佳时期。
接下来,6-8月这个时间段,如果你在春招找到了实习,那么一般你就在公司实习了,实习结束后,到9月开始就是要开始秋招了。
但是,这里其实有一个问题,在前面就讲到过,现在的秋招一般都会很早,可能在7月的时候很多的公司提前批就开始了,而提前批又是很好拿offer的时候,所以,选择去不去实习就显得很重要了,或者,你去实习了,如果发现你所实习的公司不是你想留的公司,建议尽早离职准备秋招。从今年的情况来看,可能因为疫情的影响,到了9月份开始秋招,发现其实已经晚了,拿我的情况跟身边的同学来说,今年9月份开始秋招,一般都是投了一大堆的公司,结果最后只有可怜的5个面试机会,这个时候才发现,提前批真的很重要,再对比一些没有实习的同学,通过提前批的面试,一般都有几个offer斩获,对比之下,发现实习的优势竟然没有了,可能这就是现在互联网公司的找工作的现实写照吧。
怎么投递,怎么内推
前面讲了校招的流程问题,这里讲一下在面试的过程中一定会遇到的问题,那就是投递简历。
大家应该都知道,现在互联网公司找工作,基本上都是在牛客网看相关的信息,这也是给大家提供了一个渠道。
关于投递,现在不同的公司也有不同的形式。
第一种,大公司,大公司一般都会有自己的投递官方网站的,都是在官方网站进行投递,这个麻烦的就是,很多的简历信息都是需要手动输入的,所以,还是比较耗时的,到时候遇到了你就会发现真的有点烦,有时候投递个简历需要半天;但是,有一个好处就是,可以比较实时的查看面试进度,直接在官网上进行查看就可以了。
第二种,有一些公司因为没有自己的官方网站,所以,就托管在第三方来进行这个操作,比如,在牛客网上直接进行投递,在牛客网上填写简历,然后,就可以一键投递了,这个方便一些,但是,就是感觉很多时候没有消息,我也不知道为什么。
第三种,也是依赖第三方公司,今年投递的感觉来说,一般都是依赖一个叫做https://www.mokahr.com/
,这个网站一般就是公司进行内推的,这个投递网站好处就是方便投递,而且有些公司只需要你上传你的电子版的简历就可以,降低了投递成本,但是,不方便的就是查询投递进度。
然后,说到内推,其实,方式也就那么多。一般,如果有实验室的师兄师姐在比较好的互联网公司,那么,我们可以通过这种渠道进行内推,一般也是比较靠谱的,成功率比较高;其次,现在很多内推也都是在牛客网进行了,我很多时候也是在牛客网看有没有公司的内推,这种方式有一个问题就是一般内推的人很多,最终你能不能被筛选到是一个问题;最后,还有一种方式就是通过公众号,官方的公众号投递,或者有一些公众号也会提供内推码。
最后,就算没有内推,其实也不要紧,很多人直接在官网投递,也是能够机会的,而且,现在的内推跟前几年还不一样,现在就算是内推了,最多也就是有个笔试的机会,不会直接给面试机会,直接给面试机会除非是简历特别出众。
校招知识储备
这一部分我觉得是这篇文章的重点了,写这篇文章也是为了告诉大家怎么准备校招,而其中的专业知识部分就决定你能不能拿到offer了,所以,接下来,我重点的跟大家聊聊校招的专业知识部分的准备工作。
算法
首先,我可以告诉大家一点就是,校招对于技术栈的要求并不会很高,校招就是招聘应届生,只需要你有可塑性、可培养的空间,那么,就很有可能给你offer,那么,如果校招不强调技术栈的重要性,那么注重什么的考察呢?
没错,就是算法,对于计算机专业的学生来说,从大学开始接触到计算机的必修课里面一定是有数据结构和算法这门课程的,而且也是相当的重要,而校招,从我自身面试的经历来说,算法可以说是十分的重要,再强调也不为过。
在现在的招聘流程中,首先是有笔试,大公司的笔试一般就是2-4道编程题,题目的难度leetcode的hard以上,所以,笔试就是检验你的算法的能力;进入到面试阶段后,基本上每一轮面试中,一定是会有算法题的,现在也是一般使用牛客网进行考核,所以,大家可以先去牛客网适应适应,那么,在一次面试中,算法的重要性怎么样呢?我这么说吧,如果一轮面试中,面试官出了一道算法题,如果你做出来了,其他的专业知识点回答的很一般,你有可能进入到下一轮面试,如果你算法题没有做出来,专业知识点就算回答的再好,基本上也是凉凉。因此,从我的经验来看,面试中A出算法题,至少可以拿到60分,A不出来,那就是0分,无一例外。
那么算法如何准备呢,这也是我想跟大家聊的一个话题,因为我在找工作之前,算法的能力可以说太一般了,很多的算法都是不懂的,基本的题目也是很难做出来,但是,经过这一年的训练,现在在面试中的算法题A出来基本上是没有问题的,除非是特别难的题目,那当我没说,有过几次经历,感觉被刷KPI了;因此,如果你现在也是对算法没有任何的自信的话,不用太担心,因为我也是这样过来的,只要你坚持,有方法的训练,应对基本的面试是完全没有问题的。
接下来就是讲讲怎么去应付校招的算法难关,拿offer。
首先,如果你离秋招还有一年多的时间,也就是明年的秋天才参加秋招,或者时间更多,同时,你的数据结构跟算法的基础也是不太好的话,我建议你先看看数据结构与算法的书籍,关于看哪些书籍,我之前已经写过了,可以看这篇文章必须看的数据结构与算法书籍推荐: https://blog.ouyangsihai.cn/cong-ru-men-dao-na-da-han-offer-bi-xu-kan-de-suan-fa-shu-ji-tui-jian-bu-hao-bu-tui-jian.html。
其次,如果你的时间非常紧张,马上就快要参加春招找实习了,这个时候其实我就不太推荐看书了,看书的效率其实是很难保证的,我建议你看一下牛客网左神的算法教程,左神的教程我是看过的,从基础到进阶的一整套课程,我觉得讲的非常的精彩,能够看得出来左神的功力,对于每一种算法的类型,每一个题目的讲解都是细致入微的,推荐去看看。
然后,如果你对于基本的算法通过看视频或者看书有了一定的了解的话,那么,接下来就是校招的刷题时间了。
讲到刷题,其实方法很重要,这里我就讲一下我的这一年的刷题的经验,其中也有自己的血与泪的故事,就不多说了,这里告诉大家,避免踩坑。
不管哪个方向的,我都建议你刷题的第一本书是《剑指offer》,为什么这么说呢,因为面试的时候,很多的题目都是出自这本书的,不管哪个公司,另外我还要告诉你,特别是春招的时候,因为大家准备的都不是特别好,所以,面试官出的题目也不会很难,一般就是选自这本书,一定要好好的把每一道题目都吃透。那么怎么样才算吃透呢,可能你看了几遍这本书,但是还是不够的,你还需要去牛客网找到剑指offer的专栏,进行线上的练习,只有当你自己可以在线上把每一道题都可以A出来的时候,并且都是最优解,这个时候,这本书就是过关了,那么,你也是可以应付面试中的70%的算法题。
如果这一步你已经做到了,还想要提高的话,我还会推荐左神的书《程序员代码面试指南:IT名企算法与数据结构题目最优解》,这本书的难度比剑指offer难很多,里面有很多有难度的题目,但是各个章节都编排的非常合理,都是按照分类来的,非常适合进行刷题,训练自己的算法思维。
当然,如果你不想看书,想直接刷题,那么,我推荐你去leetcode进行刷题,去leetcode刷题也需要注意一点,尽量按照类型来刷,这样可以更好的进行练习,同时,我也建议你先把hot100搞定,然后再去刷其他的,这样可以先把最热门的题目搞定,其他的有时间再去训练。
以上就是应付算法的一些技巧,这当然只是针对大多数的人来说的,大佬可以跳过。
专业方向知识
这一部分接着上面的算法,可以算是比较合理的,只有在算法的基础上,才有资本谈论专业知识,否则,没有任何意义。首先声明一下,下面的这一部分主要是针对Java开发的,其他的方向在这里不讨论。
Java大家都知道技术是非常的多的,也是比较费时间的,但是,结合校招的特点,狠毒的技术其实是不用讨论的,主要的需要复习的在这里都会讲到,主要包括下面这些。
数据结构
计算机网络
操作系统
数据库
Java基础
Java集合
Java多线程与并发
JVM
Spring、Mybatis、SpringBoot等框架
Redis
Dubbo
Zookeeper
消息队列
以上的这些知识点其实都是考察的非常频繁的,其中数据库,数据结构,Java集合,并发,JVM,Redis这几块知识点,被问到的概率特别高,基本上是面试必问的。
不过,大家不用太担心,因为,通过这一年多的面试,我基本上把这些知识点都进行了总结,常见的面试题也都是进行了总结,只需要按照我总结的来进行复习,我觉得问题不大,互联网前50应该是没有任何问题的。
下面我给出一些我总结的常见面试题,都进行了分类,非常好进行复习。
一 Java基础
一致性hash算法
sleep和wait
强软弱虚引用
Arrays.sort原理
创建对象的方式
若hashcode方法永远返回1会产生什么结果
解决hash冲突的三种方法
为什么要重写hashCode()方法和equals()方法以及如何进行重写
动态代理
sleep和wait的区别
java 地址和值传递的例子
Java序列化
java NIO,java 多线程、线程池,java 网络编程解决并发量
JDBC 连接的过程 ,手写 jdbc 连接过程
说出三个遇到过的程序报异常的情况
socket 是靠什么协议支持的
java io 用到什么设计模式
serviable 的序列化,其中 uuid 的作用
什么情景下会用到反射
浅克隆与深克隆有什么区别,如何实现深克隆
反射能够使用私有的方法属性吗和底层原理?
处理器指令优化有些什么考虑?
object 对象的常用方法
Stack 和 ArrayList 的区别
statement 和 prestatement 的区别
手写模拟实现一个阻塞队列
util 包下有哪几种接口
很常见的 Nullpointerexception ,你是怎么排查的,怎么解决的;
静态内部类和非静态内部类的区别是什么?
怎么创建静态内部类和非静态内部类?
Xml 解析方式,原理优缺点
静态变量和全局变量的区别
二 Java集合
hashmap
treemap
还了解除 util 其他包下的 List 吗?
CopyOnWriteArrayList
hashmap的jdk1.7和jdk1.8区别
concurrenthashmap的jdk1.7和jdk1.8区别
HashMap 实现原理,扩容因子过大过小的缺点,扩容过程 采用什么方法能保证每个 bucket 中的数据更均匀 解决冲突的方式,还有没有其他方式(全域哈希)
Collection 集合类中只能在 Iterator 中删除元素的原因
ArrayList、LinkedList、Vector
ConcurrentHashMap 和 LinkedHashMap 差异和适用情形
ConcurrentHashMap分段锁是如何实现,ConcurrentHashmap jdk1.8 访问的时候是怎么加锁的,插入的时候是怎么加锁的 访问不加 锁插入的时候对头结点加锁
ArrayDeque 的使用场景
ArrayBlockingQueue 源码
hashmap 和 treemap 的区别
rehash 过程
HashMap 的负载因子,为什么容量为2^n
list,map,set 之间的区别
什么时候会用到 HashMap
常见的线程安全的集合类
三 JVM
反射在jvm层面的实现
jvm的方法区存什么?
JDK1.8 JVM方法区变成了什么,为什么这样做
oom出现的原因
Class.forName和ClassLoader的区别
java对象信息分配
java虚拟机ZGC详解
java虚拟机CMS详解
java虚拟机G1详解
JVM tomcat 容器启动,jvm 加载情况描述
四 多线程并发
volitale使用场景
可重入锁,实现原理
Java 无锁原理
讲讲多线程,多线程的同步方法
synchronized原理
reetrantlock
java 线程安全都体现在哪些方面
如果维护线程安全 如果想实现一个线程安全的队列,可以怎么实现?
Java多线程通信方式
CountDownLatch、CyclicBarrier、Semaphore 用法总结
juc下的内容
AOS等并发相关面试题
threadlocal
java 线程池达到提交上限的具体情况 ,线程池用法,Java 多线程,线程池有哪几类,每一类的差别
要你设计的话,如何实现一个线程池
线程池的类型,固定大小的线程池内部是如何实现的,等待队列是用了哪一个队列实现 线程池种类和工作流程
线程池使用了什么设计模式
线程池使用时一般要考虑哪些问题
线程池的配置
Excutor 以及 Connector 的配置
五 Java框架(ssm)
hibernate
Hibernate 的生成策略
Hibernate 与 Mybatis 区别
Mybatis原理
mybatis执行select的过程
mybatis有哪些executors
mybatis插件原理
mybatis二级缓存
spring&springmvc
spring中的设计模式
spring中bean的作用域
BeanFactory和FactoryBean区别
aspect的种类
spring aop的实际应用
spring实现多线程安全
spring的bean的高并发安全问题
ioc aop总结(概述性)
Spring 的加载流程,Spring 的源码中 Bean 的构造的流程
Spring 事务源码,IOC 源码,AOP 源码
spring 的作用及理解 事务怎么配置
spring事务失效情况
Spring 的 annotation 如何实现
SpringMVC 工作原理
了解 SpringMVC 与 Struct2 区别
springMVC 和 spring 是什么关系
项目中 Spring 的 IOC 和 AOP 具体怎么使用的
spring mvc 底层实现原理
动态代理的原理
如果使用 spring mvc,那 post 请求跟 put 请求有什么区别啊;然后开始问 springmvc:描述从 tomcat 开始到 springmvc 返回到前端显示的整个流程,接着问 springmvc 中的 handlerMapping 的内部实现,然后又问 spring 中从载入 xml 文件到 getbean 整个流程,描述一遍
六 微服务(springboot等)
springboot
springcloud
七 数据结构
二叉树相关
红黑树
八 数据库
MySQL
数据库死锁问题
hash索引和B+树索引的区别
可重复的原理MVCC
count(1)、count(*)、count(列名)
mysql的undo、redo、binlog的区别
explain解释
mysql分页查询优化
sql注入
为什么用B+树
sql执行流程
聚集索引与非聚集索引
覆盖索引
sql总结
有人建议给每张表都建一个自增主键,这样做有什么优点跟缺点
对 MySQL 的了解,和 oracle 的区别
500万数字排序,内存只能容纳5万个,如何排序,如何优化?
平时怎么写数据库的模糊查询(由字典树扯到模糊查询,前缀查询,例如“abc%”,还是索引策略的问题)
数据库里有 10000000 条用户信息,需要给每位用户发送信息(必须发送成功),要求节省内存
项目中如何实现事务
数据库设计一般设计成第几范式
mysql 用的什么版本 5.7 跟 5.6 有啥区别
提升 MySQL 安全性
问了一个这样的表(三个字段:姓名,id,分数)要求查出平均分大于 80 的 id 然后分数降序排序,然后经过提示用聚合函数 avg。
为什么 mysql 事务能保证失败回滚
主键索引底层的实现原理
经典的01索引问题?
如何在长文本中快捷的筛选出你的名字?
多列索引及最左前缀原则和其他使用场景
事务隔离级别
索引的最左前缀原则
数据库悲观锁怎么实现的
建表的原则
索引的内涵和用法
给了两条 SQL 语句,让根据这两条语句建索引(个人想法:主要考虑复合索引只能匹配前缀列的特点)
那么我们来聊一下数据库。A 和 B 两个表做等值连接(Inner join) 怎么优化
数据库连接池的理解和优化
Sql语句分组排序
SQL语句的5个连接概念
数据库优化和架构(主要是主从分离和分库分表相关)
分库分表
跨库join实现
探讨主从分离和分库分表相关
数据库中间件
读写分离在中间件的实现
限流 and 熔断
行锁适用场景
Redis
redis为什么快?
Redis 数据结构原理
Redis 持久化机制
Redis 的一致性哈希算法
redis了解多少
redis五种数据类型,当散列类型的 value 值非常大的时候怎么进行压缩
用redis怎么实现摇一摇与附近的人功能
redis 主从复制过程
Redis 如何解决 key 冲突
redis 是怎么存储数据的
redis 使用场景
九 计算机网络
cookie 禁用怎么办
Netty new 实例化过程
socket 实现过程,具体用的方法;怎么实现异步 socket.
浏览器的缓存机制
http相关问题
TCP三次握手第三次握手时ACK丢失怎么办
dns属于udp还是tcp,原因
http的幂等性
建立连接的过程客户端跟服务端会交换什么信息(参考 TCP 报文结构)
丢包如何解决重传的消耗
traceroute 实现原理
IO多路复用
select 和 poll 区别?
在不使用 WebSocket 情况下怎么实现服务器推送的一种方法
可以使用客户端定时刷新请求或者和 TCP 保持心跳连接实现。
查看磁盘读写吞吐量?
PING 位于哪一层
网络重定向,说下流程
controller 怎么处理的请求:路由
IP 地址分为几类,每类都代表什么,私网是哪些
十 操作系统
Java I/O 底层细节,注意是底层细节,而不是怎么用
Java IO 模型(BIO,NIO 等) ,Tomcat 用的哪一种模型
当获取第一个获取锁之后,条件不满足需要释放锁应当怎么做?
手写一个线程安全的生产者与消费者。
进程和线程调度方法
linux
linux查找命令
项目部署常见linux命令
进程文件里有哪些信息
sed 和 awk 的区别
linux查看进程并杀死的命令
有一个文件被锁住,如何查看锁住它的线程?
如何查看一个文件第100行到150行的内容
如何查看进程消耗的资源
如何查看每个进程下的线程?
linux 如何查找文件
select epoll等问题
十一 框架其他
Servlet 的 Filter 用的什么设计模式
zookeeper 的常用功能,自己用它来做什么
redis 的操作是不是原子操作
秒杀业务场景设计
如何设计淘宝秒杀系统(重点关注架构,比如数据一致性,数据库集群一致性哈希,缓存, 分库分表等等)
对后台的优化有了解吗?比如负载均衡
对 Restful 了解 Restful 的认识,优点,以及和 soap 的区别
lrucache 的基本原理
十二 设计模式
Java常见设计模式
十三 分布式
dubbo中的dubbo协议和http协议有什么区别?
负载均衡
分布式锁的实现方式及优缺点
CAP
如何实现分布式缓存
十四 其他
Java 8 函数式编程 回调函数
函数式编程,面向对象之间区别
Java 8 中 stream 迭代的优势和区别?
同步等于可见性吗?
git底层数据结构
安全加密
web安全问题
上面的这些就是我整理的互联网公司的各个知识点的常见面试题,非常高频的面试题,这里因为限于篇幅,不太好进行全部展示,如果想去看具体的解答或者质量高的博文解答,可以去我的github上查看高频面试题分类汇总: https://github.com/OUYANGSIHAI/JavaInterview/blob/master/docs/interview-experience/%E9%9D%A2%E8%AF%95%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E5%88%86%E7%B1%BB%E6%B1%87%E6%80%BB.md。
上面的这些面试题可能不是特别的全面,有一些是没有考虑到的,考虑到这个问题,我就把一些相关的面试题整理成了思维导图,如果大家有需要也可以直接去这篇文章获取,关于思维导图有什么好处我在这篇文章就不多说了,在上面这篇文章中有提到,总之,拿到这些资料,只要你好好去思考,对面试一定是大有帮助的,毕竟我就是这样走过来的。
当然,这个github不止上面这些面试题,还有其他的关于我这一年的所有积累和总结,看了你就知道,一定会对你面试有很大的帮助的,因为我就是靠上面的这些拿到大厂offer的。
面经
本来这篇文章最后还是想讲讲一些公司的面经的,但是,写着写着,发现这篇文章已经写了几天了,字数也快2W字了,考虑到文章篇幅太长了也不好,所以,这篇文章暂时就不分享一些公司的面经了,后面的文章再给大家分享,如果希望看到后面的公司的面经的话,比如,字节、阿里、腾讯等等,麻烦给个赞,这篇文章死磕了快一周了,原创不易,希望对大家有帮助。
最后,觉得不错,点个赞呗!
本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。