今天我想分享一位在大厂工作了四年的程序员在2024年获得阿里、字节、蚂蚁和小红书等公司offer的面试经历。这位大佬凭借卓越的技术实力,在众多竞争者中脱颖而出,并最终选择了其中一家,具体公司名不便透露,但总薪资接近100万,令人振奋!

)图片

职业生涯概述

从清明节到劳动节,2024年我进行了一系列互联网公司的面试,几乎是一气呵成,连续在职面试了三个星期,甚至有时候一天面试两次,实属辛苦。不过,我成功通过了阿里、字节、蚂蚁和小红书的面试。2024年互联网行业渐有好转,一些大厂开始解锁招聘名额。希望我的分享能够为有意跳槽的朋友们提供一些帮助与启示。

我的基本情况是:2020年本科毕业,之后在某大型互联网公司工作了近四年,主要从事后端研发,技术栈以Java为主。

面试准备过程

我的准备工作始于2023年10月,但由于进展缓慢,主要依靠周末刷题和复习一些面试资料,然而这种方法容易遗忘且难以持续。于是,在清明前后,我给自己制定了更系统的计划。

制定详细计划

在做任何事情之前,设定目标并将其分解为可执行的小任务是非常重要的。

根据自己的实际情况,我将准备工作分为几个大类,并按优先级排序:

  • 完善简历:重点包括个人介绍(面试开场白)和简历中项目的深入探讨;
  • 项目准备:重新审视并演练项目中的Q&A;
  • 算法准备:刷LeetCode上的热门200道题,将题型进行分类,并为每类选择一个经典案例进行笔记;
  • 八股文准备:涉及项目的技术知识及扩展知识的准备;
  • 口才练习:提升表达的流畅性,我使用ChatGPT进行项目和知识点的对练,特别注意语音表达。

项目与八股文、算法的高效联动准备

  • 针对简历中涉及的八股文和算法进行充分准备;
  • 在讲解八股文时结合项目场景,增强说服力;
  • 在讲解场景题或解决方案时,展现优秀的技术思维,给面试官留下深刻印象。

大部分面试官不会直接从简历进入技术问题,算法题往往也是有针对性的,因此在准备项目时,如果核心链路对某种技术依赖显著,就需集中精力准备相关内容。例如在字节的面试中,谈到Redis Geo时,后面又引出了跳表,最终给我出了一道与二分法相关的算法题。八股文的提问也常与项目中使用的技术栈紧密相关,因而我在项目中很少使用MySQL,所以相关问题也少。

在解答八股文时,建议结合项目内容,比如当被问到Kafka如何实现高吞吐量时,我会在结尾提及我们项目为何需要使用Kafka,以满足高吞吐的需求和如何利用这一点进行技术设计。

利用优秀的技术设计思想解决问题,例如,面试官可能问你如何设计一个高QPS的接口,此时可以结合Redis的设计理念,构建场景设计思路。这里不展开细说,但我并不是建议直接使用Redis,而是利用Redis的思维方式完成场景设计。分布式思维在很多场合也能发挥作用。

总结与思考胜过死记硬背

  • 优秀的技术设计具有普遍适用性,比如高性能:通信、存储和复杂度,经典的时间换空间、空间换时间等原则;
  • 从背景和痛点出发分析问题非常重要,了解技术的产生背景有助于更深入的理解;
  • 学会举一反三,阅读经典场景题也是提升能力的关键。

了解一些架构设计的原则

  • 架构设计的原则应考虑是否提升了系统的复杂性?是否值得?
  • 保证架构设计的合理性,避免技术腐化。

关于架构设计,各有千秋。无论是领域驱动设计(DDD)还是其他方法,能有个人见解是最理想的,面试中可以与面试官讨论设计的长期合理性及如何避免代码腐化。

业务与技术匹配度

从业务匹配度和技术匹配度两方面进行分析:

  • 业务匹配度:如果你所从事的业务与目标公司的领域相似,比如你在营销领域工作,而面试的也是同一领域,那么需要在业务深度上有独到见解,并能提出解决方案,这将大大提高被录用的机会。如果对面试的业务不熟悉,则需在领域广度上有所准备,否则面试官可能会认为你在“自我设限”。

    • 在面试小红书时,由于对其业务了解不深,我在咨询面试官成长建议时,他反馈我“不要自我设限”;
    • 在蚂蚁面试中,我表明我不会自我设限,愿意探索多个领域。他随即问起广告投放和AI算法,尽管我的回答并不完美,但提前准备过的内容已经足够应对;
    • 特别是在高管面试时,他们会非常关注你的业务敏感性及前瞻性思维。
  • 技术匹配度:可以提前了解目标公司可能使用的技术栈,寻找自己项目中相似的技术实现。在我的案例中,涉及Kafka对数据流的多次处理、数据清洗和算法处理,正好与面试公司的某项业务场景相似,面试官对此饶有兴趣,我们还深入探讨了一些经验与教训。

面试方法论

  • STAR法则:Situation(情境)、Task(任务)、Action(行动)和Result(结果)四个核心要素,在谈论项目时,最好将其拆解为多个子任务,并根据STAR逻辑清晰陈述。在字节面试中,面试官反馈我背景描述过长,建议我更聚焦于问题本身,因此控制叙述节奏至关重要,例如:遇到什么问题?我的任务是什么?我采取了什么行动?最终取得了什么结果?
  • SWOT分析法:Strengths(优势)、Weaknesses(劣势)、Opportunities(机会)和Threats(威胁)。在讨论自己公司的业务方向时,可以利用这些要素,清晰表达如何帮助公司建立优势、克服劣势、把握机会及应对威胁;在谈及个人职业规划时,也可以分析自己当前的优势、缺陷(这可能是跳槽的原因)、跳槽带来的机会和挑战,以及如何应对。

面试经验总结

由于大多数面试中,项目部分占据了50%以上的时间,加上10%的代码时间,八股文的问题相对较少。

八股文题库

阿里

  • Kafka如何保证高吞吐?如何确保消息不丢失?
  • 你的设计中涉及两条链路,它们如何保持幂等性?
  • Redis节点之间的通信机制是什么?
  • 你遇到过哪些MySQL隔离级别的问题?如何解决?
  • Redis为何如此快速?你对CAP理论的理解是什么?
  • Redis Geo的底层原理是什么?
  • 你有进行过JVM调优吗?如何确保参数调整是最优的?
  • 如何实现分布式事务?在实际应用中遇到过哪些问题?
  • 如何实现规则引擎?其核心设计模式有哪些?

字节

  • 你了解粘包和拆包吗?产生原因及解决方案?
  • 如何实现数据加密?
  • Kafka不支持延迟消息,若让你设计实现,你将如何做?
  • 有一个1000万QPS的接口,如何对传入的唯一ID进行算法处理以实现高性能?
  • 如何理解分布式?若发生网络分区应如何处理?
  • RTree的原理是什么?如何插入与快速检索?
  • HashMap的原理及不同情况下的复杂度?
  • 乐观锁和悲观锁的区别是什么?
  • 如何确保幂等性?分布式锁解决了哪些问题?
  • MySQL隔离级别及MVCC的理解?

蚂蚁

  • Redis节点间通信的Gossip原理?
  • Kafka如何保证消息的顺序?
  • ZSet的底层原理及跳表的实现原理?
  • 如何进行分库分表?其原理、步骤及关键点?
  • 你了解哪些分片算法?
  • CAS的原理及其应用场景?CAS是否为原子操作?
  • 你如何理解Volatile与Synchronized?
  • Redis哨兵的工作机制?Redis优先保证可用性还是一致性?Redis如何实现持久化?
  • Kafka从消息发送到最终消费的全过程是怎样的?零拷贝又是什么意思?

小红书

  • ConcurrentHashMap的原理?为何使用红黑树,而不直接使用红黑树?
  • volatile和synchronized的基本原理?synchronized能保证可见性吗?
  • Redis集群中节点之间的通信方式?
  • Kafka是如何实现持久化的?如何保证消息不丢失?
  • Gossip和Raft的原理?
  • ES分片数量的设计依据是什么?
  • Redis的数据结构如何设计?跳表的原理是什么?
  • 如何确保幂等性?分布式ID的常见算法是什么?
  • Redis与Tair的选择考虑?Tair的底层设计如何?

算法题总结

整体来说,算法题难度较低,祝大家面试时也能遇到类似简单的题目:

  • 给定字符串S,求不重复字符的最长子串长度。
  • 将以下命令改写为代码:cat "app.log" | grep -E "query|insert" | sort | uniq -c
  • 判断给定单链表是否存在环。
  • 实现最小栈。
  • 查找有序二叉树中与目标值最接近的节点。
  • 删除单链表中的重复节点,例如a->a->b->c->d->d->d输出为b->c。
  • 统计子串的个数。

其他面试问题

  • 领域驱动设计的细节及其实施落地。
  • 在沟通与协作中遇到的问题,跨团队目标不一致时如何推动项目进展。
  • 遇到问题时如何寻求老板的支持。
  • 如果有重新经历一次的机会,你认为哪些事情可以做得更好?

总结

面试中,项目内容是交流的重点,如何能够简洁明了地让面试官理解你的项目是一项重要的表达技巧。在很多情况下,整个面试过程可能会花费一个半小时讨论项目内容,甚至没有时间考察八股文与算法题。因此,项目准备必须充分,这是你最有把握和主导权的部分。准备得当,面试官会因你展现出的优秀问题解决思路和经验而顺利通过面试。

最后,祝大家都能顺利通过面试!