实习应聘记(二)——阿里,总结

上一篇博文写了简历撰写,去哪儿笔试和360电面。这篇主要写写阿里的三轮电面(主要是技术面,HR面是第四轮还没接到…),以及自己这段时间的一些总结吧。

阿里一面

一个学姐给的内推机会,我选的岗位是研发工程师。被分到的部门是天猫事业部。

3月6日在线投递简历,没想到3月7日周五下午就接到了一面电话。当时是下午2点多,我正迷迷糊糊准备上床小睡一会儿,突然来了个0571的固话号码,我也没多想就接了起来。对方说是天猫的,看到了我的简历,打电话来“简单聊一聊”。我突然意识到,我去,电话面试。

面试官可能为了打开话题,先问我最近在忙啥。我脑子正糊,说最近在忙着投简历呢,不是各大公司都开始校招了嘛……面试官笑了下,呵呵。突然脑子清醒过来,靠对方想问的应该是学术上在干啥好继续深入问技术问题吧。赶忙说除此之外也在做一个什么什么项目,跟着老师研究什么什么课题云云。我说到了我的可视化项目,对方表现出了一些兴趣,我赶忙趁热打铁说这个项目有在线演示的地址,您是否有兴趣看看?面试官说好,我就把URL报给了他。开始边介绍操作边解释项目(可见,有可能的话,最好能在面试前把能够展示的项目都搭到网上,特别是这种电话面试,隔空交流本就不如当面顺畅,如果能让对方直观的看到项目效果,沟通效果会好很多)。 

面试官问,这个项目遇到了什么难点?我说,是数据库的瓶颈。我们使用的是MySQL,目前三四百个点的规模查询效率还好,但上千个点的情况,查询时间可能达到十几秒。面试官问什么样的查询,我描述了下先是根据输入的关键字找到ID,再根据ID找出直接相关的ID,这样构成一个ID集合,最后查找集合内两两ID是否存在连接,过程类似点→树→图,每个请求要经过这三步查询。  

于是面试官问数据库查询做了哪些优化。我就说了下我是怎么设计的数据库,分了几个表,用类似邻接表的结构来存整个复杂网络,如何建的索引,然后提到了,有一个字段是一个枚举量,只有{“PersonProfile”,”OrgProfile”,”LocationProfile”}三种取值,因此我把类似这种的量直接数值化存储然后建索引,提高了查询效率。

面试官抓住这个,问我为什么字符串数值化后能够提高查询效率?从数据库存储引擎的角度解释……我就懵了,因为我对数据库内部存储的原理并不了解,只停留在使用的层面上。只能猜测:数值和字符串相比,比较与排序的时间都短得多?

显然这不是面试官想要的答案,他提示我,数据库存储引擎用B树或B+数作为存储结构。又是一箭穿膝盖……我对B树和B+树也不了解啊!只好老实说并不是非常清楚B树和B+树……

面试官还不放弃!(或许这就是阿里的面试风格吧… )他继续提示我,就简单把B树或B+数想象成一颗自平衡二叉排序树,结点存索引,叶子要么指向磁盘中存数据的地址,要么直接指向一块存数据的空间(当然这并不是B树或B+树的正确定义,面试官只是想短时间引导我继续思考,大家有兴趣可以去网上查阅B树,B+树,B*树等相关知识的文章 )。我只好猜,数值化后数据小,可以存在直接指向的空间,而不需要频繁磁盘IO?

最后面试官告诉我,和磁盘每次取一个512K的block有关。数据小,一次能拿出的数据就多。字符串有可能一个block只存的下一两个。

而后就是一些常规问题,何时毕业,何时实习,有什么问题想要问他。我问了他天猫对于海量真实用户数据做了哪些挖掘?他大概给我讲了下天猫的挖掘过程:先将用户分类,而后分析同类用户购买商品,而后把这些商品反过来推荐给该用户,这样一个推荐过程。然后就告诉我如果有消息他的同事会和我进一步联系。结束了面试。整个过程大约二十分钟。   

阿里二面

一面结束后,不久就有消息说通过后一周之内会接到二面,而且二面传闻还是视频面试……于是3月10日到16日一整周时间我都过得提心吊胆……真是“又期待又怕受伤害”……可是这周过得风平浪静波澜不惊。就在我都不知道还会不会有二面的时候,3月17日周一上午计算机硬件实验上机,突然来了个0571…于是…二面来了。

本以为电话是约视频面试的时间,没想到又是直接说“聊聊”,看来又是一轮电话面试。跟面试官说给2分钟换一个安静的地方,然后就跑回教室拿上简历又跑到空无一人的楼梯间(电面高发期随身携带简历还是很必要的)。两分钟后面试官的电话就又来了。

这一轮的面试,纯技术问题并不多。面试官上来第一个问题,居然是“说说在大学阶段做过的印象最深的事”。当时又傻了一下(我发现我在电面过程中老是会被面试官问傻…唉…),之前都在准备技术问题,从来没想过会来这一出…我就问是技术相关还是非技术相关的?对方说都行。我想了想就说是校学生会的经历吧,我相信,重要的并不是你加入了哪些牛逼的组织,而是你的加入对它产生了什么改变。在我加入科技部之前,科技部在学生会的地位并不高,属于实打实的辅助型部门。任部长期间我和另外两位部长努力将它由幕后转向台前,在校会历史上第一次成功联合各大院级学生会合办了视频大赛。面试官问,在这个过程中遇到了什么难点,如何解决。我说难点主要在于和院会沟通吧。因为并不是所有院会都乐于与校会合作。解决方法就是清楚的分析利弊,说明他们有我们所没有的资源——能够拉外联,能更好的煽动本院学生参与;而我们有更成熟完善的活动举办经验,更高的活动规格(校级)。合作是一种双赢。解释清楚后大部分学院还是愿意合作的。

又聊到“目前受到的比较大的挫折”,我犹豫了下,回答可能高考算一个吧。当时因为一些个人失误发挥的并不好,对我和我家人都是比较大的打击。面试官问如何恢复。我说当时最紧要要面临的抉择就是是否复读。我父亲是极力反对我复读的。因为他也是一名高中教师,他说复读能够有大幅提分的情况非常少。最后我没有复读,来了西邮。当然我现在回头来看,我不后悔当时的选择。因为首先我读的是我喜欢的计算机专业,其次我有幸进入了西邮Linux兴趣小组,结识了一帮志同道合的朋友,在这个积极上进的圈子里共同努力共同奋斗。现在想来,大学的好坏,甚至师资的好坏,都不是决定性的因素。真正重要的是个人的努力。面试官评价说在我的年龄能有这个想法的不多(心里窃喜一下,觉得应该问题不大了~)。

后来说到项目,面试官问我用C++做了什么项目,我说完全用C++实现的就是简历上第三个项目,用的C++ MFC。面试官问是团队项目还是个人项目?我说是4人团队,我是负责人。于是面试官问我如何分工。我就大概阐述了下因为开发周期只有20天比较紧,所以没有同时分工开发客户端和服务端,而是先集中力量一起攻破客户端,再一起攻破服务端。每个阶段再根据客户端和服务端的模块划分任务。这样遇到技术问题也好沟通。 

后面面试官又问了个很“奇怪”的问题:有没用自己的技术赚过外快。我说因为我对计算机各个方面都挺感兴趣,所以也会一些网页前后端,视频音频处理之类的。之前在导师介绍下帮陕西省互联网大会制作了开场视频;也曾经帮一家物流公司制作了网站前端。当时对方要求网站符合RWD(响应式网页设计)而我不会,所以我咨询了一些学长,选用了bootstrap框架完成,这个框架原生支持RWD。(我说这段其实是想有意展现快速学习能力,不知道面试官有没理解…)面试官问,那些核心技能呢?C++,C之类的。我说没有用它们赚过外快,基本都是用它们在校内做一些项目,并没有用来盈利……

再后来面试官问我,看我的简历应该很有可能是能拿到保研的(简历写得有点…美化自己…大家懂…),对未来是什么规划。我说因为本校并不是很好的学校,保研也只能保本校而我不大愿意在本校读研。如果能有幸拿到贵公司的实习机会并参与工作,可能会选择就业;如果没能够进入贵公司,我最近也在准备托福,可能会选择出去读研,香港等地…… 

而后问我实习希望做哪方面工作。我回答我对数据挖掘挺有兴趣,虽然了解不多。而我知道天猫掌握着海量的用户真实数据,恰好我一面也有向面试官询问天猫的数据挖掘,其实我还挺希望能够在实习阶段接触到相关的业务,不知道有没有机会。面试官说他不能确定但会帮我在评价中注明。紧接着面试官就反问我,如果由我来做天猫推荐算法,我会如何给用户进行分类。这个问题恰好我以前有想过,但并没有验证过正确性,于是我就阐述了下我的思路:首先作为一个电商网站,用户间最大的差异应该在于消费能力。因此先根据消费能力(近期月均消费额等数据)进行分类。然后是性别,再然后是年龄,最后是地域。因为众所周知的“南北差异”等原因我认为地域也会对消费习惯造成影响。这就是我对于分类方法和优先级的想法。

面试过程就差不多结束了,随后就是例行的“何时来实习”,“有什么问题想问我”。这次我问了阿里系各个垂直产品是独立进行开发,还是共用同一个底层架构在上层拉分支?面试官回答是后者。支付宝、天猫、淘宝、阿里巴巴等,底层其实是使用同一套技术。然后就告诉我有进一步消息会有人和我联系。结束了二面。全过程约半小时。

总体感觉,二面并不是技术型面试,更多的是对综合能力和思维模式的考察。尽量在每一个问题上展现自己的闪光点和独特之处就好。

阿里三面

二面结束后,下午我随手打开阿里校招网站,看到我的状态已经从“应聘中”变成了“应聘成功”,顿时非常兴奋!但又不敢确定,难道两轮面试就有结果了?后来内推的学姐在Q上恭喜我终面通过,我一下放松下来,觉得世界都是美好的~

可是……事实证明,我还是Too young too simple。兴奋期还没过,周二晚上在实验室和同学写一个项目的需求分析,突然来了一个010的电话。我想,是不是去哪儿的笔试结果出来了呢?出门接电话,是一个自称北京阿里的工程师打来的。和我预约面试时间。当时我就懵了(对,又一次),因为之前都是杭州的号码(天猫在杭州),于是我问,我已经参加过阿里的面试,请问您是哪个部门?对方反问我参加的是哪个部门的面试,我说是天猫,对方说他也是。他不知道具体流程,HR安排的。我只好和他商量了下,约在3月20日周四晚8点,进行第三轮面试。

因为他自称是工程师,所以我明白,这次一定是一场实打实的技术面没跑了。本来彻底放松的神经又开始紧张,甚至更甚于前,紧张到全身发抖。为何后台显示通过却又加面一轮?是和往年一样借此刷人?还是其他原因?会问什么技术问题? ……这些都没有答案,我能做的也就只有尽力准备了。

周三满课。周四直到晚7点前,我把我的简历过了一遍又一遍,想象他会在哪几个点下挖;准备了自我介绍的稿子;把树和图的常用算法以及时空复杂度快速过了一遍;看了小组群共享里张瑞上传的《十道海量数据处理面试题与十个方法大总结》。这里向大家强烈推荐这篇文章!不长的篇幅能让大家快速掌握海量数据处理面试题的大概套路和可选路线。(膜拜JULY大神!)而事实证明,我在三面中碰到两道里面的类似题目!实战亲身验证效果!

晚上8点15,电话来了……这次的面试官比较常规。首先让我做自我介绍。我大概说了一下事先准备的稿子。因为在自我介绍中提到项目里使用了很多开源软件,因而对开源精神有一种推崇和向往。他就问我,具体用过哪些开源的东西。我说,底层来说,Linux,Apache,MySQL之类的一套;上层的话,做可视化用到了D3.js这个开源库,前端用Bootstrap开源框架,还有一些XML,JSON协议解析也用到了开源的库。他就问,在配置过程中有遇到什么问题吗?我说基本遇到的问题也都通过官方文档或论坛社区解决了,没有遇到什么特别难的问题。

然后他说,看我的简历,技能主要的点在于1、CC++JAVA 2、数据结构和算法 3、数据库 是吗?我说我对JAVA不能算熟练,只是项目有用到,知道语法而已。更多的是用C和C++。于是他问我,C++的STL有用过吗。我非常惭愧的说只用过map之类简单的…他继续问,知不知道智能指针。我就不出所料的被问倒了。只好说不是很了解。面试官就知趣的往下问了。

然后是数据结构与算法4连杀!

第一个问题:给千万级规模整数数组做去重。我一听问题就乐了,和360那个问题简直如出一辙嘛~bitmap搞定。

第二个问题:如何从M个数中找出前N大的数。这个问题在我上面说的那篇十道海量数据处理面试题的博文里有详细解答。主要就是构建一个N个结点的小顶堆,而后将后面的每一个数和堆顶比较,比堆顶大则替换,然后维护堆。这样遍历一次以后就得到了前N大的数。时间复杂度O(M log N)。

第三个问题:给定一个整数数组,找出一段连续区间使得区间内元素和最大。这道题把我卡住了,虽然记得明明是见过的一道水题但就是想不起来方程。我只好先说,最朴素的做法是枚举区间起始点和终点,复杂度O(N^2)。优化方法是动态规划,不好意思有点紧张,让我想一下方程……过了一会儿实在紧张的没思路,只好问能否给些提示。于是面试官说,每个区间都有终点,我反应过来,状态是用区间尾表示。最终在面试官提示下写出了动归方程f(n)=max{f(n-1)+a(n), a(n)}。其中f(n)表示以n位置为区间尾的区间最大和。它有两种情况,要么是f(n-1)连上当前元素,要么是从当前元素重新开始。面试官问时间复杂度和空间复杂度。我说都是O(n)。

第四个问题:第三个问题的加强版。如果第三题是循环数组,怎么处理。这个问题比较简单,我说直接把原数组复制一份接在原数组后面,再用相同的方法做就可以了。时空复杂度不变。

到这里技术面试的部分就差不多了。又问了我是否有参加过ACM竞赛,我说我们学校没有组织组队和集训,所以我只能和同学组队报名参加一些邀请赛。

后面就进入闲聊模式。面试官和我聊学校,聊未来打算,聊出国就业,劝我不要去香港读研要去就去美国云云…总之聊得挺投机。最后例行公事“有没什么要问我的问题”,我之前准备的问题都是关于天猫的,无奈面试官表示他是支付宝的,也在阿里云呆了几年。对天猫并不了解。 面试也就差不多结束了。技术部分大约15~20分钟,非技术闲聊了十来分钟。全程大约半小时出头。

面试结束后感觉不错。第二天也果然接到了经理的电话,告知我3面技术面试都通过了。还有一轮HR不过以他对我的认识他认为问题不大(我才知道好像二面那轮就是这位经理面的),如果也通过就是去杭州天猫他的部门。后面的校园宣讲就不用参加了。听到这里我才终于如释重负……这段经历也算接近尾声。

总结

这段经历让我非常充分的感觉到,平日的积累真的很重要。人品也真的很重要(问到的问题差不多刚好在我的能力范围内,不大擅长的LINUX底层都没问)。如果正面临面试,已经没有过多时间做深入积累或者积攒人品,那就做好能做的所有准备:自我介绍,简历所有可能被问的技能和技术点,数据结构和算法(树非常爱考!然后就是动归!),以及海量数据处理题。 除此之外,在每个面试过程中,尽量在回答每一个问题时能扯到展现出自己的某一个闪光点,并且联系实际例子来证明。 最后,千万千万放平心态,不要紧张。有时候,打败自己的不是难题,而是失常发挥。另外,千万不要轻易放弃任何一个问题而直接说不知道,可以问面试官“能否给一些提示?”只要在他的引导下大概能回答个六七成,留下的印象也会大大改观。而且保不准对方一提示就想出来了呢~

最后,相信大家都会找到理想的实习,所以我也就祝大家早点达成这个成就啦~加油!  

7 thoughts on “实习应聘记(二)——阿里,总结

    1. 林 达意 says

      放个项目主页?展现下项目成果的截图,说明下项目的一些特点,也会比电话口述稍微清晰直观一些吧……

      Reply
  1. 西邮学子 says

    学长,找最大的K个数,应该是用快排吧?
    题目要求找到最大的K个数,堆排的变形能找到K个,并且能排出来这K个数的大小顺序,快拍不能找到K个数的大小顺序,却能很快的找到这K个数。这个题,用快排的变形应该会更快一点吧?

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *