> 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/2025010203-xia-you-xiang-mu/we-get-letters.md).

# 读者来信

![mailbox graphic](/files/x0OcwtgL7LfQBXi1Vakl)

回信先生：

许多人基于 FreeBSD 构建东西，打包起来，做成可安装的产品。我也有类似的想法。你觉得如何？

——Gonna Bring My Ideas to Life

亲爱的 GBMItL：

想法很有意思。我敢打赌，你还年轻到能记得希望是什么滋味。

当我用 FreeBSD 2.0 组装出第一台 Unix 桌面机时，我以为自己能征服这个操作系统。它有源代码，而我能读懂 C！我真诚地相信，只要逐行审视操作系统的内部，就能获得一种技能水平——只有 freebsd-questions 邮件列表上那些匿名、面目模糊、慷慨奉献的大师们才拥有。

和你一样，我那时还没学会仔细审视那些突如其来的、闻起来很香的、引你走向背叛的诱惑。

我在本专栏的其他地方写过我与 FTP 源代码的折腾经历，没必要再用第二次复述来玷污你的灵魂——尽管大量心理治疗，加上微剂量服用从二手店淘来的 Shirley McClain“揭示你的前世”音频磁带，又揭示了那段漂泊历程的更多细节。让我告诉你：我曾用脚本识别 FTP 代码中哪个函数调用了哪个函数，按此顺序整理源文件，然后把结果送到雇主的工业级打印机，结果打印了几千页之后才发现代码是递归的——这件事足以打消你可能怀有的、认为我有任何专业能力的任何幻想，但对你理解递归、下游项目，或者希望，都没有更多帮助。它只能说明，经验就是雇主逼你买新的碳粉盒时你得到的东西。

它还顺手把我那本已短小的希望又磨掉了一层。

我也在本专栏提到过 FWTK——如果没记错，是第四次。让我查一查我那本《Dear Abyss: The FreeBSD Journal Letters Column, Years 1-6》来核实——这本书在你附近的可疑可疑零售店里有售——没错，第四次。但我当时没怎么细谈。

FWTK。Fire Wall Tool Kit（防火墙工具箱）。没错，是 Fire Wall。在 1990 年代，我们还没发明复合名词。防火墙动辄数万美元，但 FWTK 让你能在装有两块网卡的廉价 Unix 主机上为 HTTP、SMTP 等安装代理。组织内部的所有连接都终止在 FWTK 主机上，由它去获取所请求的资源，再交还给你。它支持所有现代协议，比如 HTTP 1.0 和 Gopher，通过 plug 接口还能连到你 ISP 的 Usenet 服务器。你还需要什么呢？它干活很可靠。

许可证禁止商业用途。你不能转售 FWTK。

但你可以做独立顾问，为客户安装和维护 FWTK。

我那时是独立顾问，带着笔记本电脑、戴着系铃铛的帽子在一家家公司之间游走，靠“用交叉线级联集线器”、“被空气中飘浮的玻璃纤维 *绝缘层* 堵塞的 PC 会过热起火，因为，你懂的，绝缘”这类不朽原则修网络。脚本小子的时代刚刚开始，本地一大批律师事务所都想要一个那种花哨的防火墙玩意儿。律师事务所看起来是绝佳客户：自己收费 250 美元/小时的人，看到顾问只收一半价钱也不会皱眉。毕竟，你只声称自己的价值是他们的一半。

安装 FWTK 不难。下载源代码，编译，把二进制文件塞进 **/usr/local/bin**。配置几个文件——砰——你就有了与昂贵大牌防火墙不相上下的防火墙，最棒的是，客户的钱进了 *你的* 口袋。

FreeBSD 的 FWTK Port 让整个流程轻而易举，但我满足吗？不，我不满足。因为，你瞧，我手上有源代码。源代码让人野心勃勃。源代码让人以为自己无所不能。世上到处是这样的人：发现自己能读懂源代码，就突然以为可以无所不能——比如革新互联网支付、重塑汽车传动系统、造出真正的 1950 年代风格火箭飞船，或者重构政府，而对其中任何一件事都一无所知。他们有时半路发了财，但最终必然在尖刻的耻辱与刻薄的羞愧中失败，因为能读懂源代码的聪明，跟是否胜任、是否是有价值的人毫无关系。

我以为自己能改进一切。啊，希望，多么甜美的毒药！

如果我能构建自己的 FreeBSD，已经内置 FWTK 和适当的配置文件，甚至让这些文件预先初始化好 RCS 版本控制，那安装时间就能从四小时压缩到一小时。想想那多出来的三小时我能干些什么！我能……拼命去找下一个需要安装 FWTK 的客户，就这么回事。别管什么花重金请昂贵顾问的全部意义就在于客户能看到你为他们卖力流汗。

我只要把源代码塞进 **/usr/src/contrib**，改一个 `Makefile`，然后砰——构建操作系统时它就会构建这个 Port。（那个年代也没有 **freebsd-update(8)**。每个安全补丁都得从源代码构建受影响的组件。FreeBSD 没有 Open Group 的 UNIX™ 认证，但它毫无疑问是捶胸顿足的真 Unix。）

就像参与“摸电脑”这项丑陋极客运动的所有事情一样，它失败了。

我把错误信息复制到 Stack Exchange——不，等等，那时还没有这种网站。1990 年代那些强大的搜索引擎主要是按恋物癖查询设计的。不过 FreeBSD 网站有搜索引擎，邮件列表归档也有索引。我学，我改错，又制造新错误。不是令人激动的错误。也不是有用的错误。只是错误，被磨碎、被克服，又用来制造更多错误。

但一旦整合完毕，我就能运行自己的发行版，把它刻到 CD 上，得到一张全补丁、可安装的防火墙。别管 FreeBSD 那时还没有 **release(7)** 手册页。邮件列表归档里有怎么做的笔记！

我把自己几周的空闲时间都花在了那个项目上，其中“空闲”的定义是“从家人、洗碗和洗澡那里偷来的”。

请记住，我只是在尝试整合贡献的软件。我没在做诸如那些 HardenedBSD 疯子试图同时修改核心内核代码又保持与 FreeBSD 本身同步之类的事情。不过话说回来，HardenedBSD 有使用 git 而非 CVS 的“优势”。（让人相信软件分叉是合理、可维护或可持续的，可能是 git 犯下的最大罪过，但说远了。）

即便在需要防火墙的律师事务所都用光之后，我仍坚持下来。我不会让一坨愚蠢的计算机代码打败我。毕竟，像 *那位* Jordan Hubbard——他出了名地读了 **wall(1)** 手册页，心想“它不可能这么用”，然后立刻给全世界每一个互联网用户发了消息——这种人能做到，我当然也能！

我失败了。

我和 Jordan 的区别在这里。他愿意，甚至渴望，大规模地失败。在所有人面前失败。

Jordan、Rod Grimes、Nate Williams、Mike Smith 和所有那些人把自己的工作放到了世界上，吸引其他人加入他们的愿景。他们聪明地知道源代码不会赋予他们了不起的宇宙级力量，但仍凭倔强和创造既酷又实用之物的意愿坚持下来，而不像我是出于倔强和贪婪。

偶尔，他们甚至会把这个愿景写进文档。

于是就有了今天的 FreeBSD。

那么，你该做下游项目吗？你有愿景吗？你有无限克服自己错误的能力吗？你愿意告诉全世界你做了什么吗？那就去为一个崇高的事业做志愿者，帮助那些不如你的人吧，因为那才是改变世界的方式！

对，那意味着离开你的键盘。抱歉。

行吧。去做下游项目吧。看我在不在乎。不过别重蹈我的覆辙。去犯你自己的错误。那是学习的最佳方式！

另外：律师事务所邀请你工作时，先联系他们用过的其他承包商打听一下。和律师事务所讨要未付的发票很难。毕竟，他们手底下全是律师。

有问题想问 Michael？发送至 <letters@freebsdjournal.org>

Michael W Lucas 是《Absolute FreeBSD》《Run Your Own Mail Server》等太多其他书的作者。他大概又需要调整药物了。再次。了解更多请访问 <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/2025010203-xia-you-xiang-mu/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.
