非科班拿下阿里offer,我做对了哪些?
kai 程序员乔戈里 1月16日
本文系投稿
目录
0.概述
1.我的练级之路篇
2.认知思维篇
3.专业技术篇
4.面试技巧篇
5.学习资料篇
0. 概述
首先介绍一下我的基本情况,让大家有所参考。
学校:211
专业:电路与系统(信息对抗方向)
应聘岗位:Java后端开发(或者相关开发岗位)
offer:中国银联 顺丰科技 vivo 海康威视 招商银行信用卡中心 华为 阿里
然后要明确,offer与认知思维、专业技术、面试技巧以及运气都分不开,即offer = 认知思维 + 专业技术 + 面试技巧 + 运气 。
认知思维是指求职者的心理准备,思维准备,决定了准备的质量以及offer的质量;
专业技术是指求职者的专业实力,是校招的基础,敲门砖,决定了offer的下限;
面试技巧是指求职者的语言表达,归纳整理,能力包装等能力,为专业能力锦上添花(而非雪中送炭),决定了求职者是能够发挥出应有的专业水准。
接下来我将围绕认知思维、专业技术面试技巧以及学习资料展开介绍。
关于我的练级之路,我想从一个面试经常问到的问题谈起:你为什么要从搞雷达转到搞Java开发呢?为什么从一个非常高端的领域转到一个简单的应用领域呢?你不觉得浪费你的才能吗?是的,我的研究方向是雷达相关,与Java开发完全不搭边,为什么要转呢?主要原因有以下几点(注意,面试的时候可不能这么回答呀,童鞋们,我这里只是说了个大实话而已,面试的时候得包装啊,童鞋们):
1.我发现我不适合做雷达方向的研究,整个雷达领域其实涉及的知识点是非常多的,需要掌握雷达相关理论和雷达设备本身以及战场环境3个纵深领域的知识,而雷达理论、雷达设备与战场表现三个领域的表现其实并不完全一致,想要做出成绩,其实需要经历大量年限的积累,对整个雷达领域有了一个整体的积累之后,你才能做出有效的成绩(注意这里的有效是指不是骗国家钱的那种研究,而是实实在在的能用在实战中的研究,不细说了),因此整个领域的发展不是循序渐进的发展,而是断崖式厚积薄发的发展,因此其实挺难的。
2.雷达方向的就业面很窄,基本上主要去研究所工作,而研究所的工作氛围并不适合我(说的直接点,事实上是工资更加不适合我)当然了,现在其实随着自动驾驶的兴起,雷达算法工程师也逐渐可以去民用公司赚钱,这点其实非常好。
因此想要换一个方向去做,或者说换一个技术路径去发展,但是毕竟是换一个方向去发展,时间和精力有限,需要选一个难度较低的切入点,因此选择了 Java后端开发工程师。
既然谈到了选择,这里需要提醒一下大家,在找工作之前,一定要想想自己适合做什么样的工作,自己感兴趣的是什么工作,这点非常重要。
谈完选择,定下方向,接下来就是制定计划了。整个准备过程其实一直都是制定计划、执行计划、打破计划、重新制定计划、重新执行计划的循环。因此我下面就直接介绍我都做了哪些事情。直接上图吧。
在这个过程里你会发现,生活从来没有准备到完美的时候,计划永远都赶不上变化,那么校招也是一样,你永远不会有准备好的那一天,那就在准备了多少就直接上战场吧。
既然知道了该做什么事情,那么你就应该像一只野兽一样,开始捕猎,不见血不停止,你需要拼命地野蛮生长。
(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 这段时间呢,就开始了大量的笔试,面试。
其实整个校招准备的过程中,就是一个制定计划、执行计划、打破计划、重新制定计划、重新执行计划的循环。在这个过程里,你会被很多乱七八糟的事情打断,你需要不断平衡实验室工作和校招复习之间的准备工作。这里你就需要采取很多策略,去保证你的复习时间和复习质量,同时你也需要采取有效的心态和认知去对待整个过程。
整个校招过程中,你会发现,你的认知和思维会影响你的技术准备、面试发挥,你的技术准备的程度、面试发挥的好坏又会反哺你的认知和思维,整个过程是一个稳定自我,提升自我,然后挑战外在的一个过程。
下面就详细地介绍一下,该如何准备。
我在学习过程中,一直有个态度,就是战略悲观与战术乐观。什么意思呢?解释一下:
所谓的战略悲观是指,在整个准备的过程中,心态上,要认识到自己永远都不可能准备完美,永远会有缺失和漏洞,这是很正常的,甚至单纯的一个知识点,以现在的能力,每个人都不可能准备到面面俱到,因此不要苛求自己,不要追求完美主义,抓大放小,抓住主要矛盾,解决核心问题,这是很重要的。
所谓的战术乐观是指,一旦要参与战斗,一旦去笔试,去面试,那么你就认为你是准备好的,在这样的情况下,你要明白,你需要做的是发挥出你现有的水平,发挥出你当下的水平就够了,而不是去瞻前顾后,认为自己这也不会,那也没看,不要管那些,你要做的就是自信地去应对每一场笔试,每一场面试,把你会的发挥出来,而且每次战斗都要比上次要进步,那么你的目标就达到了。
因此,在整个校招的准备过程中,你需要做到:
对于整个校招而言,你要保持战略悲观的态度,充分利用每一分每一秒去准备,不要苛求完美,抓住核心知识和技能去准备;
对于每一场笔试或者面试而言,你要保持战术乐观,你要每一场都保持自信,认为你已经准备好了,然后尽情地去发挥,以战养战,不断精进。
整个校招由大大小小多场战斗组成,你要赢的是最后的胜利,而不是某一场的胜利,因此自信地去应对每一场。所谓胜败乃兵家常事,单场的失败只能证明你当下没有准备好,你要做的是查漏补缺,不断精进,迎接下一场战斗。其实,当你参加一定场次之后就会发现,哎呀,原来套路是一样的,那个时候你就可以开始收割了。
记住:战略悲观与战术乐观。做一个长远有野心,当下有信心,事后有决心,正确认识成败,立足长远的求职者。
我在面试的过程中,保持的态度是自由与平等,什么意思呢?解释一下:
所谓的自由与平等,指的是面试者和面试官之间是平等的,面试者与面试的公司之间是平等的,没有任何的等级之分,这里的自由与平等,既指个人尊严与人格的平等,也指面试者和公司之间的选择平等,双方没有任何的权力和资格去藐视和歧视对方。这个非常重要。
面试者在参加面试的时候,需要保有自由与平等的态度,要做事先做人,要认识到你与面试官之间是平等的,首先保持你自己的人格尊严,然后再考虑面试,因此你没有必要对面试官卑躬屈膝,低声下气,没有必要惧怕对方,没有必要去紧张,见面了,一声干净利落地“老师好”或者“面试官好”,然后一字一句的清晰地去与面试官交流你的观点和主张,这个非常的重要。不要因为一个面试而丢掉了自己的骨气,这远比你面试本身更重要。
既然是自由平等的,那么面试者与公司之间的选择也自然是自由平等的,有时候,你可能会发现自己明明准备的很好,面试交流的也很好,但是就是被挂了,为啥?只能说明你的面试不符合这个公司的招聘标准,只能说明公司认为你不合适,不能说明你不行,或者你的方向选择是错的,尤其不能说明你的智商有问题,你要做的是,心里淘汰掉这家公司,然后接着下一家。
记住:自由与平等。做一个自信,大方,自尊,平等的求职者。
是故胜兵先胜而后求战,败兵先战而后求胜。 - 《孙子兵法·形篇》
这句话是说,两军交战,胜利的队伍在战斗之前就已经做了充分的准备,胜利是准备好的结果。
这句话其实很好地说明了,整个校招,若想取得好的结果,其实得早点开始准备,尽全力地早点开始准备,要明白,开始准备的早,不一定结果就好,但是准备的晚,大概率是很难取得自己满意的结果的。
孙子有云,“凡战者,以正为合,以奇为胜”。这句话是说,作战,先要把正面的兵排好,要排的不偏斜,合乎法则,这叫正;如果此时你还有多余的兵力,你就赢了,这叫以奇(ji)为胜。
这句话其实很好地说明了,整个校招其实不止你自己要复习地好,你要复习地好到干掉和你竞争同一个岗位的人,那么你就应该比你的同行多做准备,不仅要充分的准备,而且要额外的准备。
曾国藩,一代文人,但是在打仗上确实甚为了得,为啥呢?因为老爷子喜欢“结硬寨,打呆仗”。老爷子打仗的时候,大部分时间,都在挖沟,基本上他参加的战场,都是沟壑纵横。他先用结硬寨的方式把敌人围起来,限制敌人的行动能力,使自己利于不败之地,然后再徐徐图之,以求胜利。
曾老爷子这个方式,其实也正是我们校招的方式,应对每一场面试,我们要做的就是掌握核心知识点,尽最大努力,做尽可能充分地准备,使自己在专业能力上立于不必之地,然后徐徐图谋更好的待遇。
记住:凡战者,以正为合,以奇为胜。以结硬寨,打呆仗的方式去尽可能充分地准备校招(其实有时候也意味着尽可能早的去准备),确保自己在能力上能立于不败之地,那么剩下的就是尽情发挥,然后收割校招的胜利果实了。因此,做一个用笨办法踏实复习的求职者。
校招,其实不是一个人的战斗。
整个校招过程中,信息海量,一个人很难兼顾到所有的情形,例如你无法关注到所有公司的求职信息,你无法了解到所有公司的情况,因此你需要找一群小伙伴,一起去奋斗。
所谓军团作战,就是指,找一群志同道合的小伙伴,组成学习同盟,互相交流学习,互相沟通经验,互相共享求职信息,攻守相伴。这样的团结互助其实不止体现在信息上、能力上,更体现在学习过程中,相互之间的心理的支持和关心上,这些都很重要,大大提高了校招的效率和成功率。
记住:军团作战。提高准备效率,做一个团结合作的求职者。
所谓的提前准备,是指:
提前进行技术准备
提前进行秋招(一定不要错过提前批,2019最早的提前批6月底就开始了)
一定要注意,提前批的难度和正式秋招的难度是有区别的:
很多公司提前批都免笔试,这会省去不少时间
很多公司的提前批,面试难度并不高,并没有正式秋招高
提前批hc充足,有大量试错机会或者说练习面试的机会,这个非常值钱
提前批相当于给秋招了2次机会,这样话,即使提前批过不了,秋招也可以再试一次(看再多面经也不如自己亲身体验一次要感受的深嘛)
很多公司,提前批可能意味着sp,ssp(华为除外)
说明:
这里需要区别一些名词:提前批 vs 内推 vs 校招
校招:校招就是每个公司都有的完整的招聘流程,简历筛选、笔试、面试一个不少
提前批:很多公司的提前批是独立的,是当年第一批次的招聘,可能免去简历筛选,笔试
内推:很多公司的内推是独立的,可能免去简历筛选,笔试;但是有些公司内推和提前批是重叠的,也有些公司的内推和校招是重叠的,一定要注意。
一定要看内推和提前批对校招是否有影响,例如:
是否参加内推或者提前批,就不能参加校招,例如唯品会
是否参加内推或者提前批,校招就需要换岗位甚至换部门,例如网易
简历筛选 vs 免笔试
简历筛选:很多好学校的同学觉得简历筛选只是对学校不太好的同学有用,对自己没有,但是其实不是,例如银行(国有和商业银行)就会筛选,有些好学校的同学有时候会发现连笔试的机会都没有,而一些相对不太好的学校的同学拿到了笔试机会,其实是因为有些同学是内推的,免掉了简历筛选。现在简历筛选越来越玄学了,所以免掉简历筛选其实很重要
免笔试:相对而言免笔试对大家影响并没有那么大,但是免笔试有个很大的好处,就是加快面试流程。
目标:介绍Java后端开发相关的知识点
认知准备:胜而后战 (见2.3节)
说明:这部分内容是必须掌握的内容,鉴于水平所限,可能不是很全面,仅做参考。
建议: (1)复习的过程中,做复习笔记,最好是记录在云端,这样的话,可以随时复习,例如面试等待中复习; (2)当知识复习完一遍之后,就可以对照着面经去复习准备了,记住先搞熟核心知识,再去搞其他边缘的知识;(3)复习过程中,一定要注意不仅要了解知识,还要主动思考,去思考知识背后的逻辑以及设计的意图
关于专业技术呢,是指你的硬实力,硬实力的考查呢,主要从2个角度进行:
宽度:掌握的知识是否全面
深度:掌握的能力是否深入
宽度在一定程度上决定了你是否能够进入一家公司,深度则决定了你offer的等级。对于bat,甚至更好的公司来说,有时候深度甚至可能决定你是否能够进入这家公司。
一门语言(以Java为例)
(1) Java核心知识
1.Java基础
1新版本特性
2跨平台特性
3Java四个基本特性
4Object类及其方法实现(尤其是equals() and hashCode())
5基本数据类型与引用数据类型
6Exception vs Error
7finally vs final vs finalize
8final vs final
9四种引用:强引用、软引用、若引用、幻象引用的比较
10重载 vs 重写
11接口 vs 抽象类
12深克隆 vs 浅克隆
13String vs StringBuffer vs StringBuilder (底层实现)
14IO vs NIO vs AIO
15反射与动态代理
16序列化与反序列化(底层实现)
2.集合框架 (应用及源码分析)
1集合框架的设计与所有的继承关系
2Vector vs ArrayList vs LinkedList
3HashTable vs HashMap vs TreeMap
4HashTable vs HashMap vs ConcurrentHashMap
5HashSet vs TreeSet
3.并发与多线程(应用及底层实现)
1线程的创建方式
2多线程应用场景
3线程状态与转换
4线程安全与同步机制:volatile vs synchronized vs Lock(ReentrantLock)
5volatile底层原理
6synchronized底层原理及其锁的升级与降级
7Lock(ReentrantLock)底层原理
8ThreadLocal
9线程通信
10线程池(底层实现)
11死锁的出现场景、定位以及修复
12CAS 与 Atomic*类型实现原理
13AQS:并发包基础技术
14Java并发包(java.util.concurrent及其子包)提供的并发工具类:
11比synchronized更加高级的各种同步结构,如:Semaphore,CyclicBarrier, CountDownLatch;
22各种线程安全的容器(主要有四类:Queue,List,Set,Map),如ConcurrentHashMap,ConcurrentSkipListMap,CopyOnWriteArrayList;
33各种并发队列的实现,如各种BlockingQueue的实现(ArrayBlockingQueue, LinkedBlockingQueue, SynchorousQueue, PriorityBlockingQueue,DelayQueue,LinkedTranferQueue)等
44Executor框架与线程池
(2) JVM
1JVM运行时数据区域 vs Java内存模型 (这2不一样!!!)
2Java内存模型与happen-before原则
3内存泄露、内存溢出以及栈溢出
4JVM类加载机制及其作用与对象的初始化
5JVM垃圾回收
11如何判断对象已经死亡?引用计数法 vs 可达性分析
22如何回收对象?垃圾收集算法
33Minor GC vs Full GC
44常用的垃圾收集器及其特点
55内存分配与回收策略
6GC调优
11GC调优的思路
22JVM常用参数
33基于JDK命令行工具监控Java进程, 如 jps,jinfo,jstat,jmap,jstack
44基于图形化工具监控Java进程,如MAT(Memory Analyzer),VisualVM,Btrace
面向对象与设计模式(了解常用设计模式及其应用场景、示例)
1面向对象的六个基本原则
2单例模式(手撕各种单例模式)
3工厂模式(Spring的BeanFactory,ApplicationContext)vs.抽象工厂模式
4构造器模式(应用场景:解决构造复杂对象的麻烦。复杂:需要输入的参数的组合较多)
5代理模式(Spring AOP(动态代理模式:2种实现方式,即jdk & 字节码方式))
6装饰器模式(应用场景:若想对一个类从不同角度进行功能扩展,例如java.io中,InputStream是一个抽象类,标准类库中提供了FileInputStream\ByteArrayInputStream等各种不同的子类,分别从不同角度对InputStream进行了功能扩展。这些不同的实现类其构造函数的输入均为InputStream(的实现类),然后对InputStream添加不同层次的逻辑,从而实现不同的功能,这就是装饰。)
7观察者模式(各种事件监听器)
8策略模式(比较器Comparator)
9迭代器模式(ArrayList等集合框架中的迭代器)
10生产者消费者模式(消息队列)要能手撕
11…还有很多,但是掌握这些基本上够了
数据结构与算法
(1) 时间复杂度和空间复杂度分析
(2) 常用的数据结构及其特点
1数组 vs 链表
2队列 vs 栈
3跳表(Redis利用跳表实现有序集合Sorted Set)
4散列表
5堆与优先级队列
6二叉树:普通二叉树 vs 二叉查找树 vs 平衡二叉树(AVL)vs 红黑树 (vs 哈夫曼树)
7多叉树:B-Tree vs B+Tree vs B*Tree / Trie Tree
B+Tree: MySQL索引数据结构
Trie Tree: 实现敏感词过滤算法; 实现搜索引擎的关键词提示功能
8图:考数据结构不多,主要考2个最短路径优先算法
(3) 常用算法
1各种排序算法:内部排序+外部排序
地址:https://blog.csdn.net/hguisu/article/details/7776068/
需要手撕:冒泡、插入、堆排、归并、快排(2路快排+3路快排+随机枢值)
大数据排序:外部排序
2各种查找算法:
二分查找算法及其变种
二叉查找树的查找
利用快排查找
3常用遍历算法
BFS vs DFS
Morris遍历
4常用Hash算法
一致性哈希
布隆过滤器
5贪心算法
6分治算法
7回溯算法
8动态规划
9海量数据处理算法
bitmap算法
布隆过滤器
July 博客
10其他算法
LRU算法
KMP算法
Manacher算法(面试问过1次)
BFPRT算法
(4) 常见的手撕代码问题
《剑指offer》的问题
见后续文章
计算机网络
1OSI七层模型 vs. TCP/IP 五层模型(有时候也说四层)及及各层协议
2给定一个网址,访问这个网址经过了那些过程?涉及哪些协议?
3HTTP and HTTPS
HTTP报文格式
HTTP方法及相互区别
HTTP的无状态
HTTP状态码
HTTP 1.0 vs 1.1 vs 2.0
HTTP vs HTTPS
HTTP安全性
HTTP底层协作协议(如传输层为TCP协议)
4TCP and UDP
TCP vs UDP
TCP如何保证可靠传输?
TCP的三次握手和四次挥手及其原因
TCP的流量控制与滑动窗口
TCP的拥塞控制与拥塞窗口
TCP的拆包粘包
关于TCP协议非常好的2篇文章:
https://coolshell.cn/articles/11564.html
https://coolshell.cn/articles/11609.html
5RPC协议(经常和Dubbo一起问)
6Socket编程
7异步IO多路复用:select poll epoll
OS
1内核态 vs 用户态
2进程 vs 线程
3进程调度算法
4进程间通信的几种方式
5OS死锁相关的问题
什么是死锁?哲学家就餐问题
死锁的必要条件
死锁的应对方法
死锁的检测与恢复
死锁的动态避免:银行家算法
死锁的静态防止:破坏死锁的必要条件之一
6段页式内存管理
7页面置换算法
8磁盘调度算法
9Linux系统常用的命令有哪些?是否会Shell,Python?
数据库MySQL
1数据库范式
2数据库事务
什么是事务?
事务特性:ACID
事务隔离级别以及脏读、不可重复读、幻读
分布式事务
3数据库索引
索引的应用场景
索引特点
索引的优点和缺点
索引的分类
索引选择原则
索引的优化
索引失效
索引的底层实现(B-Tree vs B+Tree)
对于建立索引的列,数据均匀分布好还是不均匀好?
4数据库的锁
行锁 vs 表锁
读锁 vs 写锁
乐观锁 vs 悲观锁以及如何实现?(MVCC)
加锁的方式
分布式锁
5数据库存储引擎比较
InnoDB
MyISAM
Memory
6MySQL连接池对比
7MySQL命令
8JOIN的执行计划?
9数据库分库分表
10主从复制
数据库Redis
1为什么使用Redis?
2Redis的优点与缺点
3Redis的数据类型、底层实现以及各种数据类型的使用场景
4Redis是单线程吗?单线程的Redis为啥这么快?
5Redis持久化的方式
6谈谈Redis的过期策略以及内存淘汰机制
7如何解决Redis和和数据库双写一致性的问题?
8如何应对缓存穿透与缓存雪崩的问题?
9如何解决Redis的并发竞争Key问题
Web与常见框架
1Servlet的生命周期(问的很少)
2Cookie vs Session
3分布式Session
4Spring相关(应用与源码分析)
看过Spring的源码吗?
IOC应用及原理
AOP应用及原理
事务
Spring涉及的设计模式
谈谈Spring Bean的生命周期和作用域
Spring MVC的工作原理
Spring vs Spring MVC
Spring vs Spring Boot
了解微服务,Spring Cloud
5Netty (网络框架)
6Dubbo
分布式架构
1服务调度,涉及服务发现、配置管理、弹性伸缩、故障恢复等
2资源调度,涉及对底层资源的调度使用,如计算资源、网络资源和存储资源等。
3流量调度,涉及路由、负载均衡、流控、熔断等。
4数据调度,涉及数据复本、数据一致性、分布式事务、分库、分表等
5容错处理,涉及隔离、幂等、重试、业务补偿、异步、降级等。
6自动化运维,涉及持续集成、持续部署、全栈监控、调用链跟踪等
项目
(1) 准备项目对于秋招而言是非常重要的,为啥呢?
加深对所学知识的理解,将知识转换为能力
证明你的学习能力和实践能力
项目可以在一定程度上,将面试官的问题引导到一定范围内,例如在面试的时候,一般情况下,项目会最开始介绍,在介绍项目的时候,你就可以以你熟悉的内容,不断引申,就像是多米诺骨牌一样,一直延续下去。这样就有可能避免面试官深挖基础,问到你没有准备过的东西。
(2) 如何准备项目呢?我以我准备的Java后端项目为例说明,即叶神的高级项目课
1明确这个项目的需求与解决的问题
2明确这个项目的结构与组成
3明确这个项目涉及的技术栈
4完成这个项目的基本功能
在完成的过程中,总结归纳
5总结归纳业务知识,例如如何实现系统的登陆和注册功能,如何实现点赞功能
总结技术栈的相关知识与应用场景,例如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面,那么你需要表达出你的忠诚、坚持、责任、荣誉、毅力、稳定、对自己正确的认识等,至于具体的套路,我这里就暂时不说了,如果后期需要了解的同学比较多的话,我可再补充。
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版)》(看一本即可)
入门:《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技术内幕 Innodb存储引擎》、《高性能MySQL》(这本更好,不过有点难)
入门:《Redis实战》
进阶:《Redis设计与实现》
官网:https://redis.io/(如果有时间,一定要把官网上的命令好好过一遍,把官网的文章好好读一下,非常好)
(框架这部分,我认为通过官网直接上手实战,然后再去分析其源码)
《深入分析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
https://www.nowcoder.com/courses/2
END
觉得文章不错的,欢迎点好看和转发,长按下图关注程序员乔戈里,收看更多精彩。