【黑板报】分享阿里巴巴面试心得

 

经验总结...





0 引言

在成功拿到阿里的实习offer之前,我已经有过两次面试的经历,但最终都被GG了(后面作总结我会分析原因)。对于像我这样向来自信甚至带点小自负的人来说,是相当受打击的。好在两次失败的经历并不是只有坏处,最起码下次面试的时候不会再怯场,还有一点更重要的,通过这两次面试,我大致摸清了阿里的整个面试流程以及套路。客观的讲,面试除了自身的实力以外,技巧性是相当重要的,我相信,不管是一个技术再厉害的大牛,如果没有对整个面试环节有一个大致方向性的把握,对于面试官所要提问的内容毫无准备,谁也不敢保证说这个offer我肯定可以拿到。因此,我在这里分享下自己的经验,希望帮助更多人,在面试过程中可以少走一些弯路。

1 笔试

先来说一下笔试部分,对于阿里的笔试难度来说,以我曾经做过的网易、蘑菇街笔试难度来比较的话,大致应该是:阿里>蘑菇街>网易,当然这里仅仅考虑了难度,抛开了各个公司的评判标准。比如说,阿里的笔试你考60就给你过了,但是网易可能就要你考75。阿里的笔试题总共包括两个部分,前面一部分是选择题,总共20道,时间是40分钟。也就是说,40分钟后,不管有没有做完,选择题会自动进行提交,然后你才可以继续做第二部分。从我做下来的情况看,时间相当得赶,基本上会来不及。题目内容大多是一些智商题,概率论,操作系统、网络等基础题。给我的感觉是,只要是技术面,选择题都是从一个大的题库中随机抽取,而不是跟某个具体的岗位挂钩。比如一些概率题,会有考察贝叶斯公式的,一些智商题,可能需要你用到简单的动态规划来推算。个人认为,选择题部分主要还是在考察一个人的基本功还有他的知识面。第二部分总共有三道大题,时间好像是两个小时,有点记不太清了。一般情况下会考一道算法题,难度不会太大,但是如果你没做过这样的题目,基本上还是做不出来。我举几道笔试原题:

在一个数组中,有若干个数,每个数字都出现两次,也就是说数组中如果出现了一个2,那必定存在另一个2,除了一个数仅仅出现了一次,如何在空间复杂度为O(1)的情况下找出这个数。

这道题目如果你有做过,你会发现解决问题的方式相当巧妙。具体答案可以自行百度,这里不赘述。

从100个数中随机抽取K个数,要求K个数不能重复。

你也许可以马上想到用暴力的解决办法,如果重复了,那再次抽取,直到抽完K个数。这道题目也有巧妙的解决办法,详见《编程珠玑》随机数那一章。

另外两道题目,以我的经验,一般会出现一道并发编程题,往往它会给你一个场景,让你提供一个解决方案,比如说设计一个活动抢购之类的程序。这些题目,大多万变不离其中,从最本质上来说,它可能仅仅是让你写一个生产者消费者模式或者是哲学家吃饭思考的问题。

一般情况下,笔试部分选择题做得不是很差,后面三道大题能做出两道来基本上就过了。

2 面试

再来说下面试,在这里,我不想条条框框得把我面试到的问题都列出来,因为那样毫无意义。问什么问题都是取决于interviewer个人的,没有什么所谓的题库,他想到问什么就问什么,当然也会根据你自身的实际情况来做提问。同时为了避免泛泛而谈,我可能也会以几个实际的面试题为例。

一般情况下,总共会有三轮技术面+HR面。如果你参加的是内推,所有的都是电话面试。对于我来讲,我更喜欢与面试官一对一面试,通过一些肢体语言和纸笔,有利于把一个问题更好得表达清楚,我并不惧怕现场写代码。在这方面,网易做得就比较好,先通过一轮电话面试筛掉一部分人,然后再参加现场面试,对于外地过来的同学,车票可以报销。如果你参加的是校招,通过了笔试,一般会邀请你去一个酒店进行面试。

面试一般会让你先做个自我介绍,这时候不要再去重复得介绍一些个人信息,面试官跟你面试的时候,肯定是已经拿到你的个人简历了,可以介绍一下自己平时经常做的事情,自认为比较擅长的或者自己喜欢的,自我介绍一分钟足矣,在这过程中,应该是让面试官知道你擅长什么,从而引导面试官有针对性的提问。接下来会问一些项目经验,你应该是挑一些有一定的含金量,并且印象比较深刻的(面试前,有必要回顾下做过的项目)。大致可以按照这几点来介绍:自己负责了哪个模块;把这个模块的大致流程介绍一遍;在做这个项目过程中碰到了哪些问题,最后是怎么解决的;最后就是对这个项目的收获。介绍完项目经验以后,面试官开始自由提问,以我多次面试的经验来看,面试的问题都不会太难。我可以大致给出面试的提问范围:

  • 关于java虚拟机,你需要知道JVM的内存结构,垃圾回收机制,内存分配策略,类的加载机制以及内存模型。以上这些请参考周志明的《深入理解java虚拟机》。
  • 熟悉java各个容器的实现,例如HashMap、ConcurrencyHashMap等,最好去阅读源码,这次面试关于HashMap原理三个面试官问了我三次,重要程度不需多说了。
  • 熟悉java并发编程,尤其是java.concurrency包下的api,并发作为一块高级内容,对于很多人说,很少接触,也很难将其掌握。幸运的是,面试官在这一块都不会考得太深入,推荐《java concurrency in practice》。
  • 熟悉常用的数据结构、算法。很多人认为算法在实际项目中根本用不到,并且觉得算法太难,就疏于学习。那为什么所有的大公司都喜欢考算法呢?尤其是像微软、facebook这样的巨头?算法不仅需要必备的理论,更需要亲自动手,有关算法的书籍更多,找一本适合的就可以了,题库推荐leetcode。
  • 其他还有像设计模式、数据库都很重要,这些东西并不是靠一两个月就能掌握,还是需要平时多积累、总结。推荐《head first 设计模式》,如果有你认为学习能力强,可以直接看四人帮的《设计模式》,数据库就不多说了。
在这里,我并不是想给出一个面试宝典一样的东西。事实上,上面列出的东西,没有两到三年的时间学习,根本掌握不了。要想成为一名技术大牛没有捷径。还是希望大家可以认真踏实的学习,一旦你真正掌握了这些,面对面试官的提问基本上可以达到游刃有余。

3 总结

总体来说,大多数企业考虑到校招针对的是在校学生,面试都不会出现太难的题目。然而在如何学习这个问题,笔者还是有话要说的,我见过很多人,光看书或者视频,忽略了实践,最终的结果就是我能看懂代码,但是我不会写。更有甚者,拿着一本与自身水平不适应的书例如《think in java》在那里啃,导致自信心大受打击,学习兴趣骤减。武侠小说告诉我们,练一门与自身功力不相符的武功只会走火入魔。我在学习马克思主义的时候,对里面提出的思想观点是相当抵触的。但是有一点关于理论与实践的辩证关系,我深表赞同:实践是理论的基础,理论对实践有反作用,理论和实践是相辅相成的,缺一不可。我曾经遇到一位长者,他目前的职位是产品经理,问我在学校有没有项目,我说基本没有。然后他以一种教育的口吻跟我说,你这样会荒废掉的。我笑而不语,如果非要用一张图来描述我的表情的话,应该是这样的:

我刚才强调了实践的意义,但是我认为,如果你做过类似的项目已经足够得多,就不要再去做重复劳动。我无意去贬低在学校做的项目,但是事实就是如此,99%的学校里的项目只能算个Demo。试问,有谁考虑了代码是否足够Elegant?是否足够Robust?是否足够Security?如果没有,那就远远达不到作为产品级别的工业强度!那么这样的项目做得再多也是无用功。

另外,文章开头谈到我两次失败的经历,都是到了HR面,有人说能面到HR,基本上就已经过了。而我两次都败在了HR面上,我甚至一度怀疑自己是不是情商有问题。在HR面的整个过程中,给人感觉还是比较轻松的,就跟平时聊天一样,基本上都是一些比较开放性的问题。但是一定要能够说得通,不能出现前后矛盾,那面试官肯定以为你是在忽悠。另外,不要把自己的缺点说得太过直白,笔者就是因为吃了这个亏。好了,作为一个HR面的loser,我就不多说了。

最后,如果面试失败也不要灰心,面试很大一部分是有运气成分的,笔者不乏见过很多被BAT刷掉,最终去了微软谷歌的,你能说他们技术不够强硬?重要的是每次面试后,都能做反思、总结,吸取经验教训。

【文章转载自 简书 作者 雨停就走】




    关注 求职黑板


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册