电梯里那句话
2023 年冬天,我在北京西二旗面一家做供应链的公司,第三轮技术面。面试官让我讲讲 AQS。我从 state 讲到 CLH 变体队列,讲到 Node 的 waitStatus 四个取值(CANCELLED=1、SIGNAL=-1、CONDITION=-2、PROPAGATE=-3),讲到独占模式和共享模式下 acquire / release 的差异,还顺手画了个同步队列转移的图。讲完他沉默了两秒,说:“行,那下一题。”
面完一起下楼,电梯里聊了两句。他说他是做业务后端的,AQS 这套东西“其实我自己也没细看过,是上一轮面试官给我的题”。
那一刻我心里有点复杂。我花了三个晚上翻源码记下来的东西,在这个招聘流程里的功能,跟“能力”这两个字关系不大。它更像是一张门票,一张证明“我愿意为这件事投入时间”的门票。
面试题的通胀,是有时间线的
回来之后我把这几年面过的记录翻了一遍,也跟几个当面试官的朋友对过,发现面试题的“汇率”变化其实有迹可循。
2015 年前后,能讲清楚 JDK 8 里 HashMap 的实现就算不错了——数组加链表,链表长度超过 8 转红黑树,退化阈值是 6,负载因子 0.75,默认容量 16。这几个数字答得上来,基本能过。
到 2018 年,这个不够了。得讲 ConcurrentHashMap 为什么从分段锁(Segment,默认并发级别 16)改成 CAS + synchronized,为什么 JDK 8 放弃了 Segment 这套设计。
2020 年前后,开始问 AQS、问 ReentrantLock 的公平与非公平实现差在哪、问 Condition 的等待队列怎么转移到同步队列。
2022 年之后,问法又变了,变成“你为什么这么设计”。比如 treeifyBin 里为什么要先判断数组长度是否小于 MIN_TREEIFY_CAPACITY(64)——因为数组还小的时候,扩容的收益比重构红黑树更高。
关键在于,这些题目对应的技术本身,几乎没动过。HashMap 从 2014 年 JDK 8 发布到现在,核心实现基本没变。变的是答对这道题的人在候选池里所处的百分位。题目没变,答对它的人变多了,稀缺性被稀释,所以面试官必须不断加码。这就是通胀,跟菜市场的逻辑一模一样。
面试是价格发现,不是能力测量
我不觉得面试官是故意为难人。这里头有个更结构性的东西。
面试本质上是一种价格发现机制。公司不知道一个三年经验的后端值多少钱,市场上也没有标准报价,所以它只能通过面试来做两件事:一是确定你的技术下限,二是确定你愿不愿意为这个机会付出额外成本。
八股文恰好同时测了这两样。你肯花时间背,说明你愿意投入;你知道今年考什么、能找到最新的面经,说明你的信息获取能力不差。这两项在真实工作里当然也有用,但它们跟“能不能把业务问题拆解成技术方案”是两回事。
所以我见过两种情况。一种是工作能力平平但面试通过率很高的人,他们的共同点是混在几个面经群里,每周更新题库,面试前把这家公司最近三个月的面经翻一遍。另一种是技术很扎实但面了半年没 offer 的人,因为他们习惯现场推导,而现在的面试节奏根本不给你推导的时间——60 分钟里要塞进自我介绍、项目、八股、算法、反问,每道题留给你的思考时间不到 90 秒。
这个判断可能有点刻薄,但我确实觉得它比“多刷题就能过”更接近现实。
面试官那一侧,其实也很狼狈
顺便说说面试官。大部分人第一次当面试官的时候都很慌,因为没人教过他们怎么面人。公司的培训通常只有一句话:“注意别问歧视性问题。”
我认识一个在杭州做中间件的朋友,他说他出的题基本是从自己被面过的题里挑的,标准是“我自己能答上来,也能判断对方答得对不对”。这逻辑听着合理,实际会导致题目在自己不熟的领域被误用。很多面试官问 JVM 调优,自己只会背那几套参数,候选人一旦反问他“你们线上用的是 G1 还是 ZGC”,场面就尴尬了。
还有个更现实的约束:面试官是兼职的。他手上有排期、有 OKR、有下午三点的需求评审。一场 60 分钟的电话面,他大概只有 10 分钟准备。这种情况下,一个现成的题库就是最优解。
所以下次你被问到一个八竿子打不着的问题,大概率不是刁难你,是他今天实在没空想题。
几个我自己试过有用的做法
第一,开场先判断这场面试是题库型还是推导型。 方法很简单,自我介绍完之后问一句:“这个岗位现在最棘手的技术问题是什么?”如果对方答得很具体,比如“订单表到了 8 亿行,分片键当初选得不好,跨片查询很慢”,那后面就是推导型,你把思路讲清楚比背答案重要得多。如果对方含糊其辞,那就是题库型,老老实实按八股节奏走。
第二,八股挑 20 个深挖,别铺 100 个。 我的筛选标准是:能不能被追问三层以上。拿 HashMap 扩容举例——为什么容量必须是 2 的幂?因为 (n-1) & hash 等价于取模但更快;为什么扩容后重新分配时元素要么在原位置、要么在原位置加旧容量?这个规律同样来自 2 的幂;为什么树化阈值是 8?官方注释里写的是泊松分布,链表长度到 8 的概率大约 0.00000006。能追三层,说明这个知识点有结构,面试官追问你不容易翻车。
第三,简历上每个技术点都准备一个带数字的版本。 “我把接口 QPS 从 1200 提到了 4800”比“我做了性能优化”有用十倍,因为数字是可以被追问、也可以被验证的。面试官对具体数字的信任度,远高于对结论的信任度。
第四,反问环节别浪费在“团队氛围怎么样”上。 问“你们代码 review 是什么节奏”“线上事故的复盘流程是怎样的”“这个岗位半年内最想解决的一件事是什么”。这些答案比薪资更能预测你会不会干得难受。
最后
我现在已经不太把面试结果当回事了。不是因为躺平,是因为我慢慢意识到,面试这个场景能测出来的东西比大家以为的少,而被顺便测出来的东西比大家以为的多。
回电梯里那个面试官,他最后跟我说了句话,我记到现在。他说:“其实我们招人主要看聊得来不来。”
当时我觉得他在敷衍我。现在想想,他可能是那天唯一说了真话的人。