学习前端九个月,拿下美团、百度、字节等大厂offer,我的秋招是如何准备的?

790 阅读14分钟

前几天发了一篇关于自己的学习感受的博客:学习前端九个月拿下大厂offer,我干了些啥,收到了不少人的认可。所以这里打算来一篇干货,聊一聊自己的秋招是如何准备的。

准备阶段

九月份之前准备面试,主要是针对自己的简历进行复习:

  • 基础部分:需要牢固掌握的
    • html、css、js
    • 浏览器相关
    • 计算机网络
    • 数据结构以及常见算法题目
  • 框架&项目:经常使用,但是没有系统总结过的内容
    • vue相关的基础知识、原理以及项目
    • react相关的基础知识、原理以及项目
    • uniapp开发微信小程序
  • 实习
    • 做了什么?
    • 学到了什么?
  • 加分项:之前接触过,但没有经常使用以及深入了解,后期有时间去了解一下
    • node.js,express框架,koa框架,egg.js框架
    • webpack的的核心概念以及性能优化
    • 项目优化部分

简历准备

简历是十分重要的一环,因为通过简历会给面试官一个大致的映像,通过简历和最开始的自我介绍可以暗示面试官一些自己的亮点,从而和面试官有良好的聊天体验。

1. 面试之前需要怎么准备

  • 面试的流程
  • JD分析
  • 如何写简历
  • 准备工作和注意事项

2. 面试流程

  • 一面:考察基础知识
  • 二面(交叉面):始于基础知识,终于项目。可能会有多轮交叉面。
  • 三面:leader面试,更多交流角色定位,对产品的想法之类的,不会有太多的技术问题。
  • hr面试:低调一点,如实回答,保持积极、乐观、自信的心态。薪资正常去谈。

Ps:校招看重基础知识能力,主要看重一面。

3. 如何写简历

  • 内容简介

    • 个人信息
    • 教育经历
    • 专业技能
    • 实习经历
    • 项目经历
    • 博客和开源
  • 直击重点,表现自己的优势

投递阶段

九月份以后开始陆续投递简历:

  • 边学边投简历,多看面经查缺补漏
  • 坚持刷题
  • 找可靠的人,确定有hc的人进行内推
  • 积极准备面试

1. 基础内容

基础内容分为:htmlcssjs浏览器计网数据结构和算法

html、css

针对常见面试题进行总结:秋招保驾护航——HTML、CSS篇

  • HTML语义化
  • 块级元素和内联元素
  • 盒子模型
  • margin
  • BFC
  • float布局
  • flex布局
  • 定位问题
  • 响应式布局

js

推荐书籍:《js高级程序设计》和《你不知道的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手写题:

秋招保驾护航——js面试篇(上)

  • Array.map()
  • Array.forEach()
  • Array.fliter()
  • Array.reduce()
  • 数组去重
  • 数组扁平
  • arguments转换成数组
  • 手写new
  • 闭包的产生
  • 函数柯里化
  • call
  • apply
  • bind
  • 对象的各种创建阶段
  • 深拷贝和浅拷贝
  • 继承实现的各种方法

秋招保驾护航——js面试篇(下)

  • 防抖和节流
  • 手写Promise以及相API

数据结构和:

算法:

  • 递归: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。

常见面试题:

vue面试题总结

  • 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

原理部分:

MyFace项目

自己参加比赛的项目,面试前要系统的整理一下问题,就好像答辩前要提前准备好一些问题对付评委们的问题。

  • 项目架构搭建
  • 项目开发管理
  • 开发难点
  • 项目优化
  • 获取成就

3. 实习

  • 做了什么?
  • 学到了什么?

这里因人而异,我自己的每段实习都会去认真对待,完成交给我的每一个任务,当自己觉得压力比较小的时候再去主动申请去负责一些新的内容。开发的过程中不断的调研和总结,实习过程中遇到的问题和你觉得有意思的东西都可以记录下来,指不定哪一场面试中你的问题或者感悟直戳面试官的内心,面试官便会知道你的实习不是过去混混日子,而是实打实的做了一些事情。

4. 加分项目攻坚

这里因人而异吧,因为我学习的时间较短,我认为优先级较低但是也是很重要的技能的东西放在了后面,在面试的过程中如果被问到了,我也会坦诚的说自己因为时间的原因没有深入的去了解。这里切记不会的东西还夸夸其谈,听到面试官耳里就是胡编乱造,面试官是为了发掘你的亮点,而不是为了考到你。

如果你说我什么都不会,那面试下来你就去把这些问到的问题做一个学习,指不定下次面试还会问到呢?对于我而言,我最开始什么都不会,就是通过面试意识到了自己哪里有所欠缺,然后不断的学习总结,形成自己的知识体系。

性能优化相关

自己也没来得及总结,但是对一些常见的优化,自己也在第一次面试被考到后下去去学习,第二次再遇到同样的问题也不会答不上来。

node

node 是webpack包管理和前端接触服务器端、数据库等操作的入口,有利于自己对其他核心知识底层原理的探究。如webpack的一些原理、vue服务端渲染。

  • 学好基础课
  • 了解后端开发和服务器
  • 探究其他核心的原理

webpack

前端模块化、工程化必须要掌握的,学会从0开始使用webpack搭建项目

  • 核心知识
  • webpack实战
  • 配置优化
  • 深入vue脚手架