0%

阿里巴巴内推实习面试经历总结和记录

今年3月初大概6号的时候在校园BBS论坛上找到了一个学姐帮忙内推阿里巴巴。过了约10天开始进入了内推面试流程。人生头一次面试一个公司并且一路面到了HR面,按照HR的意思是最后一面了,据说面试结果要过一段时间才会通知(该不会挂了吧-_-||)。不管怎样,这是人生一次宝贵的经历,记下这次经历,以时刻警醒自己。

大致情况


在学校情况大概是这样:之前只做过1个项目(安卓恶意APP批量检测工具,用了机器学习方法),参加过数学建模得了两个校内赛奖和省三等奖,和同学5人参加过15年和16年ASC竞赛(不过都没进决赛),大一得了国奖,大二得了学校的一等奖学金。技术上兴趣还是自认为比较广泛的,虽然之前搞过的安卓弃坑了。比较擅长C/C++,Java与python略懂。我比较赞同在理论知识掌握牢固的前提下进行技术学习(技术指某门具体的应用技术),多看书,不要“无脑”的写代码。

总之技术经历挺平淡的,挺像一个读书读多的“书呆子”,并没有一堆吊炸天的项目和开源的东西。

我投的是C/C++研发。我没选意向部门,简历被支付宝拿到了(但简历里有个问题是你想到阿里哪个部门,我写的阿里云,因为知道他们用C/C++,而且了解到貌似他们主要做云计算和大数据平台这块)。

初面

初面面试官问的问题都很偏向基础的技术知识。正因如此,我对初面的印象最深刻。听声音面试官应该比较年轻。第一次打电话是周三,当时在上课,幸好坐在教室中间周围全是人,装作捡东西接听了一下,告诉他我在上课(当时傻了,没约下次电话时间)。第二次就是一周后的周五晚上快十点了(应该在加班吧)。那个时候打电话我挺惊讶的,也挺感动的(那么忙还要面试实习生)。

问题有这么几个:

  1. 自我介绍。我主要把我上面的大致情况讲了一下,但没说我对学习技术的看法,只谈了获奖和项目经历。
  2. 谈谈傅里叶变换。不会。其实之前在知乎和推酷上看过一个带动图的回答,还是有些印象,但是仅仅听说过的话还是就说不会好点。然后面试官问我你们专业都学过哪些数学课,我说微积分,线性代数,概率论与数理统计、离散数学,然后就没再问数学了。
  3. 听说过或用过C++的NIO网络模型没。我说我只知道Java有NIO一个包,C++下好像没这个东西,我不知道。然后就没再问了。我总怀疑是不是听错了,因为后来查了下,确实没C++的NIO。
  4. 讲讲快速排序。这个答的自我认为比较好,因为以前还专门写了博客。然后让在collabedit.com上手写快排。事后才知道这个网站是专门用来面试的。不过可能晚上打游戏看视频的人太多,网抽风了。我敲好了代码对面说没看见,过了几秒网页就显示链接断开,然后一刷新什么都没了,所以最后面试官还是没看见我写的代码。。。
  5. 用过数据库没。我说mysql。然后让谈谈对mysql锁的认识。不会。
  6. 网络协议栈几层?介绍下。我答的5层(主要好举每层协议的例子)因为做过一个课程设计是从抓的数据包里还原HTTP报文信息,所以答的还可以。
  7. 介绍简历中的项目(比赛中负责什么,C语言套接字编程学到什么程度,课程设计HTTP协议还原,安卓恶意app批量检测工具项目介绍一下)。
  8. 问随机森林算法,怎么训练的,知道过拟合么?我说随机森林不会过拟合。然后问为什么,讲了一通。然后问做项目的时候你们怎么衡量机器学习算法的好坏,我说的是交叉验证+测试准确率,另外可以看TPR,FPR,TNR,FNR,外加ROC曲线和AUC值(顺便解释了ROC曲线是干啥的)。面试官问ROC曲线怎么画的,解释了一下。

面试时间大概40分钟多一点,大概面完15分钟,简历状态就是“面试中”了。

我的感受是,只要项目在一年内做的,没有夸大成分,简历项目问题应该都能答出来。一面偏向基础,常见算法要会。同学有一面问mysql索引的,B+树的,HashMap和ArrayList的,当然他面的Java。只是说做项目要深挖知识点,多思考,注重基础和常考的面试问题。

人生第一次面试,一开始说话都没力气。后面好了一些。

二面

二面面试感觉是最有意思的,面试官也很有意思,问的问题也很不一样(不是那种背书问题)。一开始还是自我介绍。让我说了下OpenMP是什么(主要因为竞赛的时候用了)。快速排序原理(估计一面面试官跟他说了没写代码的事)。怎么并行化快速排序(一时没想起来,有一个专门的并行算法,并不是递归的时候创建线程递归就行),因为不知道怎么答,所以我说并行快速排序容易造成负载不均衡,一般归并排序并行好点。然后就被要求并行化归并排序(我说了一下外部排序和归并过程)。最后又问机器学习。其中一个问题没答出来:ROC曲线如果相交,AUC值也差不多,你怎么判断哪个方法好?

大概时间还是用了40分钟,最后被问实习时间,我说7月1到9月1。然后让我提问,我问了下一共要面试几次(官网上说3次,但网上说4和5次的都有)。

三面

三面是最短的一次,只有20多分钟,面完以为挂了(间隔了一周多才到HR面)。主要问简历项目。面试官很喜欢质疑,比如:你们做的项目学校在项目答辩后看代码么?我说看,因为文档和代码让提交。他说:如果只是走走形势呢?我说做项目时要发论文,老师总要看看东西吧。其实有一点我没说,面试官估计也清楚吧,就是现在学校里有些老师都是到处接活,至于做成啥样,能用,能发文章就行,代码的话很多老师自己都不怎么写了,所以也不关心。反正这个问题个人感觉没答好。

之前还问了:你学技术的动力是什么?我说就是觉得好玩,解决问题很有意思,搞技术挺酷的(实话,当年高考报专业全是计算机和电子信息类的)。貌似面试官表示很怀疑。我相信大部分长期写代码的都是最初觉得好玩才学写代码的。但是,我感觉我理解错他意思了,他应该是想强调学技术是长期的事情,你怎么坚持下来的,这恐怕是他真正关心的。

还有:看你经历挺丰富,万一你哪天对别的东西感兴趣了,那你之前的技术怎么办?我说我并不是见什么都感兴趣,我会对技术有个大致了解再决定是否继续深入。我说了我搞安卓的例子,说不打算搞移动端开发了。又被问为什么?我说我偏向解决基础性的问题,移动端还是比较面向业务和需求,不太符合我解决问题这个兴趣点。看来我是傻了,现在想想,对方是怕你太随性,不能坚持。但我觉得一个程序员应该对新技术始终保持跟进,感兴趣是动力啊。了解一个新技术,不代表你整个技术领域都改变。而是其它技术或许可以为解决问题提供参考和新思路。比如:机器学习技术可以跨界应用到安全领域,一个人做安全的人如果视野很窄不愿意学习,那么很难把这个新兴技术应用到自己的领域。

总之,搞技术的人在非技术的阅读理解和表达上是很容易产生偏差的,要想想再说

HR面

面试官是个大姐。第一次电话是上午上课,幸好坐中间了,假装捡东西,接了电话,约了中午。我以为一点多会打过来,就没睡觉。前一天熬夜了,困得不行,就躺着玩手机。大概是HR午休或者考虑到学生午休吧,两点半打过来了(早知道睡觉了T_T)。

先让自我介绍。然后问我实习动机,我说增加大企业实习经历,因为以前没实习过,也希望获得转正式员工的机会。

之后问技术上关注擅长什么。我说C/C++还有机器学习。于是就问为什么是这2个技术。我说能解决问题,偏向基础,我想做偏基础的东西,偏向业务和应用的不太感兴趣。作了个大死又说了安卓,我说框架什么的这些老是在变,不想被Google这种大公司牵着鼻子走,也不想老是根据需求不停地改app之类的东西。然后被批评了,说技术要面向市场需求。然后问知道阿里做服务器用什么?中间件知道么?我说Java(今年年初发现了阿里好几个团队的博客,所以这个还是知道的)。又问为什么投C/C++?我说这是我擅长的,参加的ASC比赛也是这方面的,兴趣也在这里。结果面试官说你这不是擅长,你是只投你会的,因为你们学校里做项目老师让用什么你们就用什么,学校作业也是C/C++,你的技术视野太窄了,因为你接触的只有这些,所以就只投这些,阿里做服务器的都是Java,C++都是做挖掘用的(但是他们网站上写的分布式,云计算和系统内核)。我就只好说:擅长的肯定是我会的,不会的东西也就谈不上擅长,所以您这么说没错。而且我才大三,就这几年也不可能把所有的技术都了解一遍(我想就算是工作了的人也不会每种技术都懂)。语言只是解决问题的工具,最重要还是能够解决问题的知识和思路。结束时候让我提问,我说了下自己估计的实习时间,问我的岗位转正可以么?回答是表现好才可以,没转正的话校招可以直接开始面试环节,而且更沾光。如果实习时间不能达到2个月,那还不如别来。

技术视野不够这个问题很难界定,因为了解太多会被扣上“多而不精”的帽子,了解太少又成了“不愿学习”,“没有学习新技术的动力”。所以这个问题我就没继续回答。

当时还是被HR的问题弄懵逼了。应该说:招聘网站上写的是做分布式的,然后顺便提一下自己简历上有除了C++外的项目(总感觉他们想找个写Java的)。

对于学校里只用C++这点,完全不对。至少在我们学校,学生工作室全是做Web开发的,都是Java, js, python一类的。学校老师的项目用Java绝对是主流,甚至还有python的(上离散的时候授课老师亲自说他们都用python)。可以说,这几年我是完全凭个人兴趣在学C++。我学Java的时间是大一寒假,虽然比C++晚,但是我并没有只学C++。甚至我的博客里,技术文章中用到Java的占到了一半以上。只是C++是个很大的主题,至今还有很多东西没有学习到,所以没有写很多博客。我为什么学C/C++?原因很简单:它偏向基础,偏向底层。现在的计算机科学世界就是C/C++上搭建起来的。看看Linux/Unix,mysql,nginx,Java虚拟机,各种语言的解释器编译器,深度学习(GPU编程)。如果你不懂C/C++,那么上面所有这些你都别想深入研究。

总结

基本技术要过关。我列个单子,以后继续努力:

  • sql的所有指令都要看一遍,然后要有意识的搜集mysql各种面试问题。
  • 不看书能够手写各种常见算法数据结构,刷题技术过关。我一个同学跟我说程序员怎么能背代码呢?我觉得代码确实不是靠背的,但是作为一个基础有待考察的在校生,还是去准备这些东西吧。
  • C/C++基础。没问的东西不代表以后不考或可以不看。当然C++11/14就不必看了。
  • Linux网络编程,多线程:挑选APUE的部分章节看,看man手册,动手做东西。
  • 网络协议:学校里学的差不多够了。经常问问自己为什么协议设计成了这样,这么做是干什么?据一些同学说《TCP/IP详解1》是好书。
  • 操作系统的知识,课本内容差不多也够了。

还有就是技术兴趣点和学习动机这个问题,真是要想好再回答。我觉得很多人学技术的动机和我差不多,但是真要答好这个问题还是要仔细准备,不然就成了给自己找麻烦了。

Update: 最后拿到了实习,但是因为学校和时间的原因拒绝了这个offer,确实十分可惜。