前言

在2024年,从清明节到劳动节期间,我在多家互联网公司进行了一系列的面试,几乎是连续三周的高强度面试,有时一天就面试两次,确实非常疲惫。不过,经过努力,我成功通过了阿里、字节、蚂蚁、小红书等公司的面试。这一年,互联网行业的就业环境有所回暖,一些大厂也开始恢复招聘名额。希望我的经历能够为那些有意跳槽的朋友提供一些宝贵的经验。

我的基本情况

我是2020年本科应届毕业生,之后在某大厂工作了接近四年,主要从事后端研发工作,熟悉的技术栈主要与Java相关。

面试前准备

我大约在2023年10月开始准备面试,虽然进展缓慢,但我还是坚持利用周六的时间来刷题、复习面试常见问题。为了提高效率,在清明节前后,我制定了一些细致的计划。

规划目标

目标明确是成功的第一步,我将准备工作分为几个主要类别并按照优先级排序:

  • 简历完善:包括个人介绍和简历项目的深入挖掘;
  • 项目准备:重新回顾项目经历并进行问答演练;
  • 算法准备:刷LeetCode的Hot200,分类整理题型,确保每类选择经典案例并做好笔记;
  • 八股文准备:涉及项目的技术知识及扩展知识的准备;
  • 口才练习:通过与ChatGPT对练来提升表达能力,特别是语音表达。

项目联动与高效准备

  • 充分准备简历中涉及的八股文和算法;
  • 在讲解八股文时,结合具体项目场景,增加说服力;
  • 讨论场景题或解决方案时,展现出优秀的技术思维,增加分数。

大多数面试官不会单独问技术问题,甚至算法题也是针对性的。在准备项目时,如果某种技术在项目中的核心链路上占比较大,就要多做准备。比如在字节的面试中,我们讨论了Redis Geo,后来又聊到跳表,最终写了一道与二分法相关的算法题。八股文的提问通常也是围绕着项目中使用的技术栈进行的,例如由于我的项目中使用MySQL的经历较少,所以相关问题自然也少。

在回答八股文时,最好结合项目内容。例如,当被问及Kafka如何实现高吞吐时,我会进一步说明我们项目中为何选择Kafka,是因为对吞吐量的高要求,并详细阐述如何在技术设计中考虑这一点。

例如,要利用Redis的快速特性来设计一个高QPS接口,面试官可能会询问如何结合Redis进行场景设计。重要的是,这并不是让你直接使用Redis,而是运用Redis的设计思想来解决问题。

总结与思考胜于死记硬背

  • 优秀的技术设计具有通用性,例如高性能的通信、存储和复杂度等方面;
  • 以背景痛点为出发点看待问题,理解一项技术的产生原因,有助于深入理解;
  • 多看一些经典场景题,学会举一反三非常重要。

对架构设计的理解

  • 理解架构设计原则,例如在提升系统复杂度方面的权衡;
  • 如何保证架构设计的合理性,防止代码腐化。

架构设计是一个主观的领域,掌握一些个人见解会是加分项,例如可以讨论领域驱动设计(DDD)中的设计方案,以及其适用场景和带来的好处。

业务和技术的匹配度

在面试时,业务匹配度和技术匹配度是两个重要的考量点:

  • 业务匹配度:如果你的工作经历与目标公司的业务领域相同,比如你从事的是营销,而目标公司也是在该领域,那么在面试中你的领域深度会受到重视,此时你需要提供独到的见解和解决方案,若能与对方的痛点相符,录用的可能性会增加。
  • 技术匹配度:了解目标公司的技术能力,并准备好相关技术方案,以便在面试中展示你在项目中解决类似技术问题的能力。

方法论的运用

  • STAR法则:在分享项目经历时,可以将其拆分为情境(Situation)、任务(Task)、行动(Action)和结果(Result)四个部分进行表述。
  • SWOT分析:在讨论业务方向时,可以提到自身的优势、劣势、机会和威胁,展现出你如何帮助公司建立优势和解决劣势。

面试经验分享

在大多数面试中,项目部分通常占据超过50%的时间,加之10%的编程时间,八股文的提问相对较少。

常见八股文问题

阿里

  • Kafka如何保证高吞吐量?如何确保消息不丢失?
  • 设计中存在两条链路,如何保证幂等性?
  • Redis节点之间是如何通信的?
  • MySQL隔离级别及遇到的相关问题与解决方案?
  • Redis的快速特性及CAP理论的理解?

字节

  • 什么是粘包和拆包?如何解决?
  • 数据加密的方法?
  • 设计延迟消息的解决方案?
  • 如何处理1000W QPS的接口?

蚂蚁

  • Redis节点通信的Gossip原理?
  • Kafka如何保证消息有序?
  • 分库分表的原则及关键点?
  • CAS原理及其应用场景?

小红书

  • ConcurrentHashMap的原理?
  • Redis集群节点通信方式?
  • Kafka持久化的实现?
  • 如何实现分布式ID?

常见算法题

总体来说,算法题难度较低,希望大家在面试中也能遇到简单的题目:

  • 不包含重复字符的最长子串长度;
  • 将命令行操作转化为代码;
  • 判断单链表是否存在环;
  • 最小栈的实现;
  • 查找有序二叉树中与目标值最接近的节点。

其他问题

  • 领域驱动设计的细节及实际应用?
  • 如何在团队间推动目标的实现?

总结

在面试过程中,项目内容是最为重要的部分,如何简洁明了地向面试官阐述你的项目经历也非常考验表达能力。很多情况下,面试的时间大部分用于讨论项目,因此充分准备这一内容将帮助你在面试中占据主动,有助于顺利通过。