> For the complete documentation index, see [llms.txt](https://freebsd-journal-cn.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://freebsd-journal-cn.bsdcn.org/20240910-nei-he-kai-fa/we-get-letters.md).

# 读者来信

* 原文链接：[We Get Letters](https://freebsdfoundation.org/our-work/journal/browser-based-edition/kernel-development/we-get-letters/)
* 作者：Michael W Lucas

![mailbox graphic](/files/gDvpEhpNqA24buak3IZa)

**亲爱的科技界（乃至任何领域）最没用的建议专栏作家：**

**在整个开源界，内核开发者是精英。他们能实现真正酷炫的东西，发明巧妙的新功能，比如 ZFS、缓冲区缓存、内存保护。有什么建议能让我成为他们的一员吗？**

**我读过你的专栏好几次了，老实说我得告诉你：为了最大化成功几率，我会仔细听取你的所有建议，然后反其道而行。**

**——新手但不天真（Novice But Not Naïve）**

亲爱的 NBNN̈：

“做计算机工作还不够。我要让我的失败真正难以解释！”

很好。

许多人幻想内核开发者是编程精英。John Baldwin——多次入选 FreeBSD Core Team，也是本《期刊》编辑委员会主席——就是从写文档直接转做内核开发的。John 不幸认识我几十年了，所以我可以笃定地告诉你：他不仅不是什么精英，他身上那些引人注目、足以定罪、值得说道的事，统统与编程无关。内核开发者当然得达到最低限度的胜任水平，但除了几条规则之外，内核代码没什么特别的。把内核程序员当成精英，会在你起步前就毁掉你——所以我强烈鼓励你这么想。

不过，你若执意前行，执意要让自己织一个茧，蜕变成一位内核开发者，像一只动不动就 panic、会 dump 内存、会损坏文件的蝴蝶——那就立刻把梦想和目标分开。目标是可付诸行动、完全在你掌控之内的事情。实现梦想则需要别人替你出力。约那个让你心动的人吃晚饭？纯属梦想。约那个让你心动的人吃晚饭，被对方提醒你天生不值得爱、应该识相点别再像所谓 “浪漫爱情” 里那种令人毛骨悚然的主角一样纠缠人家？这才是完全可以实现的目标！

你掌控不了别人。为目标努力，别为梦想。

要想成为内核开发者，你可以设定哪些目标？

先读文档。比如《FreeBSD 操作系统设计与实现》《FreeBSD 设备驱动程序开发》《Designing BSD Rootkits》——后者为学习内核工作原理增添了有趣的转折。《FreeBSD Developers Handbook》免费可读。把脑子塞满，做完书里的练习。如果某个知识点你啃不动，没关系，早就有人写过文章和书讨论过它了。

注意，我没说 “问别人该怎么开始学内核”。如果你常逛邮件列表、论坛，或者互联网上更不堪入目的讨论板，偶尔会看到有人求教如何学内核编程。你也许以为这些人在找上面那份书单，但我这里给出的答案用最浅显的搜索就能找到，看起来像在求人牵手。毛毛虫会求助织茧吗？不会！它们又流汗又挣扎，才能挤进逼仄的茧，熬成超越自身的存在。你必须自己干。多数转变都死在这一步，因为人类钟爱舒适惬意、不可付诸行动的梦想，不喜欢丑陋艰难的目标。

像参与任何开源项目一样，你得找一小块下手。从 bug 开始。问题报告（problem reports）是准内核开发者的金矿。在可能的项目里翻找时，你又要再一次把目标和梦想分开。“解决几个 panic bug 并让我的修复被合入” 是梦想。它需要资深内核开发者注意到你的修复并选择采用。“这个月解决一个已报告的内核 panic” 严格说也不是目标，因为你不能保证一定能解决。“这个月花十个小时研究一个已报告的内核 panic，期间不每三分钟就停下来在社交媒体上吐槽、在工作群里抱怨、或者向我那只即使我天生不值得爱也不得不忍受我的宠物诉苦。”——喏，这才是目标！完成足够多这样的目标，你就能练就内核编程的本事。

不过，内核工作真正的难处在哪？

在于别人。

假设你写好了补丁，修复了已报告的问题，并附在 bug 上。你没法让项目成员注意到你的工作。即使他们注意到了，你也没法让他们原样采纳你的补丁。某个项目成员可能把你的补丁当作灵感或概念验证，然后基于你完全没想到的理由写了个完全不同的补丁。让人注意你是梦想。通过提交一整套高质量补丁让自己难以被忽视，才是目标。

毛毛虫怎么变成蝴蝶，这里有个有趣的事实。它们其实不变。我们看到毛毛虫爬进茧，蝴蝶飞出来，于是以为发生了转变——残酷的真相是：毛毛虫的茧是个棺材。毛毛虫爬进去，化成一团浆，只剩下一个基本相当于自组装蝴蝶套件的小块。蝴蝶的第一顿饭是 100% 纯正的毛毛虫浆糊。当你提交了第二十个补丁，仍然感觉没人在乎，请庆幸自己没有真的化成一滩肉泥。精神上的肉泥不那么显眼。

假设你的补丁被采纳了？然后呢？

还是人。

在那个神圣而至高无上的计算机科学研究组（Computer Science Research Group）分发原始 BSD 的光辉岁月里，一个人足以对 Unix 形成充分理解。一次完整安装只占几兆字节。是的，这包括编译器和源代码——“完整安装” 哪里不清楚？大学生都被要求读完并理解这些代码。

今天呢？等你读完基本系统的源代码，它已经变了，你得从头再来。成为 “内核开发者” 几乎不可能。你顶多成为负责内核某一个小切片的可信开发者。做维护会涉及内核的其他部分，这意味着要和负责这些部分的人讨论你的改动。在内核里干活和在用户态编程没什么两样，区别只在于别人相信你达到了某种最低限度的胜任水平。

如果梦想成真，你成了真正的内核开发者，你会发现人不是问题，人是 **问题本身**。你的每一处改动都会得罪某个人。用户和非内核程序员会有一种奇怪的想法，以为你是精英、知道自己在干什么、比他们少一些茫然。

既然你声明了不仅要无视我的想法还要反其道而行，那让我总结一下：成为内核程序员是通往幸福的唯一正道，祝你好运。继续做梦吧！

想向 Michael 提问？ 请发送至 <letters@freebsdjournal.org>

Michael W Lucas 与受人尊敬的 FreeBSD 期刊编辑委员会主席、精英内核开发者 John Baldwin 不同，他始终待在文档领域。他的最新著作是《Run Your Own Mail Server》，该书以 FreeBSD 作为参考平台。更多信息见 <https://mwl.io>。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://freebsd-journal-cn.bsdcn.org/20240910-nei-he-kai-fa/we-get-letters.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
