2017年9月5日更新:猪厂offer已到手.
利益相关:2018届二本师范类大学网络工程专业本科生,应聘的是猪厂杭州的跨境电商事业部,也就是考拉海购。
之前看了这么多别人的面经,今天趁着还没把昨天面试的问题忘光,赶紧写出来分享一下攒攒人品。
总体感受
昨天在猪厂呆了一天,感觉环境还是非常nice的----园区虽然不大,但是里面设施齐全:免费的食堂、健身房、咖啡吧、邮局、银行、考拉和严选的线下实体店以及网易农场的水果店等等。
早上拿着面试短信进公司大门的时候行政小姐姐对我这种面试安排在下午结果早上就过来了的同学表示非常的惊讶,然后问我为啥这么早就来了。我也不能说我是想来蹭饭的吧?唉,只好说是因为买的早上到杭州的火车票,下了火车没哪里去就直接过来了。她一脸不相信的样子(用家乡话来说她可能打心底就觉得我是个要佬吧 哈哈哈哈)然后放我进去了,并且叮嘱我不许乱跑,只能呆在C栋的一楼。嗯,结果我转眼就溜进餐厅吃早餐了。
后来上午在咖啡吧稍微准备了一下,看了看项目代码然后随便逛了逛,中午吃完饭就去等面试了。
一面(50分钟左右)
一面面试官看起来还是挺和蔼的,先让我做自我介绍然后他一边看我的简历。
问题列表
- 我看你简历上写到了熟悉JVM虚拟机运行机制,你能给我介绍一下Java虚拟机运行时数据区域吗?
于是我就向他要了张草稿纸,把运行时区域画了下来比较全面地讲了一遍,并且把Java虚拟机中的一些东西和底层操作系统中的东西作了以下对比,后来面试官点了点头,就问下一个问题了。
其实我对Java虚拟机还是蛮熟的,看了很多关于这方面的知识。平时在学习的过程中也写了不少关于这个的博客,对这部分知识不太熟悉的同学可以参考一下我的博客。
深入理解Java虚拟机---自动内存管理机制
Java虚拟机规范(Java SE 8版)读后总结
- 我看你对虚拟机挺了解的啊,垃圾回收你了解吗?给我讲讲
我先讲了下内存布局中的新生代、Survivor区域以及老年代的划分,然后讲了下对象动态年龄判断、分配空间担保等。接着从引用计数法开始讲,后来我说虚拟机中一般都不会用这个垃圾回收算法了,然后面试官打断了我让我直接从可达性分析开始介绍。我又把GC Roots的判定,哪些对象可以作为GC Roots、G1垃圾收集器的回收过程等讲了一遍。面试官看起来比较满意,就没继续深入地问虚拟机相关知识了。
在这里要强烈安利一本关于垃圾回收算法的书,是一个日本作家写的,R大在知乎上也安利过这本书。(在这里要感谢@zpauly去狼厂实习的时候没把这本书带走而是留在了寝室,我正好前两天翻了翻,还了解了一下保守式垃圾回收和增量式垃圾回收)
《垃圾回收的算法与实现》
- 你说你阅读过某些主流WEB框架的源码(Spring IoC和AOP),那么你告诉我IoC中会有AOP吗?
额...之前还这没想过这个问题,因为这两部分我当时都是分开来看的,并没有总结它俩之间的联系。后来我说AOP中要生成代理对象,而由于控制反转的存在,代理对象的生成以及其生命周期的管理工作肯定是需要IoC容器来完成的,所以我觉得它俩之间有一衣带水,紧密相连的关系。
- 那好吧,你说说看BeanFactory和FactoryBean有什么区别?
我说BeanFactory定义了IoC容器最基本的形式,相当于在Java语言中的Object一样,是所有IoC容器的基类。我们在实际进行框架开发的过程中不会直接拓展BeanFactory,而是用它的子类DefaultListableBeanFactory。然后我在描述FactoryBean的时候不知道怎么组织语言,说了一堆之后面试官说:你这说了等于没说嘛。后来还被吐槽到底有没有认真看过源码。我晕...后来面试结束之后我觉得应该把FactoryBean描述为类似于一个工厂方法中生成对象的一个东西。
下面是我之前写的相关博客:
Spring源码探究:IoC容器初始化过程详解
Spring源码探究:IoC容器在Web容器中的创建及初始化
Spring源码探究:深入理解Spring AOP的设计与实现
- AOP中动态代理的实现机制你了解吗?给我说说原理。
一开始我以为面试官直接让我说底层实现机制,稍微讲了下JDK动态代码实现方式我就开始讲它的源码了,后来面试官说没让我说源码,只是看下我知不知道怎么用。然后我就把JDK动态代理以及CGLIB动态代理讲了一下。因为前几天刚写了博客,所以非常熟悉。
深入理解JDK动态代理机制
深入理解CGLIB动态代理机制
- 你说你熟悉Mysql,讲一讲吧
这里讲了一些很基本的东西,包括ACID、隔离等级、Myisam和Innodb两种引擎、Innodb索引的底层实现(b+树)、b+树的原理、然后拓展地讲了下b树和b*树,说了它们的优势劣势。在我后面讲项目的时候还提到了封锁协议以及封锁等级等等。
可以参考下我之前的博客,我觉得总结的挺完善的。
数据库相关知识回顾与总结
- 你这个秒杀系统还挺有意思的,我们来说说这个吧
网购模拟秒杀系统是我之前学习了大型网站架构以及系统优化相关知识之后动手实现的一个小Demo,由于面的是考拉,所以之前又把项目好好看了看。面试的时候谈了很多关于系统优化、并发削峰以及流量控制、数据冷热备份的问题,这里不详细讲了。感兴趣的同学可以买下面这两本书来看看。
大型网站技术架构
大型网站系统与Java中间件开发实践
后来面试官就说可以了,然后让我过十分钟去前台问有没有面试。因为感觉一面表现蛮好,我就找了个地方又把项目代码看了一遍,因为怕二面深入地问项目。
二面(20多分钟)
二面真的是非常迷.....因为全程都在问算法题,后来和zby学姐一起吃晚饭的时候交流了一下,我们都觉得二面面试官是做数据挖掘或者是大数据方向的。
- 你做个自我介绍吧,我先看下一面面试官对你的评价。
- 一个链表,求中间结点
第一题还挺简单的,leetcode上很多和链表有关的题目都会用到这个,很快就写出来了。
- 有两个int类型的数a和b,你能写出几种交换它们值的办法?越多越好
中间变量、异或、用两数和加减运算(这里可能会发生整形溢出)
- 一个1TB的文件,你有什么最快的办法能够求出重复次数最多的TOP5行数据?
这题答得不好。。
- 给你1到100万的连续整数,我从中取出一个数然后打乱数组,你给我求出被取出的是什么数。
这题真的很迷。。我一开始说排序之后遍历,他说达不到他的要求,于是我就知道想要时间复杂度为O(n)的答案。我就一直在往二进制异或之类的方面靠,后来还是没答出来。结果今天早上突然想到一个用高中知识完全可以解决的办法:用等差数列求和公式求出1到100万的和,然后再一一减去数组中的数字,就可以求出被取出的数了。
二面之后心里十分的忐忑,心想肯定得GG了,结果去前台问了下说还有hr面。
hr面
hr面就比较轻松了,就像聊天一样。
- 做个自我介绍吧(主要是校内生活、竞赛经历、奖学金、学生干部、辩论队、专业学习等)
- 你是网络工程专业的学生,其实培养方案不太侧重软件开发吧?说说你平时都是怎么进行自学的啊?
- 为什么不考研?
- 之前投过其他公司吗?
- 这几个项目中你主要承担什么角色?
- 如果拿到了offer什么时候可以来实习?
以上。