跳槽周期跨度
什么时候动了想法
大略在去年 11 月份的时候,我负责的业务线始终做不出问题。而且整个公司的前端技术设施,都是我一手搭建进去的,再待在公司,没什么可成长的空间,就想跳槽了,期间思考了几个可能性:
- 出国工作:这个想法起源,次要是看了某位网友肉身出国到新加坡的虾皮到新加坡打工两个月的经验分享,感觉挺有意思,也想尝试下,前面投了一些跨国企业,没啥反馈,预计是卡学历,所以就放弃了,前面再想想补救外语的可能性
- 进入大厂:很多大厂都卡学历,即便是内推,也会被卡面试流程,我被小红书、京东、腾讯、美团,拼多多、虾皮、携程、喜马拉雅卡学历和卡面试过程,所以,能抉择的大厂很少,最终入职了 B 站
面了哪些公司
-
热身阶段(11 月下旬 – 12 月中旬)
- 彩云科技,offer
- 天壤智能,offer
- 掌门一对一,offer
- 帷幄匠心,offer
- 驰骛科技,offer
- 坚果云,二面挂
- 乐言科技,二面挂
-
正式阶段(12 月下旬 – 2 月下旬)
- 微盟(海内电商),一面挂
- 字节(广告商业化),一面挂
- 字节(线索中台),二面挂
- 字节(抖音生存服务),二面挂
- 网易(严选),四面完,最终评审挂
- 七牛云(低代码平台),三面完,后续无反馈
- B 站,offer
- 中通快递,offer
温习备战花了多久,面试到入职,花了多久
11 月 – 2 月 始终在陆陆续续筹备,继续了 3 个月,次要是筹备温习、复盘、刷算法
从开始面试,到入职,差不多 3 个月工夫
做了哪些筹备
次要筹备了以下几个方面:
- 简历,认真梳理了最近的工作经验,我的项目上做的事件,用到哪些技术
- 口试,次要是算法和编程题
- 技术知识点查漏补缺
温习了哪些内容,刷了哪些题
- 八股文
- 编程题,手写各种办法
- 算法题
- React/Mobx/Vite && Webpack
- 本人写的博客
八股文
这块没啥好说的,把各大社区各位大神常常分享的一些文章看了下,再就是针对计算机基础知识和网络基础知识,做了一些总结,大略看了上面这些文章:
- 浏览器工作原理与实际
- 图解 V8
- 从多线程到 Event Loop
- 前端年后面试真题,会 80% 间接进大厂正本
编程
刷了下根本会手写的面试题以及再把面试过程中遇到的手写题总结下,基本上都还好
算法
算法这块不是我的长项,根本没接触,次要是把 LeetCode 热题 HOT 100,Easy 难度简略刷了下,针对大厂频出的算法题,看不懂的,就背答案,比方经典的反转二叉树、任意两个数的和等于 Target、反转单向链表等
前面依据一些面经和文档,比方:前端年后面试真题,会 80% 间接进大厂正本,做了一些针对性地练习和坚固
框架
React 局部温习了 setState 原理、diff 原理,深刻了 hooks 和 fiber 原理,当然这里的深刻不是去读源码,因为工夫来不及,而是参考了比拟多的文章:
- React 技术揭秘
- React 进阶实际指南
- Vite
- 前端年后面试真题,会 80% 间接进大厂正本
Mobx 因为我日常应用比拟多的,也被面试官深刻问过,就本人搭建过前端脚手架和看了下 React 进阶实际指南外面有一篇讲了 Mobx。次要理解框架的主体逻辑、响应式原理、依赖收集的实现
此外也总结了一下 Redux 和 Mobx 的特点,因为面试官大概率会问:Redux 和 Mobx 的区别?
博客
因为自己常常会写播客,这点在投递简历的时候,是十分大的一个加分项,在多个技术社区有同名账号,常常发表一些文章,会受到面试官的青眼,我最近的面试,都有被面试官提到,你的博客写的不错,而且面试官也会从你的博客中来发问你,我就被问到以下问题:
- Webpack 如何实现热更新的?
- React 和 Vue 的选型?
- Redux 和 Mobx 的区别?
这些问题,我都在博客上记录了,所以都是信手拈来
重点补了哪些能力和短板
- 技术局部:算法、编程题、对框架的细节思考(不仅仅是停留在应用层面)
- 业务局部:将本人对业务的了解和思考进行了总结
- 治理局部:演绎和提炼
面试中裸露了哪些问题,怎么应答的
思考和表白的连续性
后期热身的时候,筹备内容的结构化有余,遇到有些没有筹备到的问题,临场思考和组织,或者一遍表述一遍思考,导致表白的结构性和连续性较差,体现上就是重点不够、啰嗦、答复不上
解决:针对几大类问题梳理了整体的思维导图,表白的时候,跟进面试官的侧重点,筛选关键点进行构造
化表白
过往经验的思考有余
当面试官聊到过往短板问题或者低谷经验时,一开始的答复有点浮于外表,并且有一些躲避的答复,受到了面试官的质疑
解决:认真、主观地从新梳理了对应的问题,从主观、主观层面进行从新组织语言进行答复
印象粗浅的事件
每个公司面下来的感触
- 字节:我本人的动向是字节跳动,间断面了三个部门,前面字节挂了两个部门,又被其余部门捞起来,,面到前面,越来越没底气,一方面本人的技术深度不够,另一方面,感觉面试官都很年老,不会往你的劣势方面去进行疏导(面试经验不足),有的部门,面的感觉还能够,都挂了,很烦
- 网易严选:网易严选的流程最长,我面了一个多月,当字节跳动挂了之后,网易严选是我最动向的部门,技术栈和业务方向匹配,该部门接下来一年要做的一些事件,也跟我的职业倒退比拟匹配,然而,四面完之后,就给我挂了,很遗憾,预计是被其余候选人给 PK 上来了
- 七牛云:一面问八股文,手写代码,比方实现一个 call/apply 办法等,二面很惯例,问问简历上的事,三面由部门负责人来面试(产品经理),感觉还能够,还让我加了微信,但前面流程始终没有推动,我问了 HR 屡次,HR 给我的反馈是对我的印象挺好,心愿保持联系,但前面流程就推动不上来了,再分割 HR,就没回复
- B 站:全程聊的都还能够,比较顺利
- 坚果云:印象最深的就是二面了,要开始二背后,HR 先分割我,说是一个开放性的题目,让我二选一,我抉择了其中一个,让我做整体的思考,我做了大量的后端常识、服务端常识,但面试官只问前端方面的常识,沟通的不是很顺利,整体面下来,感觉单方的了解都是有问题
哪些经验让本人很难熬
字节和七牛云的 offer 一个都没拿到
字节面的感觉还能够,第二天就挂了,很好受,心态有点蹦
七牛云三面完之后,我等了一周左右,没给我反馈,我始终在推动,包含分割三面的面试官,询问后果,就是不给反馈,挂了也没任何反馈
最终抉择
过后手头上只有掌门一对一的 offer,掌门一对一,HR 在催我入职,B 站和网易严选还没有面完,无奈回绝,很纠结,过后做的抉择就是,先入职掌门一对一,哪会儿中通分割上我,我就再面了一个中通,拿到了中通的 offer,而后再等 B 站和严选的流程了,本人对严选是十分动向的,但严选终面完还是被挂,就很头疼,在面严选的过程,B 站正式 offer 发了,只能抉择 B 站
如何克服了过程中的艰难
- 定好策略,稳住心态
跳槽的过程中不是来一家公司就面一家公司的,而是要依据本人的状况循序渐进。像我这样前面 offer 还比拟少的时候,尽管心里也慌,但还是筹备了一些兜底的策略,这点十分重要,而且自己是裸辞的状况下,面了很长的工夫,心态肯定要稳住,特地是互联网寒冬期间 - 与人交换,开辟思路
我会和学长、靠谱共事、靠谱猎头进行交换,一方面能够从他们的角度看出本人的有余,另一方面也能够从他们那里失去帮忙和思路
其余的心得体会和教训
面试的 4 个环节:简历筹备 – 投递策略 – 面试和复盘 – offer 会谈和抉择
- 简历筹备
简历筹备不是要跳槽的时候才筹备的,而是日常工作中要常常做总结,跳槽前对这些总结进行梳理演绎提炼为简历 - 投递策略
职业生涯中每个阶段的跳槽,可能会有不同的策略,惯例好用的策略是先找几家公司热身,而后再开始投递本人的指标公司,在投递过程中,工夫节点也须要有肯定的关注 -
面试和复盘
- 面试能够通过一些公司热身试错,同时,在面试中要疾速捕捉到面试官想开掘的点,用简炼地话表达出来回应给面试官。如果面试官没有挖到你长项的局部,还须要思考疏导面试官,让本人展现出本人的长项
- 在表白方面,如果间接表白不够结构化和清晰,能够先应用笔记或者思维导图梳理,而后本人预演纯熟
- 复盘很重要,要尽可能让本人犯过的错不再犯第二次,并且,复盘的内容是能够长期积攒的
-
offer 会谈和抉择
- 首先,要大略理解本人的市场价(对于大厂要理解本人的定级,对于中小厂要按市场程度),尽管这个比拟难,但还是可能的
- 如果有理解本人的市场价,那么在冀望薪资这块,就能够报得有底气一些,也比拟容易失去较高的涨幅。
- 多拿 offer,通过技巧去让厂家本人在 offer 之间相互竞争,是绝对容易的。尽管每个公司有本人的薪资体系,但招聘实质上是一个市场行为,厂家也要遵循客观规律
总结
跳槽是一项心力、膂力、脑力都必须在线的流动
材料参考和分享
- 2021 前端岗面试整顿
- LeetCode 热题 HOT 100
- React 技术揭秘
- React 进阶实际指南
- Vite
- 前端面试真题,会 80% 间接进大厂
最初
欢送大家退出 B 站,我在 B 站等你,随时可跟我交换面试教训
也欢送大家关注我的博客
高频面试题整顿
CSS
- css 重绘和重排如何了解
- 上面宽高各是多少
<style>
.box {
width: 100px;
height: 100px;
padding: 10px;
margin: 10px;
background-color: #f00;
box-sizing: content-box;
}
</style>
<body>
<div class="box">12312312</div>
</body>
- span 标签在浏览器中偏移量是多少
<style>
.test {margin: 20px;}
</style>
<body>
<div>
<span class="test"></span>
</div>
</body>
- 为什么
marign 0 auto
无奈垂直居中 - 管制 z-index 的规定有哪些
- 元素替换概念有理解吗?
- 挪动端 1px 像素如何解决?
- 一个元素暗藏有几种形式?
- 讲讲 BFC
- css 选择器
- display 有哪些属性
- 三列布局如何实现
- css 栅格布局
- flex: 0 1 auto 的含意
- css 如何实现一个正方形盒子(随父元素)自适应
JS
- js 有哪些根本数据类型
- 讲讲闭包是什么?
- var、let、const 的区别
-
es5 如何实现继承
- 原型继承形式(这里要留神下,很有可能让你手写)
- 寄生组合继承
- 引申到 es6 的 Class 语法糖
- es6 有哪些新的个性
- map 和 waekMap 的区别
- js 中 this 指向
- 讲讲 setTimeout 和 setInterval 的差别
- 用过函数节流和防抖吗?
- localStorage, sessionStorage, Cookie 之间的区别
- 上面输入后果是什么?
var count = 100;
var obj = {
count: 200,
getCount: function() {console.log(this.count);
}
}
const c = obj.getCount;
obj.getCount();
c();
- 上面输入后果是什么?
var obj1 = {a: 100};
var obj2 = Object.assign({}, obj1);
var obj3 = obj2;
obj3.a = 200;
console.log(obj1);
console.log(obj2);
- 上面打印后果是多少
var p1 = new Promise((resolve) => {resolve(1);
});
var p2 = new Promise((resolve) => {setTimeout(() => {resolve(2);
}, 0);
});
var p3 = new Promise((resolve) => {resolve(3);
});
Promise.all([p1, p2, p3]).then((res) => {console.log(res);
});
- 上面打印后果是多少
async function promise2() {function p1() {return new Promise((resolve) => {resolve(1);
});
}
function p2() {return new Promise((resolve, reject) => {reject(2);
});
}
function p3() {return new Promise((resolve, reject) => {resolve(3);
});
}
try {var p11 = await p1();
var p22 = await p2();
var p33 = await p3();
console.log(p11);
console.log(p22);
console.log(p33);
} catch(e) {};}
- 请形容下 new 的执行原理
- 为什么 Object.prototype.toString.call 能够判断出变量,而不是通过 Object.toString.call ?
- 讲讲 gc 原理
- js 如何解决数值精度问题
- 讲讲事件循环
浏览器
- 浏览器缓存原理
- 单页利用如何进步加载速度?
React
- 讲讲 fiber 架构
- 讲讲对 diff 的了解
- 讲讲对 hooks 的了解
- 讲讲 class 生命周期
- setState 原理
- hooks 为何有一些规定应用条件
- 聊聊 react 事件机制原理
- 讲讲 useCallBack 和 useMemo 的区别
- 讲讲 useRef 和 ref 的区别
- react 组件传递状态有哪几种形式
状态治理
- mobx 原理
- redux 原理
- mobx 和 redux 的区别
- 函数式组件特点,和 hoc 区别
- 讲讲 redux 中间件
微信小程序
- taro 源码如何实现的?
- taro 2.x 和 taro 3 最大区别是什么?
- 微信小程序原理是什么?
打包工具
- 聊聊 vite 和 webpack 的区别
- 模块化有理解吗,讲讲 import 和 require 的区别?
- webpack 的原理
- 谈谈摇树的概念
- webpack 热更新机制原理
- vite 原理是什么?
设计模式
- 订阅公布和观察者模式和什么之间的区别,实现一个订阅发布者模式
编程题
- 如何实现一个深 copy
- 实现一个 new
- 柯里话函数的实现
- 实现一个函数 calc
function calc() {}
- 对于任意参数,实现累乘性能
- 对于两次同样的参数,后果缓存,比方(1, 2, 3)、(3, 1, 2)
- 对缓存优化
- 实现一个 apply
- 针对深 Copy,变种的题目
- 实现一个 ajax
function ajax(options) {}
- 在实现的 ajax 根底上实现调用所有申请,等到所有申请后果胜利之后,再返回后果
- 在实现的 ajax 根底上实现申请顺序调用,第一个调用胜利之后,再调用第二个,以此类推
- 实现一个 repeat 函数,依据传入的参数,间隔时间,打印次数,来输入 log
repeat(func, inteval, times){…}
const r = repeat(repeatPrint, 10, 10);
- 用最精炼的代码实现数组非零非负最小值的索引 index
// 例如:[10,21,0,-7,35,7,9,23,18] 输入索引 5, 数值 7 最小
function getIndex(arr) {
let index = null;
...
return index;
}
- 该代码输入后果是什么?
const list = [1, 2, 5]
const square = num => {return new Promise((resolve, reject) => {setTimeout(() => {resolve(num * num)
}, 1000)
})
}
function test() {
list.forEach(async x => {const res = await square(x)
console.log(res)
})
}
test()
- 手写一唯数组转换树节点
var array = [{pid: 4, id: 6617, name: "a",subNode:[]},
{pid: 5, id: 666, name: "a",subNode:[]},
{pid: 4, id: 6616, name: "a",subNode:[]},
{pid: 6616, id: 66161, name: "a",subNode:[]},
{pid: -1, id: 0, name: "a",subNode:[]},
{pid: 0, id: 4, name: "a",subNode:[]},
{pid: 0, id: 5, name: "a",subNode:[]},
{pid: 4, id: 10, name: "a",subNode:[]},
{pid: 10, id: 451, name: "a",subNode:[]},
{pid: 0, id: 98, name: "a",subNode:[]},
{pid: 98, id: 23, name: "a",subNode:[]},
{pid: 98, id: 523, name: "a",subNode:[]}
];
var toTree = function(tarArray) { }
toTree(array);
算法题
- 实现一个反转二叉树
- 一个迷宫,最短门路生成
- 实现单向链表反转
- 理论场景算法题
- twoSum 失去两个数的之后等于 target
其余
- 聊聊业务上的事
- 聊聊最简单的业务如何解决的
- 如何做性能优化
- 聊聊前端脚手架
- 带团队中有哪些难点
- 聊聊迭代流程
- Git 如何笼罩某次 commit
- 长列表滚动,你怎么优化的
- 印象中最深的一件事
本文参加了 SegmentFault 思否征文「如何“反杀”面试官?」,欢送正在浏览的你也退出。