前几天发了一篇关于自己的学习感受的博客:学习前端九个月拿下大厂offer,我干了些啥,收到了不少人的认可。所以这里打算来一篇干货,聊一聊自己的秋招是如何准备的。
准备阶段
九月份之前准备面试,主要是针对自己的简历进行复习:
- 基础部分:需要牢固掌握的
- html、css、js
- 浏览器相关
- 计算机网络
- 数据结构以及常见算法题目
- 框架&项目:经常使用,但是没有系统总结过的内容
- vue相关的基础知识、原理以及项目
- react相关的基础知识、原理以及项目
- uniapp开发微信小程序
- 实习
- 做了什么?
- 学到了什么?
- 加分项:之前接触过,但没有经常使用以及深入了解,后期有时间去了解一下
- node.js,express框架,koa框架,egg.js框架
- webpack的的核心概念以及性能优化
- 项目优化部分
简历准备
简历是十分重要的一环,因为通过简历会给面试官一个大致的映像,通过简历和最开始的自我介绍可以暗示面试官一些自己的亮点,从而和面试官有良好的聊天体验。
1. 面试之前需要怎么准备
- 面试的流程
- JD分析
- 如何写简历
- 准备工作和注意事项
2. 面试流程
- 一面:考察基础知识
- 二面(交叉面):始于基础知识,终于项目。可能会有多轮交叉面。
- 三面:leader面试,更多交流角色定位,对产品的想法之类的,不会有太多的技术问题。
- hr面试:低调一点,如实回答,保持积极、乐观、自信的心态。薪资正常去谈。
Ps:校招看重基础知识能力,主要看重一面。
3. 如何写简历
-
内容简介
- 个人信息
- 教育经历
- 专业技能
- 实习经历
- 项目经历
- 博客和开源
-
直击重点,表现自己的优势
投递阶段
九月份以后开始陆续投递简历:
- 边学边投简历,多看面经查缺补漏
- 坚持刷题
- 找可靠的人,确定有hc的人进行内推
- 积极准备面试
1. 基础内容
基础内容分为:html、css、js、浏览器、计网、数据结构和算法。
html、css
针对常见面试题进行总结:秋招保驾护航——HTML、CSS篇
- HTML语义化
- 块级元素和内联元素
- 盒子模型
- margin
- BFC
- float布局
- flex布局
- 定位问题
- 响应式布局
js
推荐书籍:《js高级程序设计》和《你不知道的js》
js 首先对基础知识进行总结,能够应对面试中的常见问题。最重要的还是搭建自己的js知识体系,毕竟js是吃饭的本钱,要一直深入的学习,每次总结都会有新的体验,推翻自己之前的认知。
- js中的数据类型
- js的垃圾回收机制
- js中的数组
- js中的函数
- js的面向对象编程
- js的异步编程
- js的模块化管理
- ES6新特性
- 事件
- ajax
浏览器
面试的重头戏之一,下面的问题在面试中反复被提问,最重要的是理解,然后自己能组织语言说出自己的理解。
- HTML中使用js
- 浏览器缓存:强缓存和协商缓存
- 浏览器本地存储:cookie、localStorage和sessionStore
- 从网络的角度:输入URL发生了什么
- 从浏览器解析的角度:输入URL发生了什么
- 从浏览器渲染的角度:输入URL发生了什么
- 从浏览器回流和重绘的角度:输入URL发生了什么
- 跨域的解决办法
- 网络安全
计算机网络
计算机基础,面试中传输层和应用层常被问到,有时间还是建议可以系统的学习一下
- 概述
- 物理层
- 数据链路层
- 网络层:IP协议
- 传输层:TCP、UDP、可靠传输
- 应用层:HTTP、HTTPS
编程题
重点中的重点,面试一般编程没写出来就g了,这个没什么技巧,就是多写。最开始的时候会纠结从哪里入手,然后最后就一直没开始,解决这种问题最好的办法就是经历几次面试笔试的打击(手动滑稽)。言归正传,首先就是js的一些手写题,这些在学习js的时候就要有意识的去了解,在后面可以结合一些优秀的博客系统的总结;再其次是数据结构和算法,数据结构这门课还是要好好的学习,并且学习的过程中使用js多敲一敲代码,然后结合leetcode刷一些相对应的题目(leetcode上有一个专门的板块是剑指offer按照数据结构模块划分的)。这样在面试前夕就可以理解大部分算法题目,自己也有了一定的题感,这时候我建议刷高频笔试题,因为面试很多题目都在这里面。
下面是我的部分刷题心路历程,仅供参考。
js手写题:
- Array.map()
- Array.forEach()
- Array.fliter()
- Array.reduce()
- 数组去重
- 数组扁平
- arguments转换成数组
- 手写new
- 闭包的产生
- 函数柯里化
- call
- apply
- bind
- 对象的各种创建阶段
- 深拷贝和浅拷贝
- 继承实现的各种方法
- 防抖和节流
- 手写Promise以及相API
数据结构和:
- 栈、队列
- 数组、链表
- 树
- 堆
- 图
- 排序:十大经典排序算法总结(JavaScript描述) 【done】
算法:
- 递归:LeetCode70、112、509
- 分治:LeetCode23、169、240
- 单调栈:LeetCode84、85、739、503
- 并查集:LeetCode547、200、684
- 滑动窗口:LeetCode209、3、1004、1208
- 前缀和:LeetCode724、560、437、1248
- 差分:LeetCode1094、121、122
- 拓扑排序:LeetCode210
- 字符串:LeetCode5、20、43、93
- 二分查找:LeetCode33、34
- BFS:LeetCode127、139、130、529、815
- DFS&回溯::LeetCode934、685、1102、531、533、113、332
- 动态规划:LeetCode213、123、62、63、361、1230
- 贪心算法:LeetCode55、435、621、452
- 字典树:LeetCode820、208、648
高频笔试题:程序员面试高频题
- 反转链表
- 排序
- 设计LRU缓存结构
- 二叉树的前、中、后序遍历
- 最小的K个数
- 求二叉树的层序遍历
- 寻找最大K
- 两数之和
- 合并两个有序的数组
- 用两个栈实现队列
- 跳台阶
- 链表中的节点每k个一组翻转
- 子数组的最大累计问题
- 反转字符串
- 子数组的最大累加和问题
- 链表中环的入口结点
- 括号序列
- 删除链表的倒数第n个节点
- 二分查找
- 最长无重复子数组
- 在二叉树中找到两个节点的最近公共祖先
Leetcode高频题目:
- 两数之和 【hashmap done】
- 两数相加 【数学 done】
- 无重复最长子串 【set结构 done】
- 寻找两个正序数组的中位数 【done】
- 最长回文串 【动态规划 done】
- 盛水最多容器 【贪心 done】
- 三数之和
- 电话号码的字母组合【回溯法 done】
- 有效括号 【hashmap done】
- 搜索旋转排序数组 【二分查找 done】
- 最大子序和 【动态规划 done】
- 爬楼梯 【动态规划 done】
- 二叉树的遍历 【树的遍历 done】
- 二叉树的层序遍历 【字面意思 done】
- 二叉树的最大深度 【后序遍历 done】
- 从前序与中序遍历序列构造二叉树
- 买卖股票的最佳时机 【贪心 done】
- 只出现一次的数字 【位运算 done】
- 环项链表 【双指针 done】
- 岛屿数量 【dfs done】
- 旋转图像 【数学 done】
操作系统
基础课程之一,前端面试的频率较低,但是还是建议学习理解,而不是强行背诵八股文。
基本概念:
- 操作系统的概念、特征、提供的服务
- 特权指令、非特权指令、操作系统的内核
- 中断和异常
- 系统调用
进程:
- 进程的定义、组成、组织方式、特征
- 进程的状态和转换(5中状态、7种状态)
- 进程的通信:共享存储、管道通信、消息传递
- 进程和线程的区别
- 处理机的调度:高级调度(作业调度)、中级调度(虚拟存储技术)、低级调度(进程调度)
- 进程调度算法: FCFS、短进程优先调度、时间轮片调度算法、不可剥夺优先级调度算法、可剥夺优先级调度算法
- 进程的同步、互斥
- 进程互斥的实现:软件层面、硬件层面、信号量、管程
- 死锁的概念、产生条件、发生时机
- 死锁的处理方法:预防死锁、避免死锁(银行家算法)、死锁的检测和解除
存储管理:
- 负责内存空间的分配和回收
- 提供某种技术从逻辑上对内存空间进行扩充(虚拟内存技术)
- 地址转换功能,逻辑地址到物理地址的转换,程序员只要关心逻辑地址上的变化
- 绝对装入:编译器负责地址转换(单批道,无操作系统)
- 可重定位装入:装入程序负责地址转换(早期多批道处理阶段)
- 动态运行时装入:运行时才进行地址转换(现代操作系统)
- 操作系统需要提供内存保护功能,保证各个进程在各自存储空间内运行,互不干扰
- 设置上下限寄存器
- 利用重定位寄存器、界地址寄存器进行判断
文件管理:
- 文件内部数据如何组织起来?
- 文件之间如何组织起来?
- 从下往上看,os应该提供哪些功能来方便用户使用?
- 从上往下看,文件数据应该如何被存放到外存磁盘上?
数据库
基础课程之一,前端面试的频率较低,但是还是建议学习理解,而不是强行背诵八股文。
数据库的基本概念:
- 数据库、数据库管理系统、SQL、MySQL
- 数据库常见操作指令
- 表
Mysql的使用:
- 常见的使用方式
- 常见的问题
约束:
- 非空约束
- 唯一约束
- 主键约束
- 外键约束
事务:
- 什么是事务
- 事务的特性
- 事务的隔离级别
索引:
- MySQL引擎对比:MYISAM、INNODB
- 索引的方式:Hash、B+
- 索引的分类:普通索引、唯一索引、主键索引、全文索引、组合索引
- 索引的优缺点
数据库的设计:
- 表与表之间的关系
- 范式:1NF 2NF 3NF BCNF 4NF 5NF
2. 框架&项目
现在公司开发基本上都是框架(vue、react),所以大家会比较熟悉,我的学习过程如下:
- 先阅读文档,跟着后面写一些demo
- 再上慕课网上买一些实战课程,看看大厂的人是如何使用这些框架
- 自己在学校的一些大作业、实践课或者是参加比赛中去做自己的项目,用心去维护
- 了解框架的原理,面试可以和面试官聊的起来,让面试官知道你不仅会用,还很关心这些东西的底层
上面的四个步骤总结起来就是,先会用,再深入了解原理。框架重要的原因认为有如下几点:
- 吃饭的家伙,公司招人是为了干活,不会框架拿什么干活?
- 了解原理,可以帮助自己更好的解决开发中的问题,其次也可以让面试官知道你是一个热爱技术和探索的学生。毕竟在工作几年的面试官眼里,我们大部分毕业的本科生还是很菜的,这时候你要做的就是比其他的候选人更加积极,更加努力,更加认真。
vue
前端框架,react也很重要,但是自己目前的工作是vue,对vue更熟悉,因此先把框架重心放在vue上,后面有时间再去啃react。
常见面试题:
- MVVM
- vue的数据双向绑定(对象和数据)
- 观察者模式和发布订阅模式
- vue是如何检测数组变化
- vue的单项数据流
- computed和watch
- 虚拟DOM
- v-for中的key的作用
- nextTick的使用
- vue的生命周期
- @hook监听子组件的生命周期
- Vue 的父组件和子组件生命周期钩子函数执行顺序?
- keep-alive的使用
- vue的内部指令
- class和style的绑定方法
- data为什么是一个函数
- Vue之间的通信方式
- Vuex
- vue的路由
- SPA单页面
- SSR
原理部分:
- 变化侦测:秋招保驾护航——vue篇之数据双向绑定
- 虚拟DOM:深入剖析:Vue核心之虚拟DOM
- 模板编译原理:《Vue不看源码懂原理》系列——Vue模板编译
- 整体流程:秋招保驾护航——vue篇
MyFace项目
自己参加比赛的项目,面试前要系统的整理一下问题,就好像答辩前要提前准备好一些问题对付评委们的问题。
- 项目架构搭建
- 项目开发管理
- 开发难点
- 项目优化
- 获取成就
3. 实习
- 做了什么?
- 学到了什么?
这里因人而异,我自己的每段实习都会去认真对待,完成交给我的每一个任务,当自己觉得压力比较小的时候再去主动申请去负责一些新的内容。开发的过程中不断的调研和总结,实习过程中遇到的问题和你觉得有意思的东西都可以记录下来,指不定哪一场面试中你的问题或者感悟直戳面试官的内心,面试官便会知道你的实习不是过去混混日子,而是实打实的做了一些事情。
4. 加分项目攻坚
这里因人而异吧,因为我学习的时间较短,我认为优先级较低但是也是很重要的技能的东西放在了后面,在面试的过程中如果被问到了,我也会坦诚的说自己因为时间的原因没有深入的去了解。这里切记不会的东西还夸夸其谈,听到面试官耳里就是胡编乱造,面试官是为了发掘你的亮点,而不是为了考到你。
如果你说我什么都不会,那面试下来你就去把这些问到的问题做一个学习,指不定下次面试还会问到呢?对于我而言,我最开始什么都不会,就是通过面试意识到了自己哪里有所欠缺,然后不断的学习总结,形成自己的知识体系。
性能优化相关
自己也没来得及总结,但是对一些常见的优化,自己也在第一次面试被考到后下去去学习,第二次再遇到同样的问题也不会答不上来。
node
node 是webpack包管理和前端接触服务器端、数据库等操作的入口,有利于自己对其他核心知识底层原理的探究。如webpack的一些原理、vue服务端渲染。
- 学好基础课
- 了解后端开发和服务器
- 探究其他核心的原理
webpack
前端模块化、工程化必须要掌握的,学会从0开始使用webpack搭建项目
- 核心知识
- webpack实战
- 配置优化
- 深入vue脚手架