草稿箱里放了半个月, 现在稳定下来, 山地车装完了全包挡板回来把帖子发表出去
概述
年底离职通常不是一个好的选择, 但楼主的主动或被动都恰好在这个时间点.
看过不少的今年(2023)求职面试文章, 了解到今年的寒冬尤其明显, 看懂世界新闻的也知道2024也只会下降.
现在无论谁都会建议: 现在的工作能苟着就苟着, 尽量别裸辞.
本文篇幅: 离职故事 + 面试经历 + 遇到的手写题目 (前端)
离职背景
离开缘由
- 乙方公司降薪 (即撤回两年前的涨薪), 回到刚入职的薪资
- 诉说老板贷款亏钱发员工薪水
- 讲述当前环境恶劣, 自己和公司生存不容易
- 讲述楼主过去有在甲方聊天大群里支持过其他外包员工的劳动纠纷作为秋后算账
- 讲述楼主近日在公司南京这边小群里聊加班制度引发新人重新刷Boss造成新人不稳
- 事后签署
降薪协议时, 书面写道员工主动要求降薪...
- 甲方某安科技
-
原项目
连续支持维护三年的项目, 从前端6-7人熬到独立1人, 从完全的 `SHIT` 项目逐渐优化迭代, 从 `Vue2.5 + Webpack` 及 `大量冗余配置` 到 `Vue2.7 + Vite3`以及 各种 `业务组件封装`, (优化都是在需求以外自己整活的内容, 毕竟业务需求都是简单重复的没有挑战性) 到最后突然由己方交付通知 `原项目不需要人了, 帮你申请换新部门和项目组`, 原项目管理第二天才跑来软件私聊 `你应该知道了吧 要给你换个部门, 对方要你很急`, 楼主其实心里拔凉 (你一个直接负责人不提前打招呼, 事后才跑来假客套) -
新部门新项目
换新部门先是需要己方交付提流程, 到了日期还得自己去找新领导问工位安排; 换到了新工位, 新领导先是安排一个项目组的java负责人来沟通进项目组; 加了权限, 拿到仓库代码, 架构层面 `Vue3 + TS + iView-ui-plus`, ui库官网在工作网络 打不开只能自己手机/平板上看了; 看进业务代码还是熟悉的 `SHIT` 全模式, 呕心沥血忙碌两周把手里需求整完 (主要是页面改造重构, 现有ui设计太低级了换了新一套ui界面), 后两三周修修补补 (主要其他人员效率太低问题也多), 群聊里又不断地确认新的需求变更现有的需求, 在这里都是司空见惯; 历经一个多月的版本终于发布上线(发布前十几分钟还喊楼主改功能是真的离谱), 后续经常由现有的前端主导或内部的java转需求过来, 楼主基本主动揽活; 终于有一天, 楼主在对方转发一个需求到群里让前端看看(是的, 需求不是由产品直接对接, 乱的很), 又是没人搭理他, 楼主自己主动揽活需求后, 当天开发完, 第二天那位java反馈有问题 (因为是给外部嵌入用的模块, 楼主自己测试操作不方便), 在群里问了一下问题详情, 列举了几种 场景是否都有问题, 没想到对方又一次发脾气; 为什么说 `又一次` 呢? 这位大脾气java在两个月里正常沟通发脾气三次, 以下列举: 1. 第一次是在楼主刚进项目, 对方在群里反馈一个问题, 但是没人搭理, 楼主搭话本意是帮忙 分析问题, 结果却喊 `你又不改 接什么话 在这浪费我口舌`; 2. 第二次是java负责人请假, 这位成了唯一一位在场java, 楼主手里两个功能等着联调接口, 只是说了一句 `还有两个功能等联调`, 对方又发脾气抱怨 `就我一个人了 那么多事搞不过来 要找找领导去 我只要干好自己当天的活`, 当时没看明白以为只是抱怨, 第三次时才想起来是冲 楼主说的; 3. 第三次是楼主主动揽活一个需求, 对方第二天反馈问题时, 楼主只是细问了下, 谁让你表达 不清楚呢, 这就脾气上来指责楼主 `又没指定你做, 说做又不做`, 楼主当时火气就上来, 真是 DOG咬吕洞宾, 懒得争了直接右键退群; 在楼主退群后第二天周五直接请假回家休息去了, 第二周就冒出个人来说是领导安排问会不会 React, 楼主知道是准备安排新项目, 楼主如实回答 `React不熟悉, 现研究可能来不及赶需求`, 果不其然, 领导亲自过来问接不接受出差大深圳, 楼主稍微问了下出差流程和补贴就先答应下来, 而后说要安排面试, 这会心里做好出去换工作的准备了(经验告诉楼主, 不能太相信他们); 等了一天, 没反应没安排, 等了两天, 彷佛无事发生, 楼主大致知道各自心里算盘了; Boss打开, 开放隐私简历, 更改求职状态, 当然要先屏蔽些公司 (大家懂的), 刷出来的沟通 信息挺多, 基本都是人力外包, 毕竟12月了; 从此开启了两周多的面试求职之路, 这个过程中现有工作环境还是整日等待无安排待机状态, 做外包的都懂什么状态; -
经历了三年, 见过太多的
SHIT项目, 项目组织流程混乱, 人员效率低下, 楼主能接触到的内部或外包看其编码无一人有楼主技术水平(都在堆SHIT), 也没机会用新技术更别说学东西了, 优化SHIT编码以及保持规范也只有楼主独自做// 像这种垃圾代码并不少 if (status == '1' || status == '2' || status == '3' || status == '4' || ...) {} // 甚至有这样的 if (status == '1' || '2' || '3' || '4') {} // 甚至有这样的 var obj = { 中文属性: value } var 中文变量 = value
-
面试
顶着本科的头衔, 面试机会确实稍微多一丢丢, 楼主技术掌握的没有多么出色, 尽管在之前的外包环境中没见过能达到楼主水平的开发
两周的时间 Get Offer, 要求降低些, 降薪还是能上岸的, 日常有面试就去面试, 偶尔请个假回去复习八股文, 毕竟这个状态上班也是整天看手机等着下班
面试复习
只用了Boss软件, 复习看看掘金八股文, 以下的文章看起来全面些, 一些细节不够的地方反问自己, 再去搜索一些单知识文章补充, 最好自己也总结一些包括面试问到的内容
面试经历
楼主在南京, 之所以有武汉是离家近, 在备选城市添加了武汉, 某一次Boss弹窗提示是否添加武汉期望工作地, 点了一下确认, 当场就把推荐列表换成了武汉的招聘职位;
以上图中顺序为第一次沟通的时间顺序 (外包很喜欢加微信, 自研都是平台沟通)
第一场
期望地点换到武汉后, 消息里是刷的一下很多未读信息沟通, 一看全是银行类人力外包, 本着求职初期练手的原则选一家进行沟通, 自研也有尝试投, 结果当晚这银行外包公司来电话, 当时还以为是hr, 结果是乙方的女前端来说面试, 刚开始看八股文的状态下接受突然的面试, 果不其然照着八股文提问, 最后已失败告终;
第二场
南京的自研, 20-99的规模, hr主动找上楼主的, 请假去现场面试, 本以为聊一小时还不错, 最终无消息;
楼主判断失败的原则就是 面试后24小时无消息 = 失败
第三场
这家公司一开始联系说是做外包鸿蒙项目, 在自己公司开发, 消失了几天在微信上又说约荣耀外包, 楼主答应后上午电话面试, 开场沟通就不对劲, 对方是 RN 项目, 咱主 Vue 的不搭边, 事先也没说, 开场问了个 HTTPS 加密过程, 八股文没看到这里自然挂了, 后面都是假客套问答, 10分钟不到结束
第四场
楼主主动投的一家武汉自研, 先是发了邮件笔试题, 主要算法, 后面请假结束第二场面试的中午开始做题, 花了一整个下午到18:00才结束发送回复邮件, 中午没吃的楼主又饿又冷出门下馆子了
过了两天左右收到Boss上回复约面试, 腾讯会议, 语音面试过程涉及一些八股文, 一些场景案例, 其中八股文没熟练, 瀑布流没接触过没答好, 问到简历项目亮点算是扎心了, 过去经历都是简单的PC项目即使对其他开发复杂点对楼主简单到不需要记忆的程度, 失败是当然的啦
第五场
再接再厉, 总结面试经验, 整理文档
第五次是周末了, 周六晚陌生号码打过来没接到, 周日晚又打一次, 自称是仙林的初创公司做医疗科技的 (楼主这会都不知道仙林在哪), 说是猎头推荐, 楼主答应先做个邮件笔试, 约好第二天晚上八点开始, 限定2小时内打包文件回复邮件
第二天晚上花了两小时聚精会神做两个 vue小案例, 不算太复杂, 提前5分钟打包回复邮件, 从此就没消息失联了没任何反馈 (初创公司果然不能信啊, 被坑第二次了)
第六场
南瑞的一个外包, 从沟通到机试, 到面试, 时间跨度快2周了, 这甲方风评并不好, 加班很狠的那种, 我朋友对他的评价也就是 免费停车 / 食堂方面与甲方内部人交易用其饭卡很便宜 / 那个片区加班多之前同事几天就跑路
由于机试当天楼主已经有确认的 offer 了, 请假不能浪费还是继续参加机试, 机试全过程笔记本屏幕录屏, 手机小程序监控录屏
笔试题 单选多为基础概念, 模糊一点容易选错; 编程题一个, 逻辑简单, 都用不上算法, 只是逻辑函数写完不知道怎么弄输入输出, 加上有两个电话打进来只能瞬间挂断, 微信消息亮着, 心里捉急就匆忙提交机试了, 知道这东西不复杂就行了, 甚至告知外包hr应该通不过了
没想到一周后外包hr来约面试了, 又是腾讯会议, 晚上开始, 这会楼主已经走完离职流程回到家了, 至于会议面试知道就答不知道就不知道了, 结果倒是无所谓了(补充: 之后元旦前一天要给offer咱拒绝了, 真能拖跨度快三周, 预期给的钱还不如第七家的)
第七场
从面试时间算不是第七家, 第一次沟通的时间上是第七家, 现场面试, 挺远的还, 过去要1.5小时左右, 到地方还找错地;
面试过程还行, 当中有当面手写正则和小算法, 小算法倒是没全写出来, 这么短时间没完整思路, 结果没谱;
第二天晚上, 本来几乎认为失败了都快删hr了, 结果突然问期望薪资, 楼主就知道稳了, 要么对比候选人薪资, 要么决定楼主了, 报了个现有工作70% - 90%的期望后, 给到上限, 虽然还是降薪式跳槽 (如果上限喊100%或许好点?), 之后都是谈 offer 细节和入职时间了, 以楼主目前状态一周内结束离职流程妥妥的, 虽然最后催办离职程序时依然忐忑;
再第二天, 收到邮件 offer 后, 直接发起离职申请, 已经周五了, 催办了一次没回应, 到了周一一早又催办一次, 都打算先礼后兵了, 等了半小时终于审批了走到下一环节, 后面都顺利了, 直到结束这家外包生涯;
离职之后
再也不用两边公司刷视频/重复的考试/各种形式主义(全是信息安全的), 着急换工作又快元旦, 先上岸为妙
准备新的环境, 新的开始, 未来的工作中多注意补充技术, 给自己充电
面试经历就是成为面霸的过程, 前期的挫折积累都是为了后面上岸的铺垫
片尾思考?
浏览器渲染过程:
所有文章都说 回流必定会触发重绘,重绘不一定引发回流, 那么 什么样的重绘将引发回流?
面试经历中一些简单或复杂的编程题
1-100累加求和 (递归)
1-100累计相加求和, 不使用循环
// 方案1
function sum(num, start) {
num += start
start++
if (start > 100) {
return num
}
sum(num, start)
}
sum(0, 1)
// 方案2
function sum(n) {
if (n === 1) {
return 1
}
return sum(n - 1) + n
}
sum(100)
数组求和
数组中指定 n 个元素求和为目标值的下标数组(最小值)
const nums = [3,2,4,5,7] // 源数组
const target = 10 // 目标值
const n = 3 // 元素个数
const result = getArray(nums, target, n)
// 计算数组中n个元素求和为target的下标数组
function getArray(nums, target, n) {
const array = []
const result = []
const handler = (num, targetNum) => {
// console.log(array)
if (targetNum === 0 && array.length === n) {
console.log(`output->yes`, array)
result.push([...array]) // 避免array更新数据影响
return
}
for (let i = num; i < nums.length; i++) {
if (nums[i] > targetNum) {
break
}
// console.log(`output->当前循环`, nums[i])
array.push(i)
handler(i + 1, targetNum - nums[i])
// console.log(`output->当前循环结束`, nums[i])
array.pop()
}
}
handler(0, target)
return result[0]
}
兔子生兔子
一对兔子初始一月, 满指定月数成熟并开始每个月生下一对兔子(不是xx数列)
// 兔子类 - 一对
class Rabbit {
age: number = 0 // 年龄月数
constructor(age?: number) { // 设置默认月龄
if (age) {
this.age = age
}
}
update() { // 每月更新月龄
this.age += 1
}
}
// 计算兔子对数 month: 月数, adultAge: 到达成年月数
export function calculate(month: number, adultAge: number) {
const rabbitArray = [new Rabbit(1)] // 初始化默认月龄1
// 月份循环
for (let i = 2; i <= month; i++) {
// 兔子对数循环, 从第二月开始月龄+1
rabbitArray.forEach(rabbit => {
rabbit.update()
if (rabbit.age >= adultAge) {
rabbitArray.push(new Rabbit())
}
})
}
return rabbitArray
}
// 第24个月, 5个月成熟
console.log(calculate(24, 5).length) // 431
// 第10个月, 4个月成熟
console.log(calculate(10, 4).length) // 14
多个请求顺序调用 使用 yield 生成器
利用关键字 yield, 使函数生成器暂停
每次调用 next() 时, 生成器恢复执行, 并将 yield 后面表达式的结果返回给调用者
返回结果 value (求值的结果) 和 done (布尔值, 生成器是否全部调用完成)
const ajaxList = [
new Promise((resolve, reject) => {
console.log(1)
setTimeout(() => {
resolve(1)
}, 1000)
}),
new Promise((resolve, reject) => {
console.log(2)
setTimeout(() => {
resolve(2)
}, 1000)
}),
new Promise((resolve, reject) => {
console.log(3)
setTimeout(() => {
resolve(3)
}, 1000)
}),
]
const fn = function* (ajaxList) {
const promiseList = []
for (const ajax of ajaxList) {
const promise = yield ajax
promiseList.push(promise)
}
return Promise.resolve(promiseList)
}
function startPromise(fn) {
return new Promise((resolve, reject) => {
const array = []
function next(preResult) {
if (preResult) {
array.push(preResult)
}
const result = fn.next()
if (result.done) {
resolve(array)
} else {
result.value.then(curResult => {
next(curResult)
})
}
}
next()
})
}
startPromise(fn(ajaxList)).then(data => {
console.log(data) // [1, 2, 3]
})
结尾
整理的八股文没必要贴了, 放个网盘链接即可
share.weiyun.com/t81fMf5n 密码:gayp4t
笔记软件和在线平台
上班用 有道云笔记 (公司网拦截语雀网, 印象笔记md语法也弄不出来, 只能选有道了), 在家用Obsidian
话说掘金的文章主题好看的选择真少