← 返回全部文章

从这里开始:为什么写 Between Layers

在抽象层之间理解系统,也在一个迅速变化的时代里重新寻找自己的位置。

2021 年,我认真维护过一阵博客。那次尝试对我其实很重要:整理学过的内容、把模糊的理解写成句子,让我重新找回了学习计算机的热情。写作迫使我承认哪些地方只是“好像懂了”,也让我重新感受到沿着一个问题不断往下挖的乐趣。

后来没有继续,原因倒没有那么宏大。维护一个博客有些麻烦,每次想写东西之前,总要先处理页面、格式和发布流程;更直接的是,我始终不太满意它的样子。主题和排版怎么看都不大对,甚至越看越觉得有点丑。写作的兴致慢慢被维护成本和审美上的别扭磨掉,博客也就停在那里了。

几年后重新打开这个页面,是因为我突然意识到:平时其实有很多有意思的想法,如果不及时记录,很快就会在下一个问题里消失。它们未必立刻能成为论文或项目,却可能是理解一个系统最真实的起点。与此同时,我正处在一个非常迷茫和焦虑的时期。重新写博客,也许既是保存这些想法的方式,也是整理自己的一种方式。

问题不只存在于某一层

计算机领域流传着一句很老的话:几乎所有问题,都可以通过增加一个间接层来解决。现实里的系统设计也常常沿着两个相反的方向摆动:增加一层抽象,换取兼容性、可移植性和更好用的接口;或者拆掉一层抽象,换取控制力,试图让数据和执行路径更接近硬件。

这很容易让人形成一个直觉:抽象层越多,系统越慢;路径越短,性能越高。但我越来越觉得,真正有意思的系统往往从反例开始。

1997 年的 Disco 就是一个很漂亮的例子。它没有为了适配大规模 ccNUMA 机器去彻底重写操作系统,而是在硬件和多个现有操作系统之间增加了一个虚拟机监控层。这一层当然不是免费的:论文报告的基础虚拟化开销在单处理器工作负载中最高达到 16%。但也正因为多了这一层,Disco 得以在更合适的位置统一做资源管理、页面迁移和复制,隐藏非一致内存访问的复杂性。在部分工作负载中,八个虚拟机组成的系统反而比商业 SMP 操作系统快 40%,页面放置机制也曾使执行时间最多缩短 37%。

一层抽象究竟是成本,还是新的优化空间,取决于它掌握了什么信息,又替上下两层承担了什么责任。

反过来也一样。减少抽象层并不自动意味着更快。被删掉的那一层可能原本在聚合请求、缓存数据、协调资源,或者屏蔽硬件中昂贵而不规则的行为。路径看起来更直接了,系统却可能因为失去全局信息而做更多重复工作。性能并不是简单的层数加减法;边界放在哪里、机制与策略如何分工,才是问题的核心。

“Between Layers”首先来自这种理解。我想看的不只是每一层分别做了什么,而是一个决定穿过层间接口以后,会怎样改变整个系统。

被迫成为“全栈”

以前我觉得,真正理解计算机全栈几乎是不可能的。硬件、模拟器、固件、内核、运行时和应用,每一层都足够一个人研究很久。与其宣称自己“全栈”,不如守住熟悉的范围。

NaCRE 改变了我的感受。这个项目逼着我从硬件机制和 QEMU 模拟器出发,经过 OpenSBI 固件、Linux 内核中的内存管理关键路径和容器运行时,一直摸到上层应用。遇到问题时,我常常无法把它礼貌地留给“另一层的人”:接口是我设计的,错误要由我追踪,跨层之后破坏的语义也仍然要由我解释。

在 AI Agent 还没有今天这么好用的时候,我曾半开玩笑地抱怨,手里的事情按正常分工应该是一个五六人项目。现在代码确实比以前容易写了,跨入陌生代码库的成本也低了很多。但 AI 带来的是个人能力边界的扩张,而不是责任的转移。哪些假设可信、什么结果算正确、失败之后去哪里继续追,最终还是我的责任。

这段经历没有让我觉得“全栈”突然变得简单。它只是让我不再本能地抗拒陌生的层次。很多过去不敢碰的东西,现在至少可以先拆开、验证,再决定是否继续深入。这也迫使我一次次跨过原来的舒适区。

学术玩具,和没有踩到的鼓点

但越是埋头把这个项目往前推,我越能感到另一种不安。很多时候,我会怀疑自己做的东西是不是仍然只是一个“学术界的玩具”:机制可以讲成一个完整的故事,原型可以跑出一组实验,论文也可能被接收,可它离真正进入现实系统、解决现实问题还有多远?离开论文的叙事之后,是否真的有人需要它?我常常没有把握。

这种不确定感在寻找实习时变得格外具体。以前我对“之后总能找到一份相关工作”还有一种朴素的信心;现在真正去看岗位,映入眼帘的却几乎清一色都是 AI 或 AI Infra。模型、推理、智能体、异构计算和大规模基础设施正在快速重写岗位的边界,而我更像一个擅长传统 CPU 架构的人:熟悉指令集、特权级、固件、内核,以及这些层次如何咬合,却越来越难在市场上找到一个直接对口的位置。

今年参加 ChinaSys 的一场沙龙时,这种错位感尤其强烈。我的直观印象是,大家谈论的几乎都是 AI 或 AI Infra。我并不反感,甚至真心觉得很好:很多人正在接近需求最旺盛、反馈最直接、最有机会产生 impact 的地方。只是坐在会场里,我也忍不住想到自己。

真好,大家都在做有 impact 的方向,而我还在构建螺蛳壳里的小小世界。

这句话里当然有自嘲,也有疲惫。说实在的,我也只是一个普通人,我会倦。手头这个项目已经持续了一到两年,我还在紧锣密鼓地把它真正放到硬件上跑起来。系统研究有它自己的时间尺度:设计机制、接通软硬件链路、验证边界条件,常常以月甚至年为单位。当外面的变化以周为单位发生,而自己的时钟还停留在一个漫长的工程周期里,很难不觉得自己没有感受到时代的脉搏。

AI 的确压缩了其中一部分时间。过去需要花几天摸清的代码和环境,现在可能几个小时就能得到一条可行的线索;很多机械性的实现、适配和测试,也可以更快完成。但当问题足够棘手,或者根本没有可以模仿的先例时,真正消耗脑力的部分并没有消失。系统的边界应该画在哪里,跨层之后哪些语义必须保持,某个优化会不会悄悄破坏安全假设——这些问题并不会因为代码生成得更快就自动得到答案。

把代码和环境搞清楚,也不代表事情就完美了;程序跑通、测试全部变绿,更不代表这个系统真的 work。测试只能说明被覆盖的那些路径得到了预期结果,却不能替你判断威胁模型是否找对,不能证明攻击者没有从另一个层次绕过去,也不能保证实现中的偶然行为就是设计所承诺的语义。尤其是安全系统,如果一开始保护的对象、信任边界或者攻击者能力就定义错了,后面再漂亮的实验也只是在精确回答一个错误的问题。

我可能是一个相当固执的人。出于做系统形成的直觉,对关键路径上由 AI 生成或修改的代码,我仍然会尽量自己完整 review 一遍。我想知道每一处状态变化从哪里发生,错误路径是否闭合,内存和权限的归属是否始终一致。这并不是因为人类审查不会犯错,而是因为最终需要对系统负责的人仍然是我。不能因为测试通过了,就把自己不理解的部分当成已经解决。

我记得 Linus Torvalds 讲过一个相近的判断:即使 AI 能写出更多代码,Linux 的开发速度也未必按同样的倍数增长,因为人看代码的速度并没有一起变快。后来我去核对,没有找到这句话完全对应的原文;他在 2026 年谈 AI 时更明确表达过的是,AI 会提高生产力,但不会改变编程的基本功;如果想要长期维护一个系统,开发者仍然必须理解最终结果。他甚至提到,自己在个人项目里使用 AI 生成代码后,依然会读源码乃至查看汇编。对我来说,这个重点并不是拒绝工具,而是承认审查、判断和所有权不会随着生成速度一起自动化。

于是,AI 更像是移动了瓶颈,而不是取消了瓶颈。实现和调试环境的难度被压缩之后,对人的要求并没有等比例下降,很多时候反而更高了:你可以尝试更多方案,也就需要否定更多看起来能跑的错误方案;你可以写出更大的系统,也就需要理解更大的状态空间。组织和领导看到代码变得更容易产出,往往还会自然地期待一个人承担更多工作、更快交付、更少出错。工具节省下来的时间未必会成为余裕,也可能只是变成下一项任务。

所以,即便系统开发的时间被 AI 明显压缩,做一个真正可信的系统仍然很累。代码不再是唯一稀缺的东西,注意力、判断力、系统直觉和愿意为结果负责的人,反而变得更加稀缺。

更诚实一点说,在继续做这个安全项目的时候,我已经很少感到那种单纯的兴奋了。安全问题当然仍然重要,手里的工作也并没有因此失去价值;但“重要”与“让我兴奋”毕竟不是同一件事。疲惫也不是一条严密的学术结论,却是一个很难继续忽略的个人信号。

真正让我焦虑的,也许不是自己没有立刻转向 AI,而是我缺少足够的外部反馈,无法判断自己是在做一件需要耐心的事,还是只是在熟悉的路径上越走越远。把这些想法写下来,至少能让我看清焦虑具体来自哪里,而不是任由它变成一团没有名字的压力。

不舒服,不需要先证明自己

我对发论文这件事也越来越难获得意义感。2025 年 10 月,我其实已经达到了博士毕业的形式要求;但如果只看文章,我也只是勉强够毕业而已。这两件事放在一起,并不能导向一个“我已经成功,所以有资格反思评价体系”的故事。我也不想把它写成这样的故事。

我们似乎很习惯一种优绩主义的叙事:一个人要先考上清华北大,才有资格吐槽应试教育的不合理;要先发表足够多的论文,才有资格说论文并没有带来想象中的意义;要先赢得一场游戏,才有资格质疑游戏的规则。可我不觉得必须如此。

当一个人感到不舒服时,不舒服本身就值得被说出来。它不需要先通过某种成功来换取合法性。别人可能觉得你矫情,那是他的判断;把感受压回去,却只能由自己承担。至少对我而言,把它说清楚会比继续假装一切正常好受一些,也可能因此发现,原来还有人在经历相似的困惑。

给自己一个交代

既然已经疲惫,也开始怀疑论文的意义,为什么我还在继续做手头的项目?现在支撑我的,已经不太是“再发一篇论文”或者向谁证明什么。用一句不那么正式的话说,我更像是还想“憋个大的”,给自己一个好好的交代。

我对前两项工作并不完全满意。它们让我走到今天,也让我满足了毕业的门槛,但没有给我一种真正完成了什么的踏实感。这不是对合作者或者论文结果的否定,只是按照我自己的标准,我还没有做出一个足够 solid、能够让自己安心收尾的系统。

所以这一次,我想把硬件、固件、内核和运行时真正接起来,让设计经得住实现细节和真实执行路径的检验。它最后是否成为一个有广泛影响力的方向,已经不完全由我控制;但至少我想认真把它做完,知道自己曾经把一个跨层问题推到了能够诚实面对的程度。这个交代主要是给自己的,和别人没有太大关系。

我也需要走出自己的边界

我选择的研究方向本身很难,也一直没有找到太多志同道合的伙伴。很长一段时间里,我都以近乎独狼的方式工作,就这样一个人坚持到了现在。这种状态让我获得了很强的独立性,也把我困进了一个越来越厚的信息茧房:缺少持续、具体的讨论,缺少能让我看到另一种做法的人,也很难判断自己正在坚持的究竟是独立思考,还是只是对已有路径的重复强化。

我所在的环境有特殊的保密要求,交流访问和实习的空间天然有限。老师对我有很高的期许,希望把我往学者的方向培养;这份期待给过我支持,也让我背上了不少压力。当周围很难找到同频的人、许多想法只能在内部循环时,我能明确感到一种压抑,也越来越不想继续把时间消耗在封闭的惯性里。

接下来,我想给自己找一点“乐子”——不是用娱乐逃开问题,而是去寻找能让我重新兴奋、持续进步的方向和地方。我仍然觉得自己需要实习,需要探索,需要走到不同的团队中看看真正优秀的人如何提出问题、合作和做出判断。这并不是要否定过去的训练,而是想给自己的认知增加新的输入。AI 可以放大一个人的产出,却不能替代真实的人际碰撞;它能帮助我离开舒适区,却不能告诉我外面的世界究竟是什么样子。

“层间札记”也是一种自我期许

这个名字既指计算机系统中的层,也指我此刻所处的边界。我不希望自己只局限在国科大这一方特有的天地里。世界远比眼前广阔,我想出去看看,也想知道自己放进不同的坐标系之后会变成什么样。

我也不想太早被磨平棱角。我过去经历过那种失去心气的状态;读研之后,好不容易重新找回了一点对技术的热情,我不想再轻易把它交出去。保持棱角并不意味着拒绝妥协,而是仍然愿意对不理解的事情追问,对不合理的边界动手,对自己真正关心的问题保留判断。

如果说系统研究教会了我什么,那大概是:边界从来不是天然存在的。它们是某种设计的结果,因此也可以被重新设计。

这里以后会写什么

我希望这里尽量记录自己的思考和当下的感受,也会有一些技术分享。论文需要一条清晰、可验证的主线,很多零碎却重要的东西很难被写进去:一个方案为什么被放弃,一次调试为什么走了很久,一项安全机制在兼容性和性能之间如何摇摆,以及做研究的人在这些选择中经历了怎样的挣扎。

这些未必都能形成结论,但我觉得它们值得留下来。至少在我向爸爸妈妈解释自己的研究课题时,他们觉得这些故事很有意思。他们也提醒我:如果不认真写下来,好像确实有点可惜。

所以,这一次我不想把博客维护成一组零散的知识点。我更希望它成为一份长期的思考记录:技术结论当然重要,但抵达结论之前的犹豫、冲突和选择也同样重要。

从这里开始,也从层与层之间开始。