👉 博客主页 👈
📝 一个努力学习的程序猿
前言
从毕业到现在已经工作2年半的时间,期间我在2023年的年后做了一个决定:裸辞。实话讲,裸辞后的时间很难熬,再加上新工作强度大,这导致我2023年在其他平台一篇文章都没有写(最近才发现掘金这样的平台,实在惭愧)。在裸辞期间,看到最多的话,就是前端已死。maybe,总之前端的工作确实难找,真是应了那句话:“现在搞计算机,就是49年入国军”。而我在经历过2023年后,整理并想写的唯一一篇文章就是该篇,希望给大家提供些经验和警醒,能不裸辞还是别裸辞了。最后,本文内容仅限个人观点+经历,欢迎大家讨论。
个人经历-裸辞
我是双非一本计算机毕业,从大三开始自学前端,目前一直从事Vue生态的开发工作,在2023年年后选择了裸辞。裸辞前计划好好休息一下,在金三银四开始找工作,而且因为只经历过校招,在有学校的平台加持下,当时没觉得找工作是个很难的事。但是当躺平一个月后,无论是自身的焦虑心态还是家人的催促,心里很难保持平静。当自己开始重新找工作,情况不理想时,才在各种渠道查阅信息,发现似乎整个互联网都不太景气,你会发现在现在除了科班毕业生外,依然还有一大批转行想当程序员的。
在找工作的一个半月时间里,我投递了大大小小几百家公司,从结果上来说,我感觉对普通人来讲,学历真的尤为关键,而且现在又人均一本,只有学历合格了,其次才可能进面聊技术。再加上对于前端来说,100个面试者,100个会Vue+React,如果没有能在简历上让人眼前一亮的技能,那没有学历就更难进入到面试环节。其中,给到我面试机会的,大概十几家公司(大多为外包)。通过面试,我真真切切感受到了现在公司招人的高要求和内卷:几百人甚至几千人投递一个岗位,其中会有985、211高校本科、研究生毕业的人与你竞争,正因为公司备用人选太多,你能明显感受到,公司希望你学历高,要的薪资低,技术还牛X,反正你不接受,100%有其他人能接受(连部分外包的门槛都上升到了本科毕业)。
因为路是自己走的,既然已经走上了裸辞的不归路,那无论什么结果都得忍痛接受,所以我特别想整理该篇文章,希望大家能耐心细致的做出职业规划,形成自己的专业壁垒,而我也只不过是踩了不了解行业的坑罢了。还有一个切身体会就是:现在前端环境还是蛮卷的,躺平似乎成了一种过错,需要不断学习新技术去提升自己的能力。这也导致我想在30岁左右转行,不过走一步看一步吧。
话虽这么说,如果是计算机相关专业本科及以上学历的应届生,那一切都十分来得及,应届生机会是无限多的。面试官对应届生的要求不高,只要保持学习和自信,即使专业分(排名)不高,想要面试通过并不难。
如果已经工作了一两年,想要跳槽,建议先投递简历试一试,因为初级程序员多的数不过来,裸辞出来短期内可能找不到同等水平的工作。即使能力再强,也要从成千上万的人当中脱颖而出,还有要接受降薪和工作不满意的风险,甚至无奈只能前往外包、考虑转行。
面试经历
我在那个时间段实际1年半的工作经验,但是按照2年工作经验去找的,技术栈是Vue,投递简历大多会石沉大海,面试机会比较少。面试官要么极其刁钻,要么套方案;HR会横向比较,不断压价。最后到了今年虽然找到了工作,但是也未必比跳槽之前强。
无论工作好坏,但是与面试官的斗智斗勇的确是经验之谈。
首先说一下对答环节:
目前在面试的过程中,主要聊的还是HTML、CSS、JS、Vue(Vue2、Vue3、Vuex、Vue-router、Webpack、Vite、TypeScript)。 不过自己在准备面试的时候,看到了很多前端面试的题目分享,其中包含计算机网络、数据结构、浏览器相关的,不过被问到的频率太小了。不过还真有一个面试官问了我什么是“算法的时间复杂度”,当时我就懵了,明明知道有这么个东西,但就是回答不上来🤦。
其中,大厂的面试真的有难度,举个我碰到的“组合拳”:
面试官:什么是闭包?什么是作用域链?写个闭包的例子吧!为什么这样形成了闭包?(面试官写了个例子)这样写是不是闭包?存储的时候是在栈内存吗?闭包有什么应用?防抖和节流知道吗?写个防抖函数,再写个节流函数吧!什么又是垃圾回收?闭包为什么不会被回收?JS是如何实现自动垃圾回收的呢?又如何手动进行垃圾回收呢?闭包会不会出现内存泄露?什么情况下会内存泄露?怎么避免内存泄露?怎么释放闭包?
以上,只是一个问题。我到现在都还记得面试官因为我答不上而若有所思的表情,一套套的组合拳往我身上打,尤其是Webpack完全答不上来。我曾尝试转移面试官的注意力,企图聊到我熟悉的内容,但是面试官不断提醒我要正面回答问题。或许有时候明确说不了解也是一种选择😂。
再分享下其他我碰到的“组合拳”:
1、概述原型+原型链,实现原理
衍生提问:继承有哪些方法?:即一个变量赋值给另一个变量(如果要把原型链上的数据也赋值过去怎么做?如果不想把原型链上的数据赋值过去怎么做?)
2、什么是同步 / 异步?Promise + async/await 原理以及执行顺序(会给一道题目,让你说执行结果)
3、什么是递归?如何解决递归栈溢出?聊聊递归的优/缺点
4、概述Vue生命周期
衍生提问:created + mounted 的区别和对比?nextTick的作用、实现原理、应用场景?set作用及原理
5、概述Vue组件间通信有哪些方式,它们的区别和对比?
衍生提问:v-bind.sync 的原理(子组件的$emit('update:xxx', xxx)为什么能成功更新数据?原理?);详细说明slot插槽的实现及原理;通信内部是如何实现的,原理是什么;事件总线eventBus的优点与缺点
6、mixins 混入的优缺点及原理
7、概述深浅拷贝(克隆)的原理和实现方法
衍生提问:为什么需要深浅拷贝,它们的使用场景是什么?为什么部分情况下修改数据,但是页面上内容不同步渲染?不同步渲染要怎么解决(nextTick;set)?
8、概述真实DOM / 虚拟DOM / 重排(回流)/ 重绘概念;如何避免重排(回流) / 重绘
9、Vue3 和 Vue2 有哪些区别?
衍生提问:概述 diff 算法(Vue2、Vue3 之间的区别;diff 算法本身有什么变化)
10、webpack 有哪些用法(loader、plugin);vite和webpack的区别及其优劣势;
接下来,算法通常只有大厂面试会考,我在现场写了2-3道算法题,10分钟限时(不排除小厂考算法题的可能)。如果想准备算法,可以看下我被问到的算法题,感受一下大厂2年经验算法题的难度
遇到的算法题(只能用JS实现):
1、普通的数组(number[]、string[])如何做数据去重,如”[1,1,1,3,4,5,1,7]”
2、对象数组如何根据某个字段做数据去重,如”[{a:1,b:2}, {a:1,b:3}, {a:2, b:4}]”?
3、一个字符串,如“abbcccdddddeeeeedcb”,在该字符串中取出所有连续最大的字符串内容(eeeee / ddddd)
4、给定一个number数组,如“[2,3,4,5,8,9,10]”,拿到其中所有相加为特定值的数字组合,如本次相加为10的全部数字组合
5、给定一个number数组,如“[2,3,4,5,8,9,10]”,怎么反转数组([10,9,8,5,4,3,2])?
6、给定一个字符串,如“get-element-by-id”,怎么把它转化成驼峰命名(getElementById)?
7、如何实现数组扁平化,把多维数组变成一维数组?如“[[1,2,3],[3,4,5,5].[6,7,8,[9,10,[11]]]]”
以上对答+算法阶段结束后,通常还会碰到一种开放式的聊天阶段,会被问到项目经历,去说一些项目中遇到的问题以及如何解决的,或者自己做过最牛的功能以及怎么实现的,或者给你提一个场景,看问题要怎么解决。通常在聊这些功能时,顺带也就问到了相关八股文。这一部分是要准备一些的,避免现场临时想到了一些内容,结果被问的手足无措。
最后,祝愿看到文章的每个人,都能找到一份满意的工作。