Ali面经

cover
其实作为大二学生是本不急着找实习的, 是刚从寒假回学校就感受到了周围春招的氛围. 于是三月初就先在阿里校招的网站上投了简历, 也没学过怎么写简历, 常规的博客, github, 项目, 会用的时髦技术尽量往上写, 内容上也并没有什么亮点. 而后也投了一些小公司, 积累了一些面试经验, 中间也拿到了去豆瓣实习的机会, 不过这都不是重点, 转回正题.

阿里的整个面试流程相对于BT要规范的多, 通过在线笔试后(后来得知全国做完前端笔试题的一共有2K多个人), 系统会把你的状态变成待安排面试, 并给你发短信让你进校招系统预约面试时间, 我选择的是成都站的面试, 支持5月5日一整天和5月6日的早上, 一天内又分好几个时间段, 考虑到从学校到成都需要三个多小时, 我选了5号的下午16:40, 然后顺便也会从后台获得一张通关卡, 将条码打印出来这个会在面试当天用到, 这个条码也是确认你身份的方式.

请了假, 定了当天来回的动车票, 一大早上完一二节的计算机网络, 就直接去面试地点. 到成都的时间差不多是下午两点左右, 早上来的几个学长因为是预约的下午的时间, 被告知下午按时到ali下榻的酒店签到, 我因为没地方可以去就直接进了酒店, 在签到处把通关卡和最新的简历交给工作人员, 就被通知进了候场区等候, 候场区有一个很大的滚动大屏幕(感觉是个全屏的网页), 上面有显示被叫到去面试的人和对应的面试官. 放下包去上个厕所的功夫, 在🚾就收到了一面的通知, 感慨效率之快的同时, 也径直到面试官们所在的大厅去(会有工作人员陪同到对应的面试官面前, 所有面试官面前都是一桌, 一MacBook😢).

一面的面试官看起来挺年轻, 先是比较常规的问题:

  • 自我介绍 – 我也就扯了些大学之前接触互联网, 以及大学之后怎样学习前端的经历, 做了哪些项目, 主要负责什么工作…

  • CSS 和 JS 哪方面强一些 – 直接回答的JS, 因为自己也比较多接触node后台方面的东西, 对逻辑性的东西比较感兴趣, 大概平时学习前端过程中70%是接触的js方面, 至于css也是正在提高中.

  • 给了一道js题, 将”alibaba”字符串去重 – 这个比较简单, 直接转化成数组去重的题

    1
    2
    3
    4
    5
    6
    7
    8
    var merge = function(str){
    if(typeof str !== 'string') throw new TypeError();
    var _ret = [];
    str.split('').forEach(function(_s){
    if(_ret.indexOf(_s) !== -1) _ret.push(_s);
    });
    return _ret.join('');
    }

然后他问我这个函数的时间复杂度是多少, 我回答的是O(n), 他提示道indexOf在调用内部会排序, 才意识到复杂度是O(logn), 他让我改进一下, 我直接写了var _obj = {}, _ret = '';就被示意ok了. 这题开始写的时候确实是不够严谨, 在object和array两种方式之间随便挑了个, 没有注意到indexOf的坑, 平时也该多注意.

  • 然后是一道css布局题, 左右100px固定, 中间内容区自适应 – 拿到这题应该很熟悉, sidebar布局很常见, 不幸的是我当时脑袋有点昏, 想了半天… 第一个说的是flex比较方便(确实方便), 主轴定为横向, 用3个div, 左右两个固定宽, 再设定flex居中就可以中间自适应宽度. 然后普通方法就比较多, 我先讲思路, 左右两个固定宽度的容器应该脱离文档流, float, 绝对定位, fixed都可以, 中间一个容器应该是100%宽度, 左右留出100px的空间来, 用margin, 当时脑抽说了padding, 面试官还提醒我是哪一种盒模型. 如果是border-box(IE6怪异模式)确实可以用padding了…

  • 然后问了我的项目, 有什么比较难的点, 是怎样解决的 – 貌似所有的面试官都会问这个, 我拿前几天给团市委写的实时投票说, https://github.com/wssgcg1213/WsVoter
    这个东西类似于央视星光大道投票, 用户端访问用户端页面投票, 大屏幕端与服务器通过socket.io双工实时将票数信息显示在大屏幕上. 扯了一些技术细节以及我在测试并发的时候遇到的问题, 估计他不是很懂后端这方面也没多问. 然后又问了我一个开源项目https://github.com/wssgcg1213/GhostBot 这是一个基于RSS的前端搜索引擎, 他就优化方面提了很多问题, 比如如何进行的关键字匹配, 我是直接用的正则, 他提出如果用户输入两个关键字, 怎样进行筛选, 我想了想说用类似于sizzle引擎的方法, 先把关键字分组, 按第一个关键词选出一个种子集, 再在种子集里选择第二个关键词的内容. 面试官说这样可能时间复杂度比较高, 有没有更好的. 我想了一会说还是直接用正则, 他让我手写正则因为忘得比较多当时写的比较龊也不献丑了…

  • 然后还问了有没有读过jq的源码, 我说了解过一些jq原型链的实现, 将jQuery.fn = jQuery.prototype等等, 问链式调用如何实现->return this, jQ的选择器原理 -> 从右到左, 选择器分组, 种子集.巴拉巴拉…, zepto怎么实现? -> querySelectorAll.

然后就让我先回去等消息了, 回到等候区看了下时间差不多40分钟左右, 喝了口水短信也发来了, 说是让我等待一会预祝面试成功什么什么的, 在校招官网后台查询到结果即将在xx点xx分揭晓. 也是没过几分钟就接到了二面通知, 得继续面~

这个面试官看起来沉着多了, 大概三十几岁的样子, 从他的MacBook Pro 15’ 差不多可以看出等级要比刚才的一面官(Macbook Air 13’)要高一截😂..

未完待续…