微派前端面试经历
趁着考研初试成绩出来之前,投了很多家的春招招聘,面了一些,也拒了一些。之前都没有什么面试因为面试给我带来太多的帮助,或氛围不行,或白菜价格,而此次面试得到了很多很不一样的思考方式和提升,特此记录
一面
因为本来就有做任何事都提前半小时做好准备的习惯,这次也不例外,所以就提前半个小时进入了面试会议,虽然额外又多等了十五分钟,不过影响不是特别大。
自我介绍
掠过
正文
面试官:看你简历上写做个小程序的优化,可以讲讲小程序的优化么?
我:在该小程序中,我分为了两个优化点。分为延时加载,和差异比对,减少
setData
的批量使用,以及对于虚拟列表的优化实现,首先对于第一个,因为实时效果要求比较严格,而频繁的轮询会导致反复的数据赋值(算是我自己开发时候的疏漏吧)。然后是厂列表,分了两个部分角度优化,分批次setData
,以及虚拟滚动(这个是之后开发时候的想到的,虽然没有实际用上去)。面试官:差异比对,给你一个复杂对象,怎么去做呢。
我:Diff 算法的话太奢侈了,我可能会选择给他转成 JSON,比对一下就是,或者找一个 NodeID ,这种给他绑定,而不是每一个都判断
当时讲的时候,没有现在这么讲的简洁了,不过差不多想要表达这个涵义。
面试官:你在 xxx 系统写做到了权限控制,你可以讲讲你的思路么?
我:在当初我们后端并没有写完整的某个用户能看到什么的权限表,我只有一个用户的身份信息,只知道这是不同权限的人登录,并不知道这个人具体有什么权限,我参照之前实习的时候的一个解决方案,自己维护了一张权限表在本地,然后用
v-if
这些指令结合vuex
,getter
,并将getter
封装成函数,然后呢,再做校验(这样做其实问题很大,逻辑层彻底与 UI 耦合了,但是多少是一个解决方案,后面单独抽出指令,把权限表在指令中设计,用display
来做控制,从而做到单个按钮的原子级组件控制。这个其实是目前市面上看到过特别多的解决思路,我当初并没有查到,甚至当我开发的时候,都没有搞明白这个专有名词是个啥,因为之前太忙于做项目,以及蒙头书中,所以对于前端的一些解决方案并不知道其他人如何解决的,基本都是自己思路想到了,最后运用的七七八八,才知道这个解决方案,人家已经在用了,我面试的时候也是这样说的,因为这个简历毕竟是之前的,而且我认为这玩意确实是当时我独立思考的成果,所以还是能说出来的,而且在设置权限表的时候就像是去设计一款协议一样,也并不是很简单。
。。。然后又是一些项目上的问题
面试官:我们来简单问两个技术问题,
js
的事件循环知道么,以及宏任务,和微任务。我:所谓的宏任务,微任务是一个因为多线程带来的问题,就好比时间片轮转一样,在操作系统中有众多进程,进程之间通过回调来做消息通知,我们知道浏览器的 JS 是单线程,但是绝不会有谁说加上 timer 计时器也仍然是单线程,以及 UI/Render 的线程,他们是分割开的,DOM 的解析和 JS 是一起的,但是 CSSOM 的又是另外一个,所以就出现了, RequestAnimateFrame ,RequestIdleCallback 这种东西,以及setTimeout,setInterval,处于不同线程的任务,对于每一个线程的回调执行,便对微任务队列进行一次批量回调,也就是一个圈的模型,这也解释了为什么 setTimeout 相比于 ReqeustAnimateFrame 出现极小的一个时间差不平衡,一般来讲起码有 0.4ms 的误差,如果遇到更难执行的任务,卡在 js 线程,那么等待的时间就更久,而这也是为什么微任务引入的原因,避免同步任务卡太久,导致渲染不给力。
我当时一下就高兴起来,毕竟我自从把事件循环所谓的宏任务,微任务以及操作系统的进程线程模型联系起来之后,感觉打通了任督二脉之后,就没人怎么问我这个东西了,非常怀恋,RequestAnimateFrame 并不是当时答出来,只是做在这里,现在作为总结,连贯一些。
面试官:那让你实现一个倒计时,你有什么思路?
我:闭包,采用闭包缓存一个
count
,然后采用 setTimeout ,或者 setInterval 实现,但是 setInterval 的 timer 容易丢失,而且处于休眠过程中,或者其他页面的时候,就会停止还是说会继续来着(说实话我当时也说不清,现在也有点描述不出来)。面试官:还有没有其他方案呢?
我:(突然绷不住了,确实大概就这两个方案,我实在想不出来),不好意思,确实想不到其他方案,可以给个提示么。
面试官:有了解过 RequestAnimateFrame 么
我:了是了解过,这个可以使得动画边得平滑,不过还是没啥大思路,只知道,大概它的时间间隔和屏幕的 fps 有关,(说实话,我估计是当时理解了他想表达的含义了,应该想说的是展示时钟,那种,这样在刷新屏幕的时候更新值就可以了,这样会更加平滑,准确)
面试官:再问一个问题,我看你对 Vue 用的多一些,你可以讲讲 Vue 的实现以及优势么。
我:(Vue 双向绑定 ,以及与 Vue 3 的一个对比,以及之前对源码的一些理解,以及其中对 Object.defineProperty 和 Proxy 的关系,以及从作为一个语义开发者对这两个 API 的一个理解)+ (VNode,讲到这玩意的时候很多东西都忘了)+ Diff 算法。
面试官:可以讲讲 Vnode 的作用么?
我:提升性能,组件化,做 Diff。
面试官:还有没有呢?
我:。。。(当时确实没想出来)
面试官:SSR 了解过么,SSR是如何生成 HTML5 的?
我:(吧啦了这个我之前遇到过,服务端渲染,讲了一下他的实现效果和SEO上的作用,不过还是联系不上 Vnode)
面试官:Vue 组件化为什么不用HTML5 的component?
我:兼容性吧?然后讲了一下兼容性的问题。我好像对 Vnode 的有些眉目了。
面试官:说说?
我:难道是因为兼容性问题?
面试官:缺点,不太对,要不你猜一下?
我:竟然让我猜,那我就思路飞起来了,从 SSR 角度来想,联系起来,我不由得和 ORM 对比起来,其中 ORM 就是对象关系操作模型,也就是简化 SQL 的一个东西,难道是 Vnode 生成 HTML5,跨平台,移植性?
面试官:差不多,那总结一下?
我:/。/。/(总结一下)
面试官:简单做个算法题?
P A L E
P L E
有三种操作方式,加一个字符串,和删一个字符串,和改变一个字符串,问能不能一次操作实现两个字母边得一样。
我:这个题很熟悉(当时和 leetcode 那个题记错了,也不是背题,只是一眼晃过来,就忽略了,只要一次操作这个边界就开始想着动态规划去做,几个实现,然后写了半天,思路错了,面试官提醒,然后发现条件限制,然后就突然卡住了,这个题就一下子 A 不出来了,。。。面试官耐心的说,可以分成情况讨论,什么情况是不可能成功的,-提示部分就不继续说了,然后总之当时没写出来,不过大概思路是双指针了,我还往 KMP 方向思考了,回头再看确实是想复杂了,直接双指针,合并一下,然后两个指针位置只差大于2 就跳出就是,面试完之后,干饭的时候想起来,心中五味杂陈,主要是这个题不难,自己想复杂了)
其中有部分面试时候问的内容,回忆不太起来了
反问环节
关于学习建议。(在面试的时候,我基本都会问一下这个问题,因为这样可能给我未来有更大的帮助,至少学习方法不能错)
面试官:看得出来,你对底层源码很熟悉,有比较丰富的经验,也有很好的学习习惯,但是对于这些框架的参生,以及其为什么有这个,而不是另外一个已经有了的工具,换句话说就是为什么,这个能取代其他成为主流,可以从这样的宏观角度去思考,从业务层面也好,从实际出发也好,从底层原理出发也好,都需要具体了解,这个技术本身解决了什么问题,像我之前在组内和成员分享的时候,有时候甚至会涉及到某一个属性的实现,从 Webview 本身去看这个的一个原理,这些内容可以是一个学习方向,也就是说知道原理只是为了更好的运用,而不是更困难的去学习。(内容大概有删减,但是呢,也是我理解他说的一段话的含义)
在对于新的框架学习的时候,一定要去思考他的运用场景,他解决了什么问题,它为什么能成为主流,然后它是如何解决某个问题的,以及框架本身的历史包袱,只是自然而然的一个学习过程。这对我的一个学习方法有了转变,之前只是用工具,然后听说这个工具能够解决问题,然后我去采用工具,但是对于它为什么能解决我的问题确实是一知半解的
如果我成功通过面试之后,可能的业务线与技术栈?
。。。。
二面
自我介绍
讲项目
一些基本题
面试官:Promise 有哪些静态方法?
我:我记得的大概有,三种状态组合,要么都完成,要么都没完成的,直接让他完成的,所有任务中完成一个就返回的,不管成不成功都要返回的(实际上,我只是想到了 race all resolve reject 还有其他的,这种 API 其实根据现实场景去寻找更加合理)
面试官:ES6 有哪些常用方法
我:我所记得的有,定义变量的(let const ),简化操作的(解构赋值,展开运算符。。。),异步操作的(yield generator),新的数据类型(Bigint Symbol),出现类的概念,更多的 String 方法。(回答的比较笼统,确实考研去了,这些新规范忘记了很多,这个可以在 W3C 上去看)
面试官:说一下 let const 的区别
我:(这个就是很基础的内容了,不过这是因为做题的时候疯狂用到 let
的原因,其实用 const 更加合理)
算法题
也不太能算作是算法题吧,只是一个应用题吧
也就是把下面的数据集合,让你实现每一次输入,然后更新这个建议集,
简单的思路直接 BF,直接 Search
, startsWith 啥的,构造正则表达式,巴拉巴拉
然后就是可以把 goog 进行结构转变,构建一个树就行了
反问
因为是不同业务线的面试官,就顺便问了一下他所处的业务线,以及相关内容,毕竟考虑到如果去了之后,好选择业务线。
三面
问项目
如何排查 Bug
算法题和思维题
算法题
给定 n+1 个数字,然后随机放入 n 个到某一个数组,然后判断哪个数没放进去
基本思路:遍历 n+1 次,异或一遍
思维题
假定一个聊天室,只有我和你两个人,然后我说我有一个超能力,能够知道你有多少根头发,你怎样判断我是否真的有这个超能力。
当时看的时候还觉得蛮新颖的,再加上有些紧张,一时半会想不到解决方法,差点去手写真值表,然后面试官提醒,如果服务器有一个功能,可以去输出一张图片有多少个某个颜色的像素点,怎么去验证他,不过我听完之后还是没思路,然后转念一想,我作为客户端,我只有我自己的信息,那我对于服务器也是一个黑盒状态,那么我只要保证我的随机性,然后知道我自己的信息差,然后让对面来猜就行了,也就是你先来问我一次,我报一个数,然后你偷偷去拔掉一根(可以是随机的根,只要自己知道就可以了,有一种类似私钥的感觉),你再来找我问你有多少根,然后从而就能判断出,是否真的有这个能力了。
后面研究了一下,发现这个是在区块链很火的一个东西,零知识证明,本来之前也在关注区块链,不过主要是 p2p 层和 共识机制(因为和分布式这个很有共同点,所以关注的比较多)。