终于有时间也有机会来写这么一次面经了。其实距阿里的最近一次面试也有29天了,这段时间一直在等待通知,终于在昨天下午收到了阿里的贺电,一直悬着的心也可以放下了。现在赶紧把我的经历分享给各位小伙伴。
一面:
没有一点点防备,内推的第5天下午正在做实验的我突然收到了阿里一面的电话,当时觉得自己状态还可以,于是就直接面了(面试的时候如果状态不好,可以给面试官重新约时间),虽然是一面但觉得考察的很广泛(有点交叉面的感觉),从基础,知识广度以及人品等各方面对我进行了询问~
---首先是基础
Q: 我是淘宝的xxx(奔溃,太紧张没有记住面试官的花名),请你先自我介绍一下。
A: 详细介绍了一下我的个人信息,项目经历,擅长的技术。
Q: 你对css和js两者哪个掌握的更深入?
A: js。
Q: 好,那你讲讲如何让一个函数调用自身。
A: 函数内部可以使用其函数名或者argument.callee进行调用。(js高设上有一小节讲得很详细)
Q: argument.callee是什么?
A: 表示当前执行的函数,但是在ES5的严格模式下是不能使用的。(要勇敢地发散问题,这个ES5就是发散出来的,体现自身知识广度)
Q: 好,我有一个数组,如何实现它的深拷贝和浅拷贝?
A: 浅拷贝就是保存引用,可以直接把它赋值给另一个数组。深拷贝可以用数组方法实现,比如concat,slice或者for循环遍历数组取出。
Q: 如何做一个高效地递归操作呢?
A:
(有点蒙蔽,这个问题回答得略卡)
嗯,首先是要尽量做到尾递归,保证堆栈的复杂度最小。。。然后。。。还可以用记忆的方式(js语言精粹上面的,突然想到了!)
就是每进行一次递归,都把上一次递归结果缓存到一个数组中,下一次递归可以直接调用这个数组的值,减少寄存器的调用。
Q: 不错,讲讲事件流吧。
A: (心里突然释放了很多) 先说说IE的事件流吧,是采用了事件冒泡机制,而DOM标准事件流则分为三个阶段:事件捕获阶段,处理事件阶段,事件冒泡阶段。通常我们需要写一个函数来兼容两种浏览器的事件。然后balabala把函数用口头实现了一次。。。
Q: 那你知道事件委托吗?
A: 嗯,知道,就是把所有子节点的事件都委托给其父节点进行监听,在函数中可以swtich某个节点。
Q: 仅此而已吗?
A: (哈哈,很想说句不然呢?) 请给我点时间想想~
A: 键盘事件可以监听它的keyCode...(好吧,好像就这么多了把)
---开始发散了
Q: 刚刚开了下你的个人网站,那个相册旋转是怎么做的?
A:
用React写了一个状态机,如果用原生js或者jqeury写可能会很简单,用React的主要是之后考虑打造一个SPA。首先是要写一个AJAX请求后台数据,这段代码写在React的ComponentDidMount中,然后把每个相册的旋转所用到的属性当作是state放入父级组件的props中。
Q: 看来你很了解React,能讲讲它是什么原理吗?
A: React是facebook提出一个解决大型应用的框架,主要是利用状态机将属性和状态进行隔离,并用一个组件维护,再将这些组件复合。性能很快,核心在于虚拟DOM和单向数据流。
Q: 虚拟DOM?说来听听呢?
A: 在js中,最消耗性能的其实是DOM操作,一个DOM操作可以将界面元素重排或者重绘,而虚拟DOM是把元素放到缓存中,这样变化只是在缓存中,性能会非常快,这个实现主要依赖于diff算法,然后diff算法..balabala...
Q: 我看了一下,你这里面一页有上百张图片,加载的有点慢,你有考虑过优化吗?
A: 嗯,考虑过,但是还没时间去做(现在都还没做= =)。可以把100张图用缩略图,即用小图,大概在2-3K放出来,要具体查看每张图的时候再把原图呈现。
Q: 那你对整个web的性能有什么了解吗?
A: 嗯,大概有css精灵图,http缓存,cdn,脚本合并。。。然后一个一个详细讲解。
---接着是聊生活
Q: 我看你在学校担任过IBM俱乐部的部长,可以讲讲你做了些什么吗?
A: 嗯,主要承担一些设计海报,制作网站这些工作吧。当然还有给14级的同学进行网页知识的培训。
Q: 我对你的培训很好奇,能详细谈谈吗?
A: (怎么会问这个,我开始方了) 然后balabala讲了我是如何培训的,从w3c到现场授课等等...
Q: 那你觉得你的优点是什么?
A: 对前端的热爱,对生活的乐观(好官方的回答...)balabala...
Q: 缺点呢?
A: 喜欢玩英雄联盟把,偶尔会忘了时间,但是自己还是开始有节制了...(还没说完电话就挂了...原来是通话一小时自动断开了)
...断线中
Q: 哈哈,不好意思,我们继续,不过得快点了,再详细讲讲你对新人的培训过程吧。
A: (好纠结),于是讲了很多细节。
Q: 还有什么问题要问我的吗?
A: (终于该我问了!) 我想了解下淘宝现在所使用的技术~
Q: 不同业务不同技术嘛。然后详细讲了各个团队的方向...
A: 想了解下淘宝团队的英语水平。
Q: 有特别好的,也有一般的,但一般的文档是能读懂的。
A: (然后内心下定了学好英语的心),嗯,我也没有什么问题了.
Q: 那好,那等等结果吧~再见。
一面结束,说好的半个小时左右足足聊了75分钟....估计面试官也饿了。
二面:
一面结束已经是下午5点30了,吃了个饭回来大概在6点40的时候,又看到了一个杭州的电话打来。不会吧!还有!
Q: 你好,请问你是xxx吗,我是淘宝技术部这边的,想问问你有没有时间。
A: (接都接了,那就面吧) 你好,现在有空,请问这是第二次面试吗?
Q: 嗯,占用你半个小时时间,我们开始吧。
A: (我不信半个小时!)
---直接从项目入手问
Q: 看了一下你的几个项目,能告诉我你在遇到问题是怎么解决的吗?
A: 其实我之前的开发中遇到的问题不是特别多,问题主要在最后的性能问题上。自己首先会尝试调优一下自己的代码,然后再去从文件打包上去思考,如果无法自己解决,会去参考下别人的博客或者是社区。
Q: 那你如何使用文件打包的?
A:
刚开始的时候接触grunt,发现利用插件可以很快的实时压缩合并css,而且只需要写一个Gruntfile.js文件就行了,十分方便,后面又了解到gulp,代码量少写一半,因为它基于流。再到后面学习react的时候,gulp必须使用很多插件才能转义jsx语法,于是我就在社区中发现了webpack这个工具,并且在github上star了一下,觉得这个工具特好用,然后大概讲了下webpack的配置...
Q: github经常用吗?
A: 也是近段时间开始用起来的,会慢慢熟练起来。
Q: 我看了看你的个人仓库,里面还有ES6的仓库,怎么是空的呢?
A: (问到此处好尴尬...) 因为我现在写的ES6的语法还没投入到实际的demo中,有点纸上谈兵,只能写写片段代码执行。近段时间也正在逐步了解。
Q: 嗯,看了下好像还有jquery的仓库,那你对jquery的源码有了解吗?
A: 大概看过几个模块,然后讲了许久...
A: 但我觉得jquery会慢慢的不适合大型业务。
Q: 哦,什么意思?
A: jquery有很大的性能瓶颈,当DOM操作增多的时候,我们需要考虑用react。
Q: react?那你知道angular吗?
A: 嗯,知道,不过angular现在是2.0的beta版本,打算等稳定下来再去仔细品味。
Q: 那你知道react和angular分别用在什么样的业务吗?或者说两者的区别。
A: 自己从性能方面和MVC层面讲了一下...
---谈谈未来
Q: 发现你对js的新技术还是很有研究的,那你觉得以后的js会发展成什么样,或者说前端会发展成什么样。
A:
从14年的D2前端论坛开始就已经很明确的指出了'大前端'这个概念,因为前端本来就是一个通十行才能精一行的职业,所谓大前端从学习角度上来看一定要保持饥饿感,保持兴奋去适应新技术带来的变化。具体的说,大前端要兼顾变化多端的前端和以node为核心的后端。然后又从前后端分析了一下ajax和http这些东西(蛮拼的!为了把所有知识面暴露给面试官)。
Q: 想去哪工作呢?
A: (我被吓到了.)杭州吧,互联网的氛围一级棒!
Q: 嗯,还有什么问题要问我的吗?
A: 现在前端行业对ES6的使用是什么情况呢?
Q: 看整个部门人员的情况吧,说不定的。
A: 想知道你的花名,哈哈。
Q: 我叫释然。
A: 不好意思,没有挺清楚。
Q: 释然,释然的释,释然的然。
A: (听着名字就觉得牛比) 恩恩,谢谢你。
看了看时间,30分钟!可以,这时间卡的给波满分吧!
后面去问了问我学姐,才发现释然是她的老大!又去淘宝技术的官网了解了下,确实大神一枚,怎么就没要联系方式呢?!
HR面:
一二面在同一天,我想HR也会很快来吧,就这样每天提心吊胆地过着,看着论坛里的小伙伴有的很快就HR面了,心里越来越方了。等到3月16号的时候,HR终于打电话过来了,和前两面面试官一样,声音好听得不行,不过这次是个妹子!但是当时我太困了,就约了晚上。结果晚上也没有打电话过来...之后又是每一天中午打过来,结果发现我都有课,就这样到了18号晚上才有时间=
=前前后后约了4次!
Q: 你好,我是xx(由于是妹子,花名保密) 。
A: 恩恩,可以开始了!
Q: 我看你曾经创过业,可以跟我讲讲为什么要创业吗?
A: (我回答的真的很白痴啊...) 前端是一个各方面都需要有所见解的行业,加之很想自己对新东西也有一定的好奇!于是就跟着学长和几个朋友一起试试了。
Q: 讲讲创业中的细节呢?
A: 大致讲了讲我的工作,如何打造团队,如何熬夜...
Q: 成功了吗?
A: 失败了,因为...
Q: 其实总的来说不是你自己想创业对吧?而是学长找到了你。
A: (这个问题,可以说三次面试以来最不好回答的) 还是挺想的,主要自己也觉得这个项目可以做做,还可以锻炼锻炼这种高压工作。
Q: 嗯,我懂,但是你只是学长叫到你才去的是吧?
A: 嗯,可以这么说吧,但自己还是很有想法的。自己也很想掌握一些市场方面的知识,想做个全才。
Q: 谈谈你的优缺点呢?
A: (然后从自己的自信,负责,对新技术的渴求这几点讲述优点) 缺点嘛,可能自己有些浮躁把,因为前端本来就是个高速发展的行业,每年都有成堆的框架出现,可能在没有接触具体业务之前会有所迷失,不知道该学什么。
...最后就是对我的一番评价,在肯定了我的学习能力后,基本上都是说我的不足(内心很崩溃),差不多面了40分钟就结束了。
说实话面了HR后一点自信都没了=
=,首先感觉自己有几个地方回答得不理想,然后就是觉得HR姐姐分析地比较到位(感觉跟中学时代的语文老师一样,哈哈),心里特别没底。但过了段时间后心态调整过来了,又回到了平常的模式。大概过了快一个月收到了阿里实习生的offer,真的是很大的一份惊喜。
从这次面试要肯定自己过往的努力,但是要改进的地方也有很多。正如HR姐姐提到的做什么事之前多问几个为什么,无论是从技术还是什么角度上出发,都要明确好自己的目标,作为一个开发者,所应具备的不仅仅是开发技能以及行业视野。