一般阿里社招都是招 3 ~ 5 年的 P6 + 高级工程师,当初自己只有一年经验,也没想过有这个面试机会。虽然没想着换工作,但是经常关注一些招聘网站的信息。
某一天,在某 boss 上有个人找我,让我发一下简历,我一看是阿里的某技术专家,虽然之前也有阿里的在某 boss 上给我要简历,但是我深知自己经验不足,然后给 boss 说我是 16 届的,只有一年经验,然后就没有然后了。这次我依然这么回复,但是这 boss 说,没关系,他喜欢基础好的,让我可以试一试,于是我也抱着试一试的心态发了简历。
简历发过去之后,boss 就给我打了电话,让我简单的介绍一下自己,我就噼里啪啦说了一些,还说了一些题外话。然后 boss 就开始问我问题。
由于面了四轮,所以最开始的面试记忆有点模糊了,细细回想,又感觉记忆犹新。
1. 说一下 CSS 盒模型
我就说了一下 IE 的怪异盒模型和标注浏览器的盒模型,然后可以通过 box-sizing 属性控制两种盒模型的变换。
2. 说一下 box - sizing 的应用场景
这个也不难,简单说了一两个应用场景,具体就不一一细说了。
3. 说一下你了解的弹性 FLEX 布局
这个我也比较了解,各种概念和属性能想到的说了一大堆,也扯到了 Grid 布局,基本这个也没啥问题。
4. 说一下一个未知宽高元素怎么上下左右垂直居中
说了一下 flex 弹性布局的实现,说了一下兼容性,扯到了 postcss 的一些东西,然后说了一下常规的兼容性比较好的实现。
5. 说一下原型链,对象,构造函数之间的一些联系
这个我之前写过相关的文章,自己也有比较深入的理解,所以这个也不在话下,噼里啪啦说了一大堆,也不知道面试官听得咋样。
6. DOM 事件的绑定的几种方式
说了三种,然后说了一些冒泡,默认事件,以及 DOM2 ,DOM3 级的一些标准。
7.说一下你项目中用到的技术栈,以及觉得得意和出色的点,以及让你头疼的点,怎么解决的。
这个因人而异,开放性问题,主要考察平时项目的一些积累吧,这个我回答感觉也比较ok。
8.有没有了解 http2.0,websocket,https,说一下你的理解以及你所了解的特性。
这个我看过一些文章,但是没有什么印象,扯了一些概念,但是回答的不是很深。
第一轮电话初探,大约面了50分钟,就记起来这么多,还有一些细节问题可能淡忘了,总体来说,面的都是以基础为主,然后boss说把我简历推荐给内部,进行正式的社招流程。
然后当天晚上一位女面试官就给我打电话了,说八点半进行下一轮技术面试,没想到效率这么快,我都没怎么准备。
这次就直接省略自我介绍了。
1. webpack 的入口文件怎么配置,多个入口怎么分割啥的,我也没太听清楚。
这个自己就说了一下自己的理解,以及自己用 node 写的多入口怎么配置,然后面试官说不是多入口配置,然后我又说了一下自己的理解,然后这题就过了。
2. 我看到你的项目用到了Babel的一个插件:transform-runtime 以及 stage-2 ,你说一下他们的作用。
这个我也还算比较了解,就说了一下 ES 的一些 API ,比如 generator 啥的默认不转换,只转换语法,需要这个来转换,然后说 profill 啥的,扯了一下 stage-1 ,stage-2 ,stage-3 ,这个问题回答还算清楚。
3. 我看到你的 webpack 配置用到 webpack.optimize.UglifyJsPlugin 这个插件,有没有觉得压缩速度很慢,有什么办法提升速度。
这个我主要回答了一下,我之前也没怎么了解,一个想到是缓存原理,压缩只重新压缩改变的,还有就是减少冗余的代码,压缩只用于生产阶段,然后面试官问还有呢?我就说,还可以从硬件上提升,可以得到质的飞跃,比如换台 i9 处理器的电脑......
4. 简历上看见你了解 http 协议。说一下 200 和 304 的理解和区别。
这个噼里啪啦说了一堆,协商缓存和强制缓存的区别,流程,还有一些细节,提到了 expires,Cache-Control,If-none-match,Etag,last-Modified 的匹配和特征,这一块之前有过比较详细的了解,所以还是应答如流。
5. DOM 事件中 target 和 currentTarget 的区别。
这个没答上来......
6. 说一下你平时怎么解决跨域的。以及后续 JSONP 的原理和实现以及 cors 怎么设置。
我就说了一下 Jason 和 cors ,然后问我 JSONP 的原理以及cors怎么设置,这一块自己也实践过,所以还是对答如流的。
7. 说一下深拷贝的实现原理。
这个也还好,就是考虑的细节不是很周全,先是说了一种 JSON.stringify 和 JSON.parse 的实现,以及这种实现的缺点,主要就是非标准 JSOn 格式无法拷贝以及兼容性问题,然后问了我有么有用过IE8的一个什么 JSON 框架,我也不记得是什么了,因为我压根没听过,然后说了一下尾递归实现深拷贝的原理,还问了我 typeof null 是啥,这个当然是 Object ......
8. 说一下项目中觉得可以改进的地方以及做的很优秀的地方?
这个也是因人而异,开放性问题,大致扯了一下自己的经历,也还OK。
最后问了有什么需要问的地方,面试到这里基本就结束了,大约面了一个多钟头,还是蛮累的。总体来说,回答的广度和深度以及细节都还算OK,觉得这轮面试基本没什么悬念。
过了几天,接到阿里另一个面试官的电话,上一轮面试通过了,这次是二轮技术面,说估计一个钟头。这次依然跳过自我介绍之类的,直奔主题。
1. 有没有自己写过 webpack 的 loader ,他的原理以及啥的,记得也不太清楚。
这个我就说了一下,然后 loader 配置啥的,也还 ok。
2. 有没有去研究webpack的一些原理和机制,怎么实现的。
这个我简单说了一下我自己了解的,因为这一块我也没深入去研究,所以说的应该比较浅。
3. babel把 ES6 转成 ES5 或者 ES3 之类的原理是什么,有没有去研究。
这一块我说了一下自己的思路,大致也还OK,我也没去深入研究怎么转换的,之前好像看过类似的文章,自己也只观察过转换之后的代码是啥样的,至于怎么转换的规则,真的没去深入观察。
4. git 大型项目的团队合作,以及持续集成啥的。
这里我就说了一下自己了解的 git flow 方面的东西,因为没有实战经验,所以我就选择性说明了这一块的不熟练,然后面试官也没细问。
5. 什么是函数柯里化?以及说一下 JS 的 API 有哪些应用到了函数柯里化的实现?
这个我就说了一下函数柯里化一些了解,以及在函数式编程的应用,最后说了一下 JS 中 bind 函数和数组的 reduce 方法用到了函数柯里化。
6. ES6 的箭头函数 this 问题,以及拓展运算符。
这一块主要是 API 和概念的问题,扯了一些规范以及严格模式下其他情况 this 只想问题。
7. JS模块化 Commonjs,UMD,CMD 规范的了解,以及 ES6 的模块化跟其他几种的区别,以及出现的意义。
这个也是说了一下自己的理解和认知,自己对模块化历史以及一些规范都有所涉猎,这一块也还凑合。
8. 说一下 Vue 实现双向数据绑定的原理,以及 vue.js 和 react.js 异同点,如果让你选框架,你怎么怎么权衡这两个框架,分析一下。
主要是发布订阅的设计模式,还有就是 ES5 的 Object.defineProperty 的getter 和setter机制,然后顺便扯了一下 Angular 的脏检测,以及alvon.js最先用到这种方式。然后扯了一下 vue.js 和 react.js 异同点,权衡框架选择,调研分析之类,噼里啪啦说了一大堆。
9. 我看你也写博客,说一下草稿的交互细节以及实现原理。
这一款就按照自己用过简书或者掘金,SG 这类草稿的体验,详细说了一下,这个开放性问题,说到点基本就OK。
最后面试官问我有什么想问的吗,面试到这里基本就结束了,差不多面了一个小时,说过几天就会给答复,如果过了就会去阿里园区进行下一轮的技术面。
上一轮发挥感觉没前两轮发挥好,所以还是有点不自信的,没想到第三天后,就来电话了,通知我去阿里园区面试。
因为阿里西溪园区距离我不到十公里,我就踩着共享单车一点钟就出发了,天气比较热,飘在路上,百感交集,身边一辆法拉利轰鸣而过,又一辆兰博基尼呼啸而过,我心里一万头草泥马奔腾,心里暗想,为神马开这车的人不是此刻看文章的你?
走到半路了,面试官给我打电话了,说我怎么还没到,说约定的是两点钟,我一下子就懵逼了,短信只有一个游客访问ID,并没有通知我具体时间,反正不管谁的疏忽,我肯定是要迟到了,于是我快马加鞭,踩着贼难骑的共享单车,背着微风,一路狂奔,到阿里园区已是汗流浃背,油光满面,气喘乎乎......
面试迟到了,印象肯定不好,加上满头大汗的形象也不太好,加上自己饥渴难耐,这面是估计要 GG 了,一进来就直奔主题,这次是两个大 Boss 面试我。
1. 先自我介绍一下,说一下项目的技术栈,以及项目中遇到的一些问题啥的。
这个问题就是个开场白,简要说明一下,问题都不大,这个面试官就是第一次打电话给我面试的那个 boss,所以技术那块 boss 心里也有个底细,所以没再问技术问题。
2. 一个业务场景,面对产品不断迭代,以及需求的变动该怎么应对,具体技术方案实现。
具体业务场景,我就不一一描述,Boss 在白板上画了一个大致的模块图,然后做了一些需求描述。
然后需求一层一层的改变,然后往下挖,主要是考察应对产品能力,以及对代码的可维护性和可拓展性这些考察,开放性问题,我觉得还考察一些沟通交流方面的能力,因为有些地方面试官故意说得很含糊,反正就是一个综合能力,以及对产品的理解,中间谈到怎么实现,也问到了一些具体的点,记得问到的有一下几个:
怎么获取一个元素到视图顶部的距离。
getBoundingClientRect 获取的 top 和 offsetTop 获取的 top 区别
事件委托
1. 业务场景
比如说百度的一个服务不想让阿里使用,如果识别到是阿里的请求,然后跳转到 404 或者拒绝服务之类的?
主要是考察 http 协议头 Referer,然后怎么判断是阿里的 IP 或者啥的,我也不太清楚。
2. 二分查找的时间复杂度怎么求,是多少 ?
......排序的还算清楚一点,查找真的不知所措,没回答上来,也没猜,意义不大,不会就是不会。
3. XSS 是什么,攻击原理,怎么预防。
这个很简单,跨站脚本攻击 XSS (cross site scripting),攻击类型主要有两种:反射型和存储型,简单说了一下如何防御:
转义
DOM 解析白名单
第三方库
CSP 自己对 web 安全这块系统学习过,前前后后大约了解了很多,对于XSS ,CSRF,点击劫持,Cookie 安全,HTTP 窃听篡改,密码安全,SQL 注入,社会工程学都有一定了解,所以这个自然也不在话下。
4. 线性顺序存储结构和链式存储结构有什么区别?以及优缺点。
我是类比 JS 数组和对象来回答的,反正还算凑合吧,自己都数据结构这块多少还是有些印象,所以入了前端,对数据结构和算法确实一直淡忘了。
5. 分析一下移动端日历,PC 端日历以及桌面日历的一些不同和需要注意的地方。
这个我能想到的大致都说了一遍,不同的场景交互和细节以及功能都有所偏差,以及功能的侧重都可能不同。
6. 白板写代码,用最简洁的代码实现数组去重。
我写了两种实现方式:
ES6实现:
ES5实现:
7. 怎么实现草稿,多终端同步,以及冲突问题?
这个回答的不算好,本来也想到类比 git 的处理方式,但是说的时候往另外一个方面说了,导致与面试官想要的结果不一样。
面完之后,说目前的工作经验达不到 P6 水平,业务类稍弱,阿里现在社招只要 P6 的高级工程师,但是可以以第二梯队进去,就是以第三方签署就业协议,一年后可以转正,就是俗称的外包。多少还是有点遗憾,面了四轮面了个外包,最后放弃这份工作了。
最后,感谢 boss 一直以来的关照和器重。
— End —
往期推荐
想获取更多免费学习资料,每周参加优质的免费公开课?赶快扫码关注“StuQ”公众号吧!
部分图片来源:网络