一个再也没有机会回答的问题

2022 年 3 月,俄乌冲突爆发。

月底,我一个朋友间接因为这场冲突离开了,这里面的因果链条有些复杂——市场波动、业务受挫、情绪失控。

以前我们时不时会聊天,偶尔会聊到一个他很喜欢拿来面试别人的技术问题:

函数参数传递的方法有多少种?

每到这个时候,我都会有点故弄玄虚地跟他说:

“这个问题,我当年在北电面试的时候也被问过。不过我的答案有点不一样,有机会再讲给你听。”

总觉得以后还有机会。

原来没有了。

第一次听到“北电”这个词

时间回到 2003 年暑假。

我的大学室友跟我说,他有个师兄毕业了,准备入职北电,暑假想借我的床位过渡一下。我是本地人,暑假基本都回家,床位空着也是空着,所以我就答应了。

这是我第一次听到“北电”这个名字。

说实话,我根本不知道它是做什么的。

暑假结束回到学校,室友替他师兄向我道谢,顺便跟我介绍了一些北电的情况。我也是那时候才知道,他师兄拿到的是测试岗位的 Offer。具体说过什么,我已经记不清了,只记住了两点:

很难进,工资高。

这两点,成功引起了我极大的关注。

一个“双非”的迷之自信

后来了解得更多一点,我才发现,北电的招聘门槛其实很高。

对于北电来说,我算是一个“双非”选手:非 985、非研究生。尤其是研发岗位,当年招的人极少。

但当时的我,却处于一种迷之自信的状态。

理由也不能说完全没有。我已经有过几段实习经历,做过一些项目,还有一个当年含金量不错的“高级程序员”证书。那时候的我,对 985 这些标签也没有太强的概念。

至于研究生,我当时的认知更加直接:

本科毕业找不到工作,才去读研究生。

所以,“非 985、非研究生”这两件事,并没有给我造成太大的心理负担。

于是,我投了北电的研发岗。

这种迷之自信还有另一个表现。

那时候参加校招,很多应聘者都会准备一份封装精美、厚厚一叠的简历。相比之下,我的简历格外亮眼:

只有薄薄一张 A4 纸。

而我当时,并没有觉得这有什么问题。

“你也来了?”

我印象中,宣讲会是在华工。

宣讲会结束之后直接笔试。笔试前,我碰到一个同学,他看到我,说了一句:

“你也来了?”

我明白他的意思。

当时有点尴尬,心里想的是:

你不也来了么?

当然,这句话我没有说出口。

笔试做完之后,我很确定自己应该能拿到 90 分左右。题目对我来说并不难。

几年后,我自己也成了北电校园招聘的一员,才知道一个让我很意外的数字:

应届生笔试的平均分,只有 30 分左右。

这个数字让我有点惊讶。能够参加北电校招的,大多已经是当时不错的高校毕业生,为什么一份企业的技术笔试,平均分会只有 30 分?

我开始意识到,学校里学的东西和企业真正需要的东西之间,确实存在不小的距离。

冼为坚堂

虽然笔试感觉不错,但随着了解到更多北电的招聘情况,我开始觉得,自己未必能拿到面试机会。

北电的研发岗位本来就招得不多,而且我几乎没听说过“双非”拿到研发 Offer 的例子。

没想到,我还是收到了面试通知。

面试地点在中大冼为坚堂。

冼为坚堂

那天先填了一张表,其中有一项:

期望薪资

我一下不知道该怎么填。

这是我第一次参加真正意义上的求职面试,之前也完全没有研究过应届生到底应该开什么价。

于是,我瞄了一眼旁边。

坐在我旁边的是一个华工研究生,他在期望薪资那一栏写了:

7500

我想了一下,填了:

6000

这 1500 块的差距,在当时的我看来,大概就是一个 985 研究生和 211 本科生之间合理的差价。

这位被我拿来做“市场定价参考”的人叫 Sundy,没想到最后我们还进了北电同一个组。

其实怕被忘记 至放大来演吧

进入面试环节后,面试官很 nice。

但面着面着,我反而越来越紧张。

原因有点奇怪:问题都太简单了。

我开始担心,如果这些问题大家都会,我就算全部答对,面试官最后对我可能也不会留下什么印象。

终于,面试官问了一个问题:

函数参数传递的方法有多少种?

当年,C++ 和 Java 都是热门语言,这个问题背后考的,其实就是这两门语言里关于参数传递的一些特性。

我回答:

有两种,值传递和引用传递。

面试官没有什么特别的反应,继续低头看我的简历,像是在想接下来还有什么问题可问。

这很正常。这是一个常规问题,我给的也是一个常规答案。

但我不想让这个问题就这么过去。

我决定自己搞出一点“意外”。

于是,大脑开始飞速运转,试图从过去二十多年的“毕生所学”里,再找点东西出来。

龟—波—气—功

突然,我脑子里闪过两本书:

  • 《80386架构体系》
  • 《Linux内核分析》

龟波气功

我补充了一句:

“其实,还有一种。”

面试官抬起头,看着我。

我接着说:

“还有一种,是全局参数。”

他明显有点疑惑,问:

“有什么例子吗?”

我说:

“例如,在栈还没被构建的时候,比如操作系统的引导过程。”

面试官没有马上接话。

他就这么看着我,像是突然定住了。那一瞬间,整个房间仿佛也跟着安静下来,空气像凝固了一样。

我也看着他。

大概只有一两秒,却感觉时间停了很久。

然后我知道:

接下来,我可以接管这场面试了。

接管面试

我从 80386 电脑上电开始讲起。

POST、BIOS,如何从指定扇区把 bootstrap 读进内存,再把控制权交给操作系统。这些东西我当时很熟。

讲着讲着,我又顺势讲到了 Linux 的 init 进程。

到了这里,其实已经开始接近我当时知识的边界了。

当时我特意啃过 Linux 0.01 的启动源码,大体知道运行机制;但真要让我把整个 init 完整讲透,那时的我其实还没有这个底气。

不过,我还是继续往下讲。

我相信,在真正进入我的知识盲区之前,面试官会先叫停。

果然,没等我把 init 继续往下讲,面试官就打断了我:

“可以了。”

我停了下来。

一切都在计算之内。

那一刻我知道,这场面试差不多结束了。

接下来,问的都是一些常规的非技术问题。

BBS时代的“面经”

那个时代,大学生很喜欢在 BBS 上分享“面经”。

面试之后,我也经常去逸仙 BBS,一方面看别人的面经,另一方面也会分享一些自己的面试经历。当然,那个“超纲答案”我没有写进去,那算是自己修炼出来的东西。

也是在那里,我认识了一位中大的应届生。我们很投契,经常互相交流各自的面试情况。

他的网名叫:

非典型进

最后,我们都进了北电,而且进的是同一个组。

很多年后,我们又成了创业伙伴。

他就是文章开头提到的那位朋友。

答案是丰富多彩的

很多年后,我偶尔还会想起当年的那个问题:

函数参数传递的方法有多少种?

在 C++、Java 以及通常的面试语境里,我当然知道标准答案是什么。

但我至今仍然觉得,当年那个回答并不是胡来。

因为任何问题,其实都有自己的语境。

当面试官问出这个问题时,我们都默认了一个上下文:讨论的是 C++ 和 Java,讨论的是语言层面的函数调用。在这个上下文里,“值传递”和“引用传递”当然是他想听到的答案。

而我当时做的,只是跳出了这个上下文。

换一个语境,答案也就有了另一种可能。

这不禁让我想起 2000 年的高考作文:

答案是丰富多彩的

那一年,大概也是因为作文的关系,我和第一志愿擦肩而过。

三年后,在中大冼为坚堂,我又面对了一个可能决定未来的问题。

这一次,我终于给出了一个不一样的答案。

至于那个我一直说“有机会再讲给你听”的答案,最终还是没能讲给“非典型进”听。

有些答案,可以晚一点说。

有些对话,却不会再有下一次。

自己吹过的牛

2003 年 12 月 12 日。那时候我在黄金围驻场开发。晚上收邮件的时候,我看到了北电发来的 Offer Letter。

Offer

中间还有个小插曲:北电一开始竟然给我发了一份研究生的 Offer,一度让我以为搞错了。

面试那天,为了让面试官记住我,我从一个函数参数传递的问题,一路讲到 80386、bootstrap 和操作系统启动。

这个为了面试而“放大来演”的问题,后来竟然贯穿了我的整个北电生涯。

原来,这是我北电职业生涯的“引导程序”。