引入
又到了金三银四的跳槽黄金期。这篇文章结合我自己最近的社招经历,整理了不少实战经验和小技巧,主要面向 3--5年经验的初中级程序员,希望能给正在考虑跳槽的你提供一些参考。
不管做任何事情,我们都要遵循思考 --> 规划 -->行动 这个路径。
在开始准备面试之前,我们先要思考以下两个问题。
Q1:换工作的原因是什么?
在整个跳槽周期中,最关键的一步其实是:明确离职原因,下定决心。
离职念头很多时候是间歇性的,诸如:项目太赶、加班太多、和某个同事配合不畅...一瞬间可能会产生"老子不干了"的念头,随即打开了招聘软件、八股文网站,但是一旦这些外部因素发生变化,回归到舒适生活,离职念头也就随之消失。
换工作是需要持续投入 的一件事,因为面试考察的很多知识点,是系统性的、成体系的、记忆性的。这种仰卧起坐 式的摇摆,很容易陷入准备了又没完全准备的尴尬局面,既浪费精力,又拉长战线。
开始准备跳槽之前,重要的不是刷题、改简历,而是需要问自己以下几个问题:
-
我到底为什么想走?
-
这个问题是当前环境特有的,还是我无论去哪里都会遇到?
-
如果换一份工作,能解决我现有的困境吗?
只有发自内心的确认自己想要做出改变,行动才能真正坚持下去。
Q2:面试官想要什么样的人?
任何岗位都是我们先要去明确:公司到底想要什么的人?你的加入能给公司解决什么问题?。针对程序员这一岗位,换位思考,站在面试官的角度,我认为以下几点可能比较重要:
-
合不合眼缘
-
技术水平 :能不能干活。作为开发,技术当然是重中之重。延伸到面试过程中,体现到以下几点:
-
基础知识,如:八股文、算法等。
-
过往的经历中解决过什么问题,项目重难点--> 有哪些可复用的经验、能力。
-
架构、功能设计能力:场景题解决方案。
-
技术视野、学习热情:对当下最新的技术有什么了解,对新技术或者新工具有没有探索欲,如AI相关的一些知识、工具。
-
-
沟通表达能力:沟通的频率能否达成一致。具体体现在:能否理解面试官的问题,能否根据问题做出回答,而不是答非所问。回答的问题面试官能否理解。
-
人品、性格:是否正直、真诚,能否融入团队。
之前我的一个误区是,程序员靠技术吃饭,性格没那么重要。但现在我的理解是,不管是什么岗位,只要在职场中,是需要和人合作的岗位,性格是不可忽略的,只有融入团队,才能更好的开展工作。
-
稳定性:招进来能干多久--> 过往的工作经历、离职原因是否合理、跳槽频次。
-
使用AI解决问题的能力:AI时代下对于程序员而言,使用AI的熟练程度往往决定工作效率。
以下是针对面试前、面试中、面试后的阶段给出的一些Tips。
1. 面试前
在面试前这个阶段需要做的准备:
-
明确目标岗位与业务方向:让简历和准备更有针对性。
-
岗位类型:后端、前端、全栈、测试 or 算法等;
-
技术栈范围:能够接受或者希望继续深入的语言,如:Java、Golang、Python等;
-
业务领域偏好:电商、金融、物流、AI或者是ToB企业服务,某些岗位可能对是否有垂直行业经验比较看重。
-
-
打磨简历:简历的重要性不言而喻,是用人方对候选人的第一印象,简历的好坏程度决定约面率。
-
面试准备:技术知识、面试高频问题、面试话术等都要在这个阶段提前准备。
1.1 明确岗位、方向
确定目标岗位后,需要进一步明确:
-
岗位角色:到底要应聘什么?角色定位要清晰,岗位角色往往决定简历上内容哪部分要强化,哪部分要弱化。如:定位是Java后端工程师,那么针对于一些前端技能、Python技能就要简写。
-
技术栈定位:主攻语言及对应技术栈。决定简历上的专业技能部分,以及项目侧重点。如:针对Java相关技术栈,Spring 框架、微服务、消息队列、缓存、数据库等均是需要深入学习的内容。
-
业务领域:如果是投递垂直行业,简历上可以适当突出行业经验;反之,则要突出方法论和可迁移能力。
1.2 打磨简历
-
打磨:简历是不断迭代的过程,可以在面试过程中逐渐细化,完善。
-
简历的目的 :让用人方快速判断你是不是满足岗位的基本要求,有没有进一步面谈的必要。
因此简历一定要精简 ,在有限的篇幅里展示匹配度。
- 简历的原则 :不要有废话,不写与应聘岗位无关的信息 ,如:身高、体重、籍贯这种信息就没有写的必要,简历是寸土寸金的地方,要把有限的空间留给能体现自己能力的信息。
程序员简历应当包含以下内容:
- 个人基本信息
- 教育背景
- 工作经历
- 项目经历
- 技术栈(专业技能)
1.2.1 个人基本信息
-
必填:姓名、应聘岗位、学历、工作年限、电话、邮箱。
-
选填:博客地址 or
GitHub链接,年龄,性别,照片。
1.2.2 教育背景
-
倒叙展示,时间从近到远写。
-
包括内容:就读时间、学校名称、所学专业。
-
社招的话没必要罗列校园期间的课程,可以写读书期间的主要成就,如:GPA / 均分(如果比较高的话),获得的一些证书、荣誉等。如:四六级、软考及其他专业相关证书、奖学金证书情况等等。
lua
20xx年9月 -- 20xx年6月 xxxx大学 软件工程
GPA:xx(专业前x%)
证书荣誉:四六级证书、校级x等奖学金、软件中级设计师证书等等。
1.2.3 工作经历
工作公司、工作时间、担任岗位、主要负责做什么事。如果项目经历能够 cover 工作经历的主要内容,这部分内容可以简写。
20xx.4-20xx.4 xxx公司 Java开发工程师
1.2.4 项目经历
项目经历我认为是技术岗位简历中的重中之重。如果说面试是一场考试,那么项目经历和技术栈,就是提前为自己划定的重点、考点。写得好,面试官会想深入了解细节;写得平淡,技术实力再强也可能被埋没。
一定不要写流水账 ,如:负责A、B、C模块的增删改查。要有选择的写,写亮点 、写难点 ,写最能体现自己价值的事情。
可以采用STAR法则来描述项目:
S --- Situation(场景 ):说明项目产生的背景是什么?为什么需要做这个项目?一句话点出项目的商业价值或核心痛点,让面试官快速理解为什么要做这件事。T --- Task(任务):你在这个项目中承担了什么责任?负责的模块或目标是什么?明确你的角色和任务边界。A --- Action(行动 ) :你具体采取了哪些行动?为什么选择这些方案?体现你的技术思考、决策过程和解决问题的方法论,而不是简单罗列工作内容。R --- Result(结果 ) :最终实现了什么成果?可以量化的尽量量化,如性能提升、成本降低、故障减少等。强调你对业务或系统带来的实际价值。
markdown
项目起始时间 项目名称 担任角色
20xx.3-20xx.10 xxx系统 Java开发工程师
- 项目背景:这个项目用于解决什么问题,什么样的业务场景下催生了这个系统?
- 技术栈:Spring Boot、 MySQL、 Redis、RocketMQ
- 个人职责:
- 通过引入XXX作为xxx,解决了xxx问题;
- 性能优化:针对xxx接口进行sql优化,将接口响应时间从xxx降到了xxx;解决过XXX场景下的OOM问题;
1.2.5 技术栈
罗列自己擅长的技术即可,同样要有逻辑。
普通人不要写精通!(当然如果是大牛当我没说🤣
diff
- 熟练掌握Java语言及常用集合框架,了解ArrayList、HashMap等的底层原理;熟悉Java并发编程,具有线程池、AQS等实践经验;
- 了解JVM运行时内存区域,类加载机制以及GC算法,项目中有排查解决OOM问题的经验;
- 熟练掌握Spring Boot框架的使用,熟练掌握Sping Data JPA、MyBatis等ORM框架的使用;熟悉Spring Cloud框架常用组件的使用,具有微服务项目实战经验;
- 熟悉MySQL,对数据库事务,锁及索引有深入了解,具有SQL调优实践经验;了解Oracle数据库;
- 熟悉Redis的使用,对常用数据结构,持久化机制,缓存雪崩、击穿、穿透等有一定了解,具有实战经验;
- 熟悉Linux操作系统及常用指令,能够编写Shell脚本,有部署项目的实战经验,了解Nginx、Docker的使用;。
1.3 准备方向及重点
1.3.1 八股文 & 算法题
1.3.1.1 怎么准备八股?
-
根据自己的简历中的技术栈、项目经历部分涉及到的知识点,列出知识框架,根据面试过程中的问题不断细化框架。
-
复习过程中将知识分类、整理成笔记,形成经过自己理解的回答,最终形成一个题库。不要死记硬背,要真正做到理解性记忆。
-
Java八股文网站:
准备八股踩过的坑:关注高级特性,忽略基础。把精力都放在了并发编程上,没有准备基础问题。如:包装类和基本数据类型的区别。
Q:AI时代来临,还有必要背八股吗?
面试其实就是一场考试,八股是检验基础是否扎实的一种方式。尽管如今很多知识点用大模型就能迅速得到答案,但目前就我面试Java岗的经历而言,行业内的面试形式并没有因此发生根本变化,整体流程仍然遵循传统方式,并没有出现明显的更新迭代。
1.3.1.2 算法题准备
可以专攻Leetcode Hot100。
1.3.2 项目梳理
1.3.2.1 怎么梳理项目?
-
结构化表达 :按照 项目背景 → 业务目标 → 技术方案选型 → 个人职责 → 项目重难点 的逻辑提前整理。不要只讲做了什么,要讲清楚为什么这么做以及结果如何。
-
深挖技术细节:针对项目中的每个技术选型,提前想清楚:当时有哪些可选方案?各自的优缺点是什么?基于当时的业务场景,为什么最终选择了这个方案?比如:为什么用Redis而不用本地缓存?为什么用消息队列?选Kafka还是RocketMQ,依据是什么?
软件设计是一个权衡 (
Trade-off)的过程,没有绝对好或绝对差的技术,只有当下场景最适合的技术方案是什么。
-
量化成果 :尽量用数据说话。优化后接口耗时从多少降到多少?QPS提升了多少?减少了多少人力成本?能量化的一定要量化。
-
体现成长轨迹:准备"踩坑→排查→解决→沉淀"的例子。面试官很喜欢听解决问题的过程,能看出你的技术深度和解决问题的能力。
1.3.2.2 准备项目踩过的坑
-
只关注自己负责的部分,忽略整体架构。被问到上下游系统交互、数据一致性方案时答不上来。建议把项目涉及的整体调用链路、关键交互逻辑都梳理一遍。
-
没有考虑过兜底方案 。比如被问到系统功能的重试机制、幂等性如何保证等问题,才发现压根没考虑过兜底方案。建议提前复盘项目中的异常场景、降级方案、补偿机制,把这些隐形工作量挖出来。没有实现的话也没关系,正好可以当做"这个系统还有哪些优化空间"的答案。
Q:面试官最想从项目中看到什么?
-
真实性 :是不是真的深度参与,还是只写了行SQL、调了个API。追问细节就能看出来。
-
深度:遇到难点时,是停留在"百度一下解决了",还是真正理解了原理并做了技术权衡。
-
思考能力:如果重来一次,现在的方案有哪些可以优化的地方?技术选型有没有更好的选择?
1.3.3 开放性问题
- 为什么离职(必问)
虽然说离职无非就是 钱没给够 + 受委屈了,但是还是尽量不要吐槽前公司、前老板。可以从个人成长、赛道选择等角度讲。
- 你觉得自己最大的优势和不足是什么?
- 过去工作中遇到过最大的技术/业务困难是什么?怎么解决的?
- 平时怎么学习新技术?
- 和同事意见不合时怎么处理?
- 找工作比较看重什么?
- 了解我们公司是干什么的吗?
2. 面试中
2.1 自我介绍:如何在3分钟内建立技术人设
2.1.1 为什么要重视自我介绍?
自我介绍决定面试官对你的第一印象。如果磕磕巴巴、支支吾吾、逻辑混乱,面试官心里会直接给你贴上表达不行的标签,后面技术答得再好,印象分也打了折扣。
但反过来,自我介绍也不是简历复读机。千万别把工作经历从头到尾、事无巨细过一遍:"我第一家公司做了A系统,第二家公司做了B系统......"信息过多、没有重点、缺乏结构,只会让面试官觉得你表达混乱、逻辑不清,甚至怀疑你的沟通能力和思维方式。
2.1.2 自我介绍的核心原则
自我介绍的关键,是抓住亮点、突出核心价值,让面试官迅速了解你能为团队带来什么。
-
有逻辑:按"我是谁→我能做什么→我为啥适合这个岗位"的结构展开,不要东拉西扯。
-
有亮点:抓2-3个最能体现你技术深度或业务价值的点重点突出,其他一句话带过。
-
有自信:声音洪亮、语速适中、眼神交流。
2.1.3 自我介绍实战
最好针对不同类型的面试官准备不同的自我介绍,要思考面试官感兴趣的点是什么?
- 技术面试官:专业、工作经验、技术栈、业务背景;
- HR:学历、专业、过往工作经历。
技术面试官版本:
面试官您好,我是xxx,xx年毕业于xx大学的xx专业。目前从事Java已经有x年经验。技术栈主要是以Java相关技术栈
为主,框架方面熟悉Spring Cloud、Spring Boot、MyBatis等,并在项目中有实战经验;数据库方面熟悉MySQL、
Oracle;中间件方面熟悉Redis、RocketMQ,并对原理有一定研究。目前共有x段工作经历,涉及的业务主要有xx、xx
等。以上是我的技术栈的情况。业余时间会维护自己的个人博客,也会参与到一些开源项目(如果简历上放了自己的博
客链接、GitHub链接)。
HR面版本:
面试官您好,我是xxx,xx年毕业于xx大学的xx专业。目前从事Java已经有x年经验。技术栈主要是以Java相关技术栈
为主。共有x段工作经历,分别涉及到的行业是xxx、xxx。我在其中主要担任Java工程师,负责xxxx。业余时间会维护
自己的个人博客,也会参与到一些开源项目(如果简历上放了自己的博客链接、GitHub链接)。
2.2 技术问题回答思路
一般来说两个层面:项目经历、根据专业技能模块问知识点。
2.3.1 项目相关问题
面试中必问的一个问题:介绍一下最熟悉/最近的/xxx项目?
这里的一个误区就是:从项目的背景开始长篇大论,恨不得把所有细节都讲一遍。其实,这部分我们主要需要介绍的是:
-
项目的整体背景是什么。
-
你在其中担任什么角色是开发、项目负责人还是模块负责。
-
你主要负责了哪些事情。
当面试官针对你负责的内容进一步提问,比如能具体讲讲某个功能是怎么实现的吗 ,可以遵循这样一个回答思路:发现问题 → 定位并处理问题 → 验证问题是否解决。
diff
Q:看到你写了SQL优化,能说说你是怎么优化的吗?
- 问题是怎么被发现的?收到了慢查询报警。
- 如何定位、处理问题的?通过explain分析执行计划,发现没走索引。按需添加索引。
- 如何确认问题是否被解决?再次尝试执行相同sql,问题已被修复。
2.3.2 八股的回答思路
针对概念性的理解问题,可以遵循 "是什么-为什么-项目中怎么用"这个思路介绍。
markdown
Q:请你介绍下Spring框架的AOP机制?
- AOP:英文全称是Aspect Oriented Programming,面向切面编程。
- 编写代码过程中,遇到代码重复的问题,一般来说有两种方式:
- 抽象成公共类/抽象成公共方法,这种一般称之为纵向抽取;
- 而如果遇到一种情况是,重复代码依附在业务逻辑代码中,有逻辑顺序,这种情况就没办法抽取成公共方法/公共类来消除重复代码。此时可以利用AOP思想,**横向切割代码**,将重复代码抽取出来,形成一个独立模块。
- 项目中主要使用AOP来实现操作日志的记录。
2.3.3 反问问题问什么
面试是双向选择,反问环节是了解公司真实情况的最好机会,千万别不好意思,有什么关心的问题,大胆发问。
向技术面试官了解:
-
业务方向,入职后负责的项目大概情况
-
团队规模、初高级人员比例
-
工作职责、使用的技术栈
-
出差,加班情况
-
工作氛围、技术氛围
-
绩效考核方式
-
对候选人的期望,看重哪些特质
向HR面试官了解:
-
公司整体情况、企业文化
-
五险一金缴纳基数,比例
-
薪资结构,年终,其他福利待遇
-
调薪,晋升机制
-
试用期时长、转正通过率、薪资比例
-
发薪日、工作时间
-
加班费、调休制度
-
年假,事假,病假规定
2.3 面试实战心得
-
状态很重要:面试很挑个人状态,建议把时间约在上午或午休后,这时候精力最集中,大脑转得也快。
-
真诚大于套路:遇到不会的问题直接承认,这很正常,千万别强行回答或者编造。
-
掌控聊天节奏:面试过程中尽量避免冷场,保持自然的交流节奏,不要让话掉地上。
3. 面试后
一句话总结:及时复盘,查漏补缺,调整心态。
3.1 及时复盘
面完的第一时间,将面试问题记录下来,可以将每次面试的问题都汇总到一个在线文档,方便进行复盘,每次面试可以记录如下信息:
-
面试时间
-
面试公司
-
面试类型(技术一面 or 技术二面 or HR面)
-
面试问题
条件允许的情况下可以录音记录面试过程,方便复盘。
3.2 查漏补缺
面试不可能做到所有问题 100% 都能够答出来,因此面试结束并不是真的结束,我们需要将所有问题进行分析、总结。最好从一个问题发散,进行知识点层面的扩展延伸。
3.3 调整心态
首先要明确一点,面试失败是正常的,不能因为一次失败就心态崩溃。
面试前期准备不足失败更是常态,可以将准备面试的过程理解为对以往工作经历的一个总结,工作中侧重于"出活儿",很多时候忽略了对为什么这么做的思考。找工作这个过程是一个拓展知识体系深度、广度的好机会。舒适圈呆久了肯定对一些原理性的东西缺乏研究。这是正常的,重要是确保犯过的错误不会再犯。
面试后感觉良好也不要兴奋过了头,没有正式入职,一切都有变数,还是要投入到面试的准备过程中。
4. offer选择
经过前期的痛苦准备,终于到了收获果实的时刻,但这并不意味着可以完全放松。
面试是一个双向选择的过程,这就要求我们要珍惜每一次反问的机会,相信自己的第一感觉,判断是否真的和这家公司的价值观、岗位匹配。否则就是浪费时间、精力。我认为比较重要的几个点:
-
领导风格
-
业务稳定性
-
平台规模、晋升空间、发展空间
-
薪资福利
-
团队氛围
-
技术氛围
-
加班、出差强度
-
企业文化
总结
AI时代已经来临,码农这个职业的前途似乎有些黯淡,对未来的不确定性也让人感到焦虑。
在当前的大环境下,学历普通、能力普通的程序员,要找到一份合适的工作,周期可能会比较长。但不要气馁,机遇同样很重要。就我个人经历而言,失败的次数远比成功的次数多。量变引起质变,只要及时复盘、总结经验就好,不必纠结于具体没通过的原因。向前看,及时调整心态才是关键。我们能做的,就是做好准备------无论是知识上的储备,还是心理上的准备。
通过面试也让我意识到,自己在基础知识、算法能力、思考问题的深度等方面还有很多不足。因此在平时的工作中,要多问为什么,对自己所在的行业、所涉及的技术,做更深入的理解和思考。
很多时候,一切都靠命运的安排。我们能做的,就是在自己的能力范围内,尽可能地去努力。
这篇文章是基于自身经验做的一些分享,希望大家最终都能成为Offer收割机🎉~~