俗话说得好,金三银四好时节,此时不跳待何时?但是作为一名职场人,每个跳槽的选择都是人生中的一个节点,不应该草率决定,而应该细心经营,才能得到理想的结果。这也是为什么身边会出现“有的人越跳越舒服,有的人越跳越尴尬”的原因。本文将带来程序员跳槽的最全攻略,希望能为大家提供一些参考。
一、心理分析篇——跳槽“五因”
公司对你不好吗?工资太低了吗?还是公司无法继续为你带来升值(不是升职)?
第一,工资低是大家跳槽最多的理由。当然面试的时候,没有人会说因为工资低才跳槽,但是基本上百分之八十的人跳槽都是因为工资低。攀比之心,人皆有之。当你发现同行业同经验的小伙伴拿的钱比你多出一大截时,你就很难淡定了。
第二,所做工作是否有价值。这种价值可以体现在:产品走在行业前沿,或者工作对自身来说有升值空间,如果都不是的话,请慎重考虑。需要注意的是,升值是多方面的,虽然我们身处技术行业,但技术并不是唯一对我们有价值的,行业背景、管理经验、流程管理,学习大牛吹牛,都是作为一个职场人需要去关注的事情。这些属于认知和视野方面的提升,比技术本身可能更有价值。如果自己学不到知识了,提高不了自己的技术了,这时候跳槽是应该的。
第三,被天敌 PM 虐惨。俗话说:改你XX的需求啊!程序员的天敌不是测试,而是产品经理。各种乱改需求,忍受不了产品经理的各种指指点点,虐程序员如踩蝼蚁。如果真是这样,那就跳吧,这比围城都可怕。
第四,加班严重。有加班属于正常,但是过度加班就有点说不过去了。曾听一个程序员说,可以让我周末白天加班,我绝不通宵达旦,这是对我自己健康的尊重。当然偶尔通宵一次也可以接受,但是经常性的通宵达旦地赶项目,加班过于严重,就会比较难受。即使工资再高,可能也会产生跳槽的念头。记住一句话,金钱不能买来健康。
第五,产品没有前途。经常有公司上线一个产品时行差踏错,做着做着就感觉这产品方向搞错了,不会有前途了:要么错过了好时机,要么没有切中刚需,要么这个产品所需的营销运用能力和运作资本都不具备......眼看着事情难成,继续做下去也只是聊以自慰。作为程序员,你需要在一个有希望的行业里做有希望的产品,这样自己才有希望。
分析完跳槽的理由和原因,再来说说跳槽需要注意的问题。
二、原则不可违——跳槽“五法”
第一条:不要随波逐流,盲目跟风
春节过后,如果身边的朋友都开始跳槽了,甚至告诉你,这次他换的工作非常不错,工资又涨了 2000,环境好,高大上。即便听到这些消息,你也要保持冷静,毕竟工作是自己的,适合自己的才是最好的,不要被别人带乱了节奏。
第二条:不要只追求高薪
18 年前,谁会想到入职阿里巴巴的那些人会成为千万、亿万富翁?有一句话说的好:放长线,钓大鱼。如果公司的环境非常好,工作又非常适合你,对你今后的发展也不错,公司也有上市的可能,但就是工资稍微低一些,不妨可以考虑。当然你可以适当向老板提一次涨工资的事情,结合自己的职业规划,然后再综合考虑一下是否跳槽,否则你的损失可能会很大。
第三条:正确面对各方的压力
面对产品经理的刁难和各种改需求,面对公司的项目进度,自己要学会调整,并且和公司保持沟通,合理安排加班时间,合理地应对来自各方的压力,因为你并不能保证下一份工作就不用加班,产品经理就不会频繁改需求。所以说,跳槽有风险,选择需谨慎。学会承受压力和面对压力也是对自己能力的一种提升。360 行,行行有压力。
第四条:选择正确的跳槽时机
跳槽要考虑天时地利人和,其实就是要把握各种时机,选择正确的跳槽时机,比如金三银四、金九银十,可选择范围更多。关于跳槽时机,其实当你在所属领域内做得非常突出,得到大家认可的时候,就是你选择跳槽的最佳时机。这时你处于上升通道中,状态和能力都处于巅峰,换工作时通常会获得一些超预料的机会,甚至通过换工作提升职级职位。
第五条:提升核心竞争力
核心竞争力是跳槽最大的筹码,这个是很考验功夫的,需要平常点滴的积累。当工作中被分配了看似不可能的任务时,应该兴奋起来,这是你彰显竞争力的最佳筹码,迎难而上是最快积累的方法。从量变到质变,一定是经过实战积累的,将实战与理论相结合,那就更完美了,知识体系也是如此搭建起来的。以Java为例,理论知识如下:
1.线程模型 ->JVM->MESI ->线程安全->多线程/线程池->AQS->性能优化
2.Java基础->反射代理->设计模式->架构设计->微服务->分布式->一致性/CAP->HA设计
3.file->IO->NIO->linux I/O模型->netty
4.SQL->模型设计->索引创建->索引原理->算法
5.高并发->分区->分库分表->缓存->MQ->高性能存储-->运维
从底层到应用层到架构,梳理一下自己当前的水平,确定一下自己知识的深度和广度。
关于深度,知其然也要知道其所以然,通晓原理才能更好地解决问题。提高知识深度的技巧就是琢磨为什么、怎么做的。MQ 能解决什么问题? MQ 吞吐量为什么有的低有的高?每当遇到一个新东西,就深究一下,想不提升都难。
关于广度,提高广度的技巧就是多接触,多了解,多关注知名的技术博客。看看最新的招聘要求,可以了解到一些比较新的技术走向,比如 serverless,k8s,为推陈出新开拓视野。多学习一些其他语言、领域的知识,不断拓展知识面。
三、面试准备篇——具体怎么聊?
1.自我介绍
毕业院校,从业经历,主要介绍工作经历和具体的工作内容,如果太多的话就挑几个突出的公司,每个经历控制在三句话,一般总体 3 分钟介绍完毕,不要太啰嗦,语速适中,态度温和。很多面试官见你的时候都是刚拿到你的简历,这三分钟其实是给他看简历用的。
技术面试的过程中,一般通过项目的一些技术点,引入到纯技术的面试环节,这种面试方式对于双方会比较舒服,更像一个热身运动,引导面试者进入状态。
2.聊项目
展示你的最佳项目经历,这个环节是考验你对于项目的理解、投入、思考,技术方面侧重编码、设计等实战能力。
项目的阐述,首先要介绍一些项目背景,整体的架构设计,分为几个模块,自己负责哪个模块,核心功能是什么,然后等待面试官的问题。有经验的面试官有自己的套路,比如直接抓重点,难点,疑点;也有的先问你一些很轻松的问题,然后突然问你,你觉得你们线上最大负载能承受多少或者你们的 GC 机制是哪些,QPS 是什么计算方式,通过日志还是第三方监控。
很多时候面试官致力于一些细节来验证项目真伪和评估你在项目中的价值。夸大的一些数据或者不懂装懂的的辨别方式就是,抠细节。因此,对于简历中描述的项目数据一定要实事求是,不要超出自己的能力范围!
此外,阐述自己的思路和想法时可以多一点新鲜感,增加面试官对你的好感,比如缓存击穿问题,常规做法,使用分布式锁或者线程 block 等待超时,那为什么一定要让缓存击穿风险存在呢,使用job定时更新缓存,所见即所得,缓存没有就是没有,实时性稍微差一点,考验避免很大的风险和成本。数据同步就非要在业务代码中进行么,碰到事务问题的时候,又要做出选择,或者一定要用 job 轮询的方式从一个地方复制到另外一个地方,采用 binlog 的同步方式能否试一下(目前这个技术比较普及),这些操作会告诉面试官,人家是一个善于思考的好同学,跟那些背面试集锦的不一样。
3.探讨技术
高并发场景,怎么解决的,添加了MQ,怎么使用等等。说到了 MQ,底层实现原理有哪些,如何避免消息堆积,如何保证有序性,事务型 MQ 是如何显示的?ES 的底层原理什么,与 Lucene 差别是啥,搜索算法是什么,文件结构是什么,评分算法是什么,深度分页怎么玩,大概罗列一下,常规的组合拳。
从底层到应用层,架构层,来考察你的深度和广度,一般根据这个来定级别。
其中还会涉及到一些场景模拟的问题,是考察你的积累,也是对你临场应对能力,分析能力的考验,不排除一些场景,只有他们场景中才会发生,问题抛出来,让你一顿分析并解决。
如果碰到不会的怎么办,很多面试官会问比较少见或很刁钻的问题,这个时候,你可以分析一下,如果自己做的话,会怎么去做。对错无所谓,主要是思路。
4.谈薪资
通常来说,不提倡平薪,除非平台良好,岗位有吸引力,符合自己的利益最大化。正常涨幅在总包(基本+年终奖)20-30%,看个人基数,行业同龄水平,技术面试表现。不要漫天要价,也不要让自己吃亏。报给HR时,给一个期望薪资,较高的,因为不管怎么样,都会习惯性砍一下。谈薪资之前,一定要问清工资结构,是否避税,五险一金基数多少,年终奖以及其他福利等等。这些都可以和HR详细了解一下。
四、写在最后
说了这么多,最终决定跳槽与否取决于自己对整个人生的职业规划,如果你的公司符合你对自己职业规划的预期,那就没必要离职或者跳槽;如果公司偏离了你的职业生涯轨道,那么跳槽也就无可厚非。
跳槽是一个脑力活,需要持续的思考和运营,从准备阶段到奔赴战场,整个过程都需要良好的谋划,明确每次跳槽的目的,不断提高自身的硬实力才是成功的不二法门。