> 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/20191112-wang-luo-xu-ni-hua/we-get-letters.md).

# 读者来信

作者：Michael W Lucas `letters@freebsdjournal.org`

***

**亲爱的、不知怎的就被套来回答期刊信件的智者：**

大家老跟我说 Ports 和软件包系统多棒，可我老是不得不自己编译软件而不去用软件包。太痛苦了。他们怎么敢这样？你就不能让大家看看 Ports 和软件包系统没那么伟大吗？

谢谢，

**Annoyed Compiler**

***

**亲爱的 Annoyed，**

一切都是灾难。这是系统管理的核心原则。嗯，或许不算核心，但绝对是系统管理员守则第三条。对软件包系统来说更是双重适用。

我们在不同软件包系统间游走，拎着一长串需求，比如自动依赖安装和升级，支持我们环境的 LDAP、YP、KerberosIV 和 KerberosV 认证系统，更别提某位 1989 年的系统管理员宣布组织官方文件系统是 FAT16 候选版——他把备份带夹在强壮的臀部间从雷德蒙德开发实验室偷渡出来——而你这辈子都得忍受这个决定，因为那家伙晋升为 Chief Albatross Officer，再没更新过技能。还没算老板喜欢给外部供应商写巨型支票，同时无聊时就削员工工资。

或许你身处技术上的绿地，从零开始架构一切，短暂地自我催眠它会辉煌、完美、部署和运维都是乐事。当然，你不能完全按标准来。你想到处用某个特殊功能。这个功能会让你的环境对你完美，对任何人都不可忍受——这是你作为创始人的特权。

简而言之：你的需求独特，独特方式恰如没有两颗坏疽的脾脏完全相同。

无论你用什么操作系统，任何软件包系统都心怀恶意地、乐呵呵地迎合最小公分母。软件包系统设计者和其他历史人物目标一样：让人们别来烦自己，好让他们以最少折腾去做自己想做的事。这就退化成尽可能为尽可能多的人解决尽可能多的问题。我们这些有特殊需求的人——我也是其中之一，你不知道我的需求有多特殊——只能在外面敲门想进去。高档夜店至少有门房傲慢地通知你他们的软件包系统不适合你，他们还到处传我那张写着 NOPE 的照片，如果这都不算歧视我不知道什么算，但我还是更喜欢直白地把人拽出队伍、推进伸手可及却又莫名阴暗的小巷、绕到垃圾桶后面，用他们练就的精准暴力解释“你不受欢迎，再说一遍”的软件包系统。

更糟的是，这些软件从来不是设计来协同工作的。我们有 MariaDB、Postgres、Apache、nginx、lighttpd，还有 Rail Road Ruby 或随便他们叫它什么——某人有了个想法就非要去实现，从没想过他们试图让软件更好会给社会造成多少不计其数的人时附带损害。不是说这些想法都坏（当然，好吧，systemd 和整个 Oracle 算例外），但人们老抱有那种半傻的希望：也许软件不必那么糟糕。

希望的存在是为了教年轻人：没有希望。

你当然忍不住让事情更糟。

你接手一个尖叫的烂摊子环境，围绕一台跑 Antediluvian Netware 的原始 286 搭建，用喝过的茶袋和打烂的蛞蝓泥粘合。前任们做过的每一个糟糕决定都阴魂不散地缠着你。你看着这一切，决定你需要的是再盖一层日晒的袋熊粪便。你可以叫它“合理化”。听起来不错。而且你是理性地做出这个决定。因为你是个理性的人——

咳咳。失礼。我刚才笑得咳出了肾。

因为你是为自己的偏见找了自我辩护，还称之为理性。这样好多了。

所以你需要支持多版本协议的软件包，还有没人用的文件系统，可能还需要 SNMP，因为你的钉子床用钝了，你不想升级到 autotrepanation 来满足痛苦需求。

你想把从没设计来协同的东西放在一起，让它透明运转。

好消息是，前人已做过这些工作。其他人已决定 MariaDB 和 Postgres 应该同时与 nginx、或 Perl、或天知道什么集成。某些网站姑且隐去名字但押韵“Whack Derange”上，可疑的建议满坑满谷，帮你实现那幅朦胧的、绝非噩梦我保证的愿景。

再说，我也一样有罪。我刚写完一本关于 Shoggothic Nightmare Misery Protocol（SNMP）的书。我的可怕研究要求我用我相当确信没人尝试过的特性构建 net-snmp。到那悲惨的地步，我已能看见维度 πr²，并知道那只所谓“松鼠”的真名——它偶尔挂在我办公室纱窗上，尖叫它永恒敌意颂歌——所以我去 Ports 系统决心开辟我那不可言说的路。结果发现 Eternal Madness 已是构建选项。（他们叫它“embedded Perl”和“MFD rewrites”，但那就是永恒疯狂。你不必信我。我们这些 Know Too Much To Ever Be Happy Again 的人欢迎你的加入。）

无论你需要什么特性组合，都有很大可能别人已经做过。

而这正是 Ports 和软件包系统如此宝贵的原因。它让你轻松地重复错误——他人的和自己的。规模化地重复。如果你决定组织要通过 RADIUS 把通用认证粘到那台 Netware 服务器上，你可以构建自己的软件包仓库，全局启用 RADIUS 于所有支持它的东西。你用软件包系统把你的错误分发到你那一小片世界。没人能阻止你。

所以，亲爱的来信者，你完全正确。Ports 和软件包系统很糟。但只是因为一切都很糟。我鼓励你花点时间学它如何工作，只为让你能最快地在组织基础设施上部署你创新的新一层，赢得继任者永恒且正当的憎恨。 •

有想问 Michael 的问题？发到 `letters@freebsdjournal.com`。

***

**Michael W Lucas**（`https://mwl.io`）的最新著作是《Sudo Mastery, 2nd Edition》和《Terrapin Sky Tango》。

***

## 为我们写作吧！

联系我们 Jim Maurer 提交你的文章创意。 （`jmaurer@freebsdjournal.com`）


---

# 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/20191112-wang-luo-xu-ni-hua/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.
