今天收到了一个学弟的私信:
学长好,之前看到了你在论坛的总结贴,作为研一小登最近很迷茫,很想知道学长当初为什么选择这种偏底层的技术发展道路(主要是感觉周围人除了java就是java,有点听烦了(笑)),现在去看招聘软件的感觉就是什么都能干但是又好像什么都干不了,也是很sad。在帖子里看到学长描述的这种技术研究可能比单纯当后端码农有点乐趣,想了解一下想走偏底层的技术路线需要什么前置能力以及如果学到了些东西可以去什么行业上班。
本来想直接简短回复的,结果字越敲越多,遂顺便作为一批文章发布出来,希望能帮到一些有类似迷茫的同学。
为什么选择虚拟化?
论坛上都是 Java 后端和算法,其实也可以理解,毕竟这两块业界需求多,学校自然也产量大。对于任何人,在大模型把我们的工作吞并之前,无论在什么时候这二者之一都不会是什么太错误的选择。不过确实其他行业的一些经验少了点。
在当时为什么选择去了阿里云做虚拟化,直接原因可能比较简单,就是当时我在飞书客户端 Rust SDK 部门实习的久了觉得没啥意思,似乎能看到在那里继续干下去的上限在哪里,有种「拔剑四顾心茫然」的感觉,外加那段时间干的也不是很顺心,就打算在研二暑期换一家公司实习,而这个时候我现在在的这个神龙虚拟化部门又恰好在招人,于是我就在 23 年春夏之交买了张高铁票,去了杭州。
如果要问及为什么选择做基础架构,或者说所谓的偏底层的技术发展道路,那可能就要追溯到更久远的故事了。在我还是读初中的小登时,那个时候在安卓社区流行所谓的「刷机」,也就是替换手机的 ROM 镜像,实现在手机上运行不同厂商的自定义 UI,甚至运行第三方适配的更高版本的 Android 系统。别人打包的 ROM 刷多了就会想自己也看看怎么搞,于是在那个时候逐渐看着 GitHub 上一些开源第三方 ROM 的 Readme 和能搜到的一些教程,磕磕绊绊地打了几个包发到什么 MIUI 论坛和 XDA。在同期或者更早的时候,也从不知哪个渠道了解到了 Linux,周末没事就在家里给电脑折腾各种乱七八糟的发行版。为了编译那些 ROM 和搞什么 Gentoo、LFS,我家那台 2c4g 的老电脑也算是没少跟我遭罪。这些在小时候做着玩的东西可能没在互联网上留下太多痕迹,但让我感觉折腾这些「under the hood」的东西很有趣,特别有成就感。
再后来上了北邮,大一帮其他学校的女同学代打 CSAPP 实验觉得挺有意思,读了 CSAPP 那本书,了解了一些处理器还是 OS 的基础原理。再后来北邮开 CSAPP 课那学期的寒假前,在沙河图书馆读到了《软件/硬件接口》和《量化研究方法》,这下算是了解了一个常见的 CPU 内部是怎么设计以及如何做各种取舍的。第二年开春,发现有个叫龙芯杯的比赛,能从 HDL 开始写起搭 CPU,还能在自己写的 CPU 上面去启操作系统,就报了名折腾了半年。期间翻了无数历史知名处理器的相关论文想整个大的,奈何最后发现 FPGA 硬件结构特殊,在其上能整的活实在有限,最后优化了个五级顺序双发流水线,在上面跑个 uCore 了事。硬件上写出了问题又没有什么先进的调试方式,就只能挂 ILA 采样,对着一堆数据大眼瞪小眼,搞完比赛感觉调试能力突飞猛进。那半年过的着实快乐,公费去了趟西宁旅游不说,能看到操作系统在自己写的硬件上跑起来是非常酷的一件事。
再然后就是与体系结构结缘,本科毕设研究生毕设都是 RISC-V 处理器了。就着这个技术背景,很多人都会认为我应该去找个做处理器的地方,比如什么龙芯、平头哥或者开芯院。但在很早我就否决了这个技术方向,一个是我真写过这玩意,觉得抠时序、搞设计是非常消耗脑细胞的活,如果真把这兴趣弄成工作会是一件非常痛苦的事;外加这一行不像软件一样被 FSF 革命过,很多代码等生产资料都被 NDA 隔离在各个公司内部,外加硅工和码农的薪资也是有些差距。而在我 23 年 3 月从飞书请长假,真的开始思考自己后续该做什么工作时候。大概考虑了这些:
- 算法:学不会,手上还没有什么 A 会,根本选不了。
- 业务开发:大三在飞书 iOS 和后来在飞书 SDK 部门时接触过一部分业务代码,也客串写过一些,总的来说感觉代码太过模版化,属于可以写,但干起来提不起兴致,一眼望到头的工作。
- 基础架构:计算、存储、网络三大件里,我对搞计算相关的工作比较有好感。同时,客观角度来说,网络完全没了解过直接 PASS;存储在我择业的 23 年,随着某国产分布式数据库的破圈,学过 MIT 6.824 和 CMU 15-445/645 两件套的老哥如过江之鲫,搞的就差没要求应届生也要有 3 年从业经验,而我除了在 PingCAP 薅了个马克杯,给 RisingWave 修了点小 BUG 外就没什么相关经验了,属于票友水平,不足以支撑我找到一个靠谱的工作。最后在计算这边感觉虚拟化看起来有意思,于是打算去做相关工作,并在作出决定的第二天投了论坛里阿里云的内推,同时开始看相关的书。
前置能力与就业岗位
说实话,我认为在校招乃至更早的实习阶段,只要「有好奇心,愿意去读代码、读文档探索运行逻辑」就够了,其余的能力都可以在后面的工作中学习补齐。硬要说的话,至少做虚拟化可能需要下面这些能力(按照重要性排序):
- 能看懂,能写 C/Python。
- 了解 OS 的一些基本原理:比如中断是怎么处理的,为什么 Linux 要区分上半部和下半部;内存如何管理,为什么要用大页;任务调度怎么做。这些基础如果不有一个概念上的了解,就无法从中区分出虚拟化可以利用来做优化的点,遇到问题时也只能惊呼不可战胜。
- 了解虚拟化的硬件原理:例如 X86/ARM CPU 虚拟化设计上的区别;嵌套页表是如何实现内存虚拟化的;IO 虚拟化怎么做硬件加速。
- 较强的调试能力,尤其是在 coredump 现场丢失的情况下,凭日志反推问题成因的能力。
- 见过、分析过系统设计的取舍案例,并能判断出在设计新功能时应该如何在各项指标中做取舍。
至于就业岗位,总的来说,所有涉及计算资源的隔离和切分的地方都可以用上虚拟化技术,在市场上这一行主要去向大概有这些:
- 云服务公司的 ECS 部门:做虚拟机的,国内主要就是阿里云、腾讯、字节火山云和华为云;各家的工作内容大同小异,大多是围绕 QEMU/KVM/Libvirt 这套技术栈,针对新的 CPU、IO 硬件等做适配和性能优化。当然也有一些软件功能开发,这就不足为外人道也了,可以看阿里云最近在系统相关顶会发的一些论文。
- 云服务公司的容器部门:一些安全容器也会用上虚拟化,主要是 KVM 配上一些轻量级虚拟机,主流应该是 Kata-container,这些地方的主要诉求就是隔离和轻量化以及启动速度要快。和做 ECS 的区别主要应该是做容器的 PV 设备玩的更花,讲究一个 Guest 和 VMM 协同工作。
- 硬件厂商:例如 Intel、ARM、AMD 这些地方都会有一些岗位,毕竟他们不能指望云服务公司自己就能把新增的虚拟化功能直接应用起来然后帮助推广。实际的工作流程大多是硬件厂商做新增硬件功能的适配推到 Linux 内核和 QEMU 上,他们自己或者云服务商在从上游回合需要的代码。
- 开源软件公司:例如 RedHat 和 Linaro,尤其是 RedHat,主要工作应该就是维护 QEMU/KVM/Libvirt 社区版本和开发一些硬件无关的虚拟化功能(例如 TCG 和热迁移这些)
- 车企:例如理想和一汽,在现代新能源汽车控制器逐渐集中化的当下,车企是有把不同部分的控制单元在软件上通过虚拟化技术做隔离的需求的。最基础的就是智能驾驶和车载娱乐部分肯定要分开,要不然车机死机了智驾一起完蛋,约等于车主要和车机一起报销了。
除了这些常见的的就业方向外,新兴的一些方向,比如 agent 也需要使用虚拟化技术来做隔离,比如我就遇到过 DeepSeek 的 HR 说他们也需要做相关技术的。 总的来说,所有的传统基础架构相关的工作都会比较「专」,业内需要相关经验的公司就那么些,大多集中在大城市;而且有些方向还已经变得非常卷了(这里点名数据库,尤其是 TP 的),而有些行业则搞的像是夕阳行业,十多年没有重大理论创新,光是围绕现有架构缝缝补补(例如虚拟化)。行业稳定倒确实稳定,毕竟比较吃经验,有些东西只有对着问题现场琢磨很多个工作日才能想通,但这也意味着这些行业留给年轻人的工作和位置并不是那么多。
对于还没有毕业的同学我更建议看看和当下正火的大模型相关的工作会更好些,比如什么 agent 和推理优化,在那边探索空间够大,有足够多的 unsolved problem,有更多的 low-hanging fruit,同时大家都没什么经验,几乎都是同一个起跑线,年轻人靠着自己的能力和想法也许能做出来的成就会更多些。最简单的一个例子就是在虚拟化这边你如果能把虚拟化整体内存占用干掉 3%,那都是值得投入大量人力持续好几年的一个工作;而同时你可以在微信上搜搜中文 AI 三大顶会(机器之心、量子位、新智元)一年有多少「内存需求砍 42%」、「提速 79%!」、「分数提升 300%」的工作。
当然,如果真的对这些传统的基础架构工作感兴趣,还是可以直接冲的。这个领域虽然搞不出来什么颠覆的大新闻,但一些微小的优化叠加上现有的业务量,也能为自己和业界带来一些收益。如果研一时间足够的话,甚至可以去找一份相关的日常实习,看下工作内容是否有你看到的那么有乐趣。祝你在技术的海洋里,找到属于自己的那座灯塔。