非科班拿下阿里offer,我做对了哪些?
本文转载自-公众号算法修炼笔记
2019届校招结束,坎坷沉浮,尽尝酸甜苦辣,辛苦鏖战,终究获益良多,将所得总结于此,以纪念一个新的开始。
注:本文首发于牛客网https://www.nowcoder.com/discuss/122463,有修改。
目录
-
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 制定计划
谈完选择,定下方向,接下来就是制定计划了。整个准备过程其实一直都是制定计划、执行计划、打破计划、重新制定计划、重新执行计划的循环。因此我下面就直接介绍我都做了哪些事情。直接上图吧。
image在这个过程里你会发现,生活从来没有准备到完美的时候,计划永远都赶不上变化,那么校招也是一样,你永远不会有准备好的那一天,那就在准备了多少就直接上战场吧。
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) 常用算法
-
各种排序算法:内部排序+外部排序
-
需要手撕:冒泡、插入、堆排、归并、快排(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篇文章:
-
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私房菜》
数据库MySQL
-
入门:《MySQL必知必会》、与MySQL的零距离接触
-
进阶:《MySQL技术内幕 Innodb存储引擎》、《高性能MySQL》(这本更好,不过有点难)
数据库Redis
-
入门:《Redis实战》
-
进阶:《Redis设计与实现》
-
官网:https://redis.io/(如果有时间,一定要把官网上的命令好好过一遍,把官网的文章好好读一下,非常好)
Web与常见框架
(框架这部分,我认为通过官网直接上手实战,然后再去分析其源码)
-
《深入分析JavaWeb技术内幕》
-
《大型网站技术架构·核心原理与案例分析》
-
Spring/ Spring Boot/ Spring Cloud:
-
应用:《Spring实战》、《Spring Boot实战》、《Spring4.x 企业级应用开发实战》
-
底层:《Spring技术内幕》(这本写的太好了)
-
MyBatis
-
Netty
-
Dubbo
分布式架构
-
System Design Primer (https://github.com/donnemartin/system-design-primer):目前这个仓库收集到了好些系统架构和设计的基本方法。其中包括
-
CAP理论
-
一致性模型
-
可用性模式
-
DNS
-
CDN
-
负载均衡
-
反向代理
-
应用层的微服务和服务发现
-
关系型数据库和NoSQL
-
缓存
-
异步通讯
-
安全等
项目
-
《大型网站技术架构·核心原理与案例分析》
Git & Github