前言
自从离职后,除了稍微放松一下,休息了几天,准备面试也成了日常中的一环,距离上一次面试已经有超过五年的时间了,所以系统性的准备还是有必要的,这阵子也陆陆续续投了不少的简历,参加了不少面试,如今的面试体验和从前完全不同,这里简单分享下我最近的面试感受
总体流程
作为一名技术人,平时都只是在卷技术,出来了才发现,原来招聘流程也这么卷了!技术面两面起步,很多公司光技术面就要三轮,三轮过后还可能要加面,技术面完 HR 面,HR 面完还要有 Offer 审批...而且每一轮面试并不是在同一天进行的,这就把整个面试流程拉得很长,相当浪费时间。几年前在面网易时,虽然也有两轮技术 + 一轮 HR 面,但一个下午1~4点就全部搞定了,如今,时代变了
基础部分
一面免不了前端基础和一些八股问题,接下来分享下我最近面试遇到的一些面试题:
- JS 中基本类型和引用类型的存储方式
- JS 中的垃圾回收方式
- BFC 的概念,触发条件,使用场景
- position 的值有哪些,分别相对于什么定位
- script 标签 defer 和 async 的区别
- js 中如何判断 this 的指向
- 浏览器中的 eventloop(高频
- 谈一下对浏览器缓存的理解(高频
- 对 http2 的了解
- commonjs 和 ES Module 的区别(高频
- 页面性能指标有哪些,如何计算
- 前端性能优化常用方式
- webpack loader 和 plugin 的区别
这些问题的答案网络上一搜一大把,只要有准备都不至于答不上来,不过如果你有一定的工作经验,面试官会更深入问一些细节,以浏览器缓存为例,大部分同学都可以答出“分为强制缓存和协商缓存两类,强制缓存不需要向服务器发送请求,协商缓存则需要发送请求,通过304 code判断是否需要使用缓存”,如果面试官继续追问哪些请求/响应头是和协商缓存相关的,有什么区别,如果让你来设计应用的缓存策略该如何选择时,如果没有相关实践,就没那么容易答上来了
eventloop 和 cjs/ESM 区别是很高频的题目,建议大家准备充分
项目相关
一面侧重基础,基础过关之后,二三面更侧重项目,也会有一些场景设计题,这部分主要考察候选人的项目经验和技术深度,解决问题能力等,简单说下我遇到的:
项目相关(我的简历里有写搭建平台,小程序跨端开发,和IM系统等):
- 你在工作中遇到过哪些印象深刻的问题,是如何解决的
- 搭建平台的实时预览功能是怎么做的
- IM 功能是通过什么技术实现的,做 IM 系统需要注意哪些问题
- 小程序跨端如何实现?跨端框架如何做到视图层框架无关
- 小程序性能优化方法有哪些
场景题:
- 如果让你设计一个前端监控 SDK,你会如何设计
- App 中从广告位跳转到广告页性能较差,如何优化
作为一个业务开发,对工作中遇到的问题,或是说业务痛点这个事,我起初的思想比较局限,总觉得用了一些新技术,或是有深度的东西解决了业务需求,才值得拿出来说,但其实并非如此,大多数业务需求都不会难到要靠各种算法,深层技术去解决,我们可以从其他角度去看这个问题:开发业务需求也是我们每天的工作内容,开发流程中的难点,也有很多可讲之处,比如中后台开发,标准化和提效始终是痛点,通过定制开发规范,接口规范提高接口交付效率,通过搭建方案,或是简单的模板+CLI快速创建页面,沉淀统一视觉规范的组件库等,都是在通过技术手段,解决研发效率和标准化的难题。另外,中后台的用户体验是从前一直被大家遗忘的地方,但前端作为离用户最近的技术同学,不能仅满足自己开发的系统“能用”,更要让它“好用”,最后让用户“爱用”,这就要求技术同学有发现业务问题的能力,发现问题的途径有很多:
- 自己多使用自己开发的系统
- 通过埋点监控上报的数据,可以分析出用户的行为习惯,挖掘潜在问题
- 调查问卷
如果在工作中有过以上实践,说明你发现问题和解决问题的能力都很棒👍
手写 && 算法
一开始我听说前端面试需要准备算法时,我是比较震惊的,毕竟算法这东西如果不是架构组开发的话,平时真的很少碰,结果发现现在 80% 的公司面试都要求会一些基础算法和手写题,贴一些我遇到的:
算法:
- 全排列
- 最长公共子序列
- 零钱兑换
- 合并区间
- 爬楼梯
- 返回无序数组第K大的数字
- 无重复的最长子串
手写题:
- 手写 Promise.all
- 并发请求控制(超高频
- 简易 koa-compose
- async-add
算法和手写题难度适中,只要认真准备,和开卷考没什么区别,如果不知道从哪下手,建议以CodeTop做下参考,我自己做了前端岗位 Top100 的算法题,覆盖到了我面试的全部算法题。所以算法手写部分与其说是考查算法能力,不如说是考察准备用心程度,毕竟考的都是 easy,medium 程度的算法,都很常规,不至于看不懂。而且手写题,面试官也不会出代码量过大的题,不但候选人写起来时间长,面试官看起来也费神,所以手写部分都是一些简单实现,几十行代码就可以搞定,再复杂的写一下伪代码,说一下思路就好
有的同学可能会问:easy 难度的算法有什么好考的?但是,我在面试中就遇到了几个 easy 难度的题,这些题并没有出现在一面,而是出现在了二三面中。一道题的解法有很多种,每种解法的时间,空间复杂度又不一定相同,当面试官出了一道 easy 难度的算法题时,想考察的绝对不是你能不能解出这道题,而是想适当做一下进阶:能不能优化一下时间,空间复杂度?所以建议各位在刷题时,如果遇到了 easy 的题,可以看一下题解,掌握多种解法,面试时,先写出基本解法,面试官问到能否优化时,先表面思索几秒,然后写出最优解😆
最后
以上是我最近对自己面试的一些心得,和大家简单分享一下,希望对大家有帮助~