最近一位读者跟我报喜,秋招拿到了阿里、字节、美团、京东、虾皮shopee等公司的offer。
这位读者本科是双非非科班,考研跨考的计算机,他的经历很励志、很有思考,经历也很有借鉴性,今天分享给大家。
先自我介绍一下,我目前读于某双非大学,攻读计算机硕士学位。本科非科班,这期间没有学过任何科班专业课,只接触过一些简单的c,和一点基础的python语法。
后来听说IT行业收入非常高,便决定跨考本校的科班专业。我的基础非常差,考研的过程可谓是困难重重。专业课考试主要是两门:数据结构和计算机组成原理,自学的过程异常痛苦,尤其是一些什么浮点数运算,连数据结构里最简单的哈夫曼树都看不明白。
最后专业课的成绩是60多分,好在我是本校的生源,站在悬崖边擦着线上了岸。
读研这两年,痛定思痛,朝九晚十补基础,奋战两年,在今年秋招收获了几个后端offer (主要有:阿里、字节、美团、京东、虾皮shopee等),以下是部分意向书截图:
一路以来,得到了许多人的帮助,自己从零基础到顺利结束秋招的学习过程也有颇多心得和感悟,决定写一篇总结,复盘自己心路历程的同时,也借此帮助在秋招路上奋斗的同学们。
秋招的准备分为三大部分 :算法、基础、项目
其实已经有很多经验贴总结了准备的方式,我这里简单谈一下个人准备的心得,希望对有用!
算法是一定要会的,算法有一票否决权。公司会在你投递简历之后让你参加一次算法笔试,如果写不出来或者没有达到分数要求,那就失去了面试资格。在面试中,面试官也会出一两道算法题让你写一写,看看你的代码风格和思路,要是写不出来,面试通过的概率就微乎其微了。
准备方法:
剑指offer
这个没啥好说的了,算法圣经,一定要多刷吃透
leetcode hot 100题
刷完剑指offer和labuladong以后,你的力扣题目应该能有150题左右的刷题量了,hot100也是面试常出的题目,可以考虑刷一刷,这样刷题量就能达到250道左右
各种面经里的算法题
一般牛客上都会有同学分享自己的面经,面经里就有他自己面试遇到的算法题,可以思考一下这些题目的解法,找到力扣原题写一下。面经里的题目都是那些同学实战面试遇到的,非常有参考价值。看这些面经总结一下,根据这个路线,刷个300道题目大概就够了。
基础知识分为几大块:
专业课知识 (计算机网络、操作系统)
这两块是常考点,毕竟是基础中的基础。这个可以看小林coding的pdf文章,总结得非常详细和全面。计网和操作系统一定要最先看,也要掌握得非常熟练,这两个知识点决定了面试官对你基础知识的评价,而且对你理解后续的其他知识有铺垫作用。不然学到 Java web 那块,什么请求头请求行请求体会看得很懵逼。
中间件、数据库 (Mysql、Redis)
Mysql和Redis是非常重要的部分,现在很多公司都转成Go开发,有可能面试你的面试官他们目前使用的是Go或者Python,那么他们就不会问你Java的知识,而是问一些中间件、数据库和专业课的知识。
Mysql需要准备一些基本的SQL语句,比如一个班有两科成绩不及格的同学有几位这类的场景题。我面试虾皮就遇到过。除此之外,还有索引的原理、B+树、MVCC、各种锁机制(行锁、表锁、意向锁、间隙锁、next-key lock)、隔离级别、explain的使用、binlog和redo log、主从复制、调优。推荐一下极客时间的mysql 45讲,非常详细。
Redis需要掌握:5大数据结构(很重要),每一种数据结构的底层原理都要掌握,尤其是zset的底层原理(跳表),被问到了很多,还有Redis持久化、主从复制、哨兵集群、Redis Cluster、一致性哈希算法、缓存雪崩、缓存击穿、缓存穿透、缓存双写一致性问题。
如果学有余力可以了解一下MQ和Elasticsearch,争取一个高评级。
语言知识 (JVM、多线程并发)
容器知识
List、Set、Map。常考的是HashMap底层原理。
JVM虚拟机:
JVM的空间管理、类加载过程、对象分配机制、垃圾回收算法、垃圾回收器、JVM参数、JVM调优。还有一个比较常考的点是OOM的排查,还可以引申到CPU百分百的排查方式。这些都是JVM常考点。推荐阅读一下《深入理解Java虚拟机》这本书,可以比较系统地学习JVM知识。如果觉得JVM比较难理解,可以上B站看看一些机构的教程。这块地方比较抽象,学习的时候可以建议大家多自己动手画画图,流程图或者示例图都可以,把抽象的知识具体化,便于理解。
多线程并发:
公司绝大多数业务都是基于高并发场景,因此我们必须理解多线程并发知识,保证线程安全,防止项目的业务逻辑出错。这里需要理解的点有:线程安全的容器(ConcurrentHashMap
、CopyOnWriteArrayList
)原理、线程池和线程池的原理、JUC包的使用、还有保证线程安全的方式、CAS和ABA问题、多线程计数(AtomicLong
、LongAddr
)、synchronize锁的原理、锁升级过程、ReentrantLock锁的原理、ThreadLocal的使用及原理等。
除了这些知识,大家可以提前准备一些多线程手写题目:
手写线程安全的单例模式、如何破解DCL、反破解单例DCL(在构造方法里加版本号)、反序列化破解DCL(美团一面问了)、手写多线程循环打印ABC、多线程打印奇数和偶数、手写生产者和消费者模式、手写简单的ReentrantLock。如果是面试阿里,可能需要准备一个手写令牌桶限流算法的代码。
我个人面试阿里和字节的时候就遇到了好几道这种题目,手写单例DCL,被问了单例DCL代码防破解的方法,还让我手写了一个延迟队列。有一个面试让我手写了一个生产者消费者模式,这些代码都需要大家提前准备一下。
框架知识 (主要是Spring框架)
Spring循环依赖的解决,Spring的启动流程,Spring IOC、Spring AOP、还有Spring MVC、Spring Boot自动装配原理
这些知识确实比较难,还是得多看一些B站上的视频,还有一些书籍,跟着源码和讲解阅读一下。这块内容我不太推荐看博客,博客写的非常混乱,非常建议大家跟着视频,记笔记,多画图学习。
设计模式
找一些常见的设计模式去了解一下,最好是能融入自己的项目或者自己的理解中。例如:工厂模式(ioc原理)、单例模式(一定要会手写、IK分词器的dictionary有使用)、模板方法(JUC类大量使用、ConcurrentHashMap写LRU也有使用)、动态代理(Java自带的proxy类)、装饰器模式(IO类大量使用)、适配器模式(线程池submit方法结合runnable和callable)、观察者模式(Spring的各种event就是使用这个模式)等模式去理解,这样比较有说服力,不然光是陈述设计模式会很无力,显得你是在死记硬背。
分布式 (学有余力可以了解)
分布式锁(Redisson)红锁及其原理、分布式事务(Seata、TCC、2PC、3PC)和一些原理、分布式ID(雪花算法)、分库分表、分布式注册中心(Nacos、Eureka)、分布式服务之间的调用(Feign)、负载均衡算法。这块知识比较庞大而且很多需要搭建一些环境,我学习的时候就买了好几台云服务器,所以还是建议大家还是掌握前边的知识再来了解,分布式问题的坑是挺大的,我也只是了解和写过一些demo,可能需要结合到工作中才能更深地理解。
项目这块需要个人去多思考,可以去github找一些开源的项目,或者跟着视频去做一些项目。但是一定不能全盘照搬,要融入一些个人的知识技能和理解,找到你认为的难点、亮点。
加入一些高并发、问题排查(OOM、Cpu 100%)、调优(JVM、Mysql)、缓存 (Redis) 、数据结构(布隆过滤器、前缀树)的项目细节,让你有和面试官聊起来的谈资。
不能照搬了一个代码,没有加入自己的理解,那么这个项目陈述起来就很无力,面试官看不出你的代码实力,那么很有可能就出一道hard题取而代之。
面试的时候,项目也是给你降低算法题难度的一个机会,如果你的项目描述得非常好,基础知识也回答得比较棒,面试官一般都不会出一道很难又没见过的hard题来为难你,因此这个部分也需要好好准备。
先给大家梳理一下秋招的时间节点,找工作最重要的就是时间!晚一个礼拜投递,有可能就错失了大量hc和机会。现在秋招的时间越来越提前,兵贵神速!
有可能一个月的时间,笔试题或面试难度就上升了不止一个档次,尤其是秋招后期,大厂的笔试题看都看不懂,面试难度大幅度提升。
因为这时候公司已经不需要大量招人,只能提高录取难度刷掉大多数人以提高招聘效率,所以投递的时间宜早不宜迟!以下是时间安排:
3月 ~ 4月 :参加实习招聘,感受面试节奏、氛围,面试练手
4月底 ~ 7月 :参加公司实习、或者复习准备提前批 (实习不是必须的,我后边会解释)
7月 ~ 8月中 :参加提前批
8月中 ~ 9月底 :参加秋招
10月 : 秋招补招
例如我现在是参加2022秋招(2022年毕业),那么你就需要在2021年找工作。我个人就是按照这个时间节点准备的,现在不止我们求职者在卷,招聘的公司也在卷,因为公司提前开始招聘,就能比其他其他公司更先找到合适的人选。金九银十其实已经变成了金八银九,甚至金七银八,以下是我对每个时间节点理解:
3月 ~ 4月 (实习招聘):首先,我个人建议是,无论你准备得如何,基础如何,去不去实习,都必须在年初的3月份参加一次实习招聘。每年的年初3月都会有大量的企业招聘实习生,现在的实习面试难度基本对标秋招面试。
实习面试就是秋招的一次演习,也可以在一定程度上检验自己对知识的掌握程度,及时查缺补漏。如果你对基础或者算法掌握得非常到位,会收获一些公司的实习offer,就算你屡战屡败,也可以及时发现问题,避免秋招的时候再犯。
4月底 ~ 7月 (实习 or 复习): 如果你有条件去实习(课程不紧,导师不压榨,有充裕的时间),那么可以考虑去实习,实习最重要的目的不是挂一个大厂的名字在简历上让简历更好看!
实习的目的是丰富你的项目经历,让你有和面试官侃侃而谈的技术细节,还有就是获得公司内部的转正机会。
但是你一定要参与到一个项目中,让自己有所收获。我身边就有一些拿到大厂实习的同学,觉得自己有大厂实习秋招稳妥了,实习期间啥有意义的技术都没干,到最后空有大厂名头,面试一样被刷。
如果你没有条件实习,那么也无关紧要,可以找机会完善一下自己的项目细节,包装一下自己的项目,复习算法和基础,准备参加提前批。我个人就没有参加实习。不能参加实习的同学,在这个时期专心复习,好好备战提前批就可以了,不要被其他人影响心态。
7月 ~ 8月中(提前批 !很重要!) **:**我个人认为提前批非常重要,有大量的hc,而且笔试难度也不大,甚至一些公司不需要笔试就可以参加面试(字节、京东、美团等等)。
一定要参加提前批招聘,不能等到秋招再投递!我所有的offer都是提前批拿到的。提前批有一些同学认为自己还没准备好,就不参加投递。还有一些实习的同学还在公司工作,没有实习结束。这时候竞争没有那么激烈,所以一定要参加!如果失败了也可以好好复盘,接下来准备秋招,总之不能错过提前批这个机会!
8月下旬 ~ 9月底 (秋招第一批): 如果你参加了提前批,顺利的话这个时候能收获一些意向书。一些比较优秀的同学拿到大厂offer也可以结束找工作了。
但是有的同学提前批面试不是那么顺利,例如我有一个前端同学,提前批失利,但是他及时总结复盘,补充了一些项目里的技术细节,赶在秋招第一批开始马上投递,最终上岸字节和美团。所以提前批失利的同学也不必气馁,及时总结,及时投递,秋招第一批还是有非常大的机会上岸大厂!
10月(秋招补招) :这个时候就是一些公司的补招时间,还有一些公司比如银行、国企的科技岗开始招聘,如果秋招不是那么顺利,可以考虑一下这些岗位,非常香!不需要频繁的加班,也有非常好的福利。
如果你决心要上岸大厂,就算你之前这个部门的面试挂了,也会有其他部门来捞你,打电话问你能不能参加他们部门的面试,这个时候就要把握机会,用之前总结出的经验来应对面试,还是有相当把握的!
准备简历
简历就是你的门面,很多人都没有认真对待,简历关被刷是非常遗憾的!所以我们需要重视起来。首先写学历,如果是科班一定要强调自己的科班专业。
后续写一下自己掌握的技术栈。之后写一下自己的实习经历(如果有),你的实习单位和实习内容,实习时间。下一个部分写项目经历,项目背景,项目中用到的技术和细节,项目亮点。
简历最后写个人的一些总结(能吃苦,适应能力好,抗压能力强)。大家在写完简历以后不要马上投递,要多找人修改,你只是个小白,但是前辈们有很丰富的经验,要多请他们修改!
这里推荐一下库森的简历模板,我个人认为非常有用 :
https://mp.weixin.qq.com/s/m1NuxfJxUENxqEsQ2afvXQ
也感谢IT老哥帮我修改了几次简历,完善了许多内容,简历基本没有被投递的公司挂过。
个人信息(学历、电话、邮箱、基本情况)
技术栈 (多线程、Spring 、Mysql、Redis这类的信息)
实习经历
项目经历
个人总结
面试开始 :自我介绍
简单介绍一下自己的学历、技术栈、做过的项目,主要还是给面试官一个自身大体情况的概述,自我介绍的时长最好在1分钟到1分半钟,不要太啰嗦。
面试中:
面试官问你一些基础问题,按照你的个人理解回答即可,不需要死记硬背,要融入个人的理解陈述,如果觉得一直看着面试官有点尴尬,可以看着摄像头回答,语气要坚定一点。
但是难免会有一些问题回答不上来,回答不上来的问题不要立刻放弃,可以这么回答:这个问题我没接触过,但是以我现在的理解,我觉得根据xxxx(说一下你对现有知识的理解),可以推出应该是xxxx(推出的结论)。
千万不要遇到问题不懂得思考,就算你真的不会,可以问面试官要点提示,说不定自己就想起来了。
二面三面一般会涉及到项目面试,面试准备前可以画出自己的项目流程图,把项目的功能架构画一下,亮点难点做一份个人总结。
一般面试的问题会有:请陈述一下项目背景,陈述一下项目你负责的工作,陈述一下项目的亮点和难点,陈述一下你遇到了什么问题,是怎么解决问题的。具体把这些问题给想清楚,项目面试应该不会有太大的问题。
写算法题:
如果你项目或基础问题陈述得比较好,面试官基本不会为难你,会给你出一道medium或者easy题,就算是hard也是常见的hard,比如合并k个有序链表,编辑距离这种常见题。算法题写的过程不要一句话不说,先把你的思路说一说。
如果是那些系统设计题或者sql题,或者之前提到的多线程题,比如设计一个阻塞队列,一定要把需求问清楚,需要什么功能,达到什么效果,再写题目,不要啥也不问就想当然写了。
有的面试官是在考验你沟通能力,故意放一个模棱两可的需求给你,如果你迷迷糊糊就写了,沟通能力这块是会被扣分的。
面试官态度问题
有的人会遇到态度非常差的面试官,这个时候心态不要崩,千万不要慌,因为很有可能你在经历一场压力面试。我的阿里最后一面就是这样,面试官态度非常不好!
只要你不卑不亢,对面试官的质疑耐心解释,基本不会有太大问题。我一个在腾讯实习的同学给我说,他的面试官其实私下人很好的!
压力面只是为了考验你的耐心故意为之!但是有的面试官可能给你面试这天有烦心事,你也不能被他的态度影响,耐心解答即可。有的人会被面试官比较冷淡的态度所影响,不敢说话或者性情急躁,要注意调整心态,沉着应战!
HR面
如果你走到这一轮面试,那么已经十拿九稳,在这一面表达出自己的吃苦耐劳、抗压力、适应力、沟通能力,和自己去这家公司的意愿就可以了。
不要问太多关于加班时间、工资、企业文化之类的问题,这都不是这个阶段该问的。
IT行业的高薪资吸引了很多人,竞争也日益激烈。要想在这场激烈的角逐中胜出,首先得保证非常充足的学习时间,后端要学的东西非常非常之多,光算法就可以让你学好几个月,更何况还有那么多的专业知识和语言方面的知识。
如此庞大的知识体系,没个一年半载是啃不下来的,所以一定要以高三或者考研的状态来要求自己。
只有学习强度上去了,才能更好地理解消化知识,三天打鱼两天晒网是不可能学到东西的。一定要保证时间的投入,这是秋招成功的基本前提!
其次,秋招一定是越早准备,越早投递,越早面试越好,很多人都认为自己没有准备好,不敢投递。
一定不能抱着这样的心态,hc拖着拖着就没了,如果你参加了很多场面试,你会发现面试其实来来回回就是那些问题,面得多了,自己也逐渐熟练,能够从容应对。所以不需要害怕自己准备不足的问题,大胆去尝试!
关于心态,其实我们每个人生活背景、教育背景都不同。有的同学基础比较好,理解问题比较快。有的同学导师放养,课程也没那么忙碌,有大量的时间用来准备复习准备。
有的同学学业课业繁重,导师压榨,没时间抽身准备秋招。亦或是之前没接触过计算机方面的知识,学习进度比较慢。但只要你能保证投入了时间,保证了学习效率,没有畏首畏尾,投递了岗位尝试了机会,面试的时候敢于表达自己对知识的理解,即使结果不尽如人意,也不用气馁、焦虑和自责。
秋招只是你职业生涯的起点,有的人说只要毕业进了大厂,以后就可以随意跳槽,升职加薪,迈入人生巅峰,其实不然。职业生涯是一场长跑,这一行更重要的是知识的沉淀,经验的积累,而非大厂光环的包装。
就算没有圆梦大厂,一样可以靠自己的努力,跳槽到其他公司拿到更高的评级。进入了大厂不继续进步,一样会面临严重的程序员危机。我们更应该重视持续学习的能力,而非秋招一朝一夕的得失,这是我们每个程序员的立身之本。
秋招到最后,工作是一定会有的,不要妄自菲薄,也不要眼高手低,稳扎稳打,一定可以收获到满意的offer!
希望我的经历能够帮助到大家!大家加油!