早上11点,刚刚收到阿里的offer,也算是给自己三个月的春招画上了一个还算圆满的句号。
先介绍一下本人的基本情况:陕西普通一本非计算机专业大三学生,非985211。主要技能C/C++/Java/数据结构/算法。
这三个月的经历,首先确实在技术上确实通过不断的面试有了很大的提升,其次在各种面试经验上也有了一些心得。
眼看春招已经基本结束,所以将这段时间的经历写在牛客上,希望能够帮助大家,在秋招上斩获更满意的offer。
所以就拿我收到offer的三家重点说说。(按时间排序)
一、CVTE:
CVTE的实习生招聘非常早,笔试完了就收到通知,预约了面试时间就早早去了,两轮技术面试一轮HR面试,进行的很顺利,3月26号就已经发了offer。
一面:面试官非常亲切,其实我当时是第一次参加现场面试,楼主比较怂,其实现场紧张的不要不要的,自我介绍的时候说完了姓名年龄和专业之后,就卡住说不下去了。面试官看在眼里疼在心上,于是很关心的对我说,没事没事不要紧张,这样吧,我们先写两个算法放松一下(Excuse me?)不过好在面试官出的题很简单,第一个是二分查找,我用递归和非递归各写了一遍,重点就在于下标的控制;另一道是在N个数中求前M大个数,其实也很简单,思路就是使用快速排序的思想,每一次当把一个数字放在正确的位置上的时候跟M进行比较,其实在剑指offer上有原题。好在寒假的时候把剑指offer刷了很多遍,所以很快也写出来了。我个人觉得在写代码之前,有很多事情需要跟面试官进行交流,比如函数的参数、返回值、还有一些异常情况的处理,提前跟面试官约定好。比如我在写代码之前,就问面试官:假设参数是(int *arr, int length, int m)
,在这种情况下,可能会有四种情况会导致程序出现异常情况
- arr ==NULL
- length <= 0
- m > length
- m <=0
询问他在这四种情况下我们该如何处理?”面试官听完之后一下就有兴趣了,及时跟面试官沟通,一方面是防止思路与面试官预期的差距太大,面试官出的题,因此他有责任让面试者明白他的意思,另一方面表现我们积极思考,向面试官展示我们的思考能力。可能之前的算法写的太顺利,所以给自己建立了蜜汁自信,并且面试官对我的第一印象也好,后面的问题回答的很轻松,有struts2和SpringMVC的区别、Spring中IoC和AOP的理解,不过在数据库方面被难住了,在MySQL中如何定为查询效率较慢的SQL语句,比如慢查询日志、EXPLAIN关键字还有PROFILES等。但是总得来说,一面进行的很顺利。
二面:CVTE的面试流程是,如果一面的面试官觉得通过了,就会示意现场接待的姐姐,姐姐会安排在场外休息一下,二面大概在十分钟之后进行;而如果觉得不符合要求,姐姐就会亲切地告诉面试者,今天的面试结束了,可以先回去等消息。等了十分钟之后,二面如约而至,二面是一个年纪稍大,但是很有风度的中年人,事后学长说那是他们部门的BOSS,面试官让我设计了一个场景,青蛙爬井,就是画画UML,两个类图,和他们的关系。最后扩展成面向接口的思维,不得不说BOSS确实功力深厚,纠正了我很多问题,最后才勉强满意。然后就是分析项目,挑了一个我比较熟悉的,问了很多问题,比如页面的跳转关系、我所做的功能模块,让我一边画图一边解释,我自认项目准备的还算充分,因为都是自己做的,所以这部分也算顺利。后面就没有什么技术问题,问了一下我什么时候能来实习,还有在校的经历,同学之间是如何评价我的,然后就结束了。
HR面:晚上回到宿舍就有短信通知,第二天参加终面,当时还在跟女朋友看电影啊,荒原猎人。正看到小李子跟熊搏斗,女朋友吓得不敢看,广州的电话来了,让我预约第二天的终面并且填一个单子。慌慌张张跑回去完成。印象里面那个问卷问的很全面,比如家庭状况、为什么选择去广州、什么情况下会放弃这份工作、小时候印象最深的一件事情、列举出近期让你伤心的事情以及你是如何处理不良情绪的。如果各位到了这一步,一定要谨慎作答,这些问题都会列入到综合评测中。后面的面试就是把这些问题现场问一遍,说是HR面,但我总感觉是高管面,一个高管面三个面试者。
面试出来之后,等做到地铁上,广州负责的CVTE校招的学长就已经告诉我通过了,效率非常高。3月26号拿到的offer,这是春招的第一个offer,当时的心情还是很激动的。
二、百度
百度是学长内推,技术面是两轮技术面试。
一面:简单的自我介绍,因为是电话面试,所以流畅了很多(你们懂的)。一个小时满满的技术问题,所以就不用向上面再赘述了,直接上干货
1.是否了解动态规划
动归,本质上是一种划分子问题的算法,站在任何一个子问题的处理上看,当前子问题的提出都要依据现有的类似结论,而当前问题的结论是后 面问题求解的铺垫。任何DP都是基于存储的算法,核心是状态转移方程。
2.JVM调优
其实我没有实际的调优经验,但是我主要介绍了一下JVM的分区、堆的分代以及回收算法还有OOM异常的处理思路
3.分别介绍一下Struts2和Spring
不用多说,这方面比我答得好的同学肯定大有人在,就不出丑了
4.职责链模式(设计模式)
GoF经典设计模式的一种
5.实践中如何优化MySQL
我当时是按以下四条依次回答的,他们四条从效果上第一条影响最大,后面越来越小。
- SQL语句及索引的优化
- 数据库表结构的优化
- 系统配置的优化
- 硬件的优化
6.什么情况下设置了索引但无法使用
- 以“%”开头的LIKE语句,模糊匹配
- OR语句前后没有同时使用索引
- 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)
7.SQL语句的优化
order by要怎么处理
alter尽量将多次合并为一次
insert和delete也需要合并
8.索引的底层实现原理和优化
B+树,经过优化的B+树
主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引。
9.HTTP和HTTPS的主要区别
10.Cookie和Session的区别
11.如何设计一个高并发的系统
- 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引的优化
- 使用缓存,尽量减少数据库 IO
- 分布式数据库、分布式缓存
- 服务器的负载均衡
12.linux中如何查看进程等命令
13.两条相交的单向链表,如何求他们的第一个公共节点
很简单的链表题目,博客上的做法一搜一大把,我记得当时答在兴头上,又给面试官解释了一下如何求单向局部循环链表的入口,链表中很经典的问题(其实链表也就那几个常用算法,比如逆制、求倒数第K个节点,判断是否有环等)
大概八十分钟吧,最后问面试官有没有对我的意见或者建议,面试官说觉得我今晚的面试表现比简历上写的更出色。。。对面试官的好感度瞬间飙升
二面:可能一面面试官对我的评价还算不错,二面面试官一口气考了我11个设计模式(手动微笑),对,是11个设计模式,有直接提问,也有在场景设计中引导我使用。总共加起来11个,分别是:单例模式、简单工厂模式、工厂模式、抽象工厂模式、策略模式、观察者模式、组合模式、适配器模式、装饰模式、代理模式、外观模式。然后就是设计一个公司下有部门、部门下有经理和员工,经理可以管理经理和员工这样的一个模型,组合模式一套用就行了。后面还问了几个非技术问题,比如和产品、测试发生矛盾了怎么处理,答应的任务发现完成不了该如何处理等,大家如果遇到请随意装逼。
百度给我最大的印象就是每次新的面试,面试官一定会问什么时候能来实习,能够实习多长时间,答案符合要求了才进行下面的面试。据说百度今年要求6个月的实习时间,回答两三个月的都再无下文。
机智的我不管哪家公司问都是说从即日起到大四毕业,中间出了期末考试和毕业设计,都能参与实习,近期就能参加实习。不是故意想骗人,只是目前还没有和HR谈条件的筹码,这样说了就算最后去不了,也算是一次面试机会,如果一开始就拒绝的话,连面试机会都没有。等到技术面试结束了,跟一开始比,就有了谈条件的筹码,这个时候大家再根据情况合理要价
三月的CVTE、四月的百度,现在该说五月的阿里了
三、阿里巴巴
阿里巴巴其实同样的简历,在内推阶段直接简历被刷,非常尴尬。但是有幸笔试蜜汁通过,所以收到了参加现场面试的通知。
一面:一面的面试官长得超级像张家辉,整个面试过程,我满脑子都是《激战》里面的老拳王,当他朝我提问的时候,我就想到激战里面的经典台词“怕输,你就会输一辈子”。不知道面试官老师有没有看出我表情的异样~闲话不多说,上干货。
1. 二叉树的遍历方式,前序、中序、后序和层序
二叉树本身就是一个递归的产物,那前序举例,访问根节点,然后左节点,再右节点,如果左节点是一棵子树,那么就先访问左子树的根节点,再访问左子树的左节点,依次递归;而层序,使用队列进行辅助,实现广度优先搜索
2. volatile关键字
给大家推荐两本书:《Java多线程实战》和《Java并发编程的艺术》,这会儿已经三点了,脑子有点乱书名可能未必无误。对Java实现多线程描述的非常详细。现场跟面试官老师扯了很多,我在这里挑主要的说
volatile关键字是Java并发的最轻量级实现,本质上有两个功能,在生成的汇编语句中加入LOCK关键字和内存屏障
作用就是保证每一次线程load和write两个操作,都会直接从主内存中进行读取和覆盖,而非普通变量从线程内的工作空间(默认各位已经熟悉Java多线程内存模型)
但它有一个很致命的缺点,导致它的使用范围不多,就是他只保证在读取和写入这两个过程是线程安全的。如果我们对一个volatile修饰的变量进行多线程下的自增操作,还是会出现线程安全问题。根本原因在于volatile关键字无法对自增进行安全性修饰,因为自增分为三步,读取-》+1-》写入。中间多个线程同时执行+1操作,还是会出现线程安全性问题。
3. synchronized
- 锁的优化:偏向锁、轻量级锁、自旋锁、重量级锁
- 锁的膨胀模型,以及锁的优化原理,为什么要这样设计
- 与Concurrent包下的Lock的区别和联系
Lock能够实现synchronized的所有功能,同时,能够实现长时间请求不到锁时自动放弃、通过构造方法实现公平锁、出现异常时synchronized会由JVM自动释放,而Lock必须手动释放,因此我们需要把unLock()方法放在finally{}语句块中
4. concurrentHashMap
两个hash过程,第一次找到所在的桶,并将桶锁定,第二次执行写操作。
而读操作不加锁,JDK1.8中ConcurrentHashMap从1600行激增到6000行,中间做了很多细粒度的优化,大家可以查一下。
5. 锁的优化策略
- 读写分离
- 分段加锁
- 减少锁持有的时间
- 多个线程尽量以相同的顺序去获取资源
等等,这些都不是绝对原则,都要根据情况,比如不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。这部分跟面试官谈了很久
6. 操作系统
这部分基本是跪着跟面试官交流的,因为非计算机专业,对这个楼主确实比较欠缺
不过好在前面的表现还可以,顺利通过了。
二面:十分钟休息,二面面试官先问了一些无关紧要的问题,比如学校的专业课、平时如何学习新技术等等,然后切入正题,让我选一个熟悉的项目,三分钟画出大体架构图,我在项目部分的准备还算充分,但是面试官真的水平非常高。
在项目部分,可能是我整个阿里面试过程中最提心吊胆的,缓存的使用,如果现在需要实现一个简单的缓存,供搜索框中的ajax异步请求调用,使用什么结构?我回答ConcurrentHashMap,可是内存中的缓存不能一直存在,用什么算法定期将搜索权重较低的entry去掉?我说先按热度递减放进一个CopyOnWriteArrayList中,保留前多少个然后再存回ConcurrentHashMap中,面试官说效率过低,有没有更高效的算法,我假装冥思苦想(用假装其实是因为,确实想不到方法)
后来面试官说其实这个问题有点难了,换一个,又跟我扯到线程的问题,大体就跟一面面试官问的差不多,就不赘述了。这部分感觉面试官还比较满意,就问题TCP如何保证安全性,我说三次握手、四次回收、超时重传、保序性、奇偶校验、去重、拥塞控制。还讲了滑动窗口模型。
后面又考了一些红黑树的问题,问到B+数,还有JDK1.8中对HashMap的增强,如果一个桶上的节点数量过多,链表+数组的结构就会转换为红黑树。
面试官问我项目中使用的单机服务器,如果将它部署成分布式服务器?我当时心里一惊,这个问题确实没有准备过,眼看就要被问死了,临时抖了个机灵,说有一次跟一个师兄尝试这么做的时候,遇到了session共享问题,然后成功地把面试官引向了session共享的问题,跟他讨论了10分钟左右的分布式系统中如何做到session共享。后面面试官可能也觉得我这部分
手写一个线程安全的单例模式,经典的不能再经典,没什么好说的,懒汉饿汉随便选一个。
还有一些MySQL的常见优化方式、定为慢查询等,回答的七七八八,之前面试总结的问题还有印象,所以感谢自己有面试完及时总结的习惯。
最后问了问我平时都如何学习、最近都在看什么书,来实习的话学校的考试如何解决等等。
面试官告诉我他的问题已经问完了,我看没有让我提问的意思,所以我起身跟面试官握了个手(我在参加现场面试的时候有这样的习惯,握手的同时跟面试官强调,“我很珍惜这次面试机会”)
二面出来之后挺紧张的,感觉自己答的还是有很多漏洞,可能面试官虽然发现了,但是觉得我态度不错,虚心学习,所以还是很幸运到了HR面,HR面就不多说了,只要不跟HR乱提要求,比如不考虑某某城市之类的作死要求,再跟HR好好谈谈我们对知识的渴望、希望得到锻炼的决心,我觉得都没什么问题(网易除外,都是泪)
我还重点给HR讲了一下我对项目的反思,哪些地方可以做的更好。又把一次学习新技术时间又很紧的尽力夸大了一下,HR听完之后表示非常羡慕我们这样搞技术的,感觉每天做的事情都很有激情。
最后就是经过三天的等待,顺利拿到阿里巴巴的实习offer
楼主从三月初到现在,基本能叫的出来的公司都参加了各种面试,很惭愧拿到offer的只有这三家。但是经过大大小小二三十次的面试,我觉得对一个后台程序员来说,重要的不只是语言,还有数据结构算法、网络基础、并发、数据库、设计模式、操作系统、linux等等很多很多技术需要掌握。我就有很强烈的感觉,单论Java,在楼主的周围其实有很多比楼主强得多的人,可是他们有的人面试一直不顺利,原因就在于其他的知识点相对薄弱。这点在阿里巴巴面试中就体现的很深刻。最后HR问我作为非计算机专业学生,什么专业课没有学到最让我遗憾?我回答网络基础、操作系统、计算机组成原理和系统的数据库知识体系。虽然侥幸拿到了阿里巴巴的offer,但这一次的面试让我深深地看到了自己差距。跟二面面试官交流的时候,他考我项目,我就拼命想把他往框架上拉,想解释hibernate和Spring还有mybatis,结果面试官一次也没有上当。每当我说这些的时候,面试官就会打断我,说我不用解释框架,我们就建立在这些东西都双方都清楚的基础上。所以真心劝各位准备面试的朋友们,多重视基础。基础能够决定学习能力和思维方式,而学习能力和思维方式最终决定一个程序员能走多远。
以上是我对春招面试的部分总结,手上还有十份左右的手写面经,都是每次面试完当天晚上自己总结的,有需要的朋友可以私信我。
最后祝看完这篇文章额所有朋友,找到自己心仪的工作,程序员都不容易。
最后的最后,牛客在过年到现在这段时间对我的帮助非常大,有我寒假怒刷2000题,也有后面疯狂提交代码(疯狂报错),是金子总会发光,在我的带动下,整个实验室都在刷题,总之祝牛客网越办越好