# 蚂蚁暑期实习前端面试 这次面试的是蚂蚁的智能协同事业部,也就是语雀这个产品线,`okbug`非得给我推,今年到目前为止也就面了两家,再面一家不过分吧,所以`okbug`就给我推了。`2022.03.12`上午`11`点左右投的,然后还要做测评,这个挺烦人的,不过也很快就做完了。 ## 一面 周六上午`11`点左右投了,晚上七点就给我打电话,约了一面,并且还给了三道笔试题让我做完,一面约的时间是在`2021-03-16 19:00`,面试时间有`55min`。 * 笔试第一题,解析目录成为树结构。 * 笔试第二题,数组去重。 * 笔试第三题,`Promise`的串行执行。 * 油猴脚本的实现,主要是什么内容,这个是我在`GitHub`开源的脚本。 * 腾讯实习的时候的主要工作,做直播业务时遇到的问题。 * 前端框架和前端工程化方面的了解。 * 喜欢`Vue`的哪些特点。 * 登录注册的前后端整体流程。 * 手机验证码登陆的前后端整体流程,具体细节怎么做。 * 如果用户一直收不到验证码都可能有什么问题。 * 如何做到数据传输的安全。 * 数据安全具体是防范什么问题的。 * `PC`端拖拽加入购物车的具体实现。 * 移动端多个商品加入购物车的具体实现,多点触控。 * `Node`做后端的相关了解。 * 前端后端偏向于哪里。 * `ThinkPHP`如何处理的页面输出或者是接口。 * 服务器的性能监控、异常监控如何做。 * 服务器`CPU`突然爆表如何处理,如何排查问题。 * 后端的代码的异常监控,告警处理。 * 前端和后端如何平滑过渡升级。 * 多台服务器如何平滑处理后端升级。 * 容器`docker`相关的内容。 * 数据库相关的内容。 * `babel`如何处理的代码,相关原理。 * 笔试第一题相关的解析字符串结构的相关方案。 * 笔试第二题还有哪些处理方案,时间空间复杂度,`10`亿个数字怎么处理。 * 小程序如何处理卡顿问题。 * 前端如何进行性能的指标排查与相关工具,如何定位问题。 * 如何优化页面的性能。 反问阶段是问了一下语雀相关的业务组,好家伙我以为是前端,原来是全栈,包括前端后端数据库运维,当然具体是分组安排的。说实话本来我以为一面应该是一个比较轻松的面试,没想到给我问懵了,全都是场景题,人都问傻了,不过面试体验还是很不错的,面试的老哥都还是会给予一些提示的,老哥就是有点不苟言笑。对了老哥还是今年面试过程中目前我知道的唯一一个在面试前就去翻我`GitHub`的,老哥真不错。附一下当时写的笔试题第一题的代码。 ```javascript class Node { constructor({ value, level, parent }) { this.value = value; this.level = level; this.children = []; this.parent = parent; // hint: 也可在数据结构中增加 this.parent 节点辅助解析 } } const str = ` - 章节一 - 标题一 - 子标题一 - 章节二 - 章节二子子标题 - 标题一 - 标题二 `; function parseTree(text) { const lines = text.split("\n"); let curLevel = 0; let preIndex = 0; const target = []; let preNode = null; let parentNode = null; lines.forEach(line => { if(line === "") return void 0; if(!/^[\s]*- /.test(line)) throw new Error("Each line should start with - "); const index = line.indexOf("- "); if(index % 2 !== 0) throw new Error("Start tabs must be even"); let levelChange = Math.floor(Math.abs(index - preIndex) / 2); // 层级变动 if(index > preIndex) { while(levelChange--){ curLevel++; parentNode = preNode; if(levelChange > 0) { // 如果从1级标题直接到三级标题等 加入空节点 preNode = new Node({ value: "Empty Node", level: curLevel, parent: parentNode }); parentNode.children.push(preNode); } } }else if(index < preIndex){ while(levelChange--){ curLevel--; if(parentNode) parentNode = parentNode.parent; else parentNode = null; } } preIndex = index; const node = new Node({ value: line.slice(index + 2, line.length), level: curLevel, parent: parentNode }); if(parentNode) parentNode.children.push(node); else target.push(node); preNode = node; }) return target; } const result = parseTree(str); const output = node => { console.log(new Array(node.level).fill(" ").join(""), node.value, node.level); node.children.forEach(item => output(item)); } result.forEach(item => output(item)); ``` ## 二面 好家伙,周三晚上刚面完,周四中午就给我打电话约面试。这次面试的是阿里的不四大佬,这可是需要膜拜的巨佬,然后面试也就是跟我聊起天来了,不是我想象中的那么严肃。二面约的时间是在`2021-03-18 15:00`,面试时间有`35min`。 * 介绍一下你觉得比较有意思的项目。 * 小程序前端的技术方案。 * 小程序后端的技术方案。 * 小程序都做了哪些功能。 * 在腾讯实习的时候学到了什么,最重要的是什么。 * 实习期间做的东西都上线了吗。 * 平时是怎么学习的。 * 学习前端的契机在哪,为什么不做后端。 * 研究生阶段的研究方向。 * 为什么不继续研究生的方向。 * 如何实现的病毒检测。 * 用的什么模型,神经网络怎么搭建的。 * `Node.js`的了解。 * 对于后端技术方面的研究。 * `http`协议的优点和缺点。 * 对实习上的期待。 反问阶段问了一下想要巨佬给我一点建议,巨佬评价了我在学校做的小程序与一些脚本插件,然后对我说我对于实习期待的技术上的提升,依赖公司很可能是不够的,因为无论是因为时间或者是技术债方面的问题,很可能没有办法去接入或者跟随新的技术,而你现在有一些自己的纯粹的项目,可以尽量将学习的东西融入进去,无论是对你自己技术的提升,亦或者是将来留给后边的人继续做,都是非常重要的事情,自己的东西你可以想怎么做就怎么做,想怎么改就怎么改,但是公司的东西可容易处处掣肘。巨佬说的真的是非常有道理,我也要尽量去做到这点吧,毕竟现在时间还算是有的,当我工作了之后,真的很可能没有很多时间想做什么就做什么了,非常感谢不四巨佬。后期复盘的时候感觉我这场面试发挥的不好,感觉很多东西并没有展现出来,我反思了一下我觉得我也应该提及一下我相关的优势,不能只在面试官问的问题上回答。 ## HR面 好家伙周五面完了,周一就给我打电话约面试了,`HR`姐姐也是挺爱笑的,说起来挺尴尬的,我是提前约的时间五分钟进去的,正在哼着歌打开了会议,然后就尬住了,最怕空气突然安静。`HR`面约的时间是在`2021-03-24 09:50`,面试时间有`25min`。 * 对于实习选择的城市有什么想法。 * 在腾讯实习是实地实习还是远程的。 * 实习过程中学到的最重要的东西是什么。 * 学到的东西举个例子。 * 如果能重来一遍,怎么避免这个问题。 * 有面其他的公司吗,实习为什么没面腾讯。 * 个人的优点和缺点,同学的评价。 * 优点举一个详细的例子。 * 什么时候开始正式接触前端的。 * 有参加学校的什么活动和项目。 * 有用过语雀吗,给一些优点和缺点。 * 平时与同学都交流些什么。 * 会把语雀推荐给同学吗,为什么。 反问阶段我问了胜任这个职务最重要的东西是什么,`HR`姐姐给了我两点比较重要的内容,`1`是学会沟通,在工作的过程中沟通时很重要的,需要能够听明白别人说什么,还有能够说明白自己要做什么,`2`是不懂就问,每个项目都是伴随着公司的成本的,所以出现了问题要及时询问与沟通。感谢`HR`姐姐的建议,我觉得说的真的很有道理。最后姐姐说要等`1`到`2`周的时间评估一下才会有结果,那只能慢慢的等了。 ## 后续 不用等`1`到`2`周了,在`2022.02.25`我闲的没事去招聘官网看了看,给我挂了,排序没排过那也没办法了。