七天,34道题,以及一个十年的困惑
Dominik Rudnik 在谷歌招聘邮件出现之前,差点把它当成垃圾邮件删掉。
这很正常。毕竟他投过太多次简历,早就忘了这回事。更重要的是——他打心眼里觉得这种邮件不可能是真的。
但它是真的。更离谱的是:面试官给了他一周时间准备,两轮在线面试,技术轮加行为轮。
一周。七天。一百六十八小时。
而 Dominik 的算法水平是怎样的?他的原话是:"即使在最早期的小学编程竞赛里,我也没能在这些题目上成功过。"在电信公司写了几年代码,他的数据结构知识停留在 flat vectors 和静态数组。遇到复杂问题?直接上 SQLite。LeetCode?试过,失败了,再试,再失败。算法这东西,对他来说就像一种天赋缺失——不是不努力,是真的学不会。
一周后,他完成了 34 道 LeetCode 题,其中 18 道中等难度,1 道困难难度。
然后,他收到了谷歌的下一轮面试邀请。
说实话,这个故事让我后背发凉——不是因为它励志,而是因为它揭了一个我们都假装没看见的伤疤。
一个"务实"程序员的知识盲区
Dominik 不是什么混子。他在电信公司写业务代码,写路由逻辑,处理消息流。工作干得怎么样?他的 KPI 是:程序跑满 60 帧,不卡顿,就能上线。
这种"务实"有个代价。
算法?数据结构?不好意思,这些在他的工作里几乎用不到。他不是不懂变通,他是真真切切地不需要。LeetCode 那些题目在他眼里有多离谱?他说得很直白:" Artificial, non-real problems ." artificial,人造的。non-real,不真实的。在他看来,这些题目就是数学老师为了折磨人发明出来的,跟他平时解决的问题没有半毛钱关系。
但谷歌不这么想。
Dominik 知道自己面临的是什么:一个 fundamental knowledge gap,基础知识的鸿沟。一边是一周的时间,另一边是十几年来都没能填上的坑。普通人的选择是什么?放弃。或者花几个月刷题,祈祷面试时能撞上做过的题型。
他没有。他做了一个实验。
把AI当私教使
他的方案听起来很疯狂:让 LLM 当他的算法家庭教师。
不是让 AI 直接给答案——他特意设了约束:不要输出任何代码。只给概念提示、攻击思路、真实世界的例子。如果要打比方,就尽管打比方。
周五,他开始和 Gemini Pro 死磕。第一组题目:买卖股票最佳时机、有效的字母异位词、数组除自身乘积。这些题目现在看来简单到离谱,但对当时的他来说,每一道都是突破。因为 LLM 没有直接给他代码,而是告诉他"这道题本质上就是在遍历数组时做一次简单的状态维护"。
关键就在这里。算法对他来说一直是抽象的数学描述,像一堵密不透风的墙。但当 LLM 用他熟悉的语境重新描述这些问题时——比如"这就像在处理消息队列时记录某个状态"——那堵墙开始出现裂缝。
周六,他加大了强度。新策略:15 分钟时间盒。解不出来就跳过,先把概念吞下去再说。那天他肝了九个小时,干了 17 道题:反转链表、链表环检测、二叉树翻转、有效括号、最大二叉树深度、岛屿数量……
到这一天结束,他发现了一个惊人的事实:树的问题本质上就是遍历的变种,而遍历他在 GUI 组件查找和迷宫算法里早就玩过了。图的问题?更离谱,他每天都在处理网络拓扑。图算法在他眼里突然变得"没那么难"。
唯一的例外是动态规划。爬楼梯那道题,他说这是" pure forbidden magic "——纯粹被禁止的魔法。强大,但危险,他完全没搞懂。但这不重要。他的策略是:先翻过这座山,以后再回来收拾它。
中等难度的真相
第三天,Dominik 意识到一个反直觉的现象:
"简单"题往往是最难的。
为什么?因为"简单"题 introduces an entirely new concept or pattern 。它逼你学一个你完全不会的新东西。而"中等"题呢?只是"简单"题的 trickier 版本。你已经知道底层逻辑了,只是需要绕几个弯。
这个洞察让我愣了一下。确实,我们总想着先从简单的刷起,但恰恰是那些"简单"题最容易让人放弃——因为它们总是在打破你的认知舒适区。
Course Schedule 这道题让他卡了很久,直到他理解了"反转方向"和"追踪访问状态"这两个概念。突然间,他意识到这道题本质上就是个依赖追踪问题,他工作中天天见。Combination Sum 是他第一次接触回溯,但之前 Course Schedule 的训练让他没有彻底懵掉——他至少能看出这是同一种思维模式的变体。
Container With Most Water 这道题让他"情绪激动"。它看起来眼熟,但他当时写不出来。后来他才意识到,这本质上和第一天的题目是同一个思路,只是换了个迭代方向:不是从左走到右,而是从两端往中间缩。这是"双指针"技巧,而他之前根本不知道这叫什么。
到第五天,他不再学新东西了。剩下的时间只做一件事:巩固。把之前做过的题目翻出来,尝试"主动重写"——不看答案,靠记忆重构代码。面试前一天,他彻底放松,就打游戏、看视频,让大脑冷却。
面试现场的黑色幽默
面试那天,题目砸下来的时候,Dominik 心想:这不就是图遍历加二分搜索的混搭吗?
太完美了。这恰好是他准备过的东西的交集。而且这道题让他想起了做游戏时的寻路算法——他兴奋了,感觉自己不是在面试,而是在设计一个新 RTS 游戏的核心机制。
他提出了一个迭代递增的方案,说到一半突然意识到:等等,这不就是二分搜索吗?稍微重新定义一下约束条件就能优化。逻辑瞬间打通。
然后,灾难来了。
时间不够了。压力之下,他忘了迭代版二分搜索的语法。他知道递归版怎么写,但迭代的语法像被橡皮擦抹掉了一样,从脑子里消失了。
他选择了最原始的方法:口头还原。他开始对着面试官边说边写,解释他怎么切分问题空间。虽然代码里有一堆错误,虽然他最后没时间重构,但面试官点头了——因为这个思路是对的。
他的原话是:"我用了和朋友解释'分治'概念时用的技巧。"
有意思吧?教别人的时候,你必须把逻辑说到自己能理解的程度。而这种"说出来"的能力,恰恰在压力时刻救了他一命。
等电话的那几天
面试结束后,Dominik 进入了量子叠加态:他同时觉得自己挂了,又觉得自己过了。
等待的那几天很奇妙。因为脑子里全是算法概念,他开始用全新的眼光审视日常工作。他突然能看出哪些地方可以用图算法优化,哪些地方可以用动态规划减少重复计算。知识这东西,一旦被激活,就像有了自己的意志,会自己往脑子里钻。
几天后电话来了。他本来都准备好接受失败了。结果招聘方说:你代码的可调试性要注意一下——言下之意,你写得有点乱——但我们还是想请你来现场面试。
Dominik 的心情很复杂。一方面,他想要换工作。另一方面,他喜欢现在的工作,而且他才干了十个月,又要开始新一轮折腾。更重要的是:他知道现场面试的难度会翻倍。
但他还是去了。
那些没有答案的问题
Dominik 在文章最后抛了几个问题,我觉得每一个都值得砸碎键盘思考。
第一,LLM 是怎么做到用七天时间教会我十多年都没学会的东西?
这个问题背后是一个残酷的现实:传统教育缺的不是知识,是"翻译"。一个好的老师能根据你的背景、你的经验、你的认知模式,用你能理解的方式重新包装概念。Dominik 说,LLM 擅长用完全不同领域的比喻来解释问题——比如用游戏开发中的概念解释图算法。为什么我们人类不这么做?是因为我们太依赖"标准表述"了吗?还是因为我们没有 AI 那种无限耐心?
第二,既然这些算法思维这么有用,为什么我们日常生产代码里几乎不用?
他问得很直接:我们把算法当作"被遗忘和被禁止的魔法",但同时,所有高可复用的代码本质上都是经典算法思维和实际问题的交叉利用。为什么我们总在造轮子,而不是直接用现成的算法?是因为面试和实际工作脱节太远,还是因为我们根本不知道那些轮子已经存在?
第三,"速成"到底有没有意义?
他没有用"速成"这个词,他用的是 speedrun 。这是游戏圈的术语,指的是用最快速度通关。他承认:如果没有这次 speedrun,他可能十年都翻不过算法这道墙。但 speedrun 也不等于 fluency ——它只是让你翻过了墙,并不代表你真正掌握了这种思维方式。
然后他给了一个让我沉默的例子:他给朋友讲解"分治"概念的时候,意外地让自己在面试压力下重构了二分搜索的逻辑。但与此同时,他忘了最简单的代码模板是什么。
知识好像有两种形态:一种是"能说出来的",一种是"能写出来的"。速成可能帮你打通第一种,但第二种需要时间和重复。
尾声
写这篇文章花了 Dominik 八个小时。面试结束好几个月之后。
他说这应该算作这次 speedrun 的一部分。
我看了一下日期,从投简历到最终发文,将近一年。这一年里,他从一个"算法废物"变成了一个能跟面试官讨论图遍历和二分搜索的人。不是因为变聪明了,而是因为换了一种学习方式。
这个故事最让我感慨的不是他通过了谷歌面试——毕竟他后面还有两轮现场面试,结果未知。让我感慨的是他提的那些问题,到目前为止,没有一个真正被回答。
LLM 真的能取代人类教师吗?我们会看到一种新的教育形态吗?速成和精通之间的鸿沟,到底能不能被填平?
我不知道。但我知道一件事:
Dominik Rudnik 用七天时间证明了,有些墙不是翻不过去,只是你一直没找对攀爬的方式。
而现在,AI 给了我们每个人一副不同的梯子。
【MiniMax-M2.1锐评】:这篇文章撕开了"算法面试"的神话——不是谁天生就会刷题,而是没有人用你听得懂的方式教你。AI最可怕的不是它会答题,而是它终于能当一个无限耐心的"翻译"。
参考链接:
http://blog.dominikrudnik.pl/my-google-recruitment-journey-part-1