春天,又到了内推的季节,大厂们纷纷伸出橄榄枝,招揽着2020届毕业的新一批实习生。
1、内推还是不内推,有何区别?
内推是直接把简历给指定部门甚至具体到小组,而不内推则是进入备胎池,等待正式春招时缺人的部门来重新 pick 你。
所以,对于阿里来说,能内推一定要先内推,基本上80%以上的a实习生offer都是在内推面试中诞生的。
2、这么多内推机会,怎么选择?
去年的二月底三月初,阿里开始了大规模的实习生内推活动,浏览某客网,你会发现到处都是阿里内推的帖子,各个大部门、事业群,甚至精确到具体产品线,小部门,都开始了内推工作。
各个部门争先恐后地抢夺简历,生怕来晚了就收不到好简历了。
不过,作为应聘者的我们,千万别被这个场面吓到了,这么多部门和事业群,你最终也只能投递一个,所以,选择你感兴趣的岗位和部门,是你首先要做的工作。
具体怎么选择,就需要考虑到很多因素了,比如部门的技术栈,业务情况,还有你自己的兴趣,当然,我们可能没办法了解这么多信息,所以一般就是尽量选好大部门,如果有感兴趣的产品线,也可以找具体部门的人内推。
3、找内推人,怎么找?
各位可能觉得内推人没啥好挑的,看到邮箱直接就投呗,其实并不是这样的。
内推人的意义在于,他能把你的简历推到他所在的部门(也有的内推人直内推大部门,比如推到阿里云、蚂蚁金服这种大部门,而不会推到具体小部门,这种内推其实意义不大)并且可以跟进你的面试状态。
所以,请找一个靠谱的内推人,至少你要有他的联系方式,并且能够联系的上他,否则可能会和我当时一样一样吃哑巴亏。
因为我当时内推的时候找了个没有联系方式的内推人,直到我面试结束后我都联系不上他,那段时间面试结果没出来,我又找不到内推人,简直难受的不行。
如果你想要找我内推,也可以在公众号找到我的微信,如果觉得简历OK的话也是非常乐意帮忙内推的。
4、什么时候投简历比较好
什么时候投简历,一直都是大家比较关注的一个问题,参考之前我看过的一个视频(腾讯校园招聘的官方视频)一般建议不要太早或太晚,你可以理解为是内推信息发布之后的一周左右。
为什么呢,因为一开始就投递的人比较多,容易被筛选掉,而太晚投递的结果一般都是没有面试机会。
对于这个问题,我是亲身经历过的,我在内推截止日期前的一周才投递简历,结果一面后就再也没有音讯了,后来我才被另一个缺人的部门捞起来,最后虽然拿到了offer,但是还是放弃了当备胎。
5、面试相关事宜解惑
阿里内推的实习生面试一般都是电话面试,会在你投完简历的一周内找到你,一般不会提前确认时间,而是会在某天晚上八九点突然给你打一个电话,问你方不方便面试,你可以选择接受或者改期,我觉得选择改期的话应该是会减分的。
如果没有参加内推,而是到春招实习生招聘才参与面试,一般是有笔试环节的,然后面试方式会变为视频面试。
因为我是研发方向的,所以只能介绍一下研发方向的面试套路,一般来说,阿里喜欢考查技术基础,当然大部分都是Java。
基本上你要对Java核心技术、集合类、多线程、开发框架等非常熟悉,另外要对常用API的源码、Java方面的技术原理比较了解,除此之外,分布式技术、后端架构知识也是加分项。
当然,计算机基础就不必多说了,操作系统、网络、数据结构和算法肯定是要懂的。
6、关于实习转正
我没有去实习,对这方面的了解主要来自于同学,我在阿里实习的同学全部都转正了,一般来说只要你工作表现不错,答辩OK的话基本没问题,至于评级是B+还是A,一般leader是不会告诉你的。
在蚂蚁金服哈,也就是支付宝。整个大部门也快有一万多人了
21届找日常实习需要赶在春招找么
作者
阿里没有日常实习哦
研发工程师(Java)
我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer。这是我的面经,在这里分享给大家。
一面:
1 自我介绍
2 项目中做了什么,难点呢。
3 Java的线程池说一下,各个参数的作用,如何进行的。
4 Redis讲一下
5 分布式系统的全局id如何实现。用zookeeper如何实现的呢,机器号+时间戳即可。
6 分布式锁的方案,redis和zookeeper那个好,如果是集群部署,高并发情况下哪个性能更好。
7 kafka了解么,了解哪些消息队列。
8 想做业务还是研究。
9 然后出了一道题,linux的访问权限是rwx格式的。使用一个类支持访问权限的增删改查,并且注意使用的数据格式以及方法效率,规范。给了一个多小时写题。
耗时将近30分钟。
二面:
1 介绍你做的项目和其中的难点。
2 上次面试官问的问题,反射的作用是什么。
3 数据仓库,多线程和并发工具等。
4 私有云,docker和k8s等。
5 了解哪些中间件,dubbo,rocketmq,mycat等。
6 dubbo中的rpc如何实现。
7 自己实现rpc应该怎么做
9 dubbo的服务注册与发现。
10 听说我是非科班,于是问了些排序算法
耗时将近30分钟。
三面:
三面不是面试,而是笔试,耗时三个小时,考的是Java核心的基础。但是好像不能透题,就不说了。都挺有难度的。
大概说一下就是有几个考点,Java并发的知识点,集合类,线程池,多线程之间的通信等。
HR面:
聊人生谈理想,HR小姐姐非常温柔,交流十分愉快。30分钟。
蚂蚁金服中间件
蚂蚁财富
研发工程师
之前面了阿里中间件的提前批,不过没走流程。同期还面了蚂蚁中间件的两轮面试,被告知不走流程就不能面了,所以也没面完。
后来走了蚂蚁金服财富事业群这边的流程。前几天刚刚面完HR。
正好今天分享一下面经,大家可以多交流交流哈。
1:蚂蚁中间件(面了三次,两次一面,一次二面)
2:蚂蚁财富(1+2+交叉+HR)
一面:
自我介绍
1Java中的多线程了解么,线程池的增长策略和拒绝策略了解么,说一下。
2讲一下线程增加的过程和拒绝策略的执行。
3讲了一下fixthreadpool的增长策略,然后几种拒绝策略。
4高并发情况下,如何使用线程池,用哪个,问了一下线程结束要多久,是否在下一个线程结束前完成(我想的是cachethreadpool,其实思路错了)。
5表示并发量比较大,所以我说可以考虑并发量是否大于队列长度加上最大线程数量和,如果不超过的话可以是用fixthreadpool。
6并发juc了解么,有哪些线程安全的list。说了个copyonwritelist,想了半天说不出第二个了。尴尬,那就vector把,不是juc里的。
貌似并发包里确实没有其他list啊。
还问了concurrenthashmap1.8的改动。
7HTTP协议了解么,和tcp有什么区别。
8http1.0和2.0的区别。
答了TCP连接复用,加入ssl,以及压缩请求头。
其中哪个更新比较有意义,为什么。我说的是压缩请求头,这样可以优化HTTP服务的性能。
9Java的网络编程,比如NIO和Socket了解么。
说下BIO和NIO的区别把。
我说了BIO的阻塞用法,以及NIO的IO多路复用用法,说了selector,seletedkey,channel等类的使用流程,以及单线程处理连接,多线程处理IO请求的好处。
10说一下NIO的类库或框架
讲了netty,写过服务端和客户端的demo,没有在生产中实践。
1 channelhandler负责请求就绪时的io响应。
2 bytebuf支持零拷贝,通过逻辑buff合并实际buff。
3 eventloop线程组负责实现线程池,任务队列里就是io请求任务,类似线程池调度执行。
4 acceptor接收线程负责接收tcp请求,并且注册任务到队列里。
11倒排索引了解么,我说不了解。
其实就是搜索引擎的基础索引,根据关键字到文档的映射关系建立索引,中文关键字可以使用中文分词,查询时通过关键字来定位索引,并且进行排序后得到文档结果集。
然后面试官说讲一下数据库把,说下sql优化的方式
我说的是MySQL,先讲了一下sql使用索引的优化,然后基于索引说了几条优化方案。
12索引什么时候会失效变成全表扫描
说了联合索引的前缀匹配,跳跃索引,聚合函数,判空和<>这些情况。
13分布式的paxos和raft算法了解么
了解过,但是讲不清楚。
paxos:多个proposer发请提议(每个提议有id+value),acceptor接受最新id的提议并把之前保留的提议返回。当超过半数的accetor返回某个提议时,此时要求value修改为propeser历史上最大值,propeser认为可以接受该提议,于是广播给每个acceptor,acceptor发现该提议和自己保存的一致,于是接受该提议并且learner同步该提议。
raft:raft要求每个节点有一个选主的时间间隔,每过一个时间间隔向master发送心跳包,当心跳失败,该节点重新发起选主,当过半节点响应时则该节点当选主机,广播状态,然后以后继续下一轮选主。
14中间件知道哪些,阿里的dubbo,rocketmq的事务消息,问了TCC回答说这个之前没看明白。
说了mycat实现分表分库,消息队列kafka和rabbitmq等。
15平时看什么书,怎么学习的。还跟我说他们部门3个华科的,校友多多。
16Spring和Springmvc讲一下。讲了Spring的ioc和aop,Springmvc的基本架构,请求流程。
一面:
1 自我介绍
2 讲一下ArrayList和linkedlist的区别,ArrayList的扩容方式,扩容时机。
3 hashmap的实现。
4 NIO了解么,讲一下和BIO的区别,AIO呢。阻塞,非阻塞,异步。具体。
5 你说了解分布式服务,那么你怎么理解分布式服务。
6 你说了解Tomcat的基本原理,了解的是哪一部分,基本架构,connector和container
7 你在项目中怎么用到并发的
8 docker和虚拟机讲一下。
9 有啥想问的
蚂蚁金服中间件二面
1 项目
2 说一下Spring源码把,它的架构,流程。
3 Spring的bean如果要在实例化过程中修改其某一个成员变量,应该怎么做呢。不通过构造方法,并且AOP也并不能实现。
4 Tomcat的类加载器了解么,回答不了解只了解Java的类加载器。
5 自定义类加载器怎么实现,其中哪个方法走双亲委派模型,哪个不走,不走的话怎么加载类(实现findclass方法,一般用defineclass加载外部类),如何才能不走双亲委派。(重写loadclass方法)
6 布隆过滤器了解么,讲了ip地址过滤的布隆过滤器实现。
7 听说你项目用过docker,讲一下docker的实现原理,说了虚拟机一般要对内核进行虚拟化,docker则用cgroup和namespace分别进行硬件和命名空间的隔离。
8 项目中遇到的最大挑战。
9 项目中学到最多的东西
10 有什么想问
一面:
1 亿级ip地址过滤
2 排序算法和适用场景
3 数据库的事务有什么用
4 数据库的悲观锁和乐观锁
5 数据的索引有什么用,怎么实现
6 联合索引的匹配原则
7 数据库万级变成亿级,怎么处理。分库分表,分片规则hash和取余数。使用mycat中间件实现。
8 redis这种nosql和mysql有什么区别,讲了一遍redis
9 Spring了解不,用到了哪些设计模式,说了四个,单例,工厂,代理,观察者,模板其实也算。
10 web请求的过程,讲了浏览器到http服务器的过程,再讲了mvc的请求处理过程。
11 你的职业规划
12 没了。
二面:
没有二面,好像说是跳过了一轮,直接技术主管面。
三面:
1 项目中的多线程,为什么用chm,还有什么可以避免并发问题。
2 平时在看什么,写什么博客,我说分布式,关注什么内容,大后端,Hadoop生态。
3 dubbo了解么
4 dubbo的基本架构,几个组件说一下
5 服务生产者和消费者怎么进行rpc调用
6 怎么进行服务注册发现 zk实现具体说说
7 dubbo的负载均衡怎么做,讲一下具体代码实现。
8 dubbo的服务容错怎么做,怎么知道服务器宕机了 zk的心跳机制维持服务器连接
9 好了我要问的差不多啦。
交叉面:
隔壁部门的技术主管,问了一道算法题。。就没问别的了。。我也是很醉。。。
题目是链表的排序,扯了4、5种方案,转成数组,直接排序,拆分再排序,顺序连接等等。。然后我表示不能再优化了。他就说没别的问题了。。。有点吃惊。
HR面:
1 兴趣爱好
2 三年到五年的职业规划
3 意向公司和城市
4 实习经历和收获
5 实习中最大的困难
6 为什么换公司,为什么拒绝菜鸟实习offer
7 你的缺点和优点
8 你觉得你比其他人优秀的地方说三个
9 为什么想来我们部门
10 巴拉巴拉
作为一个非科班小白,我在读研期间基本是自学Java,从一开始几乎零基础,只有一点点数据结构和Java方面的基础,到最终获得网易游戏的Java实习offer,我大概用了半年左右的时间。本文将会讲到我在这半年里做对了哪些事情。
前言
对于即将读研的同学来说,一般有两件事很重要,一件事是选择导师,一件事是选择方向。
我就读于华中科技大学,主修软件工程专业,我在刚读研的时候最头疼的也是这两件事情。首先说明一下,我读的是专硕,所以实验室一般不搞科研,有部分导师会带项目,由于我不打算在实验室做项目(因为我更希望去大公司里锻炼几年),所以我当时本着想要找实习的想法选择了导师,事实证明我的选择还是很正确的,我在研二有大段时间去参加实习,让我在大厂里有足够的时间去锻炼和学习。
而选择方向这件事,我倒是折腾了好久。研一期间我做的最多的事情就是看书了,当时自己的方向还不明确,所以找了很多书来看。当别人都在专研数据挖掘和机器学习时,我还在各种方向之间摇摆不定。
我在读研之前想做游戏开发和Android开发,但我以前也学过Java Web开发。于是我在网上了解对应方向的资讯,发现游戏研发的就业面比较窄。
最后,我综合公司的岗位情况,个人兴趣,以及我之前的学习经历等因素,选定了Java开发方向。
于是,我在学校的实训项目中选择了Java Web项目,从此也真正意义上地踏上了Java的学习之路。
尽管我的入学成绩是全学院的top3,但是,我发现,作为非科班出身的我,和很多科班同学相比,还是有一定差距的。
大部分同学本科都上过计算机专业的相关课程,比如计算机网络,操作系统,数据结构等等,而我以前连听都没听过,除此之外,他们一般都会几段比较完整的项目经验,至少在Java Web方面已经算是比较熟悉了。而我在当时,只学了数据结构,另外接触过一些Java基础,有一部分项目经验,基本上就是入门水平。
于是我痛定思痛,决定好好弥补我的不足,平时一有空就去图书馆找些书来看,不论是操作系统,计算机网络,还是数据库等本科课程,我都会找一些对应的书籍来看,当时不太清楚其实有些课程其实不需要特地去补,以至于我连计算机组成原理,编译原理,软件测试等方面的书都特地找来看,现在想想也是挺逗比的。
由于我们上的课比较水,所以上课时间反而变成了我自学基础课程的大好时光了。所以我平时上课的时候都会带两三本书,一到两周内看完一本,虽然可能吸收的不是特别好,但是对当时的我来说还是有很大帮助的。
除此之外,有时候我还会偷偷去旁听有一些本科生的课程,这也是因为我在自学一些课程的时候遇到了困难,比如《操作系统》,《数据库原理》等等。于是我花时间研究了一下本科生的课表,趁着自己没课的时候赶紧去旁听课程。有时候感觉自己在课堂中显得非常突兀,尴尬地想要逃跑,但总算是坚持地听完了一门数据库的课程。
此外,我还在各种视频网站上看网课,比亦或是看中国MOOC的计算机基础课程,里面的操作系统,数据库等课程也让我印象深刻。
就这样,每天我都把自己的时间填满,愣是在研一上学期看了好几本书,当时书的版本现在有的记不清了,主要是计算机网络,操作系统,计算机组成原理,另外还有软件工程,软件测试,设计模式,等书籍。就这样,我靠着这段时间的坚持把计算机基础课程补上来了一些。
时间来到研一下半页,这时候我刚刚结束了学校的Java Web的项目实训课程,在做这个项目期间,我发现自己暴露出了很多问题,技术实践能力不足,Java基础不扎实。这件事情也给我自己敲响了警钟,因为我计划在春招期间找一份大厂的实习,但是目前看来我的水平还远远不够。
压力之下,只有努力一条出路。于是,从那时候起,我开始了“留守“实验室的学习生活。为什么要在实验室学习,一是因为学习气氛好,二是因为平时大家也可以互相交流问题。
每天早上9点到实验室打开电脑,晚上9点背电脑回寝室。大部分时间我会花在看书上,这段时间主要看的都是Java相关的书籍,借鉴的是江南白衣大佬的“Java后端书架”,比如《深入理解JVM虚拟机》,《Java并发编程艺术》,《深入分析Java Web技术内幕》,《深入剖析Spring源码》等等。
另外一部分时间我会用来看一些技术博客,我主要是根据面经上的知识点按图索骥,找到对应讲解该知识点的文章,那时候主要还是通过搜索引擎来找文章,当然有时候看到一些重点难点也会自己写一些博客。不过这个时期并不是我大量写博客的阶段,主要还是看一些讲解面试知识点的技术博客为主。
除此之外在面试前几天我会花时间去看这家公司的面经,搞懂每一个面经上的知识点,并且记录在我的笔记上,光是面经相关的笔记我就记了100多篇,这样的学习习惯我一直坚持到了秋招,确保每个面试知识点都能被我记住,消化,直至完全理解。
慢慢的,笔记越来越多,我参加面试的公司也越来越多,于是我开始不断完善自己的简历,总结自己的面试技巧,选择合适的网申时机。从头到尾我大概花了3个月的时间在找实习上,期间大大小小参加了20多次面试,我也从一开始面试一问三不知的菜鸟,逐渐变成了面霸,到复习末期,我对Java常见面试知识点已经了然于胸,同时也越来越自信,不管面什么大厂都不慌不忙。
这样的日子持续了好几个月,所谓世上无难事,只怕有心人。到最后,实验室里每个人都拿到了心仪的实习offer。
当初找实习的时候投简历比较暴力,基本上就是海投,好几个网站一起投,当时根本不知道有什么面试黑名单(冷却期),所以经常毫无准备地去面试大厂,结果可想而知。可惜当时还没有养成记录面经的习惯,所以大致地大家分享一下面试经历吧。
下面我按照面试时间先后记录一下面试流程,时间历程大概是从11月初到第二年3月初。
百度:此时的我还处于零基础状态,一问三不知,面试官语气和缓地劝退。
(深受打击,开始疯狂学习,刷面经,打基础)
新浪,搜狐,爱奇艺等巴拉巴拉:基本一轮游,偶尔能过一面。
(自我否定自我怀疑中,然后开始看书,学原理和进阶内容)
网易,头条(作死),去哪儿,携程等:虽然进步了一些,但是还是没有拿到最后的offer。
(继续疯狂看书,刷博客,刷面经,然后开始做总结,写博客)
到第二年的春天,我继续新的征程。
美丽联合,CVTE,美团,网易游戏:都拿了offer。
重点说一下拿了offer的这几家的面试经历吧。
美丽联合:当时是视频面试,技术问题比较基础,就是常见的Java基础问题,比如集合类,多线程,JVM等等。同时还问了一些场景问题,算是比较有难度的了。当时经历了两次面试,大概面了一个多小时,最终收获offer。
CVTE:这个是现场面试,技术面试就问了几道数据库的问题,总监面则是让我把简历项目的数据库设计讲清楚,可以说是很简单了。hr面则聊了半个小时,最后得到了offer。
美团:当时参加的是远程面试,应该是电话面试,问的问题比较有难度,除了Java基础问题,还会问一些多线程啊,锁和同步之类的问题,面试持续一个多小时,最后给了offer。
网易游戏:当时是两轮电话面试。第一轮是技术面试,持续时间一个小时,基本把我之前复习的内容都问了一遍,从Java基础,集合类,再到并发编程,设计模式,数据库等等,另外还问了后端架构相关的问题。总体答得还不错,二面只出了两道智力题,答出来一道,然后面试官问我玩哪些网易游戏,emmm这个我懂。
原谅我忘记了详细的面试内容,毕竟年代太过久远。
1、写好你的简历,要实事求是。找实习对项目的要求不会很高,但是基础要比较扎实。
2、夯实你的基础,多看书和博客,勤做总结,面经可以用于查缺补漏,但不是全部。
3、同一家公司的面试一般有记录(冷却期),做好准备再去面试,否则可能浪费机会。
4、春招的实习生叫做统招实习生,非春招的实习生叫做日常实习生,一般前者的面试难度比较大,后者面试难度比较小,所以,两者有一定区别,可能在后续实习内容和转正难度上会体现出差异,大家可以权衡一下。
5 、找实习有几个网站你需要知道:实习僧,牛客网,拉勾。
6、面试过程中记得问清楚能不能转正,这对你后续的选择影响重大。
最后说一点:其实实习没那么难找,一般岗位要求也会比校招低,所以你可以“挑剔”一点,有机会最好选择你喜欢的部门,我当时没太注意这一点,所以特地补充。
后记
现在是11月份,找实习的小伙伴们开始着手准备了吗,要知道,复习这种事,宜早不宜迟呀,学弟学妹们赶紧开始吧。
另外,本文可能没有把找实习的技巧和经验讲的很仔细,后面会继续推出这方面的文章。
除此之外,关于在网易游戏和百度实习的那些事,我也会写一篇文章,让大家提前了解实习生活是什样的。
如果想要了解更多和求职相关干货,可以点击原文链接,直达“校招指南”页面。下面是一个投票小活动,希望大家积极参与,谢谢啦!另外也别忘了点赞鸭 ~
一面
那一年春天,大概是3月份左右,兴致勃勃地投了阿里的Java实习岗位,没有内推,走的是正式流程,结果面试却来的比想象中早一些。
当时是在阿里招聘官网上直接参加视频面试,第一次面阿里,当时还是挺紧张的。
一面面试官问的问题比想象中要简单,一起来看看都有什么题目吧。
1 项目
当时我没有什么拿得出的项目,一个是学校的实训项目,一个简单的Java Web应用。另一个则是我在大四暑假水来的实习项目。总体来说没啥亮点。
2 项目中的问题
面试官显然对这些项目没啥兴趣,所以没问几个问题就跳过了。
3 Java三大特性
4 Jvm虚拟机 内存结构、算法、垃圾回收
当时已经看过了《深入理解JVM》所以这些问题基本都回答上来了。
5 集合类 链表和数组的区别 map和set的区别
主要考察对集合类源码的理解,那个时候理解的还不深,但是这些都是面试常见考点,我靠着刷面经也基本都答上来了。所以建议大家要多看看集合类的源码,后来我在秋招的时候就避免了这一问题。
6 二分查找代码
7 mysql相关的问题
8 spring
9 前后端数据交互
10 网络、操作系统
后面这些问题记不大清了,但是都问的比较基础,基本上就是刷过面经就能搞定的程度,当时对数据库的索引没有答好。
后续:
一面之后马上来了二面,二面面试官问了一个问题就让我等结果,并且告诉我他们的部门是阿里云。
本来我还以为这是过了的意思,后来一个HR问我一周内能不能到岗,我说大概要两周,结果。。。结果居然就没有下文了。
到现在我都不知道这个HR是不是因为时间问题而拒绝了我。于是我就这样第一次和阿里擦肩而过。(第二年春招实习我又和阿里擦肩而过,不过那一次是我主动放弃的)
所以告诫大家,如果真的是很想去的公司,一定要做好随时打包上班的准备,不要重蹈我的覆辙。
一面挂
很兴奋地参加了腾讯的春招实习生面试,当时对腾讯的后台开发岗位还没啥了解,事业群也没选。然后妥妥地一面挂了。
1 http的数据包格式
2 tcp包含ip么
3 tcp的数据包格式
腾讯确实很喜欢考计算机网络,我当时对这块基本没准备,挂的很彻底。
4、mysql数据库连接池的驱动参数
5、数据库连接池如何防止失效
6、部署项目时tomcat 的参数
问的角度有点刁钻,当时没答上来,感觉有点劝退的意思。
7 热加载的原理
8 mybatis的#和$号区别
9 java的jdk源码
10 hashmap的iterator读取时是否会读到另一个线程put的数据
这个是不会的,迭代器在迭代时如果集合类插入新元素,modcount会变化,此时迭代器的迭代过程应该会失败退出。
11 Linux的显示文件夹大小 ls -al
12 Linux的查看端口状态 natstat加参数
13 linux的查看进程的启动时间 linux ps
好吧,这就是腾讯第二喜欢的操作系统和Linux。
一面挂
当时我已经去了网易游戏实习,某天在杭州逛该的时候,接到了腾讯的面试电话,于是我就在商场里完成了这次面试。当时是CDG部门面的我,尴尬的是当时我不知道这个事业群,导致我重复问了面试官好几遍才确认:好吧,我没听说这个事业群。
简单说一下面试题吧:
1 自我介绍
2 项目
3 java的堆和栈
4 内存泄漏发生在哪
5 设计模式 工厂模式 单例模式 举例子
6 mysql数据库 实现层级树形结构 引擎 索引 查询优化 多方面
这些面试题跟之前面试遇到的没有太大区别,但是答得并不是很好,因为我那时候对有些知识点的理解还是停留在表面,所以时间一长马上就忘了。这方面不知道各位有没有同感。
7 微信红包的设计 开发 注意 用户数据的统计 项目相关
不是很常见的面试问题,主要考察系统设计方面的知识,没答好。这道题网上也可以找到答案,一些常见的系统设计场景题例如:秒杀系统,直播系统,大家平时也可以稍微了解一下。
一面挂
1项目ssm
2mybatis与hibernate比较
3快排和冒泡
4hadoop redis
这个当时还不会,连基本概念都不晓得。后来才开始慢慢重视这方面的学习
5 Linux 显示文件属性 杀死进程 找出出现次数最多的ip linux指令
打扰了,对Linux命令极为不熟悉,建议后端同学重视这方面内容的积累。
6 sql中唯一索引的使用
索引字段若相同则更新,不同则插入。
7 hashmap的线程安全,性质
8 多线程的使用
9 同步解决线程安全但带来低效率问题。
10 map reduce过程
11 spring的几个特性
12 aop事务的隔离级别和传播特性
默认隔离级别: ISOLATION_DEFAULT
感觉答的还可以,但是没有回音,有点奇怪。
一面:
1 项目内容
2 数据库设计
3 项目中并发使用,部署情况,测试情况
4 系统页面读取不一致,使用异常或者警告。
5 项目中的上传功能
面试官对项目考察的挺多,好在我事先准备的比较充分,基本都打了上来。
6 final finalize finally的用法和区别
7 hashmap原理
8 static作用域
9 大型系统的架构:高可用,高性能,伸缩性,扩展性。
刚好之前看了《大型网站技术架构》这本书,把后端架构的基础理论搞懂了一些,所以面试官问起来也能比较好地回答。
10 算法 二维数组求最大图形面积
11 SQL语句 查找
12 spring的核心原理:ioc aop di
ioc:控制反转,松耦合,自动完成依赖注入。
注入方式:构造器,setter,接口。
实话说,当时对这块内容理解不深,主要靠刷面经来学习知识点
13 hashmap线程安全 stringbuffer 和 stringbuilder.
二面:
1 项目经验
2 简历内容确认
3 两个智力题
甲有一个王和另一张牌,乙有两张牌,问甲拥有两张王的概率和乙拥有两张王的概率
概率问题,不会做
一个圆桌,两人放棋子,谁没地方放旗子谁输,问有没有必胜办法。
先手放在圆桌中心则必胜
一面
1 volatile 原理 使用 指令重排 内存屏障 保证内存可见性
2 项目
3 Java的特性 抽象类和接口区别
4 aop切面的功能 和继承的关系
二面:
1 Java的内存模型
2 Java gc 算法 垃圾收集器 分代 分区 参数配置
Java程序运行时与内存模型的关系,堆中有实例,永久代保存类的信息,加载类后自动初始化静态内容,然后虚拟机栈进行操作,对象引用指向堆中的实例,实例需要调用对应方法。
4 左移有序数组的二分查找
5 volatile的实现
6 cas操作的实现
底层硬件支持,cas为一条机器码指令
7 synchronize关键字的使用
8 lock的原理和实现,lock和synchronized的区别
9 写一个电梯需要用到的类和方法
一道面向对象设计问题,常见的题目我还见过“写一个地铁需要用到的类”、“写一个饭店要用到的类”
10 Java8新特性
明年你们可能要掌握Java9的新特性了吧
HR面挂:
1、自我介绍
2、项目的背景
3、实习遇到的困难和感受
HR面试开始时还跑去接了个电话。
问了不到10分钟的问题,问题还都是围绕实习经历的。
实习经历问完了直接说今天面试就到这里了。
她回复是挂在第三面,理由是问题理解不够深入。当时我就懵逼了,第一次被HR挂。
所以就算是HR面,大家也要好好准备,要不然就太可惜了。
一面挂
1 mysql行级锁表级锁,sql语句写select * 时如何加行级索
2 项目中的上传功能。
3 sql优化方式
4 xss攻击
5 线程安全的实现方式
面试官也挺奇葩,让我自己打电话找他面试,然后说话快得我听不清,问问题感觉也是比较随意,没下文了。
搜狐(offer) 日常实习生
一面
1 hashmap
2 说一个集合类
3 说说java特性
4 说说js
5 说说jquery
6 项目
7 sql
这个面试明显很水了,一个女面试官,面了十分钟就说通过了。
所以有时候不要觉得实习面试过了就很开心,也要根据面试难度来评估对方公司和部分做的事情是否对你有帮助,否则过去之后可能就是完全在打杂,得不偿失。
一面
1 Java ArrayList如何排序
2 hashmap原理、冲突处理、优化
3 mysql索引使用
4 Java并发包的内容
5 Java方法栈的作用
6 分布式、soa、锁
那时候对这方面还不太清楚,答得比较水。
7 两个栈实现一个队列
8 n个人中挑选m个人
9 平时看什么书
10 spring的 ioc和aop
11 Java8新特性
12 负载均衡方式
随机、轮询、加群轮询、一致性哈希
二面
1 mysql引擎
2 项目难题
3 jvm优化,博客内容
当时博客写的还不太多,没什么拿得出手的内容,博客这种东西需要花时间积累,建议各位也写一些。
4 设计模式中的观察者模式,聚合和组合,组合和继承
5 hashmap优化
6 redis,分布式
二面答得不太好。
不过当天发了offer,没有HR面
一面
1 数据库设计
2 冗余
3 范式
4 反范式
比较少见的问题,但是不难,范式用于减少数据冗余,反范式则可以避免多表连接。
5 索引优缺点
6 索引实现
7 mysql引擎行级锁表级锁
8 数组中找到第k大的数。
剑指offer原题,不过我当时只想到了先快排再找第k大的数。实际上在快排过程中就可以找到第k大的数了。
二面
1 数据库设计
2 闲聊
hr面
面试官一对二面试,问了半个小时,听说挂人很多,不过最后我们两个一起面试的都通过了。
一面
1 JAVA的jvm:内存模型、分代的介绍、每个代的操作,gc算法。
2 类加载器、双亲委派模型、双亲实现,反双亲设计,类隔离。
这部分问的很深了,特别是最后两个问题,把我问懵了。当时面的应该是基础架构部门,所以做的技术偏底层,问题都比较有深度。
3 hashmap实现、concurrenthashmap实现。
4 volatile实现,锁分类介绍、AQS介绍、公平锁非公平锁介绍。
当时压根不懂AQS,对于锁的几种类型也不够熟悉(互斥锁,轻量级锁,偏向锁)。这部分内容强烈建议看《Java并发编程艺术》以及《深入理解JVM虚拟机进行学习》
5 并发、并发中的threadlocal原理。
6 tomcat介绍
7 三个任务,每个任务id都为long类型,如何用一个long来表示三个任务都已完成,要求不能用countdownlauch。
答案是:使用三个id相&,若为0则完成否则不完成。(位运算性质)
8 NIO和BIO的区别
当时对NIO和BIO的底层原理不了解,只会回答很浅显的区别,实际上需要更加深入去分析,BIO的本质是基于阻塞IO的socket完成通信,而NIO是基于IO多路复用来实现的,在Linux上的底层实现就是epoll。
9 Spring的AOP和IOC
10 使用一个数组实现map,可以用i存key,i+1存value。
11 使用一个数组实现一个链表,i存自己下标,i+1存下一个结点下标,i+2存值。面试官要求使用移位操作。没答上,转而提问了问题7.
二面
很水,问项目,问学习经验,问一些有的没的。
看什么书,学过哪些技术。
HR面:
已面完,问了半个小时问题,感觉还可以啦。
现在回想起来,当时蘑菇街和美团的offer也是不错的,不过因为笔者一对网易游戏有情怀,最后还是选择了它。
至此,我们找实习之旅也到了尾声。以上就是我全部的实习面经了,不知道大家看的过不过瘾呢。
如果你也有面经想要和大家分享,那不妨来找作者投稿吧。每一段找实习或者找工作的经历都是各不相同的,相信你的那一段经历也值得收藏。
刚出学校大门,我的实习之路才刚刚开始。在网易待了3个月不到,百度待了五个月左右,总共8个月左右的实习时间,说长也长,说短也短,但这两段经历确实也是我人生中宝贵的财富,为我后续参加秋招面试也加分不少。
在猪场实习的日子里,我第一次了解大公司的开发流程,亲自参与项目代码的开发,我的导师会和我提需求,会指导我怎么做得更好。在这里的成长无疑是非常快速的,但我很快意识到我的问题所在,不熟悉部门技术栈,对很多Java Web的技术原理都不太熟悉,这段时间我意识到了自己的知识深度和广度都可能都有待提高。
不过由于家里的一些事情。我提前离职了,所以在猪场呆的时间很短,以致于我没来得及搞懂部门项目的技术架构就走了,这也让我在离开以后感觉很遗憾,所以我下定决心在下个实习单位要好好做。
相信大家对实习内容也很感兴趣,我给各位大概介绍一下吧。我们做的是一个基于数据仓库的Web应用,当然Web应用本身并不复杂,甚至没用到Spring框架,而是直接用复古的Servlet+JSP直接进行开发,SQL也是直接写死在代码中。
不过我导师人挺好的,给我的任务还是比较有挑战性的,当时自己一边摸索一边请教导师,愣是做完了三个功能模块,还把以前没怎么使用过的并发包和工具类都用到了项目中。
除了Java Web应用之外,我们部门其他的同事既有做数据仓库的,也有做算法的,涉及的技术也很广,像Hadoop的生态组件,包括后续用到了流式计算框架、消息队列、缓存等组件。可惜我当时还是太菜了,还没来得及研究这些东西,就要走人了。
离开猪场后我来到了熊厂。当时我们部门做的是私有云,提供一些虚拟机、容器资源用于线下测试。部门给我提的需求不算太难,大部分都是一些CURD的工作,但是这次我很快就意识到了问题所在,就是我不太熟悉部门的整体技术栈,所以在需要借鉴别人代码时偶尔会看不懂。后来部门又给了新的重构需求,此时的我开始焦虑起来,是不是应该做出一些改变呢。
终于,我找到了新的目标,我要搞懂部门的项目架构,了解相关技术栈(我们部门做的是私有云),一开始,我会请教我的导师,尽量去了解项目的架构设计,除此之外,我还会利用一些时间去看其他同事负责的代码,并且通过一些文档和PPT去了解这些代码的功能和意义。
结合代码和文档,再加上和同时的交流,我对部门项目的架构逐渐熟悉起来,为了更好地理解每一块代码的作用,我还为一些模块的代码写了注释。
当然,光看代码和文档还不能解决所有问题,因为这个项目的重点难点不在Web应用,而是在底层技术,这个项目中包含了两套架构,分别是一套OpenStack集群和一套docker集群。为了学习这两块内容,我先是看了很多博客,然后在平台上跑虚拟机和容器来做实践,最后又看了这方面的一些书籍,主要是《OpenStack设计与实现》,《docker技术入门实战》。
但是这还不够,虚拟化技术与Linux内核息息相关,又需要学习者对操作系统和计算网络非常熟悉,我自知这些内容我学得还不够深入,于是我花大量时间看这方面的书,当时也遇到了几本确实不错的书,分别是《深入理解计算机系统》,《计算机网络:自顶向下方法》,还有一本没来得及看完的《Linux内核设计与实现》。虽然以后不一定会做云计算方向的开发,但是学了这些东西我还是非常开心的。
到后来,我工位上的书越来越多,我对部门的技术栈也越来越熟悉,有时候我还会去听公司内各个团队组织的技术分享,有空的时候看看内网的技术课程,真正地实现了自己在技术广度上的拓展。
有时候我觉得,实习生活是会骗人的,你佩戴着和正式员工一样的工牌,和他们做着类似的事情,会让你觉得你的水平已经和他们差不多了,但事实上是,在转正之前,你和他们还差得远,所以不要停下自己前进的脚步,抓紧时间学习吧,把握好你在公司里的机会,合理利用公司给你提供的资源。
在网易游戏实习是一种什么样的体验?
在猪场,特别是游戏部门,确实有很好的游戏氛围,同事和领导大多对游戏都比较感兴趣,所以交流起来也比较轻松。除此之外,部门的加班强度并没有想象中那么大,当然这也主要看业务和产品,恰好我们部门不是做游戏产品的,所以在排期上没有太大压力,整体的工作强度适中。(说了这么多,其实就是体验一级棒!)
在百度实习是一种什么样的体验?
在熊厂,不管是哪个部门,一般都是工程师主导,所以整个团队的技术氛围很好,会有很多的技术大牛,你会感觉这个团队真的很靠谱,你要像大家学习的还有很多。与此同时,整体的工作强度会稍微大一点,不同部门可能会有一到两个小时的偏差,但是总体来说,都不会太早。百度在技术方面确实是不错的,公司内部经常会有技术分享,不同部门也有机会进行技术交流、合作。(总体来说,技术很强,但不轻松!)
1、工作强度、加班时间大体上看公司,实际上也看领导,道理很简单,如果领导比较养生,可能你就下班的早,反之领导如果很拼,那么你也别想轻松。
2、每个公司、部门都会有一些独特的“风俗习惯”,比如开站会,比如团建,另外,升职也是一个很敏感的话题,不是人人都能“好风凭借力,送我上青云”。
3、大公司的体量真的很大,你只是一颗螺丝钉,想要了解公司的全貌,还需要很长的一段时间,个人觉得不要只顾着埋头苦干,一定要记得看看自己身在何处。
4、大厂的食堂还是不错的,但是总有吃腻的那天。免费的健身房和教练实在是很不错的福利,当然前提是你不至于加班加班没有时间运动。
5、虽然一开始大家都只是一颗螺丝钉,但是梦想还是要有的,别看诸位大佬这么风光,曾几何时都和我们一样只是一个平凡的程序员,当然他们可不只会写代码。
腾讯SNG
后台开发工程师
大概是8月初投的简历,当时没有选事业群,第二天直接被sng捞了,抓着我一顿面试。
一周内就面完了三次面试,接着就开始无尽的等待,整整等了三周左右,终于完成了四面和HR面。
整个过程还是比较曲折的,技术面试的难度也挺大的,不过他们部门也是Java线,所以还比较有的聊。结果目前还不知道。
1一面
一面:
1 有序数组排序,二分,复杂度
2 常见排序算法,说下快排过程,时间复杂度
3 有N个节点的满二叉树的高度。1+logN
4 朋友之间的点对点关系用图维护,怎么判断两人是否是朋友,并查集,时间复杂度,过程。没讲清楚
5 单元点最短路的方法,时间复杂度
6 如何实现关键字输入提示,使用字典树,复杂度多少,有没有其他方案,答哈希,如果是中文呢,分词后建立字典树?
7 hashmap的实现讲一下吧,讲的很详细了。讲一下红黑树的结构,查询性能等。
8 Java中的垃圾回收讲一下,讲了分代,gc算法,gc root可达性分析等
9 讲一下两个项目你都做了什么把。
10 除了代码之外你还学习了什么技术,框架。
11 死锁是怎么产生的
12 线程和进程的区别
13 进程的通信方式
14 CPU的执行方式
15 代码中遇到进程阻塞,进程僵死,内存泄漏等情况怎么排查。通过ps查询状态,分析dump文件等方式排查。
16 Linux了解么,查看进程状态ps,查看cpu状态 top。查看占用端口的进程号netstat grep
17 10g文件,只有2g内存,怎么查找文件中指定的字符串出现位置。MapReduce分割文件处理。
他说可以用cat | grep 管道处理。
2二
二面:
1 快排的时间复杂度,冒泡时间复杂度,快排是否稳定,快排的过程
2 100w个数,怎么找到前1000个最大的,堆排序,怎么构造,怎么调整,时间复杂度。
3 一个矩阵,从左上角到右下角,每个位置有一个权值。可以上下左右走,到达右下角的路径权值最小怎么走。
先说了一下dfs递归实现。面试官说要优化。
说了一下用迪杰斯特拉的思路,说可以。
4 四辆小车,每辆车加满油可以走一公里,问怎么能让一辆小车走最远。说了好几种方案,面试官引导我优化了一下,但是还是不满意,最后他说跳过。
5 hashmap的实现,hashtable,concurrenthashmap实现。
6 MySQL的索引,B+树性质。
7 Linux的cpu 100怎么排查,top jstack,日志,gui工具
8 Linux大文件怎么查某一行的内容。
9 Redis内存数据库的内存指的是共享内存么
10 Redis的持久化方式
11 秒杀系统的架构设计
3
三面:
1 十亿个数的集合和10w个数的集合,如何求它们的交集。
集合的数字不重复。
我讲了两次循环,两次hash,以及排序或者合并等方式。。都不对。后来面试官说是对小数组做hash,然后遍历大数组即可。我完全想错方向了。
2 十亿和数找到前100个最大的,堆排序,怎么实现,怎么调整。
3 TCP和UDP的区别,具体使用场景呢。
4 TCP四次挥手讲一下过程,最后一次ack如果客户端没收到怎么办。
5 对于socket编程,accept方法是干什么的,在三次握手中属于第几次,可以猜一下,为什么这么觉得。
6 Linux操作系统了解么,了解一点点,就没问了。
7 对于单例模式,有什么使用场景了,讲了全局id生成器,他问我分布式id生成器怎么实现,说了zk,问我zk了解原理不,讲了zab,然后就没问啦。
8 除了单例模式,知道适配器模式怎么实现么,有什么用
9 回到网络,刚才你说到直播场景,知道直播的架构怎么设计么,要点是什么,说了几个不太对,他说要避免广播风暴,答不会。
10 Redis和MySQL有什么区别,用于什么场景。
11 问了一下最近看什么书,什么时候开始写博客的
12 问了还有几轮面试,他说这轮我可以过,有点小惊喜
4
四面:
三面过了半个多月,终于安排四面了。
1 自我介绍
2 项目,收获
3 Linux了解哪些,基础命令和知识。问我proc文件系统了解么,答不了解。
4 TCP和UDP的核心区别在哪,讲了滑动窗口保证可靠有序传输,UDP不可靠。TCP需要连接而UDP不需要。
5 TCP的四次挥手,time wait状态有什么意义。
6 说完这个他问我有什么想问他的了。
7 我问他为什么隔了这么久才面试,而且之前三面都只是初试,然后他说最近他在休假,所以就。。。害我担心了好久。他说接下来等HR面就行了。
5
HR面:
1 自我介绍
2 实习收获
3 台湾交流体验
4 之前实习公司的情况,拿到offer了吗,会如何选择呢
5 排一下公司,部门,薪资和城市等因素。
6 你的优缺点,如何改进
7 学生时代最成功的事
8 你的预期薪资
百度智能云
软件研发工程师
百度今年的提前批有点奇怪,好像都不走流程,牛客上好几个百度内推的帖子,我投了几个,基本上都是百度智能云的。
然后这些部门都安排了面试,没有冲突,所以没有动静的小伙伴可以投投别的部门试试。
下面是我的两篇面经,后续会继续更新,每个部门侧重点不太一样。
好像是做控制台方面的组
一面:
1自我介绍,项目
2 static关键字有什么用,static修饰不同东西时有什么作用,内部类用static修饰和不用static修饰有何区别。
3 hashmap,hashtable,concurrenthashmap区别和场景
4 volatile关键字有什么用
5 jvm分区讲下,作用讲下,gc算法讲一下,gc是否会有停顿或者延迟。
6 讲一下OOM和内存泄漏的例子,为什么有GC还会出现内存泄漏和内存溢出呢
7 线程和进程的区别,通信方式的区别。
8 悲观锁和乐观锁,说一下Java和数据库分别怎么实现的。
9 数据库索引说一下,除了B+树索引还有什么索引。
10倒排索引说一下,如果关键字很多,怎么优化。使用前缀树和hashmap优化。
11 前缀树的结构和原理说一下。
12 浏览器发起http请求过程,越详细越好。
13 缓存和数据库的一致性怎么保证
14 网上写代码,写了一个快排
15 没了。
二面:
1 自我介绍
2 项目中难点,用到的技术
3 多线程,说一下线程的状态和状态转换,详细问
4 多线程的sleep方法和wait方法为什么来源不同,一个是object方法,一个是Thread的方法。
5 为什么object的wait和notify必须在同步块中使用,不在同步块使用会报错么,编译报错还是运行报错。
6 jvm讲一下gc吧,两个对象的引用循环依赖,会不会被垃圾回收,什么情况下会什么情况下不会呢
7 GC root是哪些位置呢,我说记不起来,他说你不用记,其实就是运行时的一些对象和变量,比如局部变量表,方法区的元数据比如fianl,static变量,本地方法栈执行的方法。
8 数据库了解哪个。Redis说一下为什么是单线程的,不会很慢么,有什么好处。
9 Redis的IO请求模型,是不是IO多路复用呢。
10 Spring的interceptor和filter有什么区别。我说没区别,错!
11 网络这块,说一下dns请求的过程吧,dns是否会访问缓存呢,缓存在本地和浏览器,还有dns服务器上是不是都有。
12 get和post的区别讲一下,底层的实现有区别么,都是基于TCP,那么如何限制get的url长度,在哪一层限制的。
13 数据结构熟么,讲一下树和图吧,树的层次遍历使用什么结构,相应的图的遍历呢。讲讲最小生成算法,还有迪杰斯特拉。
14 数组,找到唯一一个出现两次的数。
刚开始听错,说了位运算。
a 然后讲了数组计数,hash计数,排序比较。
b 然后面试官说条件给的是1到N-1的N个数字,重新想一下。
c 说了根据数组位置和数字比较进行判断。面试官最后说可以用相加求差值来判断。
15 一个10000以下的数组,内存够。里面只有1,2,3。排下序。
a 普通排序O(nlogn)
b 荷兰旗问题,双指针解决。O(N)
c 统计数量,重放数组O(2N)
d 另外搞一个数组,把1放头,3放尾,也是双指针。O(N)。空间复杂度O(N)
16 没了。
全程50分钟
三面HR
巴拉巴拉巴拉。基本上问题都大同小异。
一面:
1 数据库的事务,四个性质说一下,分别有什么用,怎么实现的。一致性没讲好。
2 讲到了redo和undo日志,问我分别有什么用,说redo日志说错了。
3 数据库的隔离性如何保证,使用悲观锁和乐观锁有何区别。MVCC的设计目的是什么,怎么使用版本号判断数据的可见性。
4 问了一道算法,1到N的所有数字,按照字典序打印,怎么做。
说了用数组排序,问复杂度,扯了半天。
怎么优化,按照数字特征顺序打印,问这个东西和什么结构比较像。提示是树,然后说了个多叉树,问我怎么实现,最后其实使用dfs遍历树的每个分支。
5 多线程并发的同步实现,有两个方法,每个方法里有a部分代码和b部分代码,我要让两个线程分别执行两个方法,并且让他们运行完a部分代码再一起向下执行,如何实现。
6 我说了用cyclicbarrier实现,互相等待await。
然后他问我怎么用信号量实现,并且提示可以再用一个线程。
然后我说了个方案。
7 问了项目
8 如何把优化递归的代码
改成尾递归或者循环。
面试官说不是,引导说用栈实现递归。
问我栈中需要压入哪些数据。他说应该是方法参数,返回值,以及返回地址。
二面:
1 自我介绍,项目 10分钟过去
2 服务器如何负载均衡,有哪些算法,哪个比较好,一致性哈希原理,怎么避免DDOS攻击请求打到少数机器。
3 TCP连接中的三次握手和四次挥手,四次挥手的最后一个ack的作用是什么,为什么要time wait,为什么是2msl。
4 数据库的备份和恢复怎么实现的,主从复制怎么做的,什么时候会出现数据不一致,如何解决。
5 今天面试太多了,记不清了。。。
6 开源的技术看过用过么,分布式存储的了解么。
7 想做什么方向的开发。
8 Linux查看cpu占用率高的进程
9 查看占用某端口的进程和某进程监听的端口
10 如何查询日志文件中的所有ip,正则表达式
三面(8.3号更新):
数据库部门真的很严格,问题都挺难的。
1 讲一下项目
2 平时了解什么操作系统
Linux,说一下Linux排查问题常用的命令,ps,top,netstat,free,du等等
3 Linux的内存管理算法,问了一下是不是页面置换算法,他说是。
说了lru和fifo,问我lru有什么缺点,没答上来。
4 Linux的文件系统了解么,讲了一下inode节点,文件和目录的原理。他问我了不了解具体的文件系统ext2,ext3,答不会。。
5 进程通信方式有哪些,问我分别怎么使用,管道有哪些类型,各有什么优缺点。
6 问我服务器硬件了解么。。一脸懵逼,问了我懂不懂Raid,瞎扯了几句就说不懂了。
7 shell了解么,没怎么写过。
8 听说你会Java,说一下JVM内存模型把,有哪些区,分别干什么的
9 说一下gc算法,分代回收说下。
10 设计模式了解么,说了7种,问我分别怎么用,实际应用过吗,稍微扯了一下。
11 MySQL的引擎讲一下,有什么区别,使用场景呢。
12 查询最新的10条数据,想了好一会,order by id desc limit 10
13 MySQL的union all和union有什么区别,我瞎掰了一下,应该不对。
14 MySQL有哪几种join方式,底层原理是什么,答不会,只知道表现形式。
15 Redis了解哪些啊,数据结构和基本原理把。
问我Redis怎么做集群,答了主从哨兵和cluster。
Redis的持久化怎么做,aof和rdb,有什么区别,有什么优缺点。
16 Redis使用哨兵部署会有什么问题,我说需要扩容的话还是得集群部署。
17 分布式系统了解么,说一下Hadoop了解啥。
我说基本组件稍微了解过,简单搭过环境。
18 MapReduce的combiner干啥的,我说是合并结果的,问我啥时候会用到,答不知道。
19 Hadoop分发任务时,有个job失败了,hadoop会怎么处理,我答不知道,猜是会继续执行。。
20 hadoop分发任务,如果有一个节点特别慢拉慢了整体速度怎么办。我猜测是通过yarn分配相同的资源给每个任务,可以避免这种情况,他好像不太满意。
21 hadoop答得很烂。问了我两个10g文件比较,2g内存,重复率很高,筛选出不同的内容。我说拆成十份hash,每份两两比较hash的结果集,貌似他说OK。
22 排序算法了解哪些,巴拉巴拉。
23 用队列计算一个树的高度,我说用层次遍历记录节点高度。
24 一个黑名单集合,数据量很大,快速查询一个值是否在集合里,怎么设计,我说布隆过滤器。
25 还是上一题,说这个黑名单可能需要动态地增删改,如何设计才能避免访问响应太慢。我没思路,瞎扯了一下加硬件,用内存存,都被驳回了。然后他说算了。
26 上一题的黑名单做成分布式,怎么做。说了分片的方案,根据地址的hash值确定分片所在节点。
27 分布式数据库了解么,我不太明白他问的是啥,说不了解,感觉应该是问数据库的分布式方案。
28 有什么想问的,据他所说还有2-3轮面试,惊了。
全程50分钟,可以说是迄今为止难度最大的一个?
一面:
1 项目
2 讲一下AOP吧
3 动态代理和静态代理有什么区别
4 TCP和IP报文是否会分片,分别在什么情况下会分片。
TCP分包之后是否还会进行ip分片
5 做个题
无限长轨道。两辆车同方向开,车会滴水,怎么让他们相遇。这题简直像脑筋急转弯。
6 写一个斐波那契数列
递归式,要求改进
dp方式,要求优化空间
用三个变量代替数组进行dp,要求改进
我说数学公式,OK。
7 讲一下Linux的内存结构,我说只会JVM的,他让我说一下。
两者的内存如何映射,是什么关系,不会。
8 没了
二面:
1 项目讲一下,10多分钟去了。
2 排序算法,复杂度,比较。快排的空间复杂度是logn
3 讲一下OSI七层模型,我说了5层模型,然后他让我再补充一下,问了每层的作用,问了wifi属于哪一层。
4 线程间的同步用什么方式,说了object方法。
问我使用hashmap时重写哪两个方法,为什么要重写,巴拉巴拉,什么场景下重写。
5 平时用过什么数据结构,list用哪些有啥区别。
6 Spring中的ioc和aop。ioc的注解有哪些。
autowired和resource有什么区别,作用域有哪些。
autowired如何配置两个类中的一个吗
7 写一个单例模式,有点忘却了,巴拉巴拉搞出一个双重检测的,中间改了多次。
8 Java会有内存泄漏吗,三个区分别什么情况下会产生内存泄漏
三面:
1 主要了解哪些技术
2 分布式系统怎么设计,说了CAP和BASE,最终一致性
3 问我最终一致性是什么,举一下强一致性和最终一致性的例子。分布式事务和消息队列
4 分布式事务的消息id怎么确认顺序,我说使用zk
5 zk的性能瓶颈怎么克服,我说使用redis和redis集群。
6 跨机房的网络延迟怎么解决,我说不懂,他让我猜一侠华北到华南的延迟时间大概是多久,我说大概十秒内。
7 网络这块熟么,说一下socket编程吧。说了一下java的socket
8 网络编程的NIO和BIO区别,阻塞指的是什么意思呢。
9 socket客户端和服务端的连接过程和通信过程说一下。
10 操作系统熟么,一般版,shell和命令熟么,不熟。
11 算法熟么,答不熟。
12 系统怎么设计,设计模式怎么用
13 系统优化怎么做,cpu,IO,内存分别怎么排查问题和调优
14 家乡,女朋友,巴拉巴拉
一面:
1 自我介绍
2 docker和k8s了解多少
3 研究生学了哪些课程
4 操作系统了解么,讲一下进程和线程
5 死锁和处理方式
6 内存,虚拟内存和页面置换
7 网络了解么,讲一下三次握手和四次挥手
8 数据库了解多少,mysql索引,事务,锁讲了一些
9 Redis呢,讲了一下数据结构,持久化方式,使用场景
10 分布式了解哪些,负载均衡有哪些方式,说了dns,nginx,lvs和硬件,一致性问题怎么解决,说了2pc,3pc,raft和paxos,zab
10 mysql大表数据查询,怎么优化,分表,分库。
11单链表判环
使用快慢指针解决
12 完全二叉树判断:
二面:
1 项目
2 docker和kubenetes的原理和了解程度
3 docker的cgroup了解么
4 kubenetes的架构,扩容是怎么完成的。
5 Java的四种引用
6 Java的线程通信方式
7 Linux的进程通信方式
8 Java的线程池
9 算法
1 - N + 1这些数中取出N个,问剩下的是哪个。。
我说加起来相减,面试官说取巧了,不能这样。
我说比较数组下标,他还是说取巧。
于是我让他提示我一下,他说了排序再找。。额
然后想了两个空间换时间的办法,一个是用hashmap遍历两个数组。一个是合并数组后统计数字出现次数,也是hashmap
给定一串数字,找出所有可能的IP地址组合,比如192168111,组合是192.168.1.11,192.168.11.1。
应该LeetCode的题。之前自己没写完整,现场憋出来了。
这个代码应该没错。面试官看了二十分钟才说ok。
然后我们就这样沉默了20分钟,中间他就说了几句话。
三面:
1项目
2家庭情况
3学习生活的挑战
4学新技术的方式
5解释一下docker
6意向城市和岗位方向
一面
1 项目
2 队列和栈区别
3 两个栈实现队列,两个栈实现最小值栈
4 数据库的事务性质,如何实现这些性质
5 事务隔离级别有哪些,默认是什么级别。
6 已提交读有什么问题,用于什么场景
7 二叉树了解么,平衡二叉树呢,有什么场景会用到呢。
8 僵尸进程和孤儿进程是什么,分别有什么危害。
9 主从复制怎么实现。
10 Redis你用来做什么,为什么不用mq做异步队列
11 分布式文件系统了解么,HDFS讲一下原理
12 Java中一般用什么类型表示价格。
13 Java如何把byte类型转换成字符串
14 Java的string类型为什么是不可变的
15 有什么问题
今日头条上海
后台开发工程师
今日头条
后端研发工程师
找牛客大佬要了白金码,跳过死亡笔试,直接视频面,从3点开始,断断续续到晚上8点结束。
每个面试官给我的感觉都是怎么这么高冷啊。
1一面
一面:
1 写一个题,找一个无序数组的中位数
2 写了个快排,然后让我找到无序数组第k大的一个数,我说先排序再找,实际上可以用快排的partition函数。
3 快排的时间复杂度,最坏情况呢,最好情况呢,堆排序的时间复杂度呢,建堆的复杂度是多少,nlgn。
4 操作系统了解么,Linux和windows
5 说说Linux的磁盘管理,一脸懵逼
6 Linux有哪些进程通信方式,五大件
7 Linux的共享内存如何实现,大概说了一下。
8 共享内存实现的具体步骤,我说没用过
9 socket网络编程,说一下TCP的三次握手和四次挥手,中间网络不好,面试官都没听清楚,很尴尬
10 跳过网络,问了项目的一些东西
11 问我如何把docker讲的很清楚,我从物理机,虚拟机到容器具体实现稍微说了下。
12 问我cgroup在linux的具体实现,不会。
13 多线程用过哪些,chm和countdownlatch在实习用过
14 不得不吐槽下今天牛客的视频网速,不知道啥原因卡的一比,明明下载网速很正常啊,牛客视频每秒才20k。。疯狂掉线搞得很蛋疼。
二面:
1 自我介绍
2 Java的集合类哪些是线程安全
3 分别说说这些集合类,hashmap怎么实现的,扯了很多
4 MySQL索引的实现,innodb的索引,b+树索引是怎么实现的,为什么用b+树做索引节点,一个节点存了多少数据,怎么规定大小,与磁盘页对应。
5 MySQL的事务隔离级别,分别解决什么问题。
6 Redis了解么,如果Redis有1亿个key,使用keys命令是否会影响线上服务,我说会,因为是单线程模型,可以部署多个节点。
7 问我知不知道有一条命令可以实现上面这个功能。不知道
8 Redis的持久化方式,aod和rdb,具体怎么实现,追加日志和备份文件,底层实现原理的话知道么,不清楚。
9 Redis的list是怎么实现的,我说用ziplist+quicklist实现的,ziplist压缩空间,quicklist实现链表。
10 sortedset怎么实现的,使用dict+skiplist实现的,问我skiplist的数据结构,大概说了下是个实现简单的快速查询结构。
11 了解什么消息队列,rmq和kafka,没细问
12 写题时间到。第一题:写一个层序遍历。
13 第二题:写一个插入树节点到一颗排序树的插入方法,使用递归方式找到插入位置即可。
14 第三题:一个有向图用邻接矩阵表示,并且是有权图,现在问怎么判断图中有没有环。
15 我说直接dfs走到原点即为有环,刚开始写的时候我又问了一嘴是不是只要找到一个就行,面试官说是的,然后我说这样应该用bfs,有一次访问到原节点就是有环了。
16面试官问我不用递归能不能做这个题,其实我都还没开始写。然后我就说没有思路,他提示我拓扑图。我没明白拓扑图能带来什么好处。现在一想,好像当访问过程中找不到下一个节点时就说明有环。做一个访问标记应该就可以。
17 第四题:一个二叉树,找到二叉树中最长的一条路径。
我先用求树高的方式求出了根节点的左右子树高度,加起来便是。
18 然后面试官提示需要考虑某个子树深度特别大的情况,于是我用遍历的方式刷新最大值,用上面那个方法遍历完整个树即可。
19 面试官说复杂度比较高,但是由于时间问题就说结束了。
三面:
三面的面试官真的高冷啊,不苟言笑就算了,我问他问他他都不爱搭理的,搞得我内心慌得一比,感觉凉凉。
1 介绍一下项目
2 你谈到的并发技术,chm和countdownlatch怎么使用的
3 为什么要这么处理,使用线程池是不是也可以。我说也可以
4 操作系统的进程通信方式,僵尸进程和孤儿进程是什么,如何避免僵尸进程,我说让父进程显示通知,那父进程怎么知道子进程结束了,答不会。
5 计算机网络TCP和UDP有什么区别,为什么迅雷下载是基于UDP的,我说FTP是基于TCP,而迅雷是p2p不需要TCP那么可靠的传输保证。
6 他说不对,我说是不是因为要建立连接,开销比较大,他说不对
7 我说p2p的发送节点很多,所以不是那么需要各种传输保证,他说不对。
8 我说TCP会自动分包而TCP可以自己定义数据长度。。他还是说不对。
最后他说算了。我们问下一个吧。
9 操作系统的死锁必要条件,如何避免死锁。
10 写一个LRU的缓存,需要完成超时淘汰和LRU淘汰。
我说用lhm行不行,他说用linkedlist和hashmap可以。
于是我就写了put和get函数,进行了队头队尾操作。
他说get复杂度会不会太高,我瞎掰了半天没找到办法,他说那就这样吧,今天面试到这。
11 妈蛋,过期淘汰的处理我还没写呢,你就说结束了,感觉凉了啊,我说我要不要把剩下逻辑下完,他说不用,心凉了一大截~
12 然后HR小姐姐让我等结果了。溜了溜了
写在最前
我写过很多篇秋招总结,这篇文章应该是最后一篇总结,当然也是最完整,最详细的一篇总结。秋招是我人生中一段宝贵的经历,不仅是我研究生生涯交出的一份答卷,也是未来职业生涯的开端。仅以此文,献给自己,以及各位在求职路上的,或者是已经经历过校招的朋友们。不忘初心,方得始终。
在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾讯,今日头条,网易,华为等。
(在秋招末期,有幸又拿到了滴滴和亚马逊的offer,那时已经11月份了,所以之前的文章里都没有提到过)
一路走来也遇到很多困难,也踩了很多坑,同时我自己也探索了很多的学习方法,总结了很多心得体会,并且,我对校园招聘也做了一些研究和相应的准备。在今年的秋季招聘结束以后,我也决定把这些东西全部都写成文字,做成专题,以便分享给更多未来将要参加校招的同学。
我的本科专业是电子信息工程,基本没有接触过计算机专业的课程,只学过c语言,然后在大三的时候接触过java,Android,以及前端开发。这时候我只是一个刚刚入门的菜鸟,还不知道软件开发的水有多深,抱着试一试的态度去应聘了很多公司。结果可想而知,连简历筛选都没有通过。
当年我对游戏开发很有兴趣,特别是对网易游戏情有独钟,但是当我看到网易游戏研发工程师的招聘要求时,我只能望而却步,因为它要求学历至少是985的硕士。
也因为这个契机,我在大三的暑假开始准备考研,花了一个月的时间深思熟虑之后,选择了华科作为我的目标院校。
于是,2016年的下半年,我成为了“两耳不闻窗外事,一心只读圣贤书”的考研党,回想起来那确实是玩命学习的半年时间,每天稳定泡在图书馆8个小时以上,有时候学到宿舍都能学到晚上12点,那时候感觉自己完全变了一个人似的,可能当一个人为了某个目标而努力时,真的会变得不一样。最终我顺利地考上了,令我意外的是,成绩还挺不错。
对于即将读研的同学来说,一般有两件事很重要,一件事是选择导师,一件事是选择方向。
我在刚读研的时候最头疼的也是这两件事情。首先说明一下,我读的是专硕,所以实验室一般不搞科研,有部分导师会带项目,由于我不打算在实验室做项目(因为我更希望去大公司里锻炼几年),所以我当时本着想要找实习的想法选择了导师,事实证明我的选择还是很正确的,我在研二有大段时间去参加实习,让我在大厂里有足够的时间去锻炼和学习。
而选择方向这件事,我倒是折腾了好久。研一期间我做的最多的事情就是看书了,当时自己的方向还不明确,所以找了很多书来看。当别人都在专研数据挖掘和机器学习时,我还在各种方向之间摇摆不定。
我在读研之前想做游戏开发和Android开发,但我以前也学过Java Web开发。于是我在网上了解对应方向的资讯,发现游戏研发的就业面比较窄。
最后,我综合公司的岗位情况,个人兴趣,以及我之前的学习经历等因素,选定了Java开发方向。
于是,我在学校的实训项目中选择了Java Web项目,从此也真正意义上地踏上了Java的学习之路。
尽管我的入学成绩是全学院的top3,但是,我发现,作为非科班出身的我,和很多科班同学相比,还是有一定差距的。
大部分同学本科都上过计算机专业的相关课程,比如计算机网络,操作系统,数据结构等等,而我以前连听都没听过,除此之外,他们一般都会几段比较完整的项目经验,至少在Java Web方面已经算是比较熟悉了。而我在当时,只学了数据结构,另外接触过一些Java基础,有一部分项目经验,基本上就是入门水平。
于是我痛定思痛,决定好好弥补我的不足,平时一有空就去图书馆找些书来看,不论是操作系统,计算机网络,还是数据库等本科课程,我都会找一些对应的书籍来看,当时不太清楚其实有些课程其实不需要特地去补,以至于我连计算机组成原理,编译原理,软件测试等方面的书都特地找来看,现在想想也是挺逗比的。
由于我们上的课比较水,所以上课时间反而变成了我自学基础课程的大好时光了。所以我平时上课的时候都会带两三本书,一到两周内看完一本,虽然可能吸收的不是特别好,但是对当时的我来说还是有很大帮助的。
除此之外,有时候我还会偷偷去旁听有一些本科生的课程,这也是因为我在自学一些课程的时候遇到了困难,比如《操作系统》,《数据库原理》等等。于是我花时间研究了一下本科生的课表,趁着自己没课的时候赶紧去旁听课程。有时候感觉自己在课堂中显得非常突兀,尴尬地想要逃跑,但总算是坚持地听完了一门数据库的课程。
此外,我还在各种视频网站上看网课,比亦或是看中国MOOC的计算机基础课程,里面的操作系统,数据库等课程也让我印象深刻。
就这样,每天我都把自己的时间填满,愣是在研一上学期看了好几本书,当时书的版本现在有的记不清了,主要是计算机网络,操作系统,计算机组成原理,另外还有软件工程,软件测试,设计模式,等书籍。就这样,我靠着这段时间的坚持把计算机基础课程补上来了一些。
时间来到研一下半页,这时候我刚刚结束了学校的Java Web的项目实训课程,在做这个项目期间,我发现自己暴露出了很多问题,技术实践能力不足,Java基础不扎实。这件事情也给我自己敲响了警钟,因为我计划在春招期间找一份大厂的实习,但是目前看来我的水平还远远不够。
压力之下,只有努力一条出路。于是,从那时候起,我开始了“留守“实验室的学习生活。为什么要在实验室学习,一是因为学习气氛好,二是因为平时大家也可以互相交流问题。
每天早上9点到实验室打开电脑,晚上9点背电脑回寝室。大部分时间我会花在看书上,这段时间主要看的都是Java相关的书籍,借鉴的是江南白衣大佬的“Java后端书架”,比如《深入理解JVM虚拟机》,《Java并发编程艺术》,《深入分析Java Web技术内幕》,《深入剖析Spring源码》等等。
另外一部分时间我会用来看一些技术博客,我主要是根据面经上的知识点按图索骥,找到对应讲解该知识点的文章,那时候主要还是通过搜索引擎来找文章,当然有时候看到一些重点难点也会自己写一些博客。不过这个时期并不是我大量写博客的阶段,主要还是看一些讲解面试知识点的技术博客为主。
除此之外在面试前几天我会花时间去看这家公司的面经,搞懂每一个面经上的知识点,并且记录在我的笔记上,光是面经相关的笔记我就记了100多篇,这样的学习习惯我一直坚持到了秋招,确保每个面试知识点都能被我记住,消化,直至完全理解。
慢慢的,笔记越来越多,我参加面试的公司也越来越多,于是我开始不断完善自己的简历,总结自己的面试技巧,选择合适的网申时机。从头到尾我大概花了3个月的时间在找实习上,期间大大小小参加了20多次面试,我也从一开始面试一问三不知的菜鸟,逐渐变成了面霸,到复习末期,我对Java常见面试知识点已经了然于胸,同时也越来越自信,不管面什么大厂都不慌不忙。
这样的日子持续了好几个月,所谓世上无难事,只怕有心人。到最后,实验室里每个人都拿到了心仪的实习offer。
踏出学校大门,我的实习之路才刚刚开始。8个月左右的实习时间,说长也长,说短也短。但经历过这段实习之后,我才明白了很多事情。
在猪场实习的日子里,我第一次了解大公司的开发流程,亲自参与项目代码的开发,我的导师会和我提需求,会指导我怎么做得更好。在这里的成长无疑是非常快速的,但我很快意识到我的问题所在,不熟悉部门技术栈,对很多Java Web的技术原理都不太熟悉,这段时间我意识到了自己的知识深度和广度都可能都有待提高。
不过由于家里的一些事情。我提前离职了,所以在猪场呆的时间很短,以致于我没来得及搞懂部门项目的技术架构就走了,这也让我在离开以后感觉很遗憾,所以我下定决心在下个实习单位要好好做。
离开猪场后我来到了熊厂。部门给我提的需求不算太难,大部分都是一些CURD的工作,但是这次很快就意识到了问题所在,就是我不太熟悉部门的整体技术栈,所以在需要借鉴别人代码时偶尔会看不懂。后来部门又给了新的重构需求,此时的我开始焦虑起来,是不是应该做出一些改变呢。
终于,我找到了新的目标,我要搞懂部门的项目架构,了解相关技术栈(我们部门做的是私有云),一开始,我会请教我的导师,尽量去了解项目的架构设计,除此之外,我还会利用一些时间去看其他同事负责的代码,并且通过一些文档和PPT去了解这些代码的功能和意义。结合代码和文档,再加上和同时的交流,我对部门项目的架构逐渐熟悉起来,为了更好地理解每一块代码的作用,我还为一些模块的代码写了注释。
当然,光看代码和文档还不能解决所有问题,因为这个项目的重点难点不在Web应用,而是在底层技术,这个项目中包含了两套架构,分别是一套OpenStack集群和一套docker集群。为了学习这两块内容,我先是看了很多博客,然后在平台上跑虚拟机和容器来做实践,最后又看了这方面的一些书籍,主要是《OpenStack设计与实现》,《docker技术入门实战》。
但是这还不够,虚拟化技术与Linux内核息息相关,又需要学习者对操作系统和计算网络非常熟悉,我自知这些内容我学得还不够深入,于是我花大量时间看这方面的书,当时也遇到了几本确实不错的书,分别是《深入理解计算机系统》,《计算机网络:自顶向下方法》,还有一本没来得及看完的《Linux内核设计与实现》。虽然以后不一定会作云计算方向的开发,但是学完这些东西我还是非常开心的。
到后来,我工位上的书越来越多,我对部门的技术栈也越来越熟悉,有时候我还会去听公司内各个团队组织的技术分享,有空的时候看看内网的技术课程,真正地实现了自己在技术广度上的拓展。
有时候我觉得,实习生活是会骗人的,你佩戴着和正式员工一样的工牌,和他们做着类似的事情,会让你觉得你的水平已经和他们差不多了,但事实上是,在转正之前,你和他们还差得远,所以不要停下自己前进的脚步,抓紧时间学习吧,把握好你在公司里的机会,合理利用公司给你提供的资源。
研究生期间我有一件事情一直在坚持,那就是做笔记和写博客。
做笔记,就是记录学习中大大小小的事情,可能是面试问题,可能是一周的学习计划,也可能知识一个知识点,总归都是值得记录的东西,对我来说,就是一种积累。而对于博客,我从一开始只用于记录项目,到后来做转载,再到后来写原创,整理系列文章,则更像是一种沉淀。
但是在春招刚刚结束的这段时间,我发现一个问题,之前学过的东西忘记了很多,特别是那些理解的不够深的知识点,总是特别容易忘记。另外我发现,虽然我在笔记中记录了很多的知识点和面试题,但是往往我只看过一次,不会再去看第二次。
这也意味着,虽然记录的内容很多,但是真正消化吸收的内容很少,脑子里充斥着总是那些零碎的知识点和面试问题,对于完整的知识体系知之甚少。这些问题在春招期间也不断地暴露出来,让我思考了很久。
面对如此窘境,我想做出改变,趁着现在时间充裕,我想要为这些内容做一次减法,并且借此机会,推翻自己原有的知识体系,重建新的知识框架。简单说来,就是重新开始学习Java后端,这次我要用一种更高效的方式,避免走之前走的弯路,要用最高效,最合理的方式去复习。由于我之前已经有基础,所以我对完成这一目标有信心,相应地我也为此做出了明确且详细的学习计划。
我打算用几个关键词来形容这三个月的秋招复习。
在三个月的时间里,我首先按照Java后端路线图安排好复习计划,每个知识点都会对应安排一段时间,比如我可能花一天时间复习“Java反射”,两天时间复习“设计模式”,一周的时间用于复习"JVM虚拟机”。我一般会在月初做好整个月的计划,然后根据进度做一些微调,但是基本上我都可以跟上进度,并且是在复习到位的前提下。
所以我觉得,对于秋招这一场苦战,指定计划尤为重要,一旦计划定下来,战略目标清晰,对应的战术制定也会变得清晰,执行力也会随之变强。
至于复习方法,我主要通过看高质量博客,并且结合代码实践的方式巩固这部分知识点,比如今天学习“concurrenthashmap”,我会去找两三篇比较好的博客先看看,主要是源码解读方面的,然后我会把它们进行整合,如果有遗漏的知识点我会再进行补充,有时候我还会自己去看看JDK源码,以便更好地理解博客内容,完成知识整合之后,我就会对应地整理出一篇博客出来,发在我的个人博客上。
除此之外,当我完成了一整个专题的复习之后,我会把这些文章整理成一个专题,比如上面说的“concurrenthashmap”,实际上属于Java并发包,所以我会专门做一个博客专栏,用来完成Java并发系列的文章专题。对于每一个文章专题,我都会先理清这个专题一共有哪些内容,然后再开始整理。比如对于Java并发包,我会先写Java多线程基础的文章,再写JMM内存模型的文章,接着一步步着手写Java线程池,阻塞队列,工具类,原子类等等。这样一来这部分内容就复习完毕了,写系列文章的好处就在于,我可以从头到尾理清脉络,并且对于每一部分的知识点都做了比较好的总结。
对于博客的选择,我吸取了之前的教训,宁愿花半小时看一篇高质量文章,也不花10分钟看5篇烂文章。深度阅读的好处,就是可以让这部分内容更好地融入你脑内的知识体系,而不是像其他快餐文章一样转瞬即逝。
由于之前在实习期间参加的项目都比较大,我接触的模块也比较单一,没有对整体项目有一个很好的把握,所以我决定趁这段时间再巩固一下我的项目实践能力,这里的能力主要是指的是对项目架构的把握能力,以及对业务开发的熟练度,当然也包括对各种常用后端技术的熟悉程度。
我花了大概一个月的时间完成了两个项目的开发,当然主要也是模仿两个开源项目做了,这两个项目都使用SpringBoot快速开发,并且用到一些常用的后端技术比如redis,云存储,以及一些常见Web框架,除此之外还涉及到了solr,爬虫等技术。虽然项目不算很难,但是我在这段时间里很快地熟悉了完整项目开发的流程,并且每天做迭代,通过Git来跟进版本,每个版本都会写清所做的内容,这也让我对项目的架构非常熟悉。
在项目之余,我也找一些常用的后端组件来跑一跑demo,以便让我对这些技术有一个直观的了解,比如面试常问的dubbo,zookeeper,消息队列等组件。这些尝试也让我在理解它们的原理时更加得心应手了。
算法题是秋招笔试面试中的重头戏,每个研发同学都免不了经历算法题的摧残,对我这么一个非科班同学来说,更是让人头大。正因为如此,我放弃了刷大量LeetCode题目的方法,选择了更加行之有效的刷题方式。
首先我重新刷了一遍剑指offer,并且对每道题目进行总结,尽量保证每一道题都可以记在脑子里,众所周知剑指offer中的题是面试时非常喜欢考的,所以先搞定这部分题目是最为关键的。
搞定剑指offer之后,当然还要刷LeetCode了,LeetCode题目这么多,怎么选择呢,我没有按照tag刷,也没有按照顺序刷,而是参考当时一个大佬的LeetCode刷题指南来进行刷题的,他把每个类型的题目都做了归纳,每部分只放一些比较经典的题目。所以我前后大概刷了100多道LeetCode的题目,并且在第二遍刷题复习的时候,我也对这些题目做了一份总结。
除了上面两个经典题库,我还着重刷了大厂的历年真题,这部分我主要是通过牛客网的历年真题题库来完成刷题的。说实话,真题是非常重要的,因为公司出的题目不像平时的那些算法题,可能会出得非常奇葩,所以你如果不提前适应的话会比较吃亏。完成这部分题目之后,我对算法题的复习也基本告一段落了。
当我完成所有内容的复习时,提前批已经开始了。终于要上战场了,因为战前准备比较充分,所以我对秋招还是比较乐观的,但事实上,秋招不仅是攻坚战,而且是持久战,要笑到最后,确实也不是那么容易的事情。
前面提到我在秋招前完成了知识体系重建,那在这里我也想跟大家分享一下我当时大致的知识体系构成。就跟我前面说的一样,我选择重新再学一遍Java后端相关的技术内容,因为我知道大致的学习方向,并且有一定的基础,所以看很多文章变得更加得心应手,写文章和做总结也更加有底气了。
首先在Java基础方面,我写了20多篇原创博客,主要是对Java核心技术的解析,比如“Java反射”,“Java序列化和反序列化”,“Java异常体系”等等。
在Java集合类方面,我原创了部分文章,另外整合了一些比较好的技术文章,其中最主要的就是关于hashmap的文章,当时我整合的文章几乎没有遗漏任何一个知识点。
在Java并发编程方面,我主要参考了并发编程网以及一些优质博客的文章,先搞懂了Java并发原理,再一步步学习JUC并发包的组件,其中重点看了chm,并发工具类以及阻塞队列等JDK源码的解析文章,除此之外,我还会在IDE中跑JUC相关的emo,毕竟这方面的内容非常需要实践。
在Java网络编程方面,我先从最基础的socket入手,再讲到NIO,AIO,并且加入了几篇对Linux IO模型解析的文章,让整个知识体系更加完整(因为NIO是基于Linux Epoll实现的),接着我又加入了对Netty的探讨,以及Tomcat中对NIO的应用,可以说是把Java网络编程一些比较重要的部分都囊括进来了。为了更好理解这部分内容,我也在网上参考了很多客户端和服务端通信的demo,最后我分别用Socket,NIO,AIO以及Netty把C/S 通信的demo都写了一遍。
在JVM虚拟机方面,我则按照《深入理解JVM虚拟机》这本书的行文脉络进行文章的整理。在搞定JVM基本原理以后,我着重了解了JVM调优和实践中常遇到的问题,并且整理了常用的JVM调优工具,场景问题以及调优实践的案例,这也是因为面试中对JVM调优实践越来越重视了。
在JavaWeb方面,我从Java Web相关技术的发展入手,一步步了解了每种技术存在的意义,比如JSP,Servlet,JDBC,Spring等等,然后对每种技术进行了比较全面的了解,并且着重地看了Spring和SpringMVC的源码分析文章,另外一方面,我花了很多时间去研究Tomcat的工作原理。除此之外,JavaWeb项目中常用的maven,日志组件,甚至是单测试组件,也纳入了我的系列文章里。
在数据库和缓存方面,我主要学习了MySQL和Redis这两种最常用的数据库。对于Mysql,我从简单的sql开始了解,然后开始了解sql优化,MySQL的存储引擎和索引,事务及锁,还有更复杂的主从复制,分库分表等内容。对于Redis,我也是从简单的api入手,然后去了解每一种数据结构的底层实现原理,接着尝试去学习Redis的持久化方式,以及作为缓存常需要考虑的技术点,当然,也包括Redis的分布式锁实现,以及它的分布式集群方案。
最后一部分就是分布式相关的理论和技术了,这个也是困扰我很久的一块内容,我主要把这块内容分为两个部分,分别是分布式理论和分布式技术,理论方面,我先了解CAP,BASE等基本知识,然后开始学习一致性协议和算法,接着探讨分布式事务。对于分布式技术,涉及的东西就更多了,例如分布式session,负载均衡,分布式锁等内容,这些知识点我都会用一到两篇文章去总结,对于分布式缓存,消息队列,以及分布式服务等内容,我会花比较多的时间去全面学习,然后总结出一个系列的文章出来。当然,对于这些技术的学习主要还是停留在理论方面,在自己的项目中能用到的比较少。
至此,我的知识体系基本构建完成,这也是我在秋招中能够成功闯过那么多面试的原因。
不管前期做了多少准备,到秋招的时候也不能掉以轻心,从七月底第一次面试到9月基本佛系,中间经历了大大小小的面试。
在完成知识体系重建以后,我把重点转向了另外几件事,一是完善和熟悉我的简历,以便在面试中能够比较好地发挥,二是持续刷题,保持对算法题和笔试真题的手感和熟练度,三则是看面经查缺补漏,我一直认为看面经是很重要的一项复习内容。
就这样,我一边继续复习,以便开始了一场接一场的面试接力。
起初,我面了几家小公司练手,接着阿里的提前批接踵而至,我战战兢兢地参加了阿里中间件部门的面试,面难难度还算适中,一共四轮面试,当时我的表现也还不错,问题基本都答上来了。面完不到一周以后我就收到了通过的消息,当时还有点懵。没想到第一个offer这么快就来了。
这段时间内,蚂蚁金服的两个部门也给了我面试机会,我都参加了它们的面试,并且顺利地拿到了其中一个部门的offer。由于我对蚂蚁这边的业务比较感兴趣,最终选择了蚂蚁金服的offer。
阿里提前批的胜利确实是意外之喜,但也大大地鼓舞了我,于是我又参加了百度和腾讯的提前批面试,由于百度的提前批不走流程,一共有四个部门面试了我,每个部门都有2到3轮面试,总计约为12次面试,到后来我已经快晕了,看到百度的电话就害怕,由于面试次数太多,有时候发挥确实也不是很好,我也没有特别在意,只当是在锻炼自己了。
百度的面试难度每个部门不一样,但是每次面试必写算法题,一写算法题,时间至少就是一个小时以上,每次面试完都有一种身体被掏空的感觉。
经历了百度面试的摧残以后,我手写算法的速度也变快了,很多坑也被我填上了。接下来面对腾讯的面试,我也是既激动又担心,腾讯的面试难度比较大,对于操作系统和网络的知识喜欢深挖,问的东西也很有深度,面完前三面以后,第四面拖了3周才进行。当时三面面试官对我的评价比较好,也让我信心爆棚了好久。
在等待腾讯终面的期间,我参加了今日头条的面试,当时有幸拿到了一个白金码,免去笔试,事实证明白金码作用真的很大。头条的面试难度和腾讯差不多,三轮面试,同样需要写各种算法,由于是视频面试,我可以清楚地看到,头条的面试官真的非常高冷啊。面完头条我的第一感觉就是应该挂了吧。没想到最后还是给了offer。
结束这几家大厂的面试之后,我觉得我的秋招已经接近尾声了,不过由于之前投的比较多,所以我又面了几家大公司,如网易,华为,快手等。到9月上旬的时候,我接连收到了bat和头条,网易的意向书,阿里最早,腾讯最晚,每收到一封意向书我都很开心,没想到最后我真的可以集齐bat等大厂的offer。
9月以后,除了偶尔和同学做几场大厂的笔试,我基本就佛系了。直到后来一些外企例如亚马逊,大摩开始笔试面试,我才又重新回到了状态。
截止目前,我基本上把该拒绝的offer都拒绝了,综合各方面因素的考虑,最后应该会签阿里,原因是部门是我自己喜欢的,同时给的评级也比较高。虽然腾讯也给了sp,但是最后还是忍痛割爱啦。至于百度和头条,给的offer并不是很令人满意,所以就没有考虑了。
至此,我的秋招之旅总算圆满结束。
具体的面经都比较长,这里大概介绍一下面试的情况,具体的面经请大家关注我的公众号并回复“面经”即可查看。
阿里中间件研发面经
蚂蚁金服研发面经
岗位是研发工程师,直接找蚂蚁金服的大佬进行内推。
我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer。
然后我也参加了蚂蚁金服中间件部门的面试,经历了三次面试,但是没有走流程,所以面试中止了。
最后我走的是蚂蚁金服财富事业群的流程,经历了四次面试,包括一次交叉面,最终拿到了蚂蚁金服的意向书,评级为A。
阿里的面试体验还是比较好的,至少不要求手写算法,但是非常注重Java基础,中间件部门还会特别安排Java基础笔试。
腾讯研发面经
岗位是后台开发工程师,我没有选择意向事业群。
SNG的部门捞了我的简历,开始了面试,他们的技术栈主要是Java,所以比较有的聊。
一共经历了四次技术面试和一次HR面试,目前正在等待结果。
腾讯的面试一如既往地注重考查网络和操作系统,并且喜欢问Linux底层的一些知识,在这方面我还是有很多不足的。
百度研发面经
百度研发面经整合版
岗位是研发工程师岗位,部门包括百度智能云的三个分部门以及大搜索部门。
百度的提前批面试不走流程,所以可以同时面试好多个部门,所以我参加百度面试的次数大概有12次左右,最终应该是拿了两个部门的offer。
百度的面试风格非常统一,每次面试基本都要到电脑上写算法,所以那段时间写算法写的头皮发麻。
网易研发面经
面试部门是网易云音乐,岗位是Java开发工程师。
网易是唯一一家我去外地面试的公司,也是我最早去实习的老东家。
一共三轮面试,耗时一个下午。
网易的面试比我想象中的要难,面试官会问的问题都比较深,并且会让你写一些结合实践的代码。
今日头条研发面经
岗位是后台研发工程师,地点选择了上海。
我参加的是字节跳动的内推面试,当时找了一个牛友要到了白金码,再次感谢这位头条大佬。
然后就开始了一下午的视频面试,一共三轮技术面试,每一轮都要写代码,问问题的风格有点像腾讯,也喜欢问一些底层知识,让我有点懵逼。
更多面经请点击阅读原文进行查看。
提前批的笔试其实不是很多,我参加了网易,网易游戏,拼多多等公司的笔试,应该都是低分飘过。
我的算法基础比较一般,读研之前0基础,所以这方面学的比较艰辛,分享一些我的笔试准备经验。
1 打好数据结构和算法基础
2 先易后难,看一些基础的算法书籍,比如《图结算法》,《啊哈算法》等等。
3 剑指offer刷起来,两到三遍,做到胸有成竹
4 LeetCode刷个200题左右,记得二刷,做好总结。
5 到牛客网做公司的历年真题,熟悉题型,保持手感。
剑指offer指南和LeetCode刷题指南可以在我的博客里找到。
其中LeetCode指南是参考@CyC2018大佬的文章。
面试主要考的还是你的基础知识,需要你对Java后端技术栈有一个全局上的把握,具体说起来就太多了,具体复习方案可以参考文章后面的内容。
我个人也总结了一些面试方面的经验,主要是一些技巧。
1 做好自我介绍和项目总结,把握你发言的主动权
2 搞清楚简历上的技术点,兵来将挡水来土掩
3 注意分点答题,思路清晰,也更容易讲清楚原理。
4 压力面下保持冷静,不要回怼面试官
5 HR面试注意常用技巧,可以提前准备。
对于校园招聘来说,最重要的还是基础知识。下面的博客专栏出自我的技术博客 https://blog.csdn.net/a724888
这些专栏中有一些文章是我自己原创的,也有一些文章是转载自技术大牛的,基本都是是我在学习Java后端的两年时间内陆续完成的。
总的来说算是比较全面了,做后端方向的同学可以参考一下。
本专栏主要介绍Java基础,并且会结合实现原理以及具体实例来讲解。同时还介绍了Java集合类,设计模式以及Java8的相关知识。
带你走进JVM的世界,整合高质量文章以阐述虚拟机的原理及相关技术,让开发者更好地了解Java的底层运行原理以及相应的调优方法。
本专栏主要介绍Java并发编程相关的基本原理以及进阶知识。主要包括Java多线程基础,Java并发编程基本原理以及JUC并发包的使用和源码解析。
Java网络编程一直是很重要的一部分内容,其中涉及了socket的使用,以及Java网络编程的IO模型,譬如BIO,NIO,AIO,当然也包括Linux的网络编程模型。
了解这部分知识对于理解网络编程有很多帮助。另外还补充了两个涉及NIO的重要技术:Tomcat和Netty。
从这里开始打开去往JavaWeb世界的大门。什么是J2EE,什么是JavaWeb,以及这个生态中常用的一些技术:Maven,Spring,Tomcat,Junit,log4j等等。
我们不仅要了解怎么使用它们,更要去了解它们为什么出现,其中一些技术的实现原理是什么。
本专栏主要讲解Spring和SpringMVC的实现原理。
Spring是最流行的Java框架之一。
本专栏文章主要包括IOC的实现原理分析,AOP的实现原理分析,事务的实现源码分析等,当然也有SpringMVC的源码解析文章。
本专栏介绍MySQL的基本知识,比如基本架构,存储引擎,索引原理,主从复制,事务等内容。当然也会讲解一些和sql语句优化有关的知识。
同时本专栏里也介绍了Redis的基本实现原理,包括数据结构,主从复制,集群方案,分布式锁等实现。
本专栏介绍分布式的基本理论和相关技术,比如CAP和BASE理论,一致性算法,以及ZooKeeper这类的分布式协调服务。
在分布式实践方面,我们会讲到负载均衡,缓存,分布式事务,分布式锁,以及Dubbo这样的微服务,也包括消息队列,数据库中间件等等。
本专栏涵盖了大后端的众多技术文章,当你在Java后端方面有一定基础以后,再多了解一些相关技术总是有好处的。
除了Java后端的文章以外,还会涉及Hadoop生态,云计算技术,搜索引擎,甚至包括一些数据挖掘和AI的文章。
总的来说选取了一些不错的基础类文章,能让你对大后端有一个更直观的认识。
我之前专门写了一篇文章介绍了Java工程师的书单,可以这里重点列举一些好书,推荐给大家。
完整内容可以参考这篇文章:
《计算机网络:自顶向下》这本从应用层讲到物理层,感觉这种方式学起来更轻松。
《图解算法》《啊哈算法》
这两部书籍非常适合学习算法的入门,前者主要用图解的形式覆盖了大部分常用算法,包括dp,贪心等等,可以作为入门书,后者则把很多常用算法都进行了实现,包括搜索,图,树等一些比较高级的常用算法。
《剑指offer》这本书还是要强烈推荐的,毕竟是面试题经常参考的书籍,当然最好有前面基本的铺垫再看,可能收获更大,这本书在面试之前一般都要嚼烂。如果想看Java版本的代码,可以到我的Github仓库中查看。
《Java编程思想》这本书也是被誉为Java神书的存在了,但是对新手不友好,适合有些基础再看,当然要选择性地看。我当时大概只看了1/3
《Java核心技术卷一》
这本书还是比较适合入门的,当然,这种厚皮书要看完还是很有难度的,不过比起上面那本要简单一些
《深入理解JVM虚拟机》
这本书是Java开发者必须看的书,很多jvm的文章都是提取这本书的内容。JVM是Java虚拟机,赋予了Java程序生命,所以好好看看把,我自己就已经看了三遍了。
《Java并发编程艺术》
这本书是国内作者写的Java并发书籍,比上面那一本更简单易懂,适合作为并发编程的入门书籍,当然,学习并发原理之前,还是先把Java的多线程搞懂吧。
《深入JavaWeb技术内幕》
这本书是Java Web的集大成之作,涵盖了大部分Java Web开发的知识点,不过一本书显然无法把所有细节都讲完,但是作为Java Web的入门或者进阶书籍来看的话还是很不错的。
《Redis设计与实现》
该书全面而完整地讲解了 Redis 的内部运行机制,对 Redis 的大多数单机功能以及所有多机功能的实现原理进行了介绍。这本书把Redis的基本原理讲的一清二楚,包括数据结构,持久化,集群等内容,有空应该看看。
《大型网站技术架构》
这本淘宝系技术指南还是非常值得推崇的,可以说是把大型网站的现代架构进行了一次简单的总结,内容涵盖了各方面,主要讲的是概念,很适合没接触过架构的同学入门。看完以后你会觉得后端技术原来这么博大精深。
《分布式服务框架原理与实践》
上面那本书讲的是分布式架构的实践,而这本书更专注于分布式服务的原理讲解和对应实践,很好地讲述了分布式服务的基本概念,相关技术,以及解决方案等,对于想要学习分布式服务框架的同学来说是本好书。
《从Paxos到Zookeeper分布式一致性原理与实践》
说起分布式系统,我们需要了解它的原理,相关理论及技术,这本书也是从这个角度出发,讲解了分布式系统的一些常用概念,并且带出了分布式一哥zookeeper,可以说是想学分布式技术的同学必看的书籍。
《大数据技术原理与应用》
作为大数据方面的一本教材,厦大教授写的这本书还是非常赞的,从最基础的原理方面讲解了Hadoop的生态系统,并且把每个组件的原理都讲得比较清楚,另外也加入了spark,storm等内容,可以说是大数据入门非常好的一本书了。
1 江南白衣
这位大大绝对是我的Java启蒙导师,他推荐的Java后端书架让我受益匪浅。
2 码农翻身
刘欣,一位工作15年的IBM架构师,用最浅显易懂的文章讲解技术的那些事,力荐,他的文章帮我解决了很多困惑。
3 CoolShell
陈皓老师的博客相信大家都看过,干货很多,酷壳应该算是国内最有影响力的个人博客了。
4 廖雪峰
学习Git和Python,看它的博客就够了。
5 HollisChuang
阿里一位研发大佬的博客,主要分享Java技术文章,内容还不错。
6 梁桂钊
阿里另一位研发大佬,博客里的后端技术文章非常丰富。
7 chenssy
这位大佬分享的Java技术文章也很多,并且有很多基础方面的文章,新手可以多看看。
8 Java Doop
一位魔都Java开发者的技术博客,里面有一些不错的讲解源码的文章,数量不是很多,但是质量都挺不错的。
学习Java后端两年的时间里,接触过很多的资料,网站和课程,也走了不少弯路,所以这里也总结一些比较好的资源推荐给大家。
0 CSDN和博客园,主流的技术交流平台,虽然广告越打越多了,但是还是有很多不错的博文的。
1 importnew 专注Java学习资源分享,适合Java初学者。
2 并发编程网,主要分享Java相关进阶内容,适合Java提高。
3 推酷 一个不错的技术分享社区。
4 segmentfault,有点像国内的Stack Overflow,适合交流代码问题的地方。
5 掘金,一个很有极客范的技术社区,强推,有很多技术大牛分享优质文章。
6 开发者头条,一个整合优质技术博客的社区,里面基本上都是精选的高质量博文,适合技术学习提升。
7 v2ex,一个极客社区,除了交流技术以外还会有很多和程序员生活相关的话题分享。
8 知乎
这个就不必多说了。
9 简书
简书上有些技术文章也很不错,有空大家也可以去看看。
10 Github
有一些GitHub的项目还是非常不错的,其中也有仓库会分享技术文章。
后记
秋招结束以后,我就把主要精力花在做这个公众号上了。当然,剩下要处理的事情还有很多,毕业论文,毕业旅行,还有工作前的知识储备等等。果然,人的一生需要不断的修行,刚刚闯过了一关又马上要迎接下一轮挑战,你不能停下脚步,毕竟大家都在往前走。
希望还在求职路上的各位少侠好好加油,在未来也能够顺利地拿到自己想要的offer!
本文中涉及到的几个链接我汇总在这里,方便大家查看。
1、CSDN技术博客:blog.csdn.net/a724888(Java后端技术站点,整理很多Java后端技术文章,推荐Java方向的同学看看)
2、知乎:www.zhihu.com/people/h2pl(知乎活跃用户,希望未来能成为大V)
3、牛客网:www.nowcoder.com/profile/3539721(牛客网活跃粉,分享过一些面经和心得)
4、GitHub:https://github.com/h2pl(用于自己做项目,以及刷剑指offer、LeetCode、历年笔试题)
当然,记得要关注一下本公众号,有很多校招和学习干货在这里等你发掘,特别是正在准备校园招聘的各位同学,一定不要错过了哈。