1. 引言
继上次“百度2015校园招聘面试题回顾录(成功拿到offer)”文章过后,大家都希望除了题目之外。最好能给出自己当时的回答情况,看看有没有什么回答技巧,这样更有參考价值。
嗯,建议的非常对,因此这次对于阿里的面试回顾。我以下以对话的形式尽可能复现我当初的面试场景。
声明:以下仅仅复述我觉得有參考价值的面试题,实际面试题比这多些(有些不记得了),须要找工作的请认真看完(对Java方向的同学更有帮助),不须要的大牛们请一笑置之。
2. 阿里面试回顾
在说具体的面试场景之前。一个小插曲非常有必要说一下:
因为我面的是Java开发,但当时负责人员给我安排了一个C++面试官(在面试官桌子上放着一个“C++方向”的牌子)。然后我就跟负责人说“我是面Java方向的,不是C++方向的”,结果那个面试官笑呵呵的说“没关系,在我这面一样的,假设你不懂C++,我能够不问你C++语言方面的细节问题”。当时我心里想:尽管我C++学的和Java差点儿相同,就算面C++也没有问题。可是既然面试官这么说了,肯定不问C++了。Java预计也不会问(C++方向的project师不一定懂Java呢),应该是问数据结构、算法、网络、操作系统方面的问题了。尽管都有所准备,面起来也能够,可是鉴于两个方面的原因,我还是没答应在这面。
(1)据说阿里90%都是招Javaproject师,假设在这面后面肯定会以为我是面C++的,胜算就少了。
(2)我这几个月基本上都在专研Java方向的知识,也研究了不少JDK源代码和Java相关的项目。感觉自己的Java方向知识有了一个质的提高,因此希望面试官能够考查和检验我这方面的知识。因此我当时跟那个面试官说“不好意思,我还是希望能面Java方向的知识”,那个面试官依然笑呵呵“假设你对Java知识的确非常自信。那么能够给你换个Java方向的面试官”,然后我仅仅能说“是的,我有研究过非常多JDK源代码。也做了不少Java项目”。
最后,我出去找负责人给我安排Java方向的面试官,负责人说“那你要等会儿才行,预计要半个小时”。
“哦,没关系。那我等会吧”,心里想:等不怕,方向搞错了才要命。
说上面这段插曲的目的是想告诫大家,假设你有比較明白的方向。比方“我以后一定要做C++/Java方向的开发”,那么一定要强调出来。
假设像阿里这样每一个面试官都有个方向牌那非常容易搞定,假设没有则能够在面试一開始的自我介绍或找其他机会说出来让面试官知道,可能有人觉得语言不重要,关键是算法、数据结构、操作系统云云……是的,非常多面试官都跟我说过:在以后的工作过程中。语言不重要。重要的是你以后做的东西是不是你感兴趣的。可是我觉得语言在面试过程中是有非常大的关系的。假设你是C++方向,那么面试官可能会问你一些虚函数机制、Linux下的内存分配策略、内存管理、经常使用系统调用等这方面的知识;假设你主攻Java,可能会问集合类差别、可研究过jdk源代码、数据库等方面的知识。
因此面试的第一步就是让面试官明白知道你主攻的语言方向(可能也有较好的面试官会在提问之前首先问你懂Java还是C++),假设你两个方向都非常懂并且没有比較偏爱的方向,那就无所谓了。
一面:技术面(大概40 minutes)
半个小时没到。终于给我安排了个Java方向的面试官,这次交流非常愉快。以下的“面”代表面试官。
第一阶段:自我介绍
面: 请简单自我介绍下。
我: 我是XX大学计算机专业的一名XX,我研究生期间的方向是XX。……(方向简单描写叙述)。12年暑期在XX公司实习了4个月。做的是XX(在一所不知名的本地小公司实习过)……(其他重要项目的简述)。另外,自己是名开源积极分子。有自己的Github,并且今年暑期參加了CSDN举办的开源夏令营活动,做的是……
阶段总结:上面仅仅是我自己当时的一个简单自我介绍,经验不足讲的比較乱。并且忘了讲自己十分热衷技术,平时喜欢写技术博客等事情(有些情况下能够加分呢)。
建议大家都定制好自己的版本号。讲出自己的亮点。
第二阶段:介绍研究生期间的论文项目。针对介绍提出几个相关的技术问题
面: 好。我看下简历。(然后对着我的简历看了十几秒,指着我的第一个项目)这是你刚说的研究生的论文项目吧(我嗯),那你把这个项目具体说下。
我: 我从项目的选题(为啥要做这个方向)、项目採用的技术、新颖的地方、终于达到的效果(因为我做的是某个算法的性能提高,那么我就会讲速度提高了多少?空间压缩了多少?)这几个方面具体介绍了自己的项目。
以下就是针对我的叙述具体问了几个技术相关点,这没什么好说的,因为每一个人做的项目不一样。问的东西也不一样。
阶段总结:事实上要求讲的这个项目是用C++写的而不是Java。只是没关系。对于项目而言。语言就不是非常重要了,关键是项目的架构、所採用的技术、能达到什么样的效果。
面试官选的项目一般要么是简历中项目经验的第一个、要么是有他感兴趣的、要么项目做的时间比較长的。因此建议在写简历时,把你觉得最有把握的项目放在第一位(而不是传说中的要按时间倒序来写项目经验),没太大把握的不要写(被抽问到就慘了)。仅仅要你真真正正的吃透了被抽到的项目,那么这个项目提问阶段是全然easy的。
第三阶段:Java方向的知识。包含JVM原理、垃圾回收机制等
面: 你Java学的怎么样?
我: 还能够,有研究过部分JDK源代码,比方经常使用的集合类如HashMap/Hashtable、ArrayList/LinkedList、Vector等。还有Java5之后的并发包JUC如concurrentHashMap、Executor框架、CopyOnWrite容器等。
自己非常赞赏Java巧妙的垃圾回收机制。看过周志明的《深入理解Java虚拟机》,因此对JVM相关的知识有所掌握……
面: 嗯,学的挺深的。那你把JVM的结构和类载入原理说下。
我: 立即拿起桌上的笔和纸,把虚拟机执行时包含的几个数据区和执行引擎画了下。包含方法区、虚拟机栈、本地方法栈、堆和程序计数器,然后介绍每一个区域有什么作用,最后讲ClassLoader的类载入机制。还顺便说了下双亲委派机制。
面: (面试官点头表示惬意)你刚刚说Java的GC机制非常巧妙,那么它的巧妙之处在哪里?
我: 我从两个方面说下自己的理解:一是Java的内存分配原理与C/C++不同,C/C++每次採用malloc或new申请内存时都要进行brk和mmap等系统调用,而系统调用发生在内核空间。每次都要中断进行切换,这须要一定的开销,而Java虚拟机是先一次性分配一块较大的空间。然后每次new时都在该空间上进行分配和释放,降低了系统调用的次数。节省了一定的开销,这有点类似于内存池的概念;二是有了这块空间过后。怎样进行分配和回收就跟GC机制有关了,然后我具体介绍了GC原理、绘图表示年轻代(Eden区和Survival区)、年老代、比例分配及为啥要这样分代回收(我觉得巧妙就在于这里)。有了GC基本结构后。我又详述了下GC是具体怎样进行内存分配和垃圾回收的。
面: (面试官一直点头表示对我回答的赞同)嗯,看来你对这块的确掌握了。对了,你说你參加的CSDN开源夏令营项目是阿里的是吧(我点头)。这个夏令营是什么情况?
我: 我简介了CSDN举办此次夏令营的目的。顺便说道此次夏令营活动当初有2000多人报名參加,终于仅仅筛选出60多名。自己凭着开题报告和对开源的热爱赢得了导师的青睐得以入选。
面: 你导师是谁?
我: 淘宝的XX。
面: 哦,他啊,我认识呢,他是……(后面就简单闲聊了几句。该阶段结束。面试官让等会儿准备二面)
阶段总结:上面的对话有人看了过后可能会说:好简单啊。问的题目都是你会的。当然能过啦。是的,事实上这是有技巧在里面的,就是要想办法“先下手为强”,啥意思?即让自己成为主动摊牌者而不是被动回答者。找机会跟面试官说自己熟练掌握了哪些方面的知识、自己喜欢专研什么等等,就像上面我所做的。一開始摊牌说明自己掌握的知识处在哪些地方,引导面试官去问你想让他问的知识点,这样达到双赢的目的(你爽了,面试官也轻松了,因为他不用老是猜你可能知道哪些东西然后试探性的问你这个会吗那个了解过吗)。
二面:技术面 + HR面(大概1 hour)
一面非常轻松的就过了,可是二面就相对而言有些吃力,问的全然是项目相关,并且不是我最熟的研究生期间的论文项目,而是另外两个项目。因为复习不到位,某些地方回答的不完好。
第一阶段:自我介绍,同上
第二阶段:介绍面试官感兴趣的两个项目,一个与推荐系统相关。还有一个与Java web相关
面: 介绍下你简历上的这个电影个性化推荐引擎。使用的是哪种推荐算法?
我: 改进的基于用户的协同过滤推荐算法。
面: 那好,那你从项目的基本架构、所使用的算法原理、怎样改进的、数据怎样处理这几个方面介绍下你的项目吧。
我: 我首先画了下项目的架构图。据此图具体讲了下UserCF的原理及怎样使用用户的社交数据和六维理论改进传统的UserCF,并写出了改进后的算法公式。
然后又说这个项目的数据多大,代码中採用什么数据结构进行处理的。
面: (介绍原理中提到了利用用户类似性来作为推荐的一个參考,面试官追问)那用户的类似性你怎么算的?
我: (汗,这个有个计算公式。我不太记得了,最后依据自己的理解讲了下余弦类似性的计算方式。公式没写全。面试官问公式里的根号怎么算的,我说直接用Java的库函数)
面: 你这数据哪来的?有几类数据?数据的存储格式是什么?
我: (该项目时间有点久了。前几天仅仅复习了项目的总体架构和算法原理,忘了看具体的数据了,这里仅仅能凭自己的记忆讲了下数据的存储格式。回来后发现自己讲的尽管没错但不够具体)
附:该电影个性化推荐引擎我早已经放到了自己的Github上面,是自己在老师的指导下做的,纯算法,还比較简单有待于改进。
介绍完了这个项目,立即面试官又看中了还有一个Java web相关的项目。立即追问。
面: 嗯,你这个XX系统是用ssh2框架做的,那你对这个框架熟吗?
我: 嗯,当时在公司实习时对ssh的掌握程度仅仅是会使用级别,那时候没时间去研究框架背后的原理。
后来有闲暇时间后,我就深入研究了下这几个框架的原理,还看了部分spring的源代码,学到了不少知识。
面: 嗯,那你把这三个框架都介绍下。
我: 我開始按自己的理解按Hibernate、Struts、Spring的顺序開始讲,Hibernate讲到它的使用原理及与iBATIS的对照,顺便说了下如今似乎大家更倾向于使用iBATIS、myBATIS这样更加灵活的轻量级框架。
struts讲了下它的作用就是“将请求与视图分开”,然后讲述从输入url到使用struts处理的控制流程(struts从tomcat那接管、action处理),然后也说struts如今似乎也不那么倾向于使用因为它有漏洞。最后重点讲了下重头戏Spring。具体讲述了它解耦的功能、AOP原理及自己有利用动态代理简单模拟实现过一个简单的AOP功能、IOC(DI)等。
最后说。从web应用层面上看。Hibernate属于持久层。struts属于表示层。而Spring却贯穿全部于全部层(表示层、业务层、持久层),Spring也有自己的MVC模块、web模块及JDBC和DAO模块,仅仅是非常少使用,也就是仅仅用一个Spring也是全然能够的。
面: (点头表示肯定)你刚说到struts有漏洞,那么Hibernate是安全的吗?有没有可能发生xss攻击和sql注入攻击?
我: (汗,这个问题真心没想过,对Hibernate的掌握没有Spring那么深,仅仅能硬着头皮按自己的理解回答)这个问题没想过,只是我觉得框架没有绝对的安全。Hibernate是用来操作数据库的,hql语句里也有select、where推断。应该有可能发生sql注入攻击,xss攻击就不太清楚了。(这个回答太糟了)
面试官没说啥,一直在电脑上写着什么东西。这时候旁边的HR终于发话了。
HR: 你本科是哪的?为什么选择考研?
我: 開始说出我的“发家史”,从一所不知名的小二本考到了中科大,……
HR: 那你技术上是怎么学习的?
我: 又从本科说起,本科技术非常差,到了研究生期间才真正開始技术上的修炼。……balabala
HR: 你的职业规划是什么?
我: ……(每一个人的想法不一样)
HR: 你最大的优势是什么?
我: (自己吹吧,也要依据实际情况看)
……
阶段总结:再次说明项目的重要性。第一个项目有些记忆模糊。答的有瑕疵,这里要引以为戒(一定要对项目知根知底),第二个项目感觉答的还能够,只是Hibernate安全问题没答出来,我觉得仅仅要你其他问题答的非常好,有个别问题答不出来是不会影响终于的offer的。
HR面也非常重要,你得说通了。须要提前考虑好常见问题的回答。
第三阶段:到你提问了
*发挥阶段,能够问问公司内部的培养计划、晋升机制、是否经常有大牛分享技术让我们学习等等……
3. 总结
(1)整个面试过程中没让写代码。没问Linux下的一些知识,也没问操作系统、计算机网络相关,我觉得可能是Java面试更倾向于从项目中问相关的技术问题,假设你没项目或项目不多,那么就可能问这些计算机基础知识了。
(2)因为之前内推电面的失败,让我丧失了一些小自信。因此在这次阿里的总体面试过程中还是有些紧张,大家请引以为戒。务必在面试中保持淡定的心态,就当是和朋友在一起交流技术问题。
(3)最后,希望我上面对话形式的面经能够给正在找工作或以后找学生工作带来一些参考。我希望你能够从某些问题和答题技巧的准备工作取得了看。
版权声明:本文博主原创文章,博客,未经同意不得转载。