前言:经过了两个月多月的准备,2019年3月我开始发简历面试,地点上海,3.5年前端开发经验。本文主要记录两个内容,1是我面试的一些感受和经验总结,2是我认为前期要做的一些准备。
面试感受总结
1、面试前期准备很重要
尤其是对于我这种代码造诣不深的人,前期准备真的太重要了。记得上一次换工作是一年半以前,我本来想内部trans到百度品专上海的部门,很自以为是的认为内部trans并不需要准备,随便聊聊工作内容就可以了。结果大失所望,问了三题之后,面试官说,我们还要继续吗?当时就恨不得找个地洞钻进去。从那以后我深刻的明白了一个道理:永远不要打没准备的仗,机会永远是留给有准备的人!
2、平时有意识的积累沉淀很重要
平时做业务多的人一般都会犯一个错,喜欢copy自己的或者别人的代码。这种习惯很不好,一定要养成自己的代码自己敲的习惯。
还有一点,面试中一定会问的一个问题,就是你项目的难点,平时遇到难点问题的时候就要记得记录下来,你是怎么解决的,最后落地了没。
最后,关注小组其他同学沉淀的很不错的点,学习、吸收、转化成自己的!借力打力,面试时候也可以拿出来说。
3、coding!!!!!
对于头条、阿里、pdd这些要求比较高的公司,一定是有现场coding的环节。你其他理论基础、源码理解准备的再好,coding一下就暴露了。本人就是这个例子。
coding能力不可能抱下佛脚就能临时解决的,一定是平时很用心思考+多敲多练习的。如果你觉得自己coding不行(说的就是我自己),战线就要拉得长一点,从两个点来突破自己:
- 1、业务中实践,用心思考每一段代码背后的逻辑,而不是写了就完事。尤其是通用组件和封装的方法,其实都是别人总结的最佳实践,想想自己写的能实现吗?怎么实现?
- 2、刷题。leetcode中的算法题目,每天一道练习,找手感,锻炼思路。
面试review
基础理论get
说下我的面试准备过程。首先是刷了3本觉得不错的掘金小册。
- 【前端的面试之道】:基本复习要点都覆盖到了。
- 【前端性能优化原理与实践】:作为面试之道的补充,个人认为这个小册的作者表达很强,每个点都描述的简洁又准确。
- 【React 实战:设计模式和最佳实践】:我的技术站是react,这本小册重点看了下最后几章,服务端渲染,react的未来新功能(会让面试官觉得你关注学习新技术,知识面比较广)
到此准备的第一部门结束,我的理论基础部分95%是过关了。
源码进阶get
下面就开始进阶第二部分,深入了解项目中脚手架中涉及知识点的源码以及背后的原理。以下是我准备的一些进阶的内容:
1、react源码
react源码理解部分我主要从以下3个方面入手:
《深入react技术栈》:这本书比较老了,很多事照着v15来讲的,v16其实已经升级了Fiber架构。不过基本的思路都是一致的。
《React源码解析》系列完结: 对于源码总结整个流程比较清晰。
前端早读课中搜索react Filber架构相关的文章,作为以上两者的补充。
2、koa源码
koa源码就去github大胆阅读吧,就200多行代码,核心处加起来就三四十行。看懂了洋葱模型那块10行代码,你就了解了koa的本质了。
另外,koa中间件不管是官网提供的,还是自己写的,都要去了解。官方提供的常见的比如koa-parser要知道他的原理是啥。自己写了哪些中间件,用处。
3、webpack、babel、eslint原理
除了基本的配置,你要知道它们背后的工作原理。整个流程。我会去掘金或者前端早读课去阅读文章,以下通过阅读都能找到答案。
- webpack
- webpack缓存: hash和chunkhash和contenthash区别
- webpack优化:打包速度(happypack原理、优化loader的include和exclude)、打包大小(代码分离dullplugin、懒加载(首屏大小)、代码压缩、treeshaking)
- eslint
- 有没有发布过自己的eslint-config规范?
- eslint能检查错误的原理是什么?(ast)
- 如何自己去实现一个eslint规则?
- babel
- 为什么要用babel?
- preset是做什么的,plugin是做什么的?
- babel在浏览器中的是怎么转换的?哪些过程?
4、浏览器进程和线程理解
5、redux源码
首先redux是一种思想,去理解它。其次去阅读源码,createStore返回的store有哪些方法,接受哪些入参。最后自己去实现一个createSrote。(这个是pdd的一面面试题,手写createSrote)
以上源码部分的了解之后,就对自己项目的脚手架和整个项目的流程了解的很深入了。
手写coding get
第三部分,就是大量的practice手写代码。以下是我练习的一部分。
- 手写promise、promise.race、promise.finally、promise.all
- 手写防抖、节流
- 手写call、apply、bind
- 手写冒泡、快排、选择排序、插入排序
- 栈。’sd{12{SDA{S{D}}}S}}’判断字符串中的{}是否成对出现。
- 队列。实现约瑟夫环 100个数[0-99],每隔两个数删掉一个数,到最后循环到开头继续,求最后那个删掉的数是几
- JS的全排列
- 两个大数相加
- 0s打印0,1s打印1,100s打印100;用promise实现0s打印0,1s打印1,100s打印100
- 实现链式调用a().b().c().d()
- 手写深拷贝
- 手写A继承B
- 模拟实现iterator
- js设计模式。单例、工厂、策略、适配、观察者、代理
- 手写new方法
- 递归。1元一瓶水,2个空瓶换一瓶水, 20元换几瓶水?
- 数组去重怎么实现?(多种方法:set、filter、includes、indexOf、splice、sort、对象属性不能一样)
查漏补缺get
最后我自己整理了一份大而全的查漏补缺。以及头条、pdd等公司的coding部分题面试题。最后别忘了准备1-2个牛逼点的项目中的难点。
写在最后
每一次面试都是一次快速成长的过程,帮助自己清晰自己在整个市场中的定位。上一次面试经历让我知道了不要打没准备的仗,这一次,在面试之前我做足了充分的准备,理论基础和源码原理理解都很OK了。但是这一次面试,coding的过程让我痛苦,也让我知道了自己平时写代码的随意,不回去深入思考一些通用代码背后的逻辑,写完就不管了;另外算法题也需要去leetcode多刷。继续努力。