如果大家有看到我上一篇文章,就知道从2020年的年头到年中,我一直在面试者阿里的各种岗位,但是结果都是很无奈,下面的链接,有兴趣的可以看看。
https://zhuanlan.zhihu.com/p/223459952
从我开始做前端的时候,我就发誓我必须要进BAT,作为一个只是普通大专毕业的我,也没有大厂的工作背景,其实对于30岁甚至35岁之后的发展,个人感觉是很受限制的,所以进入BAT是我一开始的目标,可能这就是曲线救国吧。
那么本篇文章主要围绕两个部分:
- 前端现在个人觉得的一些现状
- 腾讯面经
想看面经的可以直接看面经,但是如果你也和我一样,学历不怎么样,一直在小公司打滚,想进入大厂的话,可以好好看看第一部分的内容。第一部分是我一直在中小公司打滚快5年的时间里,感受到的问题,和一些自己的感受。
困局
首先我先说说我的基本情况吧,我已经做前端5年左右的时间了,中间干过3家公司,都是属于中型互联网企业和创业型的公司,规模不算大。而我的学历也只是普通的大专毕业,然后考了个成人本科。所以我的情况应该算是当下很多苦恼进不了大厂,或者一直在中小公司打滚天天切图的前端一个影子。所以应该也算比较算有代表性的一类前端吧。
为什么说是困局呢?
在2020年我几乎面试了一整年,从普通的一些小公司,到上市公司,到一线大厂(阿里,腾讯,字节)。我得到最多的反馈其实就是2种,学历不够或者陪跑。但是应该会有不少其他想冲击大厂的同学会得到另外两种反馈,技术深度和广度不够,或者简历上缺乏有意思的项目。导致最后没有得到面试机会或者面试通过不了。
在这种前提下,你就很容易形成一种死循环,一直在中小公司徘徊,大部分的中小公司都是以业务优先,对于技术的建设相对来说比较缺乏,所以新的技术得不到实践机会,每天忙于各种业务需求,身边的氛围不好等,都是最终影响你能力提升的因素。所以这就是困局的地方!下面我详细说说我的理解。
------------------------------------------ 1.学历 -----------------------------------------
别听那些人去扯学历在程序员不重要,如果你有刷什么抖音之类的平台,会看见一些阿里的hr或者其他公司的hr说学历不重要,关键是能力,这些毒鸡汤就别再相信了,给大家看看字节内推的朋友和我的聊天:
包括我自己从阿里或者其他公司里面得到的一些消息,就是学历问题,过不了。所以学历非常重要,4.5年前的时候,或许前端的学历可能还不是特别重要,但是随着时代的发展,前端的人员越来越多的时候,hr和面试官每天看成千上百的简历,对于学历的筛选就会变得重要起来。
其实换个角度想,你想加入大厂,全中国很多程序员也想,所以hr或者面试官肯定是需要筛选简历的,那么就会出现机器筛选的问题,那么你就很可能就这个环节就筛选掉了。而且面试的过程其实很难说十分准确的知道你全部的能力,所以学历也是一个很重要的考量指标。
这是困局形成的第一步。
--------------------------------------- 2.技术能力 ---------------------------------------
如果你学历一般,普通本科,大专或者初中,那么大概率你一直都在中小公司中工作,那么中小型公司的特点是什么?就是快,老板说要,明天要上线。这是大部分中小公司的普遍现象,所谓的扁平化,其实就是没有太多层级,干一个事情不需要层层审批,效率至上。在这种氛围当中工作,就会存在一个问题,技术的深度和广度难以进行深挖和展开。
- 技术深度 - 试想你在每天都忙于处理各种紧急需求,各种老板需求,改各种因为没有在需求阶段就充分考虑就急忙上线导致的bug。你每天带着疲惫的身躯,回到家,能坚持去阅读源码,或者去各种论坛看技术文章的人有多少个,就算你能做到,你又能一直坚持多久,人不是机器,身心会疲惫。
- 技术广度 - 如果你在中小公司或者传统行业的公司中,你会发现,你的工作除了切图还是切图,或者做做小程序,用node的机会也只是用一下webpack。各种框架甚至都不会用,还在用jquery的公司不在少数。多端统一技术你压根就别想,特别现在的小公司,都是挂靠在各种平台中,微信,支付宝等。直接使用小程序进行开发,老实说,只写小程序的前端,压根就不是前端,本来在前端已经被框在浏览器中,而现在小程序进一步把前端框在小程序中。在这样的环境下,如何去扩展你的知识广度呢?
当然上面的话只说大部分人,有人可能会说,我可以坚持,我可以自己去搞个项目,自己做个博客啥的,我在现在的公司面试官,也是看到不少简历上是这么写的,我用egg+react去实现了博客,也使用到mysql或者mongo等等。老实说,当你真正用过在一些大型项目当中并且落地运行,要面对的问题绝对不是自己弄小项目玩玩那么简单的。而且如果你并非一个实习生或者培训机构出来的人,你的简历上更多是写实际项目上的东西,而不是自己弄个小项目出来,就说你会什么什么技术,有辨识度的面试官看到这样的项目,有可能会减分的。当然,你如果是自己弄了个优秀个开源项目另当别论。这就是困局形成的第二步。
------------------------------ 3.简历上缺少有意思的项目 ---------------------------------
综合上面2步,因为学历,你到不了大厂或者大型的互联网公司,每天忙于业务,缺乏技术的积累,技术能力不够。那么你大多数情况下会在中小型的公司或者创业型公司里面,这个时候你面对的必然是每天忙于业务。
不知道大家有没有发现,在前端的生态圈里面,优秀的开源项目一般都是比较大型的互联网公司中产出的。中小型的公司一般没有,或者很少。因为中小型公司往往在注重业务的利润,对于团队的建设和人才的培养,以及技术的积累一般不太重视,能用即可。所以你所在公司或者团队的风气都是不停搬砖,缺少技术积累和总结。更加少会有人提出我们一起做个组件库,脚手架,或者我们自己来做个监控系统之类的东西。
就算你所在团队当中有人提出来说做一些技术沉淀或者有意思的项目,又有多少人能真正有时间做下来。打个比方,例如做个组件库,最终大家加班加点做出来了十来个组件,那么你对比一下antd,差距有多大。这个差距老实说,并不是大家的技术能力差距导致差距那么大,是因为antd团队投入的是大量人力物力去做,而我们只是几个前端,利用加班时间或者空余时间去做出来的。怎么能比呢?再说,如果你一些组件库这类专项,没有真正结合上下游的资源,例如设计UI,产品经理等人员资源,将你的项目能真正落地解决实际问题,那么你的这些所谓的组件库,其实都是自己拿来玩玩的东西,根本没有任何价值。
举一些项目的例子:
- 一个组件库,如果没有做到公司UI统一规范,产品经理和设计介入统一好样式和交互方式,你自己封装出来的组件只能算你自己弄的小工具罢了。另外一个组件库有没有相应的文档,demo等配套,提供给其他开发者,一个真正落地的专业组件库并没有你想象的简单。
- 监控系统,如果你没有结合后端,数据库和运维资源,压根你的监控系统根本搭建不起来。就算搭建起来,里面的功能是不是真的有意义,是不是确实能解决当前项目中的痛点盲点,我们自己有没有思考过,或者有牛人给你指点。
- ........
这就困局形成的闭环处。所以整体下来的困局形成如下:
- 没有好的学历和工作背景
- 你大概率去到中小型公司,或者创业公司和传统行业公司中搬砖
- 往往因为这类型的公司,更注重业绩和效率,对技术的建设忽视,导致你的工作时间和加班时间都是忙于搬砖。
- 在这类型的公司里面,往往身边的伙伴大概率来说相对平庸,所以氛围上没有形成一种积极的技术氛围。
- 如果你有想法,但是在公司的层面上因为注重的是业绩和效率,往往能提供的资源有限。
- 也正因为第三点的原因,所以没有很好的机会去提升自己的能力,加强技术深度,扩展知识广度。从而形成一种困局的局面,随着年龄的增长,想要突破现状进入大厂就越来越难。
破局
别再喝毒鸡汤了,听听我的经历看能不能帮到你。
从前我认为,只要我不停积累我的技术能力,就可以进入大厂,现在看来实在太天真了。面试其实就是3分技术7分运气的东西。或许有的人真的是100%实力,但是我的背景遇到的面试经历,就是确确实实的说明面试需要不少运气,请听我一一道来。
- 学历:首先学历是硬伤,已经毕业的你,没办法回到从前,但是在学历上我是如何破局呢?
- 如果你是大专,可以考个成人本科会有微微的帮助。起码可以让更多hr看你的简历。
- 其次,学历的硬伤也是面试需要靠很多运气比较大的成分,例如你现在面试大厂中的岗位,如果现在大厂非常需要人,而且有很多HC,那么你能成功跳过学历限制的机会就会大大提高,试想一下,如果现在你面试的部门只有1个HC,但是有一大群985,211的人挤过来,可能说你的能力比他们好,但是又不是说好非常多,那么你大概率得到的结果就是不通过。
- 多在各种社交平台,知乎,掘金等社区活动,认识多一些在大厂的人,和他们交流,得知一些内部招聘的岗位,HC等,会对你有针对性的去面试部门有帮助。ps:我在写知乎文章之前,我一个大厂的网友都没有,现在收获一批网友互相交流。
- 技术深度:我从前也是一个切图仔,每天忙着切图,没有多余的时间去学习,我的破局方法如下:
- 在一个公司待长一点的时间,利用时间的优势,积累对相关业务的熟悉程度,提高自己处理业务的能力,减少每个需求的处理时间,从而让自己空余出更多的时间可以对新技术的了解和深挖。(说白了就是在一个公司成为一名老油条,但是不要利用老油条的便利虚度光阴)
- 我在进腾讯前的公司,工作了4年多,已经是一名老油条了,对于业务上的事情,更多是处于一种协助和半管理的状态,更多是培养新人接手我手上的项目,释放自己的时间。
- 利用释放的这些时间和精力,去学习新技术,看别人的方案,以及利用自己多年在当前业务的经验,发现项目的不足和问题,通过技术的方式去解决(效率和质量),从而提高自己的技术能力和实践经验。
- 多封装和配置,例如,可以从后端接口获取的,绝对不会自己写死在代码上,将需求抛给后端。重复使用的组件尽可能自己多学学封装组件,积累组件编写技巧以及封装技巧,对于技术深度有帮助。如果时间紧急,可以先使用第三方的库解决,但是要留意别人如何封装,然后转为自己编写。技术都是从点点滴滴积累起来的。
- 当你做到以上事情,那么你开发的速度将会提升,那么就可以挤出多一点的时间给自己有针对性的学习深度的知识。切勿看啥学啥,在各种平台上有五花八门的文章,但是要搞好前端的深度,必须深入了解一门框架的原理和思想,对浏览器的基础要了解,gc,渲染原理,前端的性能优化要加强学习,并且应用起来。
- 技术广度:作为前端,我们绝对不能只停留在浏览器,必须学会跳出浏览器,主要就是后端和多端统一上。在我们当下的环境中,不一定有机会能应用到实际项目中,但是我们一定要多动手做demo(简历的项目中不要写自己做的demo作为项目,可以在你的技术技能中提及),对于使用以及基本原理和优化要有了解。
- 后端方向:以node作为切入点,学习koa,express的区别原理,如果你想进阿里,多用用egg,nest可以多期待。了解数据库,mysql和mongo即可。缓存方案redis。运行node,少不了nginx,了解一下如何做负载均衡。当然你也可以继续深入一点点,例如redis的缓存策略,击穿雪崩等解决方案,数据库的分表策略,索引机制,事务机制等,nginx的负责均衡策略等。个人建议:因为缺少实际项目,所以点到为止即可,要记住你是前端,这些技术更多是后端的技术,所以在有限的时间内不要过度深入(当然你有时间另当别论),更多是扩充知识而已,要深入可以日后根据方向继续深入。
- 网络:前端对网络的知识普遍都比较薄弱,多了解http不同版本的区别,特别是http1.1和2.0,https原理,tcp的链接方式,udp是什么等等。
- 多端统一方案:可以去了解一下react-native,flutter,taro等多端统一方案,做做demo,知道一下基本原理以及应用场景。
- 简历上有意思的项目:这个是需要考验你的综合实力了,因为你除了要有能力实现一些功能以外,还需要清楚的知道你现在想做的一些专项是为了解决什么问题,能否拿出数据,一般我们都是围绕2个点出发去提出技术方案,质量和效率。打个比方,组件库是提高质量和效率的,监控系统是提高质量的。这个需要你根据自己所在公司的业务,能否发现痛点,解决痛点,要学会用数据说话,提升了多少,覆盖率多少等等,让你的项目覆盖公司,这样你的项目才有意义。
- 跟对领导很重要,如果你的领导对于人员的培养很看重,愿意为团队争取资源,一定要好好珍惜,多沟通,多争取机会参与基础建设,那么对于自身能力提高会事半功倍。(需要看运气)
- 选对公司很重要,在没能进入大厂前,选择一个好的公司,好的技术团队,也是会让你事半功倍。(需要看运气)
大概我就是这样做的,在现在的公司4年了,我从第2年到现在,一直保持着不断折腾,学习框架的原理,阅读源码,为公司实现了统一的组件库,实现了整个公司不同业务线的ui统一交互统一,拉动产品和设计同学共同创建。也做过监控系统,确实解决应用中的监控盲点,性能缺陷,得到公司认同,并且立项开发,得到大量公司提供的资源(人员和金钱),也有几个技术点成功申请了专利。当然中间也是需要团队的支持以及领导看重和培养。
最后也因为在面试中,得到面试官的赏识,也加上运气的成分吧,最终成功入职到腾讯,成功破局,希望我的经验可以帮到你,下面是腾讯 -> csig事业部的腾讯云面试面经。请收下!
腾讯云7面面经
从7月尾到9月尾,面试时长2个月(因为中间穿插了校招,所以时间有所拖长),7轮面试,其中5轮技术面,1轮GM,1轮hr。
下面只提供题目,答案就自己查找吧,毕竟查找答案也是学习的一个过程!
一面-技术面
晚上,视频面试,属于同部门的同事。
前端知识
- dom树节点和渲染树节点一一对应吗,有什么是dom树会有,渲染树不会有的节点
- CSS会阻塞dom解析吗?
- requestIdleCallback是干什么用的
- 浏览器的渲染原理
- 浏览器的渲染过程
- 关键渲染路径详述
- 避免回流的方式
- 跨域的方式
- 前端的网络安全如何防御(xss,csrf)
- cookies的保护方式
- 浏览器的缓存机制
- 什么文件用强缓存,什么文件用协商缓存
- React-Native的原理,优缺点
- react的虚拟dom和diff描述
- react渲染优化(class,hook)
- react的context的使用场景
node和后端知识
- mysql和mongo的区别,使用情景
- node有什么情况会导致内存溢出
- node的内存分配
- event loop(浏览器和node)
开放性题目
- 首屏优化方案
- 在App中如何实现前端资源离线缓存(方案)
算法
const arr = [101,19,12,51,32,7,103,8];
1.找出连续最大升序的数量
2.找出不连续最大升序的数量
二面-技术面
晚上,视频面试,属于其他部门同事。
前端知识
- 浏览器的输入url后的过程
- js异步方式
- promise.resolve是干嘛的
- promise.then如何实现链式调用
- promise.then不返还一个promise还能用then吗
- promise.finally的作用,如何自己实现finally
- promise原理
- webpack的异步加载如何实现
- webpack的分包策略
- 跨域方式有什么
- jsonp的原理
- csrf防御手段
- cookie的samesite属性作用
- js对象循环引用会导致什么问题
- react如何阻止原生默认事件
- react的fiber节点树是什么数据结构,为什么要用这样的数据结构
- react 异步渲染原理,优先级如何划分
- react hook有自己做一些自定义的hook吗
- react key的原理
- react如何实现函数式调用组件,toast.show()
- react新增了什么生命周和删除了什么生命周期,为什么要删除
node后端知识
- node对于option请求如何处理
- node如何处理cors跨域
- ES modules和commonjs的区别
- node的event loop和浏览器的区别
- dns查询过程,dns用什么协议发起dns查询的
- tcp和udp区别
- tcp的三次握手和四次挥手
- 协商缓存和强缓存的区别
- https协议握手大概过程
- 对称加密和非对称加密的区别
- 非对称加密,私钥和公钥的区别
- https证书的作用
其他
- 如何埋点,为什么用1*1像素的gif图片做上报
- 如何定义首屏
算法
// 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
// 示例 1:
// 输入: [1,2,3,4,5]
// 输出: True
// 示例 2:
// 输入: [0,0,1,2,5]
// 输出: True
// 限制:
// 数组长度为 5
// 数组的数取值为 [0, 13] .
三面-技术面
早上,视频面试,leader面试
前端知识
- 绑定事件有多少种方式
- 事件触发的流程,捕获和冒泡
- 捕获阶段能终止吗
- 终止冒泡阶段有哪些
- 如果实现one绑定事件
- 事件委托的原理
- event.target和event.currtager的区别
- 浏览器显示一个图片有什么方式
- 如何获取url中的?后的参数
- 浏览器的内存回收机制 标记清除还是引用计数?
- 如何解决跨域
- 什么是简单请求什么复杂请求
- const和let有什么区别
- ES6常用的api有哪些
- 数组断引用的方式有什么
- Base64图片有什么问题
node后端知识
- Http强缓存和协商缓存用的是什么字段,整体流程是怎样
- Https原理
- Https第一次请求会携带什么
- Ca证书的内容是什么
- Https2.0的特性
- xss攻击原理的防御方式
- Csrf攻击原理和防御方式
- 二进制分帧的具体是什么
- Keep alive和多路复用的区别
- Option请求的作用
- Node gc方式
- 新生代和老生代的区别
- 新生代内存地址移动到老生代内存地址的过程
开放问题
- 长列表优化方案
- 首屏优化方案
- Node如何保证第三方接口的稳定性
四面-GM面
- 浏览器从写入url到加载完毕的流程
- 浏览器白屏原因
- 页面打开后cpu和内存快速增长,如何定位问题,可能有什么问题
- 长列表优化,以及长列表中,如果带搜索功能如何实现
五面-技术委员会技术面
最新规定9级及以上级别需要1-5轮的技术委员会进行加面。
- 最满意的项目列举2个
- 为什么使用RN
- 有100匹马,场地只有4条跑道,得出最快的4只马需要多少轮 Lam:100匹马,4个赛道,找出跑最快的4匹马。
- 已知函数fn1会随机返回1-5的整数,要求基于fn1编写fn2,要随机生成1-7,fn2内不能使用系统的随机api,只能调用fn1获取随机数
六面-技术委员会技术面
- 前端的未来发展的一些思考
- Serverless的优缺点,前端的应用范围
- 页面性能优化
- 做过的专项的架构图
七面-HR面
- 为什么离职
- 你现在公司最有成就感的项目是什么
- 你现在公司最有挑战的项目是什么,你是如果解决难题的
- 期望薪酬
因为我以前有其他公司的工作经验,所以需要做性格测试,之后就是等出薪酬方案和hr沟通,然后发offer,offer后进入背调,一切通过后进入入职预约流程,之后就等待入职咯~~~。
总体感受
现在前端除了一些基本的面试知识外,明显感觉到算法的考虑在逐步加强,所以也总结一些重点的考点吧。一些很基本的原理我就不写了,什么闭包,什么原型链
- 对JavaScript的Api可以手写。
- bind
- new
- promise
- .....
- 浏览器的加载原理,回流重绘,url输入后的流程,关键渲染路径等....
- 框架的原理,了解你最常用的框架的内部原理以及实现,包括思想等。
- 浏览器和node的GC原理
- 浏览器和node之间eventLoop的区别
- webpack的基本原理
- 数据库,redis,nginx的一些基本概念以及基本原理和优化。
- 对于前端页面的优化方案,包括首屏加载,资源整合,网络优化,长列表优化等
- 网络安全,xss,csrf,cookies保护等
- 网络知识
- tcp
- https和http
- dns
- udp
- 算法和数据结构
- 基本常用排序
- 链表操作
- 树结构操作
- 贪心算法
- 回溯算法
- 双指针操作
- 哈希表
- 动态规划(一般为加分题)
整个面试过程,主要缺点可能是面试时间太长了,前前后后收到offer用了2个多月,面试者需要比较耐心吧。面试的难度还是需要看面试官给你的压力大不大,基本上面试的内容都会比较细,当中有一些关于我自己本身项目上的一些问题并没有写出来。但是基本围绕的点就是介绍你的项目,用到的技术,为什么用这个技术,解决什么问题,最终结果。如果你简历里面的内容你不是很熟悉,那么建议你别写,或者略微带过,不要给面试官带来过大的期望。我们对于简历上写到的内容,一定弄清楚每个技术的优缺点,尽可能了解原理和优化方案,不要只为用而用,大厂一般比较在意一个面试者自己的思考能力。
例如你写到你的项目里面用过xxx,但是面试官可能就想多问问你为什么用xxx,有什么问题之类的,如果这个时候你回答不上来,会给人感觉你只是用了而已,缺乏深度思考。而且自己的项目里面,必须说清楚你的具体负责的内容,参与程度如何。
以上就是我面试进腾讯云的整体过程以及追梦成功后的一些总结,如果你也在面试大厂或准备面试大厂的路上,希望这篇文章可以帮到你,祝您成功!