> 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/20210910-freebsd-kai-fa/we-get-letters.md).

# 读者来信

* 原文链接：[We Get Letters](https://freebsdfoundation.org/wp-content/uploads/2021/11/Weve_Got_Letters.pdf)
* 作者：MICHAEL W LUCAS

致敬，噢，伟大的来信专栏大师！

既然我已经把“拍马屁好让你注意我”这件不可避免的事办完了，我就问：你疯了吗？你本该回答人们真诚而发自内心的来信，结果你告诉他们就算只是问一下也注定完蛋。这一期是开发专刊，我敢打赌你一定会在你的版面上痛骂开发者。

你怎么敢，先生？你怎么敢？

——不是粉丝

最亲爱的 NAF：

我对开发者绝无成见。其中大多数——呃，许多人是可爱的人。我只是希望他们能把毕生精力投入可能改进文明的事业，比如志愿在路边捡垃圾。

我的问题在于代码，不是编码者。我们把计算机代码当成值得囤积的珍贵财宝，可实际上它就像核废料里散落着几颗红宝石。虽然 CSRG 出产的每一行代码都是无杂质的白金，但大多数代码仓库里都是一大堆勉强能用的喷射物，支撑着偶尔闪现的才华火花。其中一些闪光的代码行被枷锁束缚着，支撑着威胁我们文明的元凶，比如 Facebook。

是的，这个世界——其实是互联网，但如果你是个开发者，互联网不就是你的整个世界吗？——上充斥着如何编写更好代码的文档，但它们彼此互不认同，而且你们大多数人根本懒得读说明书。不，别争辩。我写那些文档；我对你们中有多少人读这些玩意儿有着近乎邪恶的了解。

如果你想成为一名开发者，又想改进文明，那就用你来之不易的聪明才智去减少这个世界使用的代码量。

每一行代码都是一颗技术债务的种子，等待机会绽放成一朵恶性肿瘤；每一个程序都是它们可怕嫩芽的农场。你安装的每个软件包在你登出的那一刻就开始被忽视，这就是为什么你们中有些人开着六年未关的终端会话，还觉得没关系，因为服务器在防火墙后面，反正我们都完蛋了。搞电脑的人总以为有技术解决方案，而唯一的解决方案是关掉笔记本，在现实世界里混上一两辈子。

很少有开发者会把整个职业生涯都花在编写干净、全新、完美的实现上。大学批量生产出这些眼睛发亮的疯子，他们以为自己会像高年级项目要求的那样用 Java 写 IP 路由器，然后他们找到一份工作，被脸朝下扔进核废料缸，被告知要让它不再具有放射性。他们花无数时间修复别人因为对自己代码工作方式理解不足而造成的 bug，直到他们资历深到被允许写自己的 bug 为止。

这足以让人想要从一片干净的场地开始，写一个几乎无用的程序，希望能借此展示优秀的软件应该长什么样，然后发到 Github 上，只为了证明他们存在。或者他们曾经存在过。你知道 Github 有一个设置代码继承人的功能吗？那个你为自己满意而写的、但被别人发现并提交 bug 直到它接管你生活、最终让你中风的恐怖程序？在你退休、开始选择晚年要吃哪个牌子的一元店猫粮之前，务必为你代码的下一位受害者指定继承人。如果你选我，我会立刻把所有权利拍卖给最不光彩的出价者，并用所得收益玷污你的遗产。

最英雄的开发者是那些删除代码的人。许多代码几十年没被碰过，因为似乎能用，但实际上它已经以无人察觉的方式失败了。研究它。该因为它老就拔除吗？当然不！只有存在更受维护的替代方法时才该拔除。

大概是一个库。过去几十年里我最不讨厌的“创新”之一是 FreeBSD 的 libarchive。

Unix 有太多用于压缩和归档数据的格式，因为其中大多数是在 Unix 上为 Unix 而发明的。经验不足十年的人能理解何时该用 **compress(1)** 而不是 Microsoft CAB 档案吗？不能，因为除了少数硬核档案格式专家外，没有人无论经验多少还记得这个。那多头蛇一样的 tar 格式呢？消灭一种 tar 格式，就会长出两种来取代它。更糟的是，每种新 tar 格式都针对越来越特定的用例做了优化。

每个归档程序都支持自己的格式。其中许多对其他格式只有勉强支持。我刚开始当系统管理员时，能用 **tar(1)** 解压 zip 档案，除非 zip 格式真的被压缩过，或者某个白痴（我，我就是那个白痴）给文件名贴错了扩展名。

libarchive 提供了压缩和归档真理的单一中央来源。依赖 libarchive 的程序可以处理任何文件格式。在 libarchive 中发现并修复的 bug 立即传播到每个链接它的程序。

libarchive 的真正好处是它减少了使用中的代码量。原本几十个程序各自拙劣地实现它们所谓对自己偏好格式的支持，这些程序抛弃自己的引擎，转而引入 libarchive。这个库也许有数万行代码，但使用它移除了数十万行代码。而且，它让系统管理员能用自己喜欢的归档工具打开任何东西。在我职业生涯早期，我学会了熟练使用 **tar(1)**，就像某些马戏团表演者熟练地把拖车链从鼻孔塞进去再从耳朵里拉出来一样。今天，我用 `tar` 打开那些让系统管理员头疼的 CAB 文件。

与此同时，GNU tar 还依赖文件扩展名。我不知道 Linux 的人怎么应付。也许这就是他们为什么那么紧紧地拥抱他们的企鹅。库会不会走过头？不会。只有远见会失败。某晚在 BSDCan 上，几位喝得比睡得还多的 FreeBSD 开发者冒出了一个天才的火花，实现并发布了 libtrue——一个 **true(1)** 程序的后端，可被链接到任何程序中。可悲的是，世界未能领会这项伟大的创新，libtrue 至今未被广泛采用。

如果你想成为一名开发者并让世界更美好，研究你的核废料，着眼于减少它。它是否有古老的功能现在可以由一个维护良好——大部分维护——呃，无论如何都维护着——的库来承担？是否有应该放在库里的通用功能？

你如何减少世界上的代码量？因为代码毫无疑问是毒药。看看它对你做了什么，让你质疑我的道德，而我显然不在乎。

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

**MICHAEL W LUCAS** 是《TLS Mastery》、《Absolute FreeBSD》和《$ git commit murder》系列的作者。他的《DNSSEC Mastery》和《Domesticate Your Badgers》应在 2022 年初出版，要阻止他已经太晚了。请把你的问题提交至 <letters@freebsdjournal.org>。


---

# 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/20210910-freebsd-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.
