2015暑期实习面试分享(阿里巴巴、网易杭研)

#interview #internship #alibaba

最近两个月一直在找暑期实习,一开始觉得最近一年的实习经历能给自己加很多分。然而投了很多份简历,有的石沉大海,有的在途中被刷。期间对自己产生过质疑,也感到过气馁。然而挫折也有它好的一面,它让我发现并直面我的不足,从而不断提升自己。每天下班以后虽然疲惫,但仍然坚持花些许时间读一些关于coding的书,刷一两道leetcode。
终于在前几天拿到了阿里的offer。在这里简单记录一下这段时间笔试和面试的经历和收获。

概览

  • 阿里内推 (客户端):技术一面 -> 技术二面 -> 终面/hr面
    显示二面未通过,被回绝
  • 腾迅网申 (客户端):简历没通过 -> 霸面失败
    hr转告说:面试官看了简历觉得和职位不匹配,不想面你
  • 百度网申 (客户端):在线笔试 -> 目测笔试没通过
  • 微软网申 (Software Engineer):在线笔试 -> 目测笔试没通过
  • Google网申 (Software Engineer):石沉大海
  • 网易游戏网申 :石沉大海
  • MSRA网申 (Software Engineer):收到一封邮件说过了第一轮的简历screening -> 石沉大海
  • 阿里网申 (客户端):在线笔试 -> 技术一面 -> 终面/hr面 -> 收到offer
  • 网易杭州研究院 (JAVA后端):技术一面 -> 技术二面 -> 收到offer

详细

### 阿里内推 三月初阿里网申,申完看到内推可以提前电话面试,遂在网上四处找人帮忙内推。在这里也要感谢帮我内推的同学给了提前感受面试流程和氛围的机会。
一面主要问了一些项目相关的东西以及基础知识。最近一年实习做的项目都是实打实的,没有什么水分,所以就算被追问一些细节也应付的比较轻松。基础知识方面主要包括了TCP、UDP的区别线程进程的区别堆和栈的区别等等。其中堆和栈的区别回答错了,其实在这个时候我已经意识到对很多基础知识的掌握不太扎实,然而并没有引起我足够的重视,导致了之后面试的失利&被鄙视。 过了一个礼拜以后二面,上来就讲到了JAVA的并发编程和IO,结果发现自己连 wait()&notify()怎么用stream和reader有什么区别都没有搞清楚,面试全程有一多半的问题答不上来或者答的有问题,面完就觉得肯定过不了了。
没想到第二天接到电话终面,约了晚上九点面试,放下电话就开始看并发编程和IO,然后抓紧时间浏览了几篇面试常见问题。面试上来并没有如我所想问technical的问题,而是问我之前是如何发现问题和解决问题的,顿时感觉一拳打到了棉花上。当时我就举了之前是如何解决一个app的OOM问题,但是我最后说的解决方案并没有得到面试官的认可,他追问我对GC算法的了解如何,我无言以对。之后hr问的几个behavior的问题答的也不是很好,最后意料之中的挂了。 这次失败让我重新审视自己的不足,并给了我努力提升的动力。


### 阿里网申 内推失败以后四月初参加了阿里的在线笔试。当时正好要出去旅游,只能带着电脑在机场的星巴克笔试。
具体题目已经记不太清了,前面大概有20道选择题,基础概念题和逻辑思考题为主。最后三道简答题,都是关于客户端编程的优化的。一道是安卓开发如何考虑兼容低API level的设备,还有一道大概是安卓的app如何更快的加载和打开。笔试总体还算比较简单,我身边所有申阿里的都通过了。
接下来五月初到广州面试,面试的场地和流程都非常有序(与鹅厂相比),休息区有一个大屏幕,轮到你以后会语音叫号并显示面试的地点,甚至还有短信实时通知。一面问项目比较多,面试官应该可以看到我上次内推的面试情况,所以还着重问了我之前面试没答好的几个问题,包括GC算法和多线程。整体答题情况还不错,不过我每回答一个问题面试官就会笑,笑出声音的那种,让我心里完全没底。每次反应都是:我答错了了么?然后说稍等,我再仔细想一想,最后又想不出哪里有问题,搞得心里有些紧张。之后面试官让我手写一个Singleton,我写的大概是这样:

public class A{
    private static A a;
    public static getInstance() {
        if (a == null) {
            a = new A();
    }
    return a;
    }
}

面试官看了一分钟说,你这个多线程下面有问题啊,我一看赶紧在getInstance()前面补了一个synchronized。 最后面试官问有没有看过JAVA的源码,我说看过一些,他就问我hashmap的初始load factor是多少,我说0.75,我回答完他又开始笑。我说不可能啊这个我很确定,他说你要对自己有信心,要确定自己的答案。一面差不多就是这样,面试官都没有给我问他问题的机会就叫我出去等着,我当时心里一凉,但是五分钟以后接到短信通知二面,赶紧屁颠屁颠就进去了。
二面是终面面试官和hr一起面,先是技术面,后是hr面。技术面也是从项目谈起,我提到我做过一个看新闻的app,他就拿网易新闻问我一些常见功能的实现方法。之后问的问题也是基础为主,包括TCP和UDP的区别TCP的握手次数OSI model结构, switch、hub和router的区别, JAVA并发编程非对称加密等等,问题涵盖的面非常的广。后来聊到之前上课做过收音机还问我降噪电路是怎么做的,我只能回答忘记了。。。
hr面比较轻松,问了一些有没有帮助过同学有没有做过老师觉得可以但是你自己不太满意的项目之类的问题。


### 网易杭研 今天刚刚接到hr的电话说通过了面试,但是我已经接了阿里的offer,只能和hr说不好意思。
网易申的职位不是客户端,所以相关的经验会少很多,不过还好仍然是JAVA。为了准备一面周末特地找了本书突击了servelet的基本原理。
一面最主要问得是TCP的基本概念,问得比较细,问到了congestion control和flow control,涉及了slow start、sliding window等等很多基础概念(面试的时候基本上是边说边想,学基础protocol已经过了挺久的了有些都忘的差不多了)。之后问了JAVA的并发编程主要有哪些做法,我说有可重入锁、wait&notify、concurrent collection的库以及executor service。然后他问在IO主导的情况下,线程池的数量应该设置的比实际核心数多还是少,这里我回答错了,答案应该是多,因为IO主导的程序大多数的线程会block在IO操作上,所以将pool开的大一些可以让performance更好。最后问了一下servelet的原理以及nio的使用。
一个多星期以后接到电话二面。二面持续了一个小时以上,基本上都在谈项目,面试官非常喜欢在小地方问问题,从PHP问到Android再问到JAVA基础,基本上都是在我对项目描述的基础上提出新的问题让我解决,或者是问我当初为什么要这样设计。


##总结 主要就总结一下我面过的这两家。JAVA基础是重中之重(基本上不怎么会问Android),并发编程、IO以及GC算法都经常会问到,有机会也要多读源码,了解一些内部class的实现方法。
项目经验会有一定的加分,当然前提是你在项目里学到了很多东西。对于我个人来说,没有怎么考到算法,但是我觉得算法还是很重要的,多练练没坏处。
我个人主要还有两方面不足,一方面是需要更加熟悉JAVA基础,另一方面是对Android的底层优化不是很了解。

推荐书籍: Effective JAVAJAVA核心技术Head first servelet & JSP编程之美编程珠玑
练习算法平台:Leetcodehihocoder