2019秋招经验谈

来自:算法修炼笔记(微信号:alglearning),作者:kai
首发于牛客网https://www.nowcoder.com/discuss/122463,有修改。

2019届校招结束,坎坷沉浮,尽尝酸甜苦辣,辛苦鏖战,终究获益良多,将所得总结于此,以纪念一个新的开始。

目录

  • 0.概述

  • 1.我的练级之路篇

  • 2.认知思维篇

  • 3.专业技术篇

  • 4.面试技巧篇

  • 5.学习资料篇


0. 概述

首先介绍一下我的基本情况,让大家有所参考。

  • 学校:211

  • 专业:电路与系统(信息对抗方向)

  • 应聘岗位:Java后端开发(或者相关开发岗位)

  • offer:中国银联 顺丰科技 vivo 海康威视 招商银行信用卡中心 华为 阿里

然后要明确,offer与认知思维、专业技术、面试技巧以及运气都分不开,即offer = 认知思维 + 专业技术 + 面试技巧 + 运气

  • 认知思维是指求职者的心理准备,思维准备,决定了准备的质量以及offer的质量;

  • 专业技术是指求职者的专业实力,是校招的基础,敲门砖,决定了offer的下限;

  • 面试技巧是指求职者的语言表达,归纳整理,能力包装等能力,为专业能力锦上添花(而非雪中送炭),决定了求职者是能够发挥出应有的专业水准。

接下来我将围绕认知思维、专业技术面试技巧以及学习资料展开介绍。

1. 我的练级之路篇

1.1 选择与方向

关于我的练级之路,我想从一个面试经常问到的问题谈起:你为什么要从搞雷达转到搞Java开发呢?为什么从一个非常高端的领域转到一个简单的应用领域呢?你不觉得浪费你的才能吗?是的,我的研究方向是雷达相关,与Java开发完全不搭边,为什么要转呢?主要原因有以下几点(注意,面试的时候可不能这么回答呀,童鞋们,我这里只是说了个大实话而已,面试的时候得包装啊,童鞋们):

1.我发现我不适合做雷达方向的研究,整个雷达领域其实涉及的知识点是非常多的,需要掌握雷达相关理论和雷达设备本身以及战场环境3个纵深领域的知识,而雷达理论、雷达设备与战场表现三个领域的表现其实并不完全一致,想要做出成绩,其实需要经历大量年限的积累,对整个雷达领域有了一个整体的积累之后,你才能做出有效的成绩(注意这里的有效是指不是骗国家钱的那种研究,而是实实在在的能用在实战中的研究,不细说了),因此整个领域的发展不是循序渐进的发展,而是断崖式厚积薄发的发展,因此其实挺难的。

2.雷达方向的就业面很窄,基本上主要去研究所工作,而研究所的工作氛围并不适合我(说的直接点,事实上是工资更加不适合我)当然了,现在其实随着自动驾驶的兴起,雷达算法工程师也逐渐可以去民用公司赚钱,这点其实非常好。

因此想要换一个方向去做,或者说换一个技术路径去发展,但是毕竟是换一个方向去发展,时间和精力有限,需要选一个难度较低的切入点,因此选择了 Java后端开发工程师

既然谈到了选择,这里需要提醒一下大家,在找工作之前,一定要想想自己适合做什么样的工作,自己感兴趣的是什么工作,这点非常重要。

1.2 制定计划

谈完选择,定下方向,接下来就是制定计划了。整个准备过程其实一直都是制定计划、执行计划、打破计划、重新制定计划、重新执行计划的循环。因此我下面就直接介绍我都做了哪些事情。直接上图吧。

在这个过程里你会发现,生活从来没有准备到完美的时候,计划永远都赶不上变化,那么校招也是一样,你永远不会有准备好的那一天,那就在准备了多少就直接上战场吧。

1.3 执行计划

既然知道了该做什么事情,那么你就应该像一只野兽一样,开始捕猎,不见血不停止,你需要拼命地野蛮生长。

(1) 2017.10.1 - 2017.10.15 我其实是2017.10就有意识的开始准备找工作了,但是那个时候需要干实验室老板的任务,因此都是每天项目任务完成之后,开始零散的学习Java基础知识,当时每天项目任务完成,开始复习的时候,基本都是晚上11点左右了,每天基本上学习到凌晨0:40左右,回宿舍休息,第二天接着来。就这样,学习了差不多有半个月,后面项目越来越紧,需要投入的时间越来越多,然后就开始中断了。对Java有了一个整体的认识。

(2) 2018.2 直到寒假放假,大概2018.2 才有了2周完整的学习时间,这2周,深化了一下Java基础知识,Java基础基本上已经有一个全面的了解了。3月返校,老板的任务更重了,基本上挤不出什么时间复习,因此我加班到5月中旬,把我所有的相关的任务全部做完之后,跟老板商量,能不能开始找工作,不再做实验室项目了,老板曰,可以。尽管后面老板还找我,但是其实已经没有那么频繁了,因此我开始有了一定的时间复习,但事实上,其实并不够,其实还是有很多实验室项目的事情需要做,但是好歹可以有自己的时间复习了。

在这里我要给大家一个建议:当你实验室活很多的时候,你需要给你的老板去说你即将要找工作的事情,去和他商量,为啥这么做呢?首先,老板对你毕业有身杀大权,你需要征求他们的同意,才能有一定的时间去找工作,不至于发生因为找工作而没有完成实验室任务,导致和老师发生冲突,那就不好了;其次,你提出找工作的事情,其实是给老师释放一个信号:你要找工作了,希望老师能少安排活,即使他最后没有少安排活,也会降低对你完成任务的期许,这样不容易造成冲突。

(3) 2018.5.15 - 2018.6.15 正式复习开始了,在这段时间里,开始大量复习计算机网络、Linux、数据库(MySQL, Redis)的知识,大量总结归纳。同时呢,也开始准备一个Java后端的项目:这个项目其实就是叶神的高级项目课https://www.nowcoder.com/courses/semester/senior, 然后边做边学习Spring Boot,Spring,MyBatis这些框架,同时也加深对数据库的理解,并且有意识地开始学习如何优化代码,如何引入设计模式。 在整个项目的学习和准备过程中,我要给大家一个建议:那就是准备校招的时候,其实应该以结果为导向,以实战为线索,在实战中,在项目中去应用自己学习过的知识,同时学习新的知识,通过迭代来将知识、能力以及思维逐渐形成一个体系:知识-思维-能力-案例 四位一体的体系。

(4) 2018.6.16 - 2018.7.15 这段时间里,最重要的事情莫过于算法了,在这段时间里,主要的工作就是看算法相关的书籍,了解算法基础知识,然后开始刷题,加深理解。

在学习算法的过程中,其实,也一直接着做Java后端的项目;同时呢,还在深入的学习JVM, 学习设计模式。

(5) 2018.7.16 - 2018.8.8 这段时间呢,主要完成Java后端的项目,同时,伴随着Java多线程、设计模式的学习,然后开始复习计算机网络、Linux、数据库等。

(6) 2018.8.9 - 2018.11 这段时间呢,就开始了大量的笔试,面试。

1.4 小结

其实整个校招准备的过程中,就是一个制定计划、执行计划、打破计划、重新制定计划、重新执行计划的循环。在这个过程里,你会被很多乱七八糟的事情打断,你需要不断平衡实验室工作和校招复习之间的准备工作。这里你就需要采取很多策略,去保证你的复习时间和复习质量,同时你也需要采取有效的心态和认知去对待整个过程。

整个校招过程中,你会发现,你的认知和思维会影响你的技术准备、面试发挥,你的技术准备的程度、面试发挥的好坏又会反哺你的认知和思维,整个过程是一个稳定自我,提升自我,然后挑战外在的一个过程。

下面就详细地介绍一下,该如何准备。

2. 认知思维篇

2.1 战略悲观与战术乐观

我在学习过程中,一直有个态度,就是战略悲观与战术乐观。什么意思呢?解释一下:

所谓的战略悲观是指,在整个准备的过程中,心态上,要认识到自己永远都不可能准备完美,永远会有缺失和漏洞,这是很正常的,甚至单纯的一个知识点,以现在的能力,每个人都不可能准备到面面俱到,因此不要苛求自己,不要追求完美主义,抓大放小,抓住主要矛盾,解决核心问题,这是很重要的。

所谓的战术乐观是指,一旦要参与战斗,一旦去笔试,去面试,那么你就认为你是准备好的,在这样的情况下,你要明白,你需要做的是发挥出你现有的水平,发挥出你当下的水平就够了,而不是去瞻前顾后,认为自己这也不会,那也没看,不要管那些,你要做的就是自信地去应对每一场笔试,每一场面试,把你会的发挥出来,而且每次战斗都要比上次要进步,那么你的目标就达到了。

因此,在整个校招的准备过程中,你需要做到:

  • 对于整个校招而言,你要保持战略悲观的态度,充分利用每一分每一秒去准备,不要苛求完美,抓住核心知识和技能去准备;

  • 对于每一场笔试或者面试而言,你要保持战术乐观,你要每一场都保持自信,认为你已经准备好了,然后尽情地去发挥,以战养战,不断精进。

整个校招由大大小小多场战斗组成,你要赢的是最后的胜利,而不是某一场的胜利,因此自信地去应对每一场。所谓胜败乃兵家常事,单场的失败只能证明你当下没有准备好,你要做的是查漏补缺,不断精进,迎接下一场战斗。其实,当你参加一定场次之后就会发现,哎呀,原来套路是一样的,那个时候你就可以开始收割了。

记住:战略悲观与战术乐观做一个长远有野心,当下有信心,事后有决心,正确认识成败,立足长远的求职者

2.2 自由与平等

我在面试的过程中,保持的态度是自由与平等,什么意思呢?解释一下:

所谓的自由与平等,指的是面试者和面试官之间是平等的,面试者与面试的公司之间是平等的,没有任何的等级之分,这里的自由与平等,既指个人尊严与人格的平等,也指面试者和公司之间的选择平等,双方没有任何的权力和资格去藐视和歧视对方。这个非常重要。

面试者在参加面试的时候,需要保有自由与平等的态度,要做事先做人,要认识到你与面试官之间是平等的,首先保持你自己的人格尊严,然后再考虑面试,因此你没有必要对面试官卑躬屈膝,低声下气,没有必要惧怕对方,没有必要去紧张,见面了,一声干净利落地“老师好”或者“面试官好”,然后一字一句的清晰地去与面试官交流你的观点和主张,这个非常的重要。不要因为一个面试而丢掉了自己的骨气,这远比你面试本身更重要。

既然是自由平等的,那么面试者与公司之间的选择也自然是自由平等的,有时候,你可能会发现自己明明准备的很好,面试交流的也很好,但是就是被挂了,为啥?只能说明你的面试不符合这个公司的招聘标准,只能说明公司认为你不合适,不能说明你不行,或者你的方向选择是错的,尤其不能说明你的智商有问题,你要做的是,心里淘汰掉这家公司,然后接着下一家。

记住:自由与平等做一个自信,大方,自尊,平等的求职者

2.3 胜而后战

是故胜兵先胜而后求战,败兵先战而后求胜。 - 《孙子兵法·形篇》

这句话是说,两军交战,胜利的队伍在战斗之前就已经做了充分的准备,胜利是准备好的结果。

这句话其实很好地说明了,整个校招,若想取得好的结果,其实得早点开始准备,尽全力地早点开始准备,要明白,开始准备的早,不一定结果就好,但是准备的晚,大概率是很难取得自己满意的结果的。

孙子有云,“凡战者,以正为合,以奇为胜”。这句话是说,作战,先要把正面的兵排好,要排的不偏斜,合乎法则,这叫正;如果此时你还有多余的兵力,你就赢了,这叫以奇(ji)为胜。

这句话其实很好地说明了,整个校招其实不止你自己要复习地好,你要复习地好到干掉和你竞争同一个岗位的人,那么你就应该比你的同行多做准备,不仅要充分的准备,而且要额外的准备。

曾国藩,一代文人,但是在打仗上确实甚为了得,为啥呢?因为老爷子喜欢“结硬寨,打呆仗”。老爷子打仗的时候,大部分时间,都在挖沟,基本上他参加的战场,都是沟壑纵横。他先用结硬寨的方式把敌人围起来,限制敌人的行动能力,使自己利于不败之地,然后再徐徐图之,以求胜利。

曾老爷子这个方式,其实也正是我们校招的方式,应对每一场面试,我们要做的就是掌握核心知识点,尽最大努力,做尽可能充分地准备,使自己在专业能力上立于不必之地,然后徐徐图谋更好的待遇。

记住:凡战者,以正为合,以奇为胜。以结硬寨,打呆仗的方式去尽可能充分地准备校招(其实有时候也意味着尽可能早的去准备),确保自己在能力上能立于不败之地,那么剩下的就是尽情发挥,然后收割校招的胜利果实了。因此,做一个用笨办法踏实复习的求职者

2.4 军团作战

校招,其实不是一个人的战斗

整个校招过程中,信息海量,一个人很难兼顾到所有的情形,例如你无法关注到所有公司的求职信息,你无法了解到所有公司的情况,因此你需要找一群小伙伴,一起去奋斗。

所谓军团作战,就是指,找一群志同道合的小伙伴,组成学习同盟,互相交流学习,互相沟通经验,互相共享求职信息,攻守相伴。这样的团结互助其实不止体现在信息上、能力上,更体现在学习过程中,相互之间的心理的支持和关心上,这些都很重要,大大提高了校招的效率和成功率。

记住:军团作战。提高准备效率,做一个团结合作的求职者

2.5 提前准备

所谓的提前准备,是指:

  • 提前进行技术准备

  • 提前进行秋招(一定不要错过提前批,2019最早的提前批6月底就开始了)

一定要注意,提前批的难度和正式秋招的难度是有区别的

  • 很多公司提前批都免笔试,这会省去不少时间

  • 很多公司的提前批,面试难度并不高,并没有正式秋招高

  • 提前批hc充足,有大量试错机会或者说练习面试的机会,这个非常值钱

  • 提前批相当于给秋招了2次机会,这样话,即使提前批过不了,秋招也可以再试一次(看再多面经也不如自己亲身体验一次要感受的深嘛)

  • 很多公司,提前批可能意味着sp,ssp(华为除外)

说明:

  • 这里需要区别一些名词:提前批 vs 内推 vs 校招

    • 校招:校招就是每个公司都有的完整的招聘流程,简历筛选、笔试、面试一个不少

    • 提前批:很多公司的提前批是独立的,是当年第一批次的招聘,可能免去简历筛选,笔试

    • 内推:很多公司的内推是独立的,可能免去简历筛选,笔试;但是有些公司内推和提前批是重叠的,也有些公司的内推和校招是重叠的,一定要注意。

    • 一定要看内推和提前批对校招是否有影响,例如:

      • 是否参加内推或者提前批,就不能参加校招,例如唯品会

      • 是否参加内推或者提前批,校招就需要换岗位甚至换部门,例如网易

  • 简历筛选 vs 免笔试

    • 简历筛选:很多好学校的同学觉得简历筛选只是对学校不太好的同学有用,对自己没有,但是其实不是,例如银行(国有和商业银行)就会筛选,有些好学校的同学有时候会发现连笔试的机会都没有,而一些相对不太好的学校的同学拿到了笔试机会,其实是因为有些同学是内推的,免掉了简历筛选。现在简历筛选越来越玄学了,所以免掉简历筛选其实很重要

    • 免笔试:相对而言免笔试对大家影响并没有那么大,但是免笔试有个很大的好处,就是加快面试流程。

3. 专业技术篇

3.1 概述

  • 目标:介绍Java后端开发相关的知识点

  • 认知准备:胜而后战 (见2.3节)

  • 说明:这部分内容是必须掌握的内容,鉴于水平所限,可能不是很全面,仅做参考。

  • 建议: (1)复习的过程中,做复习笔记,最好是记录在云端,这样的话,可以随时复习,例如面试等待中复习; (2)当知识复习完一遍之后,就可以对照着面经去复习准备了,记住先搞熟核心知识,再去搞其他边缘的知识;(3)复习过程中,一定要注意不仅要了解知识,还要主动思考,去思考知识背后的逻辑以及设计的意图

关于专业技术呢,是指你的硬实力,硬实力的考查呢,主要从2个角度进行:

  • 宽度:掌握的知识是否全面

  • 深度:掌握的能力是否深入

宽度在一定程度上决定了你是否能够进入一家公司,深度则决定了你offer的等级。对于bat,甚至更好的公司来说,有时候深度甚至可能决定你是否能够进入这家公司。

3.2 专业技术

一门语言(以Java为例)

(1) Java核心知识

  • Java基础

    • 新版本特性

    • 跨平台特性

    • Java四个基本特性

    • Object类及其方法实现(尤其是equals() and hashCode())

    • 基本数据类型与引用数据类型

    • Exception vs Error

    • finally vs final vs finalize

    • final vs final

    • 四种引用:强引用、软引用、若引用、幻象引用的比较

    • 重载 vs 重写

    • 接口 vs 抽象类

    • 深克隆 vs 浅克隆

    • String vs StringBuffer vs StringBuilder (底层实现)

    • IO vs NIO vs AIO

    • 反射与动态代理

    • 序列化与反序列化(底层实现)

  • 集合框架 (应用及源码分析)

    • 集合框架的设计与所有的继承关系

    • Vector vs ArrayList vs LinkedList

    • HashTable vs HashMap vs TreeMap

    • HashTable vs HashMap vs ConcurrentHashMap

    • HashSet vs TreeSet

  • 并发与多线程(应用及底层实现)

    • 线程的创建方式

    • 多线程应用场景

    • 线程状态与转换

    • 线程安全与同步机制:volatile vs synchronized vs Lock(ReentrantLock)

    • volatile底层原理

    • synchronized底层原理及其锁的升级与降级

    • Lock(ReentrantLock)底层原理

    • ThreadLocal

    • 线程通信

    • 线程池(底层实现)

    • 死锁的出现场景、定位以及修复

    • CAS 与 Atomic*类型实现原理

    • AQS:并发包基础技术

    • Java并发包(java.util.concurrent及其子包)提供的并发工具类:

      • 比synchronized更加高级的各种同步结构,如:Semaphore,CyclicBarrier, CountDownLatch;

      • 各种线程安全的容器(主要有四类:Queue,List,Set,Map),如ConcurrentHashMap,ConcurrentSkipListMap,CopyOnWriteArrayList;

      • 各种并发队列的实现,如各种BlockingQueue的实现(ArrayBlockingQueue, LinkedBlockingQueue, SynchorousQueue, PriorityBlockingQueue,DelayQueue,LinkedTranferQueue)等

      • Executor框架与线程池

(2) JVM

  • JVM运行时数据区域 vs Java内存模型 (这2不一样!!!

  • Java内存模型与happen-before原则

  • 内存泄露、内存溢出以及栈溢出

  • JVM类加载机制及其作用与对象的初始化

  • JVM垃圾回收

    • 如何判断对象已经死亡?引用计数法 vs 可达性分析

    • 如何回收对象?垃圾收集算法

    • Minor GC vs Full GC

    • 常用的垃圾收集器及其特点

    • 内存分配与回收策略

  • GC调优

    • GC调优的思路

    • JVM常用参数

    • 基于JDK命令行工具监控Java进程, 如 jps,jinfo,jstat,jmap,jstack

    • 基于图形化工具监控Java进程,如MAT(Memory Analyzer),VisualVM,Btrace

面向对象与设计模式(了解常用设计模式及其应用场景、示例)

  • 面向对象的六个基本原则

  • 单例模式(手撕各种单例模式)

  • 工厂模式(Spring的BeanFactory,ApplicationContext)vs.抽象工厂模式

  • 构造器模式(应用场景:解决构造复杂对象的麻烦。复杂:需要输入的参数的组合较多)

  • 代理模式(Spring AOP(动态代理模式:2种实现方式,即jdk & 字节码方式))

  • 装饰器模式(应用场景:若想对一个类从不同角度进行功能扩展,例如java.io中,InputStream是一个抽象类,标准类库中提供了FileInputStream\ByteArrayInputStream等各种不同的子类,分别从不同角度对InputStream进行了功能扩展。这些不同的实现类其构造函数的输入均为InputStream(的实现类),然后对InputStream添加不同层次的逻辑,从而实现不同的功能,这就是装饰。)

  • 观察者模式(各种事件监听器)

  • 策略模式(比较器Comparator)

  • 迭代器模式(ArrayList等集合框架中的迭代器)

  • 生产者消费者模式(消息队列)要能手撕

  • ...还有很多,但是掌握这些基本上够了

数据结构与算法

(1) 时间复杂度和空间复杂度分析

(2) 常用的数据结构及其特点

  • 数组 vs 链表

  • 队列 vs 栈

  • 跳表(Redis利用跳表实现有序集合Sorted Set)

  • 散列表

  • 堆与优先级队列

  • 二叉树:普通二叉树 vs 二叉查找树 vs 平衡二叉树(AVL)vs 红黑树 (vs 哈夫曼树)

  • 多叉树:B-Tree vs B+Tree vs B*Tree / Trie Tree

    • B+Tree: MySQL索引数据结构

    • Trie Tree: 实现敏感词过滤算法; 实现搜索引擎的关键词提示功能

  • 图:考数据结构不多,主要考2个最短路径优先算法

(3) 常用算法

  • 各种排序算法:内部排序+外部排序

    • 地址:https://blog.csdn.net/hguisu/article/details/7776068/

    • 需要手撕:冒泡、插入、堆排、归并、快排(2路快排+3路快排+随机枢值)

    • 大数据排序:外部排序

  • 各种查找算法:

    • 二分查找算法及其变种

    • 二叉查找树的查找

    • 利用快排查找

  • 常用遍历算法

    • BFS vs DFS

    • Morris遍历

  • 常用Hash算法

    • 一致性哈希

    • 布隆过滤器

  • 贪心算法

  • 分治算法

  • 回溯算法

  • 动态规划

  • 海量数据处理算法

    • bitmap算法

    • 布隆过滤器

    • July 博客

  • 其他算法

    • LRU算法

    • KMP算法

    • Manacher算法(面试问过1次)

    • BFPRT算法

(4) 常见的手撕代码问题

  • 《剑指offer》的问题

  • 见后续文章

计算机网络

  • OSI七层模型 vs. TCP/IP 五层模型(有时候也说四层)及及各层协议

  • 给定一个网址,访问这个网址经过了那些过程?涉及哪些协议?

  • HTTP and HTTPS

    • HTTP报文格式

    • HTTP方法及相互区别

    • HTTP的无状态

    • HTTP状态码

    • HTTP 1.0 vs 1.1 vs 2.0

    • HTTP vs HTTPS

    • HTTP安全性

    • HTTP底层协作协议(如传输层为TCP协议)

  • TCP and UDP

    • TCP vs UDP

    • TCP如何保证可靠传输?

    • TCP的三次握手和四次挥手及其原因

    • TCP的流量控制与滑动窗口

    • TCP的拥塞控制与拥塞窗口

    • TCP的拆包粘包

    • 关于TCP协议非常好的2篇文章:

      • https://coolshell.cn/articles/11564.html

      • https://coolshell.cn/articles/11609.html

  • RPC协议(经常和Dubbo一起问)

  • Socket编程

  • 异步IO多路复用:select poll epoll

OS

  • 内核态 vs 用户态

  • 进程 vs 线程

  • 进程调度算法

  • 进程间通信的几种方式

  • OS死锁相关的问题

    • 什么是死锁?哲学家就餐问题

    • 死锁的必要条件

    • 死锁的应对方法

    • 死锁的检测与恢复

    • 死锁的动态避免:银行家算法

    • 死锁的静态防止:破坏死锁的必要条件之一

  • 段页式内存管理

  • 页面置换算法

  • 磁盘调度算法

  • Linux系统常用的命令有哪些?是否会Shell,Python?

数据库MySQL

  • 数据库范式

  • 数据库事务

    • 什么是事务?

    • 事务特性:ACID

    • 事务隔离级别以及脏读、不可重复读、幻读

    • 分布式事务

  • 数据库索引

    • 索引的应用场景

    • 索引特点

    • 索引的优点和缺点

    • 索引的分类

    • 索引选择原则

    • 索引的优化

    • 索引失效

    • 索引的底层实现(B-Tree vs B+Tree)

    • 对于建立索引的列,数据均匀分布好还是不均匀好?

  • 数据库的锁

    • 行锁 vs 表锁

    • 读锁 vs 写锁

    • 乐观锁 vs 悲观锁以及如何实现?(MVCC)

    • 加锁的方式

    • 分布式锁

  • 数据库存储引擎比较

    • InnoDB

    • MyISAM

    • Memory

  • MySQL连接池对比

  • MySQL命令

  • JOIN的执行计划?

  • 数据库分库分表

  • 主从复制

数据库Redis

  • 为什么使用Redis?

  • Redis的优点与缺点

  • Redis的数据类型、底层实现以及各种数据类型的使用场景

  • Redis是单线程吗?单线程的Redis为啥这么快?

  • Redis持久化的方式

  • 谈谈Redis的过期策略以及内存淘汰机制

  • 如何解决Redis和和数据库双写一致性的问题?

  • 如何应对缓存穿透与缓存雪崩的问题?

  • 如何解决Redis的并发竞争Key问题

Web与常见框架

  • Servlet的生命周期(问的很少)

  • Cookie vs Session

  • 分布式Session

  • Spring相关(应用与源码分析)

    • 看过Spring的源码吗?

    • IOC应用及原理

    • AOP应用及原理

    • 事务

    • Spring涉及的设计模式

    • 谈谈Spring Bean的生命周期和作用域

    • Spring MVC的工作原理

    • Spring vs Spring MVC

    • Spring vs Spring Boot

    • 了解微服务,Spring Cloud

  • Netty (网络框架)

  • Dubbo

分布式架构

  • 服务调度,涉及服务发现、配置管理、弹性伸缩、故障恢复等

  • 资源调度,涉及对底层资源的调度使用,如计算资源、网络资源和存储资源等。

  • 流量调度,涉及路由、负载均衡、流控、熔断等。

  • 数据调度,涉及数据复本、数据一致性、分布式事务、分库、分表等

  • 容错处理,涉及隔离、幂等、重试、业务补偿、异步、降级等。

  • 自动化运维,涉及持续集成、持续部署、全栈监控、调用链跟踪等

项目

(1) 准备项目对于秋招而言是非常重要的,为啥呢?

  • 加深对所学知识的理解,将知识转换为能力

  • 证明你的学习能力和实践能力

  • 项目可以在一定程度上,将面试官的问题引导到一定范围内,例如在面试的时候,一般情况下,项目会最开始介绍,在介绍项目的时候,你就可以以你熟悉的内容,不断引申,就像是多米诺骨牌一样,一直延续下去。这样就有可能避免面试官深挖基础,问到你没有准备过的东西。

(2) 如何准备项目呢?我以我准备的Java后端项目为例说明,即叶神的高级项目课

  • 明确这个项目的需求与解决的问题

  • 明确这个项目的结构与组成

  • 明确这个项目涉及的技术栈

  • 完成这个项目的基本功能

  • 在完成的过程中,总结归纳

    • 总结归纳业务知识,例如如何实现系统的登陆和注册功能,如何实现点赞功能

    • 总结技术栈的相关知识与应用场景,例如Spring, Spring Boot, MyBatis, MySQL, Redis

    • 总结几个你认为做的非常好的点,例如利用Redis实现一个异步处理框架

    • 总结项目中出现的问题以及解决方式,例如响应时间过长,你是如何解决的?

    • 总结如何扩展系统,例如如何扩展系统的业务功能(添加后台管理模块等)

    • 总结如何提升系统性能,例如如何处理缓存,如何提高系统响应

    • 总结如何设计一个系统,例如根据经验如何设计和实现一个秒杀系统?

    • 总结如何进行系统的测试,例如你甚至可以测试驱动开发(TDD)

    • 还有很多总结...这里只是提供一些思路

  • 扩展项目

    • 添加业务模块,例如添加后台管理模块

    • 添加推荐算法,例如给timeline增加推荐能力

    • 公共模块服务化

  • 如果可以的话,将系统上线(非常加分的),这里涉及另外的一些知识点:

    • 项目的版本管理:Git & Github

    • 项目的部署:涉及Linux、服务器

    • 项目的扩展:涉及Nginx与负载均衡

    • 项目的调试与优化:涉及如何在服务器端远程进行调试和优化,例如jmeter进行远程调试系统

    • 项目的服务化与分布式架构:微服务,例如如何将项目从单体应用扩展为分布式应用,如何将常用模块或者固定模块变成一个个服务

    • 还有很多知识点...这里只是提供一些思路

实习 

关于实习,我没有去实习过,因为实验室老板不让去,我会结合去实习的同学谈谈实习的建议:

  • 一切为秋招服务,无论前面准备项目还是去实习,一定要明确实习的目的是为了更好的服务于秋招,当然了提高技术是必然的。

  • 选择大厂去实习,小厂的实习含金量不高。(对于秋招而言)

  • 实习时间不要与秋招冲突。尽量选择春招的时候去实习,或者越早越好,因为一旦实习时间和秋招冲突,那么可能会错过很多秋招机会。

  • 若实习时发现学不到什么技术,并且影响到了秋招,立马离职,准备秋招。

  • 若实习与秋招时间重叠,实习过程中,做好两手准备:(1)实习转正;(2)准备秋招。因为转正的周期一般都比较长,一旦转正失败,那么也会错过很多秋招的机会。 ```

4. 面试技巧篇

4.1 形象和谈吐篇

面试过程很短,对于一个人的认识和了解也很有限。那么如果你的技能一般的话,就需要加强形象和谈吐了。所谓实力不够,形象来凑。

形象方面,最好穿工作便装,休闲的也可以,但是要干净、整洁,不要有异味、不要邋遢(刮胡子,梳头发,熨衣服,这些都很重要)。尤其是HR面,基本上都是小姐姐,不要吓到她们。

另外,保持微笑,表现得热情、开朗和幽默非常重要。每个人都喜欢积极乐观向上的人。交谈的时候,不要挤牙膏,别人问一句你答一句,要直接把前因后果都讲清楚。最好能够以讲故事的心态分享你的故事,尤其是hr面,最好能够把hr妹子逗笑,但是切记不要撩。

说话的时候,要看着对方,一方面,这是对对方的尊重和礼貌,另一方面,这也是一种自信。就算没有回答好,也不要低着头,不要像做错事情一样。万一碰到有说不清楚的内容,不要犹豫,直接上图。对于比较复杂的或者面试官听不懂的问题,一定要换个思路表达。

4.2 心态篇

面试的时候,你要保持一个自信的心态,无论你准备的到位与不到位。

面试的时候,紧张是正常的,但是你要通过前面的自我介绍(如果没有自我介绍的话,前几个问题回答慢一点)的时间来调整自己的紧张。

注:详细的心态管理见 2. 认知思维篇

4.3 面试技术篇

4.3.1 Checklist(简称cl)

在整个秋招面试过程中,最好能够准备一个checklist, 这个cl是用来在你面试前进行模拟面试的,那么cl包含哪些内容:

  • 自我介绍

  • 项目介绍

  • 技术知识点

  • 非技术知识点

以下详细介绍这几个方面:

  • 自我介绍 在自我介绍的时候,除了介绍你自己的基本情况外,直接明了的提出你擅长的技术栈是一个很好的技巧,为什么这么做呢?因为这会给面试官一个先入为主的印象,会给面试官心里种下一个种子,潜意识认为你对这一块知识比较了解,那么后面问到这一块知识的概率就会变大;同时呢,后面万一他问到那些不会的内容,你也可以拉面试官到你擅长的技术栈,由于前面已经埋下了伏笔,因此后面面试官大概率上是容易接受你的转换的。 注:有时候hr面的自我介绍和技术面的自我介绍不同,会产生不一样的效果

  • 项目介绍 项目介绍除了介绍项目的目的,解决的问题,设计的思想以及整体结构,更重要的是提出你在项目中的亮点以及项目中你擅长的技术栈,这会在一定程度上引导面试官去对你这些内容发问

  • 技术知识点 每次面试前,都应该有针对性地深化一部分知识点,这部分知识点要么来自于你要面试的这家公司的面经,要么来自于你计划中要解决的知识点,力求做到每次面试都拿下一部分知识点,将比较复杂的问题化整为零,然后再总结归纳,这会有效的降低你记忆的难度

  • 非技术知识点 非技术知识点主要是针对hr面试中可能出现的问题的,一般hr面就那些问题,因此这个准备非常好准备。

4.3.2 模拟面试

面试和你的笔试一样,笔试需要做大量的题目去模拟,那么面试也必然是的。那么如何进行面试的模拟呢?

  • 准备CheckList

  • 根据CheckList, 进行自我介绍,然后将你自我介绍的过程用视频录下来或者语音录下来,然后去分析你哪些地方有问题,作为面试完之后的分析依据,根据面试情况,去修正你的自我介绍

  • 根据CheckList, 进行项目介绍以及项目分析,然后将你自我介绍的过程用视频录下来或者语音录下来,然后去分析你哪些地方有问题,作为面试完之后的分析依据,根据面试情况,去修正你的项目介绍,尤其是项目中涉及的知识点以及技术栈,你是否理解到位了,你会做,那么你是否能够讲清楚,如果讲不清楚问题在哪里?

  • 你也可以请你的同学或者朋友充当面试官的角色,让他按照你的CheckList去对你进行提问,看你是否能够给一个没有做过这个项目的人将项目讲清楚,如果可以说明你真正理解了,这样就可以给你面试有一个参考。

注意: (1) 面试开始前,给面试官一个微笑,简单大方地问好:“面试官好”或者“老师好”,然后双手将简历(或者所需材料)递给面试官 (2) 面试结束后,给面试官一个微笑,简单大方地对面试官表达感谢:“谢谢您,再见”,然后带着自己的东西离场。 (3) 面试过程中,

  • 当面试官提出问题时,一定不要着急回答,而是思考清楚面试官的问题之后,再回答问题;如果不确定面试官的问题,那么你需要不断询问面试官,确定题目的具体意思,当你确定意思之后,再认真回答问题。回答问题的时候,你要一步到位,直接给出充足的细节,将问题的前因后果全部描述清楚,不要等着面试官追问,那样的话,你会变得非常的被动。讲的时候,要条理清楚,问题的来源、解决方案、演进过程,都要利索地讲清楚。

  • 当面试官问到的问题,你是不懂的,那么你应该向面试官提出你不是很懂这个问题:“不好意思,这个问题我不是记的很清楚了(或者不好意思,这个问题我没有接触过,我不是很懂)”,问他是否可以给出提示,如果可以在给出提示的情况下答出问题,体现的则是你的思考和逻辑能力;若面试官无法给出提示,那么你直接告诉面试官你不懂这个问题,但是你懂另外一个相关的知识点,是否可以给他介绍?如果可以,你接着介绍这个相关知识点;如果不可以,那就请求面试官是否可以进入下一个话题。在这里再强调一下,有时候,面试官并不期待你能在很短的时间内解决这个难题,他只是想看你遇到难题的时候的态度和思维方式以及应变能力。如果你能证明给面试官看,你解决问题的方向和方法是正确的,即使不是正确答案,也很不错。如果最后没有答上来,最后可以和面试官要个联系方式(邮箱或者微信),回去后努力搞懂,然后举一反三,写篇文章发给面试官,有时候会让你起死回生的。

  • 当面试官对你提示的时候,请记住,当你回答问题结束之后,你需要对面试官表达感谢,感谢他的提示。

  • 如果是hr面,那么你需要表达出你的忠诚、坚持、责任、荣誉、毅力、稳定、对自己正确的认识等,至于具体的套路,我这里就暂时不说了,如果后期需要了解的同学比较多的话,我可再补充。

5. 学习资料篇

Java

  • Java核心知识

    • 入门:《Head First Java》、《Java核心技术(卷一):基础知识 》

    • 进阶:《Java编程思想》、《Effective Java》

  • JVM

    • 《深入理解Java虚拟机》

  • Java并发与多线程

    • 面试:《Java并发编程的艺术》(适合在时间紧张的时候,准备面试)

    • 进阶:《Java并发编程实战》(想深入学习,用这本)

面向对象与设计模式

  • 《Head First 设计模式》

  • 设计模式(马士兵)(https://study.163.com/course/introduction/1062009.htm)

数据结构与算法

  • 入门:《大话数据结构》

  • 进阶:《算法·第四版》

  • 课程:CS61B (https://sp18.datastructur.es/)

  • 刷题:

    • 《剑指offer》以及《剑指offer刷题网址》

    • 《程序员代码面试指南》

    • 不想看书的,可以直接看左神的视频:

      • 基础(https://www.nowcoder.com/courses/semester/algorithm-elementary)

      • 进阶(https://www.nowcoder.com/courses/semester/algorithm-senior)

    • leetcode(leetcode刷的越多越好,思考的越多越好,思考很重要)

  • 海量数据处理

    • 《编程珠玑》

    • July博客(https://blog.csdn.net/v_july_v/article/details/6279498 )

  • 动态规划

计算机网络

  • 入门:《图解TCP/IP》、《图解HTTP》

  • 进阶:《TCP/IP详解·卷1》或者《计算机网络:自顶向下方法(原书第6版)》(看一本即可)

OS

  • 入门:《Operating Systems: Three Easy Pieces》(讲的非常好,只有英文版)

  • 进阶:《深入理解计算机系统》

  • 视频:清华大学-操作系统(http://www.xuetangx.com/courses/course-v1:TsinghuaX+30240243X+sp/about)

  • Linux

    • 《鸟哥的linux私房菜》

    • 视频:https://pan.baidu.com/s/1hx2as373BZlAKtKonn5u1g

数据库MySQL

  • 入门:《MySQL必知必会》、与MySQL的零距离接触

  • 进阶:《MySQL技术内幕 Innodb存储引擎》、《高性能MySQL》(这本更好,不过有点难)

数据库Redis

  • 入门:《Redis实战》

  • 进阶:《Redis设计与实现》

  • 官网:https://redis.io/(如果有时间,一定要把官网上的命令好好过一遍,把官网的文章好好读一下,非常好)

Web与常见框架

(框架这部分,我认为通过官网直接上手实战,然后再去分析其源码)

  • 《深入分析JavaWeb技术内幕》

  • 《大型网站技术架构·核心原理与案例分析》

  • Spring/ Spring Boot/ Spring Cloud:

    • 官网:https://spring.io/

    • 应用:《Spring实战》、《Spring Boot实战》、《Spring4.x 企业级应用开发实战》

    • 底层:《Spring技术内幕》(这本写的太好了)

  • MyBatis

    • 官网:http://www.mybatis.org/mybatis-3/

    • 博客:https://blog.csdn.net/nmgrd/article/details/54608702

  • Netty

    • 官网:https://netty.io/

  • Dubbo

    • 官网:http://dubbo.apache.org/en-us/

分布式架构

  • System Design Primer (https://github.com/donnemartin/system-design-primer):目前这个仓库收集到了好些系统架构和设计的基本方法。其中包括

    • CAP理论

    • 一致性模型

    • 可用性模式

    • DNS

    • CDN

    • 负载均衡

    • 反向代理

    • 应用层的微服务和服务发现

    • 关系型数据库和NoSQL

    • 缓存

    • 异步通讯

    • 安全等

项目

  • 《大型网站技术架构·核心原理与案例分析》

  • 叶神高级项目课:https://www.nowcoder.com/courses/semester/senior 

Git & Github

  • https://www.nowcoder.com/courses/2

推荐↓↓↓
程序员求职面试
上一篇:拿到阿里offer的朋友,列出了面试复习大纲 下一篇:技术面试九忌