⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 三分恶 「老三」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

这篇文章原本的开头是写给金三银四的,转眼就“金九银十”了,每一年都是最差的一年,又是未来最好的一年,不知道大家今年的面试情况如何,希望这篇文章能对大家有所帮助。

1. 了解面试考点

就像我们大学考试之前,会尽量求老师划定考试的范围,面试也是一样,在面试准备之前要尽可能有效地了解意向公司和意向岗位的面试侧重点,和面试考点,在面试准备时做到有的放矢。

职位要求获取

那么我们可以通过哪些渠道获取这些信息呢?

  • 招聘网站:大多数公司在发布职位时会详细列出所需的技术技能、工作经验和个人素质等要求。我们可以从这些岗位的JD归纳出一些职位的要求,根据自己当前的现状,分析不同年限、不同岗位的要求。

  • 官方网站:我们也可以直接访问目标公司的招聘官网,官网的职位很多都是用人的团队直接发布,岗位的JD更加贴近团队的实际需求。

部分公司的官网招聘入口:

公司名称 官网招聘入口地址
阿里巴巴 https://job.alibaba.com/zhaopin/
腾讯 https://careers.tencent.com/
百度 https://talent.baidu.com/
字节跳动 https://www.bytedance.com/cn/jobs/
美团 https://hr.meituan.com/social/
小米 https://zhiwei.xiaomi.com/social
携程 https://campus.ctrip.com/external/ctrip/job/list
  • 面经分享:在岗位的JD里面,通常只会留下岗位的概要要求,具体面试考什么,可以阅读前辈们的面试经验分享。通过这些面经,可以了解他们是如何准备的,遇到过哪些问题,以及面试官常问的问题。

一些常用的面经获取网站:

网站名称 网址 特点
牛客网 https://www.nowcoder.com/ 面经内容最丰富,最完整,校招面经相对更多。
看准网 https://www.kanzhun.com/ 看面经模块提供了很多面经,社招面经居多。
知识星球 https://www.zhihuixingqiu.com/ 基本需要付费,一些大的知识星球,有一些不错的面经分享。

去年我准备面试的时候,当时整理了大量的面经,对我的帮助很大。

  • 算法题库:近些年,算法也成为面试的重要考点,尽管实际工作基本上用不上,但是为了面试还是要好好准备。

常见的算法题库网站:

网站名称 地址 特点
LeetCode https://leetcode.com 最大的算法题库,题目最完整。
LintCode https://www.lintcode.com/
牛客网 https://www.nowcoder.com/
CodeTop https://codetop.cc/home 提供企业算法合集

面试考点分析

对于大部分面试,一般考察四部分内容:

  • 技术知识:这部分主要考察候选人对后端技术的基础理解和掌握情况。
  • 项目经历:这一部分主要考察候选人的实战经验和在实际工作里解决问题的能力。
  • 算法编程:算法部分是为了测试候选人的逻辑思维能力和编程技巧(也许)。
  • 其他方面:这部分包含软技能的评估,比如沟通能力、团队协作能力、自我驱动力等等。

不同层级

不同的年限,不同的层级,对开发人员的要求也不一样,准备的侧重点也不一样。

Boss直聘某实习生岗位JD
Boss直聘某3-5年后端工程师岗位JD
Boss直聘某Java专家岗位

实习生:

  • 熟悉常用开源框架:如Spring Boot、Mybatis等,能够熟练地利用这些框架搭建基本的应用程序。
  • 了解中间件:例如Redis、RabbitMQ等,知道如何在项目中集成这些组件,并能理解它们的基本工作原理。
  • 基础扎实:深入理解Java语言的基础知识,如面向对象编程、集合框架、异常处理等。
  • 团队协作:虽然实践经验可能不多,但需要展现出良好的学习能力、团队合作精神以及解决问题的态度。

3-5年高级工程师:

  • 熟练掌握后端技术栈:不仅要熟悉常用的开发框架,还需要了解底层的工作机制,例如JVM原理、网络编程等。
  • 项目经验:有实际项目开发的经历,能够分享在项目中遇到的具体问题及其解决方案。
  • 问题解决能力:面对复杂问题时,能够分析问题产生的原因,并提出合理可行的解决方案。
  • 代码质量:编写高质量的代码,注重代码的可维护性和扩展性。

5-10年资深/专家工程师:

  • 领域专长:在某一特定领域有深入研究,例如高并发处理、分布式系统设计等。
  • 架构设计:具备设计大型系统的能力,能够从整体上规划系统的架构,考虑系统的可扩展性、可用性等问题。
  • 技术创新:持续关注行业动态和技术发展趋势,有能力引入新的技术和理念改进现有的系统。
  • 团队领导力:作为技术团队的核心成员,指导和培养初级工程师,带领团队解决技术难题。

不同公司

不同的公司,可能也有不同的面试倾向。

比如字节跳动特别看重基础和算法,准备字节的面试,计算机基础,算法之类的一定要着重准备,“接雨水”一定要接得明明白白。

比如阿里,比较看重项目和一些中间件的原理,在问项目的时候,经常要求对项目要有一些自己的思考,为什么、是什么、该怎么优化。

这一部分,可以从前人的面经中归纳整理。接下来我们看看,具体如何准备面试。

2. 复习技术知识

面试准备的第一部分就是技术知识,对于工程师,技术知识是基础,也是面试的重头戏。

技术知识考点

为了准备Java相关的技术面试,我们需要全面地掌握多个方面的知识,那技术知识会考哪些内容呢?根据我的总结,包括但不限于Java语言特性、常用框架、计算机基础、数据库、中间件、分布式微服务以及系统设计等。

Java语言特性

  • 核心语言特性和API:熟悉Java的核心特性,比如封装、继承、多态,以及集合框架、异常处理、反射、泛型、内部类等。
  • 并发编程:深入理解并发编程机制,包括线程池、锁、同步机制(synchronized关键字、ReentrantLock、Semaphore)、volatile关键字以及原子类等。
  • JVM:理解JVM的内部工作原理,如内存区域划分、垃圾回收机制、类加载机制等。

Java框架

  • Spring框架:掌握Spring的核心容器、AOP、事务管理、Spring MVC等,掌握一些核心功能如IOC、Bean生命周期的实现。
  • MyBatis:熟悉常用的ORM框架,掌握基本使用,和基本实现原理。

计算机基础

  • 操作系统:了解操作系统的基本概念,比如进程与线程的区别、内存管理、文件系统等。
  • 网络协议:熟悉TCP/IP模型,理解HTTP/HTTPS协议的工作原理,了解DNS解析过程等。
  • 数据结构与算法:熟练掌握各种数据结构(如链表、树、图)和算法(如排序、查找)。

数据库

  • MySQL:能够编写复杂的SQL查询语句,能够对SQL进行优化,深入理解索引和事务等核心概念,掌握不同存储引擎的特性。
  • NoSQL数据库:了解Redis等NoSQL数据库的特点和应用场景,以及一些实现原理。

中间件

  • 消息队列:理解Kafka、RabbitMQ等消息队列的作用及其实现机制。

分布式微服务

  • 微服务架构:理解微服务的基本理念,知道如何设计微服务架构。
  • 服务发现与注册:熟悉Eureka、Consul等服务发现工具的使用。
  • 负载均衡:了解Nginx/Zuul等工具的配置与使用。
  • API网关:掌握API网关的功能,比如路由转发、限流等。
  • 分布式配置中心:了解Spring Cloud Config的使用方法,知道如何进行分布式配置管理。

软件设计

  • 设计模式:掌握常见设计模式(如单例模式、工厂模式等),知道它们的适用场景。

系统设计

  • 方案设计:能够对一些常见的系统,比如电商、秒杀等等做出合理的系统设计。

……

技术知识学习

对于技术的知识的学习,不太推荐临阵磨枪,单纯靠死记硬背,一定要去理解它,真正地消化吸收,并尝试用自己的语言去输出。毕竟面试现场,如果只是机械地背诵,那么给面试官的体验一定不会太好,甚至整个场面都很尴尬。

要想充分理解,系统化的学习是必不可少的。建议大家选择一些高质量的书籍和教程来学习,这里,我也给大家推荐一些。

Java语言特性

  • 核心语言特性和API:推荐《Java核心技术》,这本书全面覆盖了Java的核心概念和技术,是深入学习Java语言特性的优秀教材。

  • 并发编程:《Java并发编程的艺术》、《Java并发编程实战》、《Java并发编程之美》以及《王者并发课》都是非常好的选择,它们分别从不同的角度讲解并发编程的理论与实践。

  • JVM:《深入理解Java虚拟机》是理解JVM工作原理的必备读物,有这一本就够了。

Java框架

  • Spring框架:《Spring实战》主讲Spring框架的使用,《Spring揭秘》主讲原理,比较老的一本书,但是主要的核心原理讲的很好,

  • MyBatis:作为一个ORM框架,MyBatis大致看一本书《Mybatis技术内幕》,基本就够了。

计算机基础

  • 操作系统:《操作系统导论》与《深入理解计算机系统》都是比较经典的书籍,博主小林的《图解操作系统》也不错,更适合面试突击。

  • 计算机网络:《计算机网络》、《图解TCP/IP》也都是很经典的图书,同样也推荐博主小林的《图解计算机网络》。

  • 数据结构与算法:《数据结构与算法分析》,经典书籍,有多种语言的版本。

数据库

  • MySQL:《高性能MySQL》、《MySQL技术内幕 InnoDB存储引擎》、《MySQL实战45讲》以及《MySQL是怎样运行的:从根儿上理解MySQL》等书籍,都值得一看。

  • Redis:《Redis开发与运维》、《Redis设计与实现》、以及《Redis5设计与源码分析》都是学习Redis的不错选择。

中间件

  • 消息队列:极客时间的《消息队列高手课》,整体上还不错。

分布式微服务

  • 分布式基础:《从Paxos到Zookeeper:分布式一致性原理与实践》可以帮助理解分布式系统中的关键概念。

  • 微服务:《SpringCloud微服务实战》、《SpringCloud Alibaba微服务实战与原理》以及《SpringCloud微服务和分布式系统实践》这些都可以看一看。

软件设计

  • 设计模式:《设计模式之禅》是一本深入浅出介绍设计模式的书,设计模式三本经典著作之一,Java语言写的Demo,对Javer很友好。

系统设计

  • 方案设计:《搞定系统设计:面试敲开大厂的门》适合准备面试的工程师,书中包含了大量实际案例和设计思路,广度还可以,深度一般。

  • 架构设计:《从零开始学架构》,一本架构入门书,可以学习一些常见的互联网架构手段。

整理自己的知识库

准备面试,还有个非常重要的点,就是整理自己的面试知识库,尽管有很多非常优秀的面试知识库,但归根到底,最合适自己的还是要自己去整理。

通过借鉴别人的面经,以及从自己的面经出发,根据问题,去寻找答案,利用种种途径——教程、博客,包括现在流行的大模型,去回答面试的问题,梳理自己的答案。

这样一来,不仅能深化你对知识点的理解,也能加强你的表达能力,而且知识库的内容也更加贴合你的技术经历和知识体系,这样面试的时候才能更加如鱼得水,信手拈来。

比如我自己的《面渣逆袭手册》,就是我给自己整理的面试知识库,经历了不断的迭代和完善,每一次面试、每一次的迭代,都能提高我的面试水平。

3. 准备编程题

在现在的面试里,编程题基本上成为不可或缺的一个环节,编程题以算法为主,那么编程题如何准备呢?

按照我的经验,可以将备战过程分为三个阶段:

  1. 系统刷题:建议投入至少六个月的时间,系统地刷题。这一阶段的重点在于理解并掌握常见的算法类型及其解题策略。推荐代码随想录的教程:https://programmercarl.com/。因为仅仅记忆解题步骤是不够的,更重要的是理解背后的逻辑。很多时候,面试官不仅关心你能否解答题目,还会询问你的解题思路及是否有更优的解决方案。所以,全面的基础还是非常有必要的。

  1. 刷高频题:接下来的三个月时间,应该专注于刷那些在面试中频繁出现的题目。毕竟从面试官的角度出发,他也不可能把所有的题都刷完,一般人的策略也是出自己熟悉的题目。LeetCode上的高频题库以及Codetop提供的高频题库都是不错的选择。对于这些高频题,至少需要刷两到三遍,推荐CodeTop,或者自己建知识库,记录自己的掌握程度,直到这些题目能够在没有任何提示的情况下手写出来。

  1. 冲刺刷题:在面试前的一个月内,应该集中精力刷那些已经进入面试环节的公司的题目。比如字节,什么接雨水、全排列之类要刷熟;比如美团,牛客的剑指Offer要多刷。这段时间的冲刺,是尽可能保证自己在面试高压的情况下,能迅速、准确地解答一些可能会出现的题目。

算法刷多少道才够呢?有人说300道,有人说100道……我觉得还是根据个人的情况来定,如果有条件,尽可能多刷。坦白说,我觉得算法在工作中基本上用不到——但是没办法,现在这个内卷的环境下,算法是个一键Pass的考点。而且相比较其他难以量化的东西,算法算是相对公平的评估方式了,卷了是一定能出结果的。

4. 准备项目

面试的第三个重要部分,就是你的项目经历了,问项目的目的,是想看到候选人落地实践的能力和解决问题的能力。

项目选择

准备项目的第一步,是选择项目,面试官的精力有限,一般一份简历上,放两个项目足够。不管你是应届生,还是老鸟,正确的项目选择,都能让你在面试里更好地展示自己。

  • 以我为主

    • 与我相关:选择的项目应该是你参与过的项目,最好是那些直接反映了你的专业领域或工作背景的项目。如果你在一家传统行业的公司,你的简历上出现一个秒杀项目,那就显得不合时宜。
  • 体现亮点:挑选那些具有一定挑战性和难度的项目,那些项目能体现出你的技术实力和个人优势。尽量不要选一些太简单太普通的项目。

  • 面向岗位:

    • 职位要求:根据目标职位的具体要求来挑选项目。如果面试一家电商公司,那肯定优先选择电商相关的项目,但是要确保对项目有深入的理解和准备,因为面试官也懂。
  • 行业趋势:关注行业内的最新发展和技术潮流,尝试挑选那些涵盖了前沿技术或顺应当前行业趋势的项目。比如现在大模型很流行,如果你做过相关的项目,就可以选中它。

项目整理

怎么整理项目呢?我觉得其实就像在公司里给老板做汇报,他对你的项目可能一无所知,你要通过你的汇报,让他理解这个项目,了解你再项目里做了什么,并让他认可你做的东西的价值。

建议大家可以对自己的项目建一个文档,或者你要想卷的话,也可以做个PPT。那么如何整理你做的项目呢?可以通过这几步:

  1. 明确项目背景:描述项目的背景、目的以及它所解决的问题。
  2. 描述你的角色:说明你在项目中的职责是什么,担任了什么样的角色,比如项目经理、核心开发者等。
  3. 技术栈选择:列出项目使用的主要技术栈,并解释为什么选择它们。比如为何选择Spring Boot而非其他框架,MySQL数据库的优势在哪里等。
  4. 面临的挑战与解决方案:详述项目过程中遇到的技术难题或其他障碍,以及你是如何解决这些问题的。例如,如何处理高并发下的事务一致性问题,或者如何优化支付系统的延迟。
  5. 项目成果:总结项目最终的成果,比如提高了多少交易处理速度,增加了哪些新的功能,用户体验有何改善等。
  6. 反思总结:分享从项目中学到的经验教训,项目里存在的问题,以及未来如何改进。

这里可以拿一个电商的支付系统来举例:

:::info项目背景

  • 支付系统是为电子商务网站提供安全高效的支付手段,简化购物流程,提高转化率。

你的角色

  • 在该项目中担任技术负责人,负责系统的设计与开发工作。

技术栈选择

  • 后端: 使用Spring Boot框架构建后端服务,因其提供了快速开发微服务所需的特性。
  • 数据库: 选择了MySQL作为关系型数据库管理系统,因为它支持高并发读写操作,并且具有较好的事务处理能力。
  • 消息队列: 引入了RocketMQ来处理异步任务,确保支付过程中的数据同步不会阻塞前端体验。
  • ……

面临的挑战与解决方案

  • 高并发下的幂等: 采用分布式锁机制,配合业务幂等键,保证业务幂等,防止重复支付。
  • 支付安全性: 为确保支付过程的安全,支付系统单独部署,满足PCI认证安全要求。
  • ……

项目成果

  • 系统上线后,支付成功率提升了20%,转化率提升了10%。

反思与学习

  • 在快速迭代中,有些设计的可扩展性不足,在后续的项目中,将会更加注重系统架构的可扩展性和易维护性,以便更好地应对未来的业务增长和技术迭代。

:::

项目常见问题

这里也给大家整理一些,关于项目的常问的问题。之前有一场面试,我问候选人,“你的项目的亮点是什么?”他说不知道怎么回答这个问题。项目整理做好了,这一部分基本对答如流。

  • 你们的项目是什么背景?
  • 你在项目里是什么角色?
  • 项目的亮点是什么?
  • 项目的难点是什么?
  • 你遇到的最大的困难?
  • 你觉得做的最好的点是什么?
  • 你觉得项目有哪些不足?如何改进?
  • 你们项目的核心指标(并发、日活……)?
  • ……

5. 提高软技能

在面试里,我们常常说,和面试官要有“面缘”,“面缘”是什么呢?其实就是和面试官气场相合,沟通流畅。“面试不是打打杀杀,也是人情世故”,在面试前提高软技能,特别是沟通能力,也是非常重要的,在基础的要求满足下,面试官肯定更倾向于和自己有“面缘”的。

那么看不见摸不着的软技能,该怎么提升呢?大概可以从这些方面去练习:

  1. 合作双赢心态:面试不仅是面试官评估候选人的过程,也是一个双向选择的机会。面试官和你都有自己的目标:面试官希望招到合适的人选,而你希望找到理想的工作。你和面试官不是对手,而是合作共赢的关系。如果你顺利通过面试,未来的面试官可能成为你的同事或上司;即使没有通过,也不必感到沮丧,毕竟你们只是彼此生命中的过客。持有这种双赢的心态,可以让你面试更加放松,表现得更好。
  2. 准备自我介绍:认真准备一段自我介绍,大约3至5分钟,概述你的工作经验、优势以及为何适合这份工作。这段介绍不仅展示了你的专业素养,还决定了面试官对你的初步印象。尽可能让你的自我介绍自然流畅,详略得当。可以反复练习,听着录音或者看着录像去调整。

eg:一段自我介绍的示例

面试官您好,我是XXX,很高兴有机会参加今天的面试!

我毕业于XX大学,之前在XX公司担任过支付系统开发工程师的角色,期间主要负责电商支付平台的核心模块开发工作,包括支付渠道的选择与路由、支付收银台界面设计以及支付风险控制系统的搭建。在此过程中,我积累了对接和维护支付宝、微信支付及银联支付等多种支付接口的经验,并对常见的支付逻辑和系统解决方案有了深入理解。

在技术栈方面,我对Java语言有较深的认识,掌握其核心特性和并发编程模型,并具备JVM调优的实际经验。此外,我也熟练使用Spring、SpringBoot和MyBatis等主流框架,能够快速搭建稳定的服务端应用。数据库方面,我熟悉MySQL数据库的设计与优化;而对于分布式系统中的数据缓存和消息队列,我也有一定的实战经验,尤其是RocketMQ和Redis的应用。

我对当前的技术趋势保持着高度的关注,并积极学习最新的技术动态。近期,我对大模型的研究产生了浓厚的兴趣,并尝试将其应用于实际项目中,以提升系统的智能化水平。

在团队协作上,我认为沟通至关重要。曾负责多个跨部门项目的推进,深知团队内部及跨团队有效沟通的重要性。通过良好的沟通机制,不仅能够确保项目顺利进行,还能促进团队成员间的相互理解和信任。

面对技术挑战时,我喜欢从不同的角度审视问题,并寻找最优解。例如,在应对支付高峰期带来的系统压力时,我引入了异步处理机制,成功缓解了服务器负载,保证了支付流程的顺畅。

我非常希望能够加入贵公司,因为贵公司在支付领域的深厚积淀和技术实力给我留下了深刻的印象,我相信在这里可以更好地发挥我的专业技能,并与团队共同成长。

这就是我的自我介绍,谢谢!

  1. 保持友好态度:无论面对什么态度的面试官,始终保持友好之上的态度。人们的态度可以分为五个层次:从最差的恶毒到最好的热情,依次是冷淡、礼貌、友好。尽量保持比面试官略好的态度,这样的态度恰到好处。友好的态度除了语言,也要通过眼神、表情、姿态来传递。

  1. 练习回答技巧:面试中的问答环节应当是有效而且是目的导向的。为了使回答有条理、简洁明了,可以借鉴麦肯锡思考工具里的“5W1H”框架,Who(何人)、What(何事)、When(何时)、Where(何地)、Why(何因)和How(何法)。这样既能保持沟通表达的完整,也能避免太臃肿。
  2. 倾听和反馈:面试不仅仅是表达自己,也要注意聆听面试官的问题和他们的需求。展现你是一个好的倾听者,通过适时的点头或简短回应来表示你在听。此外,针对对方的观点给出适当的反馈,表明你理解并尊重他们的意见。必要的时候,也要对对方提出疑问,有来有回。另外,一个小技巧,在面试的最后,要表达你对这场面试的认可,你从这场面试里学到了一些东西。
  3. 持续改进:保持开放的心态,持续学习,面试过程可以录音或者录屏,面试之后要及时地去复盘,分析哪些对方做的好,哪些地方还需要改进,这样每次面试之后,你都会越来越游刃有余。

6. 准备简历

简历是一个求职者的门面,很多时候决定了候选人能不能得到一个面试机会。

简历样式

撰写简历,要做到内容精简,并且突出亮点。校招简历建议控制在2页以内,社招简历建议控制在3页以内。当然,如果内容是必要而且丰富的,也没有必要非要强行压缩。

简历的样式,不用刻意追求特别繁杂的设计,结构清晰,易于阅读即可。随手搜的一些简历模板:

如果有条件,可以制作一份在线的简历,能给你大大增分。

注意:一定要使用 PDF 格式投递,不要使用 Word 或者其他格式投递,不然格式可能会错乱!

简历内容

个人信息⭐⭐⭐

  • 基本信息 :姓名、电话、籍贯、联系方式、邮箱地址。要保证准确!!之前有朋友投了一个月,一个面试都没有,后来发现电话写错了。
  • 加分项(有亮点则写) : Github 地址、博客地址

求职意向⭐

应聘岗位,期望工作地点。

教育经历⭐⭐

要简洁明了地列出学历、专业、毕业院校及时间。

例如:

  • 皇家理工大学,硕士,软件工程,2019.09 - 2022.01
  • 汉东大学,学士,应用化学,2015.09 - 2019.06

专业技能⭐⭐

结合自己会什么,以及目标公司会什么,筛选关键词,列出一份和岗位相关的专业技能。同时也要注意了解、掌握、熟悉、精通程度的描述,尽量客观。

例如:

  1. Java语言

    • 熟练掌握Java语言基础及面向对象编程思想;
    • 熟悉Java常见集合框架,能够高效地使用List、Map、Set等数据结构;
    • 熟悉Java并发编程,了解线程安全、锁机制及并发工具类的使用;
    • 理解JVM原理,包括内存模型、垃圾回收机制等,并能据此优化程序性能;
  2. 框架

    • 熟悉Spring框架的核心功能模块,包括依赖注入(DI)和面向切面编程(AOP);
    • 掌握Spring MVC框架,熟练进行Web应用开发;
    • 熟练使用Spring Boot全家桶进行快速服务搭建,包括配置文件管理、自动装配等功能;
    • 熟悉MyBatis等ORM框架,具备数据库操作的经验;
    • 了解微服务架构模式,熟悉Spring Cloud、Spring Cloud Alibaba、Dubbo等微服务治理框架;
  3. 数据库

    • 熟悉MySQL数据库管理系统,具有SQL查询优化的能力;
    • 了解NoSQL数据库如Elasticsearch的基本特性和应用场景;
  4. 中间件

    • 熟悉Redis缓存中间件,能够利用其特性进行数据持久化、高并发场景下的性能优化;
    • 熟悉RocketMQ消息队列,掌握基于消息驱动的应用设计与实现;
  5. 计算机基础

    • 熟悉计算机网络基本原理,包括TCP/IP协议栈、HTTP/HTTPS协议等;
    • 掌握常用的数据结构与算法,能够在实际开发中灵活运用;
    • 了解操作系统底层原理,熟悉Linux环境下基本命令行操作及脚本编写;
  6. 设计

    • 能够独立完成复杂系统的架构设计,具备良好的抽象思维能力和模块化设计思想;
    • 熟悉常用的设计模式,如单例模式、工厂模式、观察者模式等,并能在项目中合理应用;
  7. 业务

    • 能够从全局视角出发,结合业务特点进行技术选型和技术方案规划。

大家可以以适当地精简,一个简历专业技能写法的技巧,是引导式写法,也就是面向面试问题的写法,比如:熟悉TCP三次握手,引导面试官去问自己会的问题,大家适当参考。

实习经历/工作经历⭐⭐⭐

工作经历针对社招,实习经历针对校招。

工作经历建议采用时间倒序的方式来介绍。实习经历和工作经历都需要简单突出介绍自己在职期间主要做了什么,结果是什么。

示例:

XXX 公司 (201X 年 X 月 ~ 201X 年 X 月 )

  • 职位:Java 后端开发工程师
  • 工作内容:主要负责 XXX,完成了XXX,提升了XXX

项目经历⭐⭐⭐

项目经历是社招的重点,内容要做到清晰有亮点,让面试官对你的项目有东西,你有东西可答。写项目经历有这么几个建议:

  • 精选项目:通常情况下,保留一到两个你最熟悉或与应聘职位最契合的项目。过多的项目可能会让面试官难以抓住重点,太少又没法充分展现你自己。
  • 内容负责:简历写的每一项,你都要很熟悉,对细节非常清晰,经得起面试官的追问。
  • 表述清晰:项目职责可以采用STAR法则(情境、任务、行动、结果),比如:为了解决掉单问题,引入消息队列+定时任务,实现主动轮询,掉单率降低到0.01%以下。
  • 简介精炼:项目背景介绍控制在两句话以内,保证简洁的同时,也能高度概要项目。
  • 技术栈精简:直接罗列用到的技术名词就好,不用再作额外的解释。
  • 少谈业务多说技术:尽量把重点放在技术实现和解决问题上,而不是业务本身,体现你用技术解决业务问题的能力。
  • 展现软实力:可以提一下你是怎么协调团队合作的,或者是如何克服困难的,这些都能很好地反映你的综合素养。

例如:

2019-05 ~ 2023-06 淘X 高级 Java 后端开发工程师

  • 项目描述:负责淘x电商平台的核心交易系统,支持大规模用户访问和高频交易处理。

  • 技术栈:Spring Boot + MySQL + Redis + Mybatis + Spring Security + Oauth2

  • 工作内容/个人职责:

    • 为应对大量用户数据和高频交易的需求,确保数据同步的实时性和准确性,整合了 Canal 和 RocketMQ,实现了 MySQL 增量数据(如商品、订单数据)的实时同步至 Elasticsearch,成功实现了数据的实时同步,提高了数据处理效率和一致性;
    • 针对扣费模块因线程池配置不当导致的死锁问题,通过分析线程堆栈和日志,发现扣费父任务和反作弊子任务使用同一个线程池导致了死锁现象,重新设计了线程池策略,分离了关键任务,解决了死锁问题,提升了系统的稳定性和响应速度;
    • 为解决用户统计模块响应时间较长的问题,使用 CompletableFuture 并行加载后台用户统计模块的数据信息,优化了数据加载流程,平均响应时间从 3.5 秒降低到 1 秒,显著提升了用户体验;
    • 针对订单表数据量过大的问题,使用 Sharding-JDBC 将订单表按用户 ID 后四位分库分表,共 3 个库,每个库 2 个订单表,并自定义雪花算法生成订单 ID,将分片键作为订单 ID 的一部分,单表数据量保持在 500 万以下,提高了查询性能;
    • 为了优化热门数据查询速度较慢的问题,采用了 Redis+Caffeine 两级缓存机制,解决了缓存击穿和穿透问题,查询速度达到毫秒级,QPS 达到 30 万以上;
    • 为了解决购物车查询模块响应耗时较长的问题,采用 CompletableFuture 优化购物车查询模块,对获取用户信息、商品详情、优惠券信息等异步 RPC 调用进行编排,响应时间从 2 秒降低到 0.2 秒;

个人评价⭐

个人评价非必需,但是写的时候要注意,一定要用简洁的语言来突出自己的特点和优势,而且切记不要太空洞和宽泛,要和专业能力有关,而且要有事实佐证。

关于个人评价,可以从这几方面入手:

  • 专业技能:如文档编写、学习能力、沟通与团队协作等。
  • 工作态度:包括责任感和对工作的投入程度。
  • 抗压能力:面对挑战时的态度与方法。
  • 技术追求:对技术进步的热情及对高质量代码的坚持。
  • 实践经验:特别是分布式系统或高并发场景下的开发经验。

例如:

良好的解决问题能力:面对技术难题,能够快速定位问题根源,并提出有效的解决方案。曾在项目中成功解决数据库性能瓶颈问题,提升了系统响应速度30%以上。

两个法则

简历的编写,可以借助两种非常实用的法则来提升简历的质量:STAR 法则和 FAB 法则。

STAR 法则(Situation Task Action Result)

STAR 法则是简历撰写和面试沟通中常用的技巧,STAR 法则:

  • Situation情景: 事情发生的具体背景?
  • Task 任务:你的职责和目标是什么?
  • Action行动:你采取了哪些具体措施?
  • Result结果:最终的结果和影响是什么?

FAB 法则(Feature Advantage Benefit)

FAB 法则通常用于销售领域,但在简历中也可以拿来借鉴, FAB法则:

  • Feature特征: 你的独特技能和特点。
  • Advantage优势: 你别别人好在哪里。
  • Benefit \益处**:** 如果你被录用,公司会获得哪些收益。

定制化

这里格外强调一点,很多时候,我们是没法“一份简历包打天下”的,在投递简历的时候,尽可能做到面向JD写简历,针对不同的岗位,对简历进行定制,以便更好地匹配这个职位。

针对对应的JD,可以按照这么几个思路来定制自己的简历:

  • 研究JD: 仔细阅读JD,识别关键词、技能要求、经验和软技能等方面的要求。
  • 匹配技能: 在简历中突出与JD中提到的关键技能和经验,确保使用相同的术语,因为很多筛选的HR都不懂技术。
  • 量化成果: 用具体数据来展示你在过往工作中取得的成绩,尤其是那些与JD中列出的指标相似的部分。
  • 强调相关经验: 突出那些与应聘职位最相关的工作经历和项目经历,比如,ToC的岗位,要强调自己ToC的经验,ToB的岗位强调自己ToB的经验。
  • 关键词优化: 确保简历中包含了JD中的关键词,有时候系统会做自动的筛选。

以这个字节的后端开发工程师岗位为例,我们面向JD来定制简历:

  • 技术背景:

    • 在教育背景部分,确保提到你的本科学历——我自己之前面美团,学历被系统识别成了专科。
    • 在专业技能部分,列出自己熟悉的的编程语言,强调自己的计算机基础能力。
  • 系统设计能力:

    • 强调你在设计系统方面的经验,特别是在大型、高并发环境下的设计能力。例如:“设计并实现了多个高并发、分布式系统,有效解决了大规模用户访问带来的挑战。”
  • 数据库、缓存和消息队列:

    • 描述你如何使用这些技术解决实际问题。例如:“利用MySQL数据库和Redis缓存系统,设计了高效的数据存储和访问方案,大幅提高了系统性能。”
  • 责任心与团队协作:

    • 在自我评价或工作经历部分体现你的责任心和团队合作精神。例如:“在项目中担任核心角色,积极主动解决问题,与团队成员密切合作,确保项目成功上线。”
  • 高可用系统经验:

    • 如果你有服务治理、稳定性提升或容量规划的经验,一定在简历中突出这一点。例如:“负责了多个系统的稳定性建设,通过优化报警、监控、容灾和降级策略,提高了系统的可用性和健壮性。”
  • 行业经验:

    • 如果你有电商、金融或支付行业的经验,这是一个比较大的加分项。例如:“曾在某电商平台担任核心开发人员,参与了支付模块的研发工作,积累了丰富的行业经验。”

示例简历片段:

教育背景

  • XX大学 计算机科学与技术 本科

专业技能

  • 熟悉Java语言,具备扎实的编程基础,对C++和Python有一定了解。
  • 深刻理解计算机原理,包括操作系统、网络、数据结构和算法等。

工作经验

  • 在ABC公司担任高级软件工程师,负责高并发系统的设计与开发,使用MySQL、Redis、RabbitMQ等技术栈。
  • 主导了系统稳定性建设,优化了报警系统和容灾方案,确保了支付系统在春节、双十一等高峰期的平稳运行。

项目经历

  • 参与了XYZ银行的核心支付系统的研发,实现了系统的可扩展性和可维护性,推动了平台型系统建设。
  • 在项目中担任技术负责人,带领团队完成了系统设计和开发工作,提升了团队的技术水平。

自我评价

  • 具有强烈的责任心,对待产品充满热情,注重细节,善于沟通协调,能够在高压环境中保持冷静,与团队成员紧密协作解决问题。

7. 简历投递

写好了简历之后,接下来就是投递简历,选择正确的渠道和正确的策略非常重要,决定了会不会有面试的机会。

投递渠道

简历投递的渠道有很多,给大家聊聊我常用的渠道。

投递策略

对于简历的投递策略,用个不恰当的比喻,既要当“渣男”,也要当“舔狗”,意思是既要广泛撒网,又要重点跟进。

  • 广泛撒网:利用上述投递渠道多投简历,甚至是海投,争取更多的面试机会,不要“为了一株树苗,而放弃整片森林”。同时如果有更合适的机会,也要善于放弃,不要死磕。
  • 重点跟进:对于感兴趣、或者把握比较大的公司或者岗位,一定要重点跟进,研究岗位要求,定制简历,投递也要尽可能去找内推。对于社招,一般一家公司同时只能推进一个岗位,所以一个公司内,一定要先去推进高优的,高优的流程终止之后,再去尝试其它岗位。

持续跟进

在简历的投递过程中,一定要保持积极主动的习惯。当你提交了简历或者初步联系了招聘方后,如果一段时间内没有得到回复,一定要主动去跟进。

建议采取三五法则,初次联系后的三到五天进行一次跟进,可以通过邮件、信息的方式来咨询对方。

例如Boss直聘上,对方已读不回,这是一个示例话术:

您好!我是xxx,几天前我向您表达了加入贵司担任[职位名称]的兴趣。看到您已经查阅了我的资料,但至今尚未收到回复。我对这个职位非常感兴趣,而且我国网的经历和这个岗位也比较匹配,相信我的经验和技能能够为贵司带来价值。

请问是否需要我提供更多相关信息?或者能否告知我申请的进展情况?期待能有加入贵司的机会,希望尽快得到您的反馈。

作为工程师,可能很多人都有点社恐,对方不回复,或者不联系,就不太好意思继续问,要克服这种情绪,多问几句,最差不过是像现在这样已读不回。再好一点是对方回复为什么觉得你不合适这个岗位,可以尝试挽回,或者根据对方的反馈继续优化自己的简历。最好就是对方被打动,初筛通过。那为什么不主动跟进一下呢?

8. 模拟面试

在现在这个环境下,每一个面试的机会都是宝贵的,为了尽可能提高正式面试的通过率,建议在正式面试前,进行一些模拟面试,找到面试的感觉。

  • 找人模拟面试:

    • 尽可能找到行业内的朋友或者同事作为模拟面试官。这些人最好是对你面的职位有所了解的人,这样他们的提问和反馈才会更有针对性。
    • 如果你认识已经在目标公司工作的人,那么他们可能会提供更接近实际情况的模拟面试体验。
    • 尝试寻找不同背景的人来进行模拟面试,这样可以帮助你适应各种不同的面试风格。
  • 利用在线资源:

    • 如果找不到合适的人选,可以考虑参加线上模拟面试服务。一些平台,提供了一些模拟面试服务,或者互相模拟面试的服务。
  • 通过备选职位练习:

    • 如果真的很难找到合适的模拟面试对象,通过一些不是特别感兴趣的公司和职位的面试来练习,也是一个办法。
  • 自我模拟练习:

    • 在家里对着镜子练习,注意自己的肢体语言和表情管理。
    • 录制自己的回答,事后观看并反思哪些地方可以改进。
    • 准备一些常见的面试问题,并尝试给出清晰、简洁的答案。
  • 反馈和改进:

    • 在每次模拟面试结束后,都要收集来自模拟面试官的反馈,并据此调整自己的策略。
    • 重点注意那些你觉得表现不佳的问题,并且准备更加充分的答案。

9. 正式面试

磨好了枪,就该上阵了,经历了层层筛选,恭喜你,终于进入了面试的环节。

面试流程

一般大厂的面试分为四轮,三轮技术面+一轮HR面。

  • 一面:技术面,一般是专家工程师或者高级工程师跟进,侧重考察候选人的专业技能和基础技术知识。
  • 二面:主管面,一般是由直属负责人跟进,侧重考察候选人在具体项目上的实践经验。
  • 三面:更高领导面,一般是更高一级负责人跟进,侧重考察候选人的综合素质。
  • HR面:HRBP跟进,侧重评估候选人是否适合企业文化,以及薪资福利方面的讨论。

面试建议

“夫战,常决于未战之时”,充分准备之后,到了正式面试,就是要保证临阵发挥:

  • 精力管理:面试不要安排地太密集,确保自己有足够的休息时间和精力来应对面试的每一个环节,良好的身体状态,是面试发挥好的关键。
  • 时间管理:如果你当前仍在职,需要特别注意面试的时间安排,以免与工作时间冲突。面试不要迟到,要变更时间,一定要提前一天以上通知。
  • 了解公司和职位:在面试之前,花时间了解目标公司的文化、产品、服务,在面试过程中,要体现出你对公司的了解。
  • 调整心态:面试时保持冷静、自信的态度。不要过分紧张,保持平常心,把面试视为一个双向选择的机会,面得好或坏,心态都不要波动,面好了不一定能过,面得不好也不是就没有机会。

10. 保持积极心态

我是个心态不太稳定的人,所以知道,保持积极心态,是一件多么重要的事情,不止是面试,还有工作和生活。

有一句话是这么说的:“在果上随缘,在因上努力”,在面试上,我们要做的就是好好准备,至于结果,很多时候我们也难以左右。

面试只是打开你下一份工作的大门,不是决定你人生命运的大门。换个地方打工而已,放轻松!

最后,祝各位阿Sir在面试里一番风顺!

参考:

  1. 《软技能:代码之外的生存指南》
  2. 《软技能:软件开发者职业生涯指南》
  3. https://juejin.cn/post/7289239226024804409?searchId=202409081830424969ED8DE9BEA6C1D6A2
文章目录
  1. 1. 1. 了解面试考点
    1. 1.1. 职位要求获取
    2. 1.2. 面试考点分析
      1. 1.2.1. 不同层级
      2. 1.2.2. 不同公司
  2. 2. 2. 复习技术知识
    1. 2.1. 技术知识考点
    2. 2.2. 技术知识学习
      1. 2.2.1. Java语言特性
      2. 2.2.2. Java框架
      3. 2.2.3. 计算机基础
      4. 2.2.4. 数据库
      5. 2.2.5. 中间件
      6. 2.2.6. 分布式微服务
      7. 2.2.7. 软件设计
      8. 2.2.8. 系统设计
    3. 2.3. 整理自己的知识库
  3. 3. 3. 准备编程题
  4. 4. 4. 准备项目
    1. 4.1. 项目选择
    2. 4.2. 项目整理
    3. 4.3. 项目常见问题
  5. 5. 5. 提高软技能
  6. 6. 6. 准备简历
    1. 6.1. 简历样式
    2. 6.2. 简历内容
      1. 6.2.0.1. 个人信息⭐⭐⭐
      2. 6.2.0.2. 求职意向⭐
      3. 6.2.0.3. 教育经历⭐⭐
      4. 6.2.0.4. 专业技能⭐⭐
      5. 6.2.0.5. 实习经历/工作经历⭐⭐⭐
      6. 6.2.0.6. 项目经历⭐⭐⭐
      7. 6.2.0.7. 个人评价⭐
  7. 6.3. 两个法则
    1. 6.3.1. STAR 法则(Situation Task Action Result)
    2. 6.3.2. FAB 法则(Feature Advantage Benefit)
  8. 6.4. 定制化
  • 7. 7. 简历投递
    1. 7.1. 投递渠道
    2. 7.2. 投递策略
    3. 7.3. 持续跟进
  • 8. 8. 模拟面试
  • 9. 9. 正式面试
    1. 9.1. 面试流程
    2. 9.2. 面试建议
  • 10. 10. 保持积极心态