个人的选择与历史的进程
(长文预警:本文约 17000 字)
近日,几位好友找我聊起他们的选择。“一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的进程”。我父亲也从小就给我讲,选择大于努力。人生已经走了三分之一,经历过多次选择:初中选择计算机竞赛,高中同时选择数学和计算机竞赛,高考选择中科大、后悔没考上清华,大二从数学专业转到计算机,大四放弃了创业、工作和出国而选择了 MSRA,博士毕业选择去大厂,面试了 12 家公司最终选择去华为工作……
我一向是有选择困难症的,特别是容易被沉没成本缠住,容易为得不到的东西纠结很久。这导致我在做选择的时候大多偏好稳定而非风险。与此同时,我还是比较理想主义的,希望利用自己的技术改变我们的生活。回顾我的这些选择,感觉就像是《楚门的世界》里面的楚门,生活在一个巨大的摄影棚中,虽然这些选择看似是自己的自由意志做出的,但却是当时环境和性格偏好的自然推论;很多时候做出了一些离经叛道的事情,却又被一把无形的大手拉回既定的轨迹。这大概就是历史的进程吧。
懵懂年代
听话的好孩子
初中以前,我还没有选择的概念,都是听爷爷奶奶的,每天除了学习啥都不干,既不跟小伙伴们出去玩,又不打游戏、不看电视、不看小说。小学的时候,奶奶监督我每天晚上做 50 道题,做不完不许睡觉。小学三年级开始利用晚上和周末的时间上奥数班,当时是一大群孩子挤在肖老师的屋子里,席地而坐。到了五年级,则是集中在桥西区的奥数集训队教室里,一人一个固定的课桌,也不用去上课了,天天做卷子。
上大学之前,我几乎从来没有自己买过东西,包括衣服都是家里给买的,每天家长从衣柜里拿出哪件衣服,就穿哪件。我的兜里基本上只有一两块钱,上学放学坐公交车用。有一天早上,大雪没过了膝盖,公交车很久才来一趟,每一趟上面都像沙丁鱼罐头一样挤满了人,在绝望中我只好深一脚浅一脚地往学校走,走到学校已经是接近中午。其实我家离学校只有 3 公里的路程,在北京算是非常近的了,如今我租的房子离公司也是 3 公里,跑步只要 20 分钟。
这种高强度、别无旁骛的训练,让我拿到了华罗庚金杯数学竞赛的全国金牌,但是生活基本上不能自理,更谈不上有自主选择的意识。小学升初中的时候,因为这块金牌,全市所有的初中都对我免费,除了最有名的石家庄二中。二中说从来都没有免学费这一说,最多给便宜一半。但我爷爷奶奶和爸爸妈妈考察了一圈,发现还是二中的学风最好,师资力量最雄厚,因此最后还是选择了二中。这项选择当然征求了我的意见,我觉得也挺好的,但我并没有深度参与调研。
初中选择参加计算机竞赛
刚上初中不久,学校开始组织计算机竞赛班。我家里一开始不让我参加,说计算机,这不就是玩电脑吗,要是天天打游戏,这还得了?过了一个月,我的好朋友孟阳跟我说,计算机竞赛是编程序,里面有很多数学,挺有意思的,我回去告诉家长,他们说,那就去参加吧。如同小学一样,初中进机房也要煞有介事地穿上鞋套,然后我就听到老师在讲 printf 语句,环顾四周,同学们有的在低头看谭浩强的课本,有的在认认真真做笔记,老师不让碰电脑,我们都不敢乱动。当时我们的英语都不太好,小学学英语也是用汉语拼音当音标的错误方法,所以 C 语言里面的这些关键字我也是用汉语拼音来标注的。正是因为如此,我经常把 main 写成 mian。
当时我们学习编程的方法也很简单粗暴,代码靠死记硬背,写错了就罚抄。在一个没有计算机的教室里,我因为少写了一个分号,在纸上罚抄程序 50 遍。我面试的时候,有的候选人问我,为啥一眼就能瞄见程序里面的语法错误?那是学编程的时候罚出来的强迫症。
初中除了计算机竞赛,还有数学竞赛,但我在数学竞赛上没有花太多时间,也没有取得很好的成绩。这大概是因为我觉得计算机比较好玩,就在计算机上花了更多的心思。初中的计算机竞赛(NOIP 普及组)我还拿了满分,但这对考高中并没有什么用,还是要看中考成绩的。正是因为如此,我们参加计算机竞赛的同学们大多数时间还是扑在中考所需的文化课上,我的中考成绩也是全市前十几名,顺利进入了石家庄二中高中。顺便提一句,现在河北省高考最厉害的高中可能是衡水中学,作为高考工厂闻名全国,但当时衡中还没有这么强,石家庄二中无论高考还是竞赛都是省里最强的。因此,在选高中这件事上,也没有什么可纠结的。
高中
同时参加四门竞赛,最后剩下两门
我高中的时候,数学、物理、化学、生物、信息学(计算机)竞赛拿到省一等奖都可以保送,竞赛班是学校开的,不收任何费用,而且不设门槛,所有学生都可以来听课。为了便于学生们找到自己的兴趣,这些竞赛班上课的时间一般是错开的。因此,我同时去参加了数学、物理、化学、计算机竞赛班,想看看哪个更感兴趣再做选择,没选生物还是因为上课时间冲突了。
每种竞赛班一开始上课的时候都是在 200 人的大阶梯教室,跟大学里上大课一样,坐在后面的都看不清黑板上的字。用不了几个月,很多人就因为跟不上或者不感兴趣而退出了,在一个普通教室里就能装下所有的学生了。到这个阶段,老师也会定期组织一些考试,成绩不佳的老师就会劝退,建议去集中精力到其他竞赛,或者集中精力准备高考。因为每门竞赛全省只有大概 40 个一等奖,二中北校区能拿奖的也就十几二十个人。要拿奖需要经过刻苦的训练,一般是暂停文化课集训,因此如果拿不到奖,再回去参加高考,成绩肯定是有一些影响的。因此,每门竞赛最后就会剩下十几二十个人冲击保送,太多的人进来只会导致内卷,一部分运气不好的同学前途就可能受影响。
我当时数学竞赛的成绩相对是最好的,计算机也不错。物理和化学竞赛我也跟着学完了大部分的知识,但是没有认真做题训练。不过从这些竞赛课中,我学到了很多有益的思维方式。比如我面试的时候喜欢出的一道题,三个人站在等边三角形的三个顶点处开始追逐顺时针的下一个人,问相遇时间,这就是物理竞赛中一道经典的题目,如果用微积分去硬解这条极坐标下的对数螺线会很麻烦,但采用相对速度的思维方式则可以口算出结果。
正是因为我觉得这些竞赛都挺有意思的,我舍不得放弃任何一门竞赛。直到各门竞赛的上课频率增加,化学竞赛跟其他竞赛的上课时间冲突,也没有时间完成这么多作业,才首先放弃了化学。放弃物理则是我自己的战略性放弃,因为同时参加数学、物理竞赛的大神是有好几位的,这两门竞赛的上课时间也有意安排得不冲突。但是老师和家长都劝说我,同时搞这么多竞赛没有时间,应该尽量集中精力到一门上。我最终也报名参加了物理竞赛,但是在复赛的实验考试上,因为我没参加过培训,连实验器材怎么用都搞不清楚,最后得了一个省二等奖也是不错了。
与办网站和写文章结缘
刚上高中,我就认识了好朋友肖世康,他计算机技术很强,不仅会制作计算机病毒、编写杀毒软件,还会做网站。刚上高中的我虽然会写点 C 程序,但只是应付互联网公司笔试题的水平,对操作系统、计算机网络、网站开发可以说是一无所知,只知道用冰刃(IceSword)杀掉了系统关键进程,系统就会崩溃;初中还学过用 FrontPage 做点最简单的网页,对 HTML 和 CSS 是一窍不通。因此我就很崇拜肖世康,跟他学计算机系统和网站开发。当时,他开发了一个 “太行新一代防病毒软件”,我帮他写了几个窗体,但还是没搞清楚杀毒的原理。
不久,我就自己用 FrontPage(后来改成了 Dreamweaver)办了一个完全由静态网页构成的 “博杰学习网”,那时候特别流行各种 JS 特效,我就从网上粘一堆 JS 代码,网页上一会儿大雪纷飞,一会儿彩旗飘飘,一会儿一个横幅飞过。2008 年 512 地震的时候,我还搞了一个全站灰化。因为我当时参加着四门竞赛,就把几门竞赛的学习资料和班里的各种信息都放到了博杰学习网上,俨然成了非官方的信息门户。大概就是在那时,埋下了一颗喜欢做网站的种子。
后来,因为维护这些静态网页太费劲了,特别是需要修改全站整体风格的时候一页一页地修改简直是个灾难,我就在 5d6d 上(免费论坛托管网站)注册了一个数之理论坛,这是当时最流行的 Discuz! 论坛软件,肖世康还帮我注册了一个免费域名 boj.pp.ru。论坛使得信息发布的效率高了很多,我投入更多的时间在折腾论坛上,占用了很多做竞赛题的时间,把历届竞赛的真题和答案等学习资料都收集起来放了上去。其中影响力最大的可能是我写了一本数学竞赛的《骗分导论》,还把另外一位作者 “我是智障” 写的计算机竞赛《骗分导论》扩充出了第二版。论坛甚至还吸引了国外搞数学竞赛的同学,我帮他把国内的数学竞赛题翻译成英文。
可惜的是,当时我没有数据备份的习惯,博杰学习网和数之理论坛的数据都已经丢失,除了我自己写的《骗分导论》,我在上面积累的竞赛资料都再也找不到了。
高中的时候,我经常上网看各种东西,一开始受(国内意义上)比较右的自由派思潮影响,后来又受比较左的思潮影响,经常在网上看帖,还以笔名写过很多时事评论文章。这也占用了很多本来应该用来做竞赛题的时间。记得 2009 年去北京参加 NOI 全国计算机竞赛决赛的时候,我们省队的晚上都在做题,我却在刷乌有之乡,陪同我去参赛的奶奶就说,我老是上网,不好好做题。不过,在高中这个比较早的阶段接触到很多不同的政治观点,也让我认识到社会的复杂性和观点的多样性,不容易听风就是雨,而是会有更多独立的调研和思考。
喜欢写作,大概是小学的时候经常写作文培养的爱好。虽然我写得不怎么样,按照中高考的标准来说尤其不擅长写记叙文,但至少我愿意动笔记录自己的所思所想,而不像现代的很多年轻人一样很难写出长篇的文章,甚至提笔忘字。
高考选择中科大
当年保送生有三条出路,全国竞赛获奖直接签约特定的学校,获省级一等奖以上参加 “五校联考”(或者其他学校组织的类似考试),以及高校的自主招生降分录取条件参加高考。
2009 年 NOI 全国计算机竞赛虽然我只拿了个铜牌,但还是能去复旦的。但那时候我才高二,不想为了节省一年高中的时间放弃去清华北大的机会。相比其他学科竞赛,计算机竞赛确实是比较特殊的,大多数学生都是高二上学期获得省级竞赛一等奖,然后经过省队集训,高二的寒假参加全国计算机竞赛。而其他学科一般是高三上学期才获得省级竞赛一等奖,随后参加全国竞赛。因此,我高二拿到计算机全国铜牌的时候还没有考数学竞赛,自然也不希望放弃这个机会。实话说,我数学竞赛学得比计算机好,计算机能拿河北省第 2 名、进入 6 名成员组成的省队纯属超常发挥(河北省没有省选,根据省级比赛成绩直接进省队),我们竞赛班一些计算机大神却发挥失常了。但数学竞赛却没有发挥得那么好,与省队失之交臂。我数学竞赛中有些领域一直学得不太好,比如平面几何,在复赛中就吃了大亏。
如同大多数竞赛生一样,我走上了 “五校联考” 的道路,包括清华、上海交大、中科大、西安交大、南大 5 所高校,考试的科目包括数学、语文、英语、理科综合,跟高考科目差不多,从早上 8:30 一直考到晚上 20:00,一天考 7.5 小时。其中数学和理科综合的题目很多是竞赛初赛难度的题,比高考略难。考得最糟糕的是理科综合,100 分满分只考了 40 分。最后我距离清华的分数线差 10 分左右,但是超过了其余 4 所学校的分数线。五校联考允许填两个志愿,当时我填了清华和上海交大。清华还是允许我参加面试的,当时是群体面试,几个候选人做无领导小组讨论,话题是 “如何看待谷歌退出中国”,这个话题自然我比其他候选人了解更多,虽然我有意克制自己,但还是明显地领导了整个讨论。去北京面试清华,还发现了面试名单里把我们班一个同学给漏掉了,赶紧通知他去找清华,最后他顺利地上了清华。上海交大则是承诺我加入最好的理科实验班。
中科大有些不同,在 “五校联考” 之外,派了很多招生老师来学校组织面试,跟公司面试比较相似,几轮面试中,有当面做题,有考察基础知识,也有聊未来规划。面试结束之后中科大的招生老师特别希望我能去,说我是学校面试成绩排名第一第二。不过中科大要求签协议,就像公司接 offer 一样,协议里要求保证不再去其他学校。但是这个协议只有纸面的约束力,很多同学拿到清华北大的还是走了。
当时我最纠结的就是去上海交大还是中科大。上海交大的名气更大一些,而且上海这个城市也更大;中科大则是有一张更安静的书桌,适合做基础研究。我当时计划学数学专业,计算机只是一个爱好,因此感觉中科大这种数理基础扎实的氛围更适合学数学。最终,我选择了恪守与中科大签署的协议,来中科大理科实验班就读。特别需要说明的是,理科实验班属于少年班学院,我们对外说少年班学院的时候,大部分人会把我们当成是少年班的,但其实少年班学院除了少年班还包括高二考上来的创新试点班和高三正常毕业的理科实验班。
还有另外一个选择,就是放弃直接保送的机会,利用清华的自主招生降分和竞赛获奖的加分,复习半年,再去冲一把清华。但我觉得这样风险太大,因为我们竞赛班的文化课是压缩到高一一年学完的,高二一年都在做高强度的竞赛训练,全校的文化课统考成绩已经降到了 100 多名。虽然拿到省一等奖之后,为了备战自主招生考试(科目与高考基本相同),又补回来了很多文化课的知识,成绩回升到前 50 名,但不考虑加分的话连中科大都不一定能上。当然通过高三下学期的训练,成绩还会有提升,但是凭借自主招生降分去冲清华还是太冒险了。
我们竞赛班在省级竞赛成绩出来,保送资格落定之后,就进入了佛系的状态,相比高考班的同学们,实在是太逍遥自在了。这大半年,我自学了 PHP,想着模仿 Discuz! 论坛和 WordPress,自己写一个论坛系统出来,最后一共写了大约 8000 行代码,搭了个 demo,但后来也没有再用了。我还读了一本《深入理解计算机系统》,这是我对计算机系统兴趣的萌芽。此外,我读完了 Matrix67 等大神的博客,学到很多有趣的知识,梦想如果有一天自己的博客里也能有这么多高质量的内容该多好。
大学
我对没有考上清华是颇有不甘的。刚上大学的时候,我在寝室里播放 “西山苍苍,东海茫茫” 的清华校歌,还问室友,你知道这是什么歌吗?他说,这还用问,肯定是清华的校歌呀。科大理科实验班人才济济,很多都是与清华北大失之交臂的。直到今天,遇到有来面试、实习或者入职的清华学生或者清华毕业的专家,他们有时候比较谦虚,我就总是会说,我可是梦寐以求想成为清华的学生,结果一辈子都没有实现。成为清华的学生是一辈子的光荣,你们应该珍惜这份荣誉。
大二,从数学专业转到计算机
大一,尽管我加入了华罗庚班学习数学,科大也是学霸氛围浓厚,但还是像高中一样没办法完全收心在学习上,总是喜欢参加各种社团。关于这一段大学期间的经历,我曾经写过一篇挺长的博客,毕业——谨此祭奠我逝去的青春,就不再赘述了。但是其中有两件事情还是需要强调。
第一件事是大一加入了 LUG(Linux 用户协会),接触到黑客精神和自由软件精神,发现可以用技术改变生活。高中的时候,我们班很多人认为共产主义难以实现,因为材料和能源的总量都是有限的,而人类的欲望可能是无限的;此外,社会地位也是相对的,不可能做到绝对的平等。保送后的佛系时光里,我也读过多人投票中的阿罗不可能性定理(1951)和经济学家科斯的经典论文 The Nature of the Firm(1937),一度有些绝望,绝对公平的选举和一人一票制的公司都是不现实的。但计算机存储、传输和处理的是信息,而非实物,信息的传输和复制成本很低,这就使得无私分享、各取所需成为可能。黑客精神的自由、分享和合作吸引了我,希望在物欲横流的世界中建立一个信息的乌托邦。这与今天元宇宙和 Web3 的思想内核其实是有些相似的。
第二件事是大一下学期跟着格物致知社的小伙伴们尝试懵懵懂懂的创业,仿照当时大火的电影《社交网络》和 “中国版的 Facebook” 人人网,搞了个 “格物网”。当时我们发现每个班级、每门课、每个实验室都缺少沟通和信息发布的渠道,有的用电话、群发短信这种最传统的方式,有的用 QQ 群,但是消息很快就被淹没了。学校虽然有一个在线教学平台可以共享课程资料,但使用者寥寥。于是我们提出了 “组织社交网络” 的概念,其核心是社会中的 “组织”,实现组织内的资料共享、通知公告、交流讨论、项目计划、选举投票等。组织可以组合使用现有的功能模块,也可以用编程创建新的功能模块。简单地说,一个组织就像是一个独立的多功能论坛。同时,我们还畅想了 Web3.0,希望通过技术的手段,保证每个人可以对自己的数据有拥有权,可以自主授权其他人访问数据,并通过一套利益分享的机制,可以让数据的使用者向数据生产者付费,从而让生产者能够获得现实世界中的收益。回想起这个 2011 年的设计,还是觉得有点兴奋,因为今天 Web3 基于区块链技术实现的也是类似的梦想。
可惜我的网站技术落后于想法,网页弄得非常丑,格物网在大一升大二的那个暑假上线了,如 毕业——谨此祭奠我逝去的青春 那篇博客所讲,我们在贺羽社长和张伟副社长的带领下,在东西区校园里摆起了幕布和投影宣传格物网。在校园里拉幕布和投影宣传网站,在科大应该是空前绝后了。
因为这些经历,我越来越沉迷于能给我们实际生活带来改变的计算机,而不是枯燥无味的数学。我大一的数学成绩很差,大一下学期的线性代数还挂了科,其中很大一部分原因就是整天泡在少院机房里倒腾计算机。我跟好朋友郭家华就很有缘分,我第一天来中科大报到的时候,是坐了一夜火车,大清早就在少院 221 宿舍楼门口等着。过了一阵子,郭家华就拉着行李过来了,他也是计算机竞赛保送的,而且高中就很会玩 Linux,知道怎么做服务器的网络配置。他是我在科大认识的第一个朋友。虽然我也经常去少院机房,负责机房技术管理的周淼淼学长并不让我碰主控室的服务器,因为我当时一条 Linux 命令都不会。到后来,我跟着郭家华慢慢学会了一些命令,也可以像周淼淼学长和郭家华一样,去主控室里扯网线、搞水晶头、配置交换机和网关服务器了。我读研一的时候,还把 LUG 的本科小伙伴们叫到少院机房来玩,看 Freeshell 服务器集群的实物,一起做水晶头。不过,网络这东西也许没什么难的,做过就知道了。我跟女朋友讲起在少院机房教几个小伙伴做水晶头的故事,她说这有什么难的,当年网线坏了,舍不得买一条新网线,都是重新装个水晶头就修好了。
大一暑假的时候,我认真考虑从数学专业转到计算机专业,但还没有下定决心。我仍然买了大二上学期的数学系课本,发现比大一更难了。等到大二开学,上了两个星期课,我发现微分方程根本听不懂,数学分析(三)因为前面积分一直没学好,也听起来很费劲。我利用跟数学系教授一对一的机会,表达了我的顾虑,教授很开明地对我说,现在学的这些课程都是数学基础中的基础,如果基础打不牢,后面很难在数学上有所建树;如果对计算机更感兴趣的话,做自己更感兴趣的事情是最好的,不要委屈自己的内心选择一条不喜欢的路。于是,我下定决心,跟班主任说了转专业的事情,班主任也支持我的选择。好在少年班学院专业选择自由,只要去找任课老师填写选课单即可,不用大费周章地办理转系。
今天,我的研究领域里也有很多从数学、物理专业转过来的大佬。
比如我的导师张霖涛博士就是 1992 年的国际物理竞赛金牌,在北大学完物理之后,去普林斯顿读博时转向了 EE 和 CS。导师说,尽管他自认为是比较聪明的,物理基础也不错,但跟一些大神比起来还是欠缺一些灵感。他认为,在基础科学的学术道路上,只有 top 1% 才能做出改变世界的成就,大部分其他的研究者虽然也可以通过熬资历成为一名教授,但就没那么有意思了,他觉得自己不是最顶尖的那少数几个人。我感觉导师是一个特别聪明的人,idea 跟他大致一讲,就能 get 到;每次听报告,不管是不是他熟悉的领域,都能提出非常好的问题。就连导师这样聪明的人都认为并不适合基础研究,我觉得我没有选择基础科学是幸运的,否则也许就泯然众人了。
我在 MSRA 联合培养期间的好友陆元伟也是本科读物理,来 MSRA 的时候计算机基础并不好,郭传雄博士就给他了好几本计算机专业书,他读完之后,也可以像我们 “科班出身” 的一样做很好的计算机系统研究了。选择自己喜欢的事情,任何时候都不晚。
大四,创业,工作,出国,还是 MSRA
不管选择哪个,现在看来似乎都不错?这是我写下这个小标题后的第一个念头。
我大四的时候,脱胎于格物致知社的创业团队已经不再像搞 “格物网” 时那么一厢情愿,以为社交网络只要有技术、有想法就能推广出去。创业团队尝试了更多能带来实际收入的产品,比如物理导学系统,把物理实验视频、教学视频等打包成产品;课堂答题系统,给每个学生一个带按键的手持无线终端,教师在讲台上的电脑端可以通过近场通信实现点名、答题等功能。这些产品带来了不少实际收入,但市场规模并不容易做大。在我离开创业团队去 MSRA 实习之后,他们找到了一个真正有科技含量并且前景广阔的领域——高端科学仪器。今天,国仪量子依托中科大的原始创新成果,设计生产了多款高端量子科学仪器,解决了量子精密测量中的多项 “卡脖子” 问题,成为了一家累计融资额近 10 亿元的独角兽。如果当年选择在这个创业团队继续做下去,不仅可以实现财务自由,同时所做的创新也有很强的实用价值。
尽管科大的深造率很高,本科毕业直接工作的并不多,但我在计算机竞赛中认识的很多大神本科毕业后就拿到了 Google 等顶级公司的 offer。此外,一些国内的互联网公司也向我伸出了橄榄枝,例如阿里就曾邀请我去面试。我并没有认真考虑本科毕业直接工作这个选项,因为大三暑假就加入了 MSRA 的联合培养博士生项目,觉得微软还不错。我的一个博士好友跟我说,当年字节跳动的 CTO 邀请他加入,他最后还是选择来 MSRA 读博了,这样就错过了一个亿,可能还不止。
出国深造是科大绩点高的学生的默认选择,因为读硕一般需要自费,大部分都是选择读博。我大二的时候,也跟格物致知社的几位小伙伴一起,一起到北京来合租了将近一个月的短租房,参加新东方的 GRE 培训班。有趣的是,我们这几个人大部分都没有出国。我大一数学成绩不好,加上平时沉迷于折腾各种网络服务,对课程不是特别上心,从而绩点比较低(大三申请 MSRA 联合培养时是 3.4,大四毕业时是 3.3),出国读博估计也去不了特别好的学校。因此,虽然我上了 GRE 培训班,但回来之后并没有按照老师的要求背单词、做题,至今我也没有报名参加过 GRE 考试。此外,我当时对学术研究也不怎么感兴趣。很多绩点高的同学会在本科进入实验室做科研,但我没有任何科研经历,感觉科研就像我曾经弃坑的数学专业一样无聊,而做工程项目就能真正改变生活。因此,在申请季,我没有去了解任何一所学校,也没有提交过任何申请。
MSRA 则是起源于一次意外的邂逅。当时我虽然跟计算机学院一起上课,但一下课就去 LUG 活动室或者少院机房了,跟计算机学院的同学们一起玩的不多,很多信息也比较闭塞。大三下学期,班主任黄老师告诉我,微软有一个 “微软小学者” 奖学金,我可以尝试去申请。面试的过程中,我才知道微软可以实习,还有联合培养博士项目。一开始听说 “微软小学者” 和联合培养博士项目招的都是绩点高的学生,我觉得没戏了,但没想到面试我的老师很赏识我本科期间做的这些技术项目,最后不仅评上了奖学金,也获得了联合培养博士的机会。
在这四个选择中,我最纠结的是创业和 MSRA。创业的事情是很有热情的,但风险可能会比较大,因为当时我们还没找到高端科学仪器这么好的方向。经过两个月的暑期实习,MSRA 给我的印象很好。办公室环境舒适,有免费的饮料和水果,文化很开放,mentor 们都很博学而且认真。最关键的是,我改变了对研究的刻板印象,原来网络系统研究不是推公式,而是在写代码解决现实中的问题。虽然这些问题来自遥远的数据中心,但它们是真实存在的。因为我的风险偏好还是偏稳定,选择了在 MSRA 继续读博,做研究。虽然我对国内读博有一点顾虑,但看到联合培养师兄师姐的成就,也就不再担心了。
博士
系统还是 FPGA 编程
读博过程中的第一个项目 ClickNP 是导师的关键项目,导师谭博已经做好系统设计,集中全组的资源一起做,最后我写的论文初稿也被导师完全推翻重写了。这篇 paper 发表之后,导师在茶水间问我,下一步是做 FPGA 编程,还是做系统。我想了想,还是做系统吧,首先因为我并不是 EE 出身,FPGA 编程只是三脚猫功夫,深入做下去数字电路都玩不转。其次是因为我们网络组的 mentor 们主要研究方向还是偏系统的,做系统能得到更多的指导。导师点了点头,说他也建议我做系统方向。这次两三分钟的谈话,就决定了我博士的道路。
博士毕业,学术界还是工业界,创业还是大厂
博士毕业的时候,就涉及到工作的选择,我大致划分为 5 种:学术界、自由职业、创业、国外大公司、国内大公司。
首先是学术界,虽然我很喜欢科研,但是如同我一开始读博时的顾虑一样,我不喜欢理论,喜欢能够实用的研究。我觉得学术界的研究,即使是网络系统领域,也经常脱离实际需求。例如我博士期间整个团队花了几年时间研究的心血,虽然发表了很好的论文,但也只是探索了一些可能性,并没有在任何一个生产系统中商用。今天,我仍然希望把工业界的成功实践总结成论文发表出来,就像我喜欢写博客分享自己的生活一样,但不希望 “为赋新词强说愁”,为了写论文而专门做一些短期内不可能商用的东西。
其次是自由职业,虽然黑客精神本质上是鼓励自由职业的,但目前基于知识的利益分享机制还不健全,除了个别大 V,只靠咨询服务、知识付费、个人网站的广告收入来养活自己是很难的。对于大多数自由职业者来说,自由职业能赚到的钱远远少于给大厂打工。因此,我自由职业的想法逐渐被消磨。羡慕 LUG 选择自由职业的小伙伴们,用自己的人生践行着理想主义的精神。就目前而言,还是需要先保证自己不饿死,再谈自由、分享、开放的黑客精神。
然后是创业。创业公司的优点在于效率高,可以像鲇鱼一样钻进细分市场。分析目标市场的规模和当前玩家情况,就会发现公司挣钱都很不容易。像微软这样体量的公司,10 亿美金以下的市场根本入不了法眼。因为大公司要立项做一件事情需要复杂的流程,需要一个多功能的团队支持,一个小团队三五个人搞定的事情,大公司可能需要几十个人的团队。大公司开发流程复杂,代码生产率 300~500 行/人月,产出的代码也是经过严格的检视和测试的;小公司可能代码生产率高达 3000~5000 行/人月,但代码质量未必这么高。因此,大公司比较适合 to B 的、对质量有严格要求的市场,而创业公司比较适合小步快跑、快速迭代的市场。
我所在的数据中心网络研究领域就比较难创业,因为数据中心都是大公司才有的,大型公司要么自研智能网卡,要么采购其他大公司的智能网卡,谁会去买一家名不见经传的小公司的网卡呢?因此,这个典型的 to B 领域虽然有很多创业公司,但都是功成名就的大厂大佬们出来创办的,并不适合年轻人创业。如果要创业,可能就得去做区块链、元宇宙、隐私计算、人工智能等比较 “新兴” 的领域,而我在这些领域并没有积累,也不希望放弃在数据中心领域已有的积累。
我认为数据中心领域还是比较适合去大厂工作。相比自由职业或者创业公司,大公司的条条框框更多。这些条条框框一方面体现在规章制度、项目管理和开发流程上,另一方面体现在选题立项上。用我导师的话来说,就是要遵从公司商业上的事实与选择,尊重公司在产业中的位置与产品的现状;研究的问题一定需要有可以落地到产品的途径,而不是解决 “人类的问题”。
在国内或者国外工作对我来说没有什么不同,但是我女朋友今年才博士毕业,如果我 19 年就出国的话,就从异地变成异国了。异地的时候我们还能每个月见一次面,异国的话就没法这么频繁了,甚至还会有时差,就更麻烦了。因此我很快就排除了出国工作这个选项。2018 年初,我突发奇想,报名裸考了托福,还考了 103 分,其中口语和写作是最差的,分别是 22 和 24 分,如果经过一定的准备,也许可以提高。但后来我并不打算出国工作了,就没有刻意学习英语。
大厂面试,主要就是做题、讲研究成果和聊天
这么综合看起来,就只剩下国内大公司或者独角兽了。大公司招人一般有几种渠道,大佬邀请,内推,或者海投简历。因为我们在 MSRA 的圈子里,很多从 MSRA 出去的大佬自然就成为我们的重要选择,他们也会主动联系我们,这种大佬邀请的方式拿到顶级 Offer 的概率最高;内推则是找朋友内部推荐,我的联培博士好友聪老师就帮我内推了好几家公司;海投简历一般来说不太建议,首先是简历被 “捞” 起来的概率不大,其次是匹配到的部门也不一定合适。大佬邀请或者内推的方式相当于利用推荐人的背书,在面试前给了面试官较好的第一印象。不过,内推一定要找靠谱的朋友,曾经有人给我推荐候选人并说了坏话,我就说要么就别推荐,由于个人恩怨说人家坏话总不是好事。
我一共面试了 12 家公司,分为三类:
- 国内大厂,包括阿里、腾讯、字节跳动、美团、华为
- 国内独角兽,包括 Pony.ai、第四范式、寒武纪、地平线
- 外企,包括 MSRA、Xilinx、VMWare
大部分公司的面试形式都差不多,前两轮是技术面,大多数公司会让讲一讲所做的研究,做一些算法题。后面是主管面,以及更高级的总裁面,有的还有 HR 面。这些高层面试就以聊天为主,主要是看研究成果的影响力,未来的职业规划,公司价值观的匹配程度,高层领导也会借此机会宣传公司,吸引候选人。有些高级领导也会在面试中要求写代码。
比如阿里星就包括两轮技术面试、一轮主管面试、一轮交叉面试,以及一轮阿里星终面。阿里星终面是部门的 P11 总裁和其他部门的两位大佬,加上高级 HR 主管一起面试,先让做 30 分钟学术报告,各位大佬再提问 30 分钟。当时我不知天高地厚地大谈起正在做的批流一体处理的数据库项目,没成想 P11 大佬就是数据库的资深专家,被喷了一顿。不过我的很多不成熟的项目就是这样利用给大佬汇报的机会来接收反馈的。在 MSRA 实习的时候,有一次(并非面试)图灵奖得主 Butler Lampson 来 MSRA 访问,我就给他讲了讲全序消息传输的想法,他给了非常有价值的反馈,这个工作在被拒了 4 次以后终于发表在 SIGCOMM ‘21 上。
阿里的交叉面试也令我印象深刻。交叉面试的面试官来自其他部门,是一位从 Intel 跳槽过来的专家,问了我很多 CPU 体系结构的知识,他说我在同龄人里算懂的比较多的,但对于细节了解还比较少。我说,在公开渠道很难了解到 CPU 微体系结构的细节呀。他颇有些深意地说,这就是工作经验的价值呀。这一席话让我意识到,一定要加入到有核心技术的团队里面,并且有尽可能宽广的技术视野,才能在短暂的青春里学到尽可能多的 know-how。
面试字节跳动的郭传雄老师时,郭博士给我出了一道数学题。那道题是给定一个递推公式求上下界,是从他的 DCell 论文中得出的(随着 DCell 级别超指数级增长的服务器数量),而我并没有认真读过这篇论文。其实数学上这个上下界并不难求,但是我当时的确没做出来,郭博士给我讲了才豁然开朗。郭博士说,他喜欢的研究就是数学理论优美,同时又有实用价值的类型,但这样的研究可遇不可求。面试字节 CTO 杨震原的时候,他让我当场写代码,还聊了很多我研究工作中的细节。他说,好久没有聊这么底层的东西了,他在百度的时候就做这种底层优化,有种当了几年将军又回到当年侠客切磋剑法的感觉。
面试 Pony.ai 的时候,如愿见到了传说中的楼教主。见到楼教主之前有两轮代码面试,每场面试有两三道不算难的算法题,跟 Google 的面试很像。楼教主给我出了几道智力题,我都没有见过:
- 用一个每次抛出正面朝上概率为 p 的硬币,允许多次抛出,实现一个等概率的 01 随机变量,要求尽可能减少抛出次数的期望。这的确是很漂亮的一道题,现场我想出了最优策略但没算出期望来,后来我才搜到期望是 1/H(p),其中 H 是熵函数。
- n 维立方体的顶点数和面数。
- 三维正方体的六个面上任给起点和终点,求虫子沿面爬行的最短距离。
- 把一张长方形纸的一条边三等分、五等分。楼教主现场给了一张 A4 纸让我折,我折腾半天,给出一种方法,教主以为对了,我自己发现错了;然后我改了改,找到一种他没见过的三等分方法,但比较复杂,其实教主的方法非常简单,也很容易推广到任意等分。
当时我还问楼教主,怎么看端到端的自动驾驶流水线,他说生命攸关的东西完全交给神经网络这种黑盒子,他不放心;深度学习的可解释性和可调试性不强,就算效果好,万一出了事很难向公众解释,也不一定能符合法规的要求。
MSRA 的面试轮数可能是最多的,有两轮代码面、研究员和主管集体面试、交叉面、副院长面、HR 面等,其中每轮代码面是两道算法题加一道系统设计题,号称是 “一票否决制”,因为代码面不通过的不管主管怎么说情都没法录用。MSRA 的研究员和主管集体面试和华为的研究员和主管集体面试、阿里星终面比较类似,都是先讲学术报告,然后是提问交流。交叉面主要是考察知识面的广度和思维的开放程度,曾经有位候选人在面试时大肆攻击交叉面试官的研究领域,这就不太合适了。
面试华为的时候,谭博问我,对 FPGA 在数据中心里的应用怎么看。如果仅仅站在为自己的研究成果辩护的角度,大谈 FPGA 的优势,这个回答就狭隘了。不同的公司有不同的选择,其中有技术路径依赖的原因,也有商业上的考虑。公司更希望候选人能客观地分析各种不同智能网卡体系结构的优劣。我自己做面试官的时候,也希望候选人能从自己的研究工作跳出来,有新的独立的思考,最好能升华一层,而不是像复读机一样把几年前做过的报告再讲一遍。
事实上,这些面试我都没有怎么准备,因为我觉得大厂的算法题都不难(除非是考到数学或者脑筋急转弯类的问题);研究成果已经讲过很多遍,不需要 PPT 材料都可以讲出来;聊天就更不用准备了,我的职业规划就是成为系统架构师,我也比较喜欢奋斗,跟国内大厂的价值观比较匹配,同时我对计算机也保持着浓厚的兴趣,希望持续探索巴斯德象限的前沿。有些面试官还是会问一些跟计算机基础知识相关的问题,我就知之为知之,不知为不知。比如 C++、Java 我没用过,我就说不会;虽然我做过一点内核开发,但都是最简单的内核模块,没有研究过网络协议栈。我自己做面试官的时候也喜欢考察候选人的计算机基础知识,例如操作系统、网络、分布式系统、数据库等,以及候选人惯用编程语言的语法语义和编译链接运行时的知识(例如垃圾回收),经常发现很多候选人在问到理论性的问题时回答得头头是道,但追问一层就答不上来了,因为他们并没有真正用过这些系统,只是背了一些面经。有的候选人甚至试图欺骗面试官,如果面试官是这方面的专家,这是很容易被发现的。
直到今天我自己做了面试官,才发现跟我当年做候选人的时候一样,候选人的水平和经历跟面试官越接近,面试起来就越舒服。遇上高手就像是朋友聊天,比如遇上打 ACM 的就聊聊擅长哪些数据结构和算法,哪些题是天坑,比赛的时候怎么打配合;遇上折腾网站的就聊聊用了什么框架,CSS 和 JS 有多少坑,运维的过程中有哪些血泪史;遇上稚晖君那样折腾嵌入式系统的就聊聊玩过(烧坏过)哪些单片机,PID 控制的参数怎么调的;遇上搞区块链的就聊聊共识机制和智能合约,顺便让他给我科普科普已经多年没看过的币价;遇上玩过信息安全的就让他讲讲黑了哪些网站,找到了哪些漏洞的 “光辉历史”;就算遇上自己不懂的领域,也能虚心请教,听候选人讲讲他的故事,能学到不少东西。
大厂 Offer 的选择
承蒙各位面试官和领导的厚爱,在这些公司我都拿到了不错的 offer。国内大厂的 offer 之间是会互相 match 的,例如我拿到阿里星的 offer 之后,其他几家大厂都会参考这个 package。因此学弟学妹如果想找大厂工作,一定不要只投一家,否则就等着被宰吧。
为了选 offer,我就像审论文一样,给每家公司写一段 Summary(概要总结),列出 Strengths(优点)和 Weaknesses(缺点),将面试过程中和各方面收集来的信息放到 Comments to the Author(评论)里面。同时,我也会记录公司里的大佬、直接主管、新入职的优秀员工和实习生。就像顶会的每篇论文审稿意见都很充实,我给每家公司也写了上千字的点评。在此基础之上,我做了一张电子表格,从多个方面给每家公司打分,包括:
- 入职薪酬
- 长期预期薪酬
- Offer 在同龄人中的相对档次
- 业务匹配度
- 成长空间
- 工业界影响力
- 学术界影响力
- Work-life balance(工作轻松度)
- 领导熟悉度
- 工作稳定程度
- 公司文化
- 公司品牌
- 部门前景
- 领域前景
- 技术积累
- 大牛老板
- 大牛同学
- 工作地/户口
每一项都像论文审稿一样 1~5 打分,然后计算算术平均值、几何平均值、方差等统计指标。根据这些统计指标,再对各家公司进行排序。就像审论文一样,论文中不中不是单看评分,但第一轮筛选中可以把评分过低的先行过滤。平均分 3 分以上的公司有 7 家,也就是第一轮过滤掉了 5 家。因为最后只能选一家公司,“中稿率” 只有 8%,这确实是个很残酷的筛选。对于第一轮被筛掉的公司,为了避免吊着招聘 HR,浪费主管的一片真心,我就早一点直说了。就像论文第一轮被拒之后早点告诉作者,作者还可以早一点转投其他会议。我这个人不擅长拒绝,在拒绝每家公司的时候都要深思熟虑好久。
这 7 家的平均分最低为 3.78 分,最高为 4.11 分,其中前 6 家的平均分都至少为 3.94 分,因此真的是难分伯仲。我也很难对上述这些指标进行加权。论文投稿中,也不是根据分数来决定最终的录用,而是经过 PC(程序委员会)会议讨论,如果有人 champion(支持)并且没有人反对,这篇文章多半就能中。换到选择公司的语境中也是如此,如果有明显的优点并且没有明显的缺点,就是更好的选择。
最终,因为我的博士启蒙导师在华为,而且华为有软硬件结合设计的优势,我做出了艰难的选择。拒绝这 7 家公司中的另外 6 家就更难了,因为每家公司都有广阔的前景、优渥的待遇、充足的成长空间、成批的大牛老板和同学等。在那时看来,也许选择哪家公司并没有很大的不同。
毕业前不久,遇上了 “516” 美国制裁事件,一时间人心惶惶,很多人说华为快不行了,劝我不要去华为了。一位老师对我说,人最宝贵的是时间。如果你想支持华为,可以花钱,买一部手机都是支持华为。但是如果选择加入一家公司,投入自己的绝大部分时间,那就不一样了。钱学森等大科学家可以放弃优渥的待遇回国做默默无闻的工作,但他们再也不能像杨振宁那样做世界前沿的研究、拿诺贝尔奖,而且一辈子的生活条件也没有很好。但我经过实地调研和访谈,确认华为并不是像外面传言的那样不堪一击,整个公司还在正常运行,该做什么项目还做什么项目,在食堂吃饭的时候电视机上就在播出与制裁相关的新闻,而大家都已经习以为常。因此,我力排众议,坚持认为加入华为跟钱学森回国完全不是一个性质,并保持了我的选择。这也是我一生中遭到反对最多的重大选择。
新员工入职培训的时候,我们跟人力资源部的一位总裁座谈,我就提出,可否效仿 “阿里星”,搞一个系统性的吸引优秀人才的项目。2019 年 8 月,公司恰好启动了 “天才少年” 计划,我也很有幸成为其中的一员。公司层面的 “天才少年” 计划当然跟我随口提出的建议无关,但我能够预判到公司对博士等优秀人才招聘越来越重视,而不是像某些人想象的那样受到了制裁就要收紧优秀人才的招聘。3 年过去,在领导和各位同事的关怀下,我承担了越来越重要的项目责任,发挥了越来越大的价值,也说明当年的这个选择没有错误。
尽管我只有很有限的工作经验,想告诉学弟学妹的是,在上述 “打分项” 中,领导和部门的重要度高于公司和研究领域的整体状况。一个人过得舒服不舒服,在工作中能不能受到重视,很大程度上要看领导,尤其是直接主管。跟领导的 vision(愿景)一致,合作起来会更顺畅。这就像是在读博过程中,导师的重要程度远大于学校和学院的名气。部门的重要度其次,主要看部门的业务和氛围,也就是业务的基本盘是否稳固,是否有想象空间,团队氛围是否和睦。在大公司中,公司股价的下跌可能会影响收入,但是短期内对个人工作的影响是不大的。研究领域的热门与否更是一个缓慢的变化过程,如果哪一天自己的研究领域垂垂老矣,再换也不迟,很多大佬都经历过研究领域的切换。
如果时光回到多年前,选择会不同吗?
有一部系列纪录片《人生七年》(The Up Series),从 1964 年开始记录英国不同阶层的 10 个男孩和 4 个女孩的生活,每 7 年出一集,至今已经到 63 岁了。这部纪录片想验证的就是 “七岁看老” 这句中国古话。我从这部纪录片中看到的是,尽管阶层跨越很困难,但每个人可以选择不一样的生活,“我就是我,是颜色不一样的烟火”。从 7 岁、14 岁甚至 28 岁,都很难预期 63 岁时的人生轨迹。
我认为我的生活也是如此。尽管很多选择并没有悬念,但生活的轨迹有太多的未知。我往往是基于自己的兴趣而非功利得失来做选择,所谓的 follow my heart。
21 年前,2001 年,小学三年级
我没有上一年级,是直接跳级到二年级的。一开始校长不同意跳级,我奶奶说我一年级的知识都学会了,校长说那就让他做做一年级的考试题,要是能答上来,就让他跳级。结果我一年级的题考了满分,校长又让我做二年级的,二年级的只错了一道题。校长说,要不然直接上三年级吧。我奶奶说,算了,孩子心智还不成熟,上了三年级怕被同学欺负,还是上二年级吧。
2001 年的时候,我刚开始学奥数。虽然小时候认字、做算术题比较早,但奥数班里到处都是所谓的神童。有些神童甚至比我还厉害,还有些神童不仅学习厉害,还多才多艺。我只有很小的时候学过手风琴和画画,后来都为了奥数让路,花三千多块买的手风琴也成了摆设。这么多神童,谁都不知道谁能学得最好,这时候是最不确定的。
14 年前,2008 年,高一
如果我早一点在数学竞赛和计算机竞赛中做出选择,集中精力搞一门竞赛,有可能拿到国家级金牌,从而上清华北大。但我并不只是功利地为了拿奖而学竞赛,因为数学和计算机都是我的挚爱,我哪个都舍不得放弃,这又不是谈恋爱,很多人一定要皑如山上雪,皎若云间月。如前文所述,竞赛期间我还搞网站、写文章,我的确是把竞赛当作了一种兴趣爱好。
2010 年,高三,如果我知道未来的兴趣会从数学转移到计算机,就可能会选择上海交大而非中科大。如果从一开始学的就是计算机专业,我是不是会继续参加 ACM 竞赛,是不是会跟着上海交大的同学们一起创业,或者是不是会出国读博?这些都是未知的。
7 年前,2015 年,研一
在合肥,我们正在寝室、LUG 活动室和少院机房紧锣密鼓地开发 USTC 评课社区,马上就要上线了。这也是我倾注心血最多的业余项目,至今可能总共花了接近 1000 小时来做开发和维护,我个人的 commit 有 552 个,代码数万行。作为对比,我的每篇顶会论文从调研、选题、设计、实现到写作投稿,个人大约耗时 2000 小时。当然,这没有计入研究团队里其他成员的时间,但评课社区团队的其他成员也花了很多时间。我在 LUG 搞的其他业余项目,比如 Freeshell、Blog、VPN 也都花了数百小时的时间,但是我离开学校之后就不再维护了,因此每个项目花的时间可能没有评课社区多。当时确实没有想到 7 年后的今天,评课社区能有这么大的影响力,这也是我们一直坚持维护的动力。如果当时推广到全国各大高校,有可能使我们成为自由职业者,用评课社区作为一个能养活自己的业余项目,甚至成为主业。
在北京,谭博的 ClickNP 项目已经构思完成,等我 7 月来到 MSRA 就正式开搞了。这个项目集中了全组的精干力量,还有微软 FPGA 作为大背景加持。按照谭博的说法,这篇论文要是都不能中,他就不知道怎样的论文才能中了。因此,那时候虽然还没有开始读博,读博的顺利就已经是大概率的了。
未来会有多少黑天鹅?
过去几十年,国际国内环境风平浪静,互联网行业一路高歌猛进,几乎每家头部公司和独角兽都预期了指数级的增长。但很多人都忽略了太平盛世仅占历史的很小一部分时间。近年来,国内政治环境和中美关系逐步变化,导致深远的影响,中概股的下跌只是冰山露出水面的部分。2020 年开始的疫情更是黑天鹅事件,随着病毒的不定向性变异甚至有可能成为 “大过滤器”。因此,“Plan A” 的稳定性和 “Plan B” 的可行性在当下显得尤为重要。
我向来危机意识比较强,早在疫情开始之前,家里就屯了足够吃一个月的军粮,包括压缩饼干和自热食品、罐头等,即使遇到上海封城这样的极端情况也最多是吃不到新鲜蔬菜,但不会断粮。此外,除了传统的云盘备份,我还对关键数据进行光盘备份,放在我自己家和我老家,虽然更新频率不高(回老家的时候)而且存储年限有限,但能起到一定的容灾效果。
混沌和未知的世界就像笼罩在楚门头上的天幕,当楚门试图挑战这个虚幻世界的规则时,整个世界都在与他为敌。但是,林子里的鸟儿终究是关不住的,楚门勇敢地选择了真实。