Refactoring English: Month 2

Michael Lynch

Refactoring English(《重构英语》): 第 2 个月

一句话总结

在 AI 革命期间写书是否明智?

亮点

  • 我开始怀疑自己置身于 AI 革命之外是否正确。
  • 在投入更多时间之前,我应该先向自己证明读者愿意为我的书付费。
  • 我可能是全世界最后一个才发现 RSS 是阅读博客的绝佳方式的人。

目标评分

每月初,我都会定下当月想要完成的目标。以下是本月目标的完成情况:

发布 2024 年年度回顾博文

我对最终的成果很满意。这一年发生了几件大事,我已经分别写过文章,所以一开始很难决定年度回顾中该包含哪些内容。我觉得最终的成果很好地总结了这一年。

它曾短暂登上 Hacker News 榜首,但随后突然被降至第 63 位,原因不明。

完成本书的另一个章节

实际完成的内容比预期稍多,因为原本没打算加入测验。我觉得这个测验还不算特别出色,但把文字内容与更具互动性的形式结合起来挺有趣的。

根据读者反馈修订教程章节

我根据读者的建议做了一些行文层面的修改,但最大的修订是新增了一节。有几位读者希望能获得关于如何在示例中使用合适的虚拟数据的指导,我也认为这部分内容应该加入文章。

在 AI 革命期间写书是不是很傻?

显而易见,AI 正在引发软件开发领域的革命。

AI 模型如今已达到了胜任的初级工程师的水平。按照目前的进步速度,AI 将在两年内在大多数编程任务上超越最优秀的人类。

我预计软件行业的大部分领域都将围绕 AI 进行重构。在我有生之年,最接近的类比就是从桌面软件向互联网的转型。

我目前没有工作,也没有公司要运营,所以完全可以自由地去做任何想做的事,以利用 AI 的最新进展。

而我却在写一本与 AI 毫无关系的书……

我不想一味追逐最新、最炫的东西,但置身于 AI 革命之外,又感觉就像在 90 年代末看到互联网兴起时说:“我想把软件刻在光盘上,让顾客通过邮寄来订购。”

当初选择专注于写书的理由依然成立,但其机会成本比我六个月前规划时预想的要大得多。

这本书真的有市场吗?

另一个问题是,写这本书是一项长期投入,而我还没有信心确定人们真的想读它。

我发布的第一个章节获得了积极的反响,但那是比较有趣、受众较广的一章。我担心像《被动语态是有害的》这样的章节,更像是“多吃蔬菜”式的说教。人们或许会承认它有益,但读起来并不有趣。而我常去的 Hacker News 或 Reddit 这类平台,也不会去推荐一篇关于被动语态的文章。

问题在于,我的书中大多数章节都是这种“多吃蔬菜”式的章节。

我可以重构结构,把“大声朗读你的文章”这样的技巧放到博客章节里来讲,但这不太合理,因为它适用于各种写作,而不仅仅是博客文章。

但也许我的思路错了。我不认为在网上浏览的人会想读一篇关于被动语态的文章,但如果他们决定要读一本关于高效写作的书,他们很可能会去读被动语态那一章。

我原本以为在网上免费发布的样章必须与书中的章节一字不差,但其实不必如此。我可以随心所欲地为网络改编内容,所以如果我在博客样章里谈到大声朗读写作内容,那也没问题。在正式的书中,我可以把朗读技巧安排在博客章节之外。

尽管如此,在再花几个月时间之前,我仍需要验证这本书是否有足够的潜在读者。因此,我的计划是先专注于另一个有趣、易读的章节,比如《写出开发者愿意读的博客文章》,然后基于最初的三章在 Kickstarter 上发起预售,让大家预订。我需要设定一个我认为合理的最低预订量目标,以此来决定是否值得继续写下去。

后知后觉:RSS 真不错

RSS 已经存在 25 年了,但我以前从未通过 RSS 来阅读文章。

我在 2011 年试过 Google Reader,但当时订阅源中没有足够多有趣的文章,所以我渐渐不再查看,也就把它忘了。

在过去几年里,有几件事让我对 RSS 的兴趣大增:

  • 我以前在 Twitter 上关注的技术人士如今已分散到不同的平台。
  • 我越来越意识到社交媒体会放大博眼球的帖子,而不是有趣的技术帖子。
  • 我把操作系统换成了 NixOS,这让我可以轻松地自托管一个免费、开源的 RSS 阅读器
  • 我意识到自己不喜欢通过电子邮件订阅博客,因为这会让收件箱变得杂乱,还让我在不适合阅读的时候产生必须阅读的压力。
  • 随着 AI 垃圾内容席卷网络,我更想关注自己喜欢的特定作者。

于是,我安装了fusion RSS 阅读器,发现它成了我阅读新博客文章最喜欢的方式之一。每当我在社交媒体上看到喜欢的博文时,我都会浏览该博主的其他文章。如果发现他们写的内容正合我意,我就会把他们加入订阅。

我最近开始使用 RSS 阅读器 fusion,以便关注感兴趣的博客

业余项目

wordword:在博文中查找 lexical illusions(词汇幻觉)

我最近读了 Matt Might(马特·迈特)的一篇博文,他在其中解释了“lexical illusions(词汇幻觉)”的概念。指的是你在文本中未能察觉重复单词的现象,例如:

许多读者没有意识到
the
大脑会自动忽略
以新行开头的单词“the”的
第二次出现。

我在写博客时经常犯这种错误,所以想做一个能自动帮我捕捉这类错误的工具。

我在很大程度上借助了Cline这个 AI 助手来编写这个工具。我既感到印象深刻,又觉得有些不安,Cline 竟能根据我的提示和测试用例如此出色地实现这个工具。

而且这个工具效果很好。我用它在已发布的文章中找出了七处词汇幻觉

# Find lexical illusions (and also some false positives like "Duck Duck Go").
$ wordword ./content/
./content/retrospectives/2019/11/index.md:114: the
./content/retrospectives/2022/05/index.md:175: Duck
./content/retrospectives/2022/05/index.md:175: Duck
./content/retrospectives/2022/05/index.md:175: Duck
./content/retrospectives/2022/05/index.md:175: Duck
./content/retrospectives/2022/05/index.md:177: Duck
./content/notes/nix-git-bash-shell/index.md:78: time
./content/notes/cypress-vs-playwright/index.md:278: makes
./content/posts/simple-vue-pre-rendered/index.md:36: for
./content/posts/bootstrapped-founder-year-6/index.md:132: case
./content/posts/ansible-role-clipbucket/index.md:83: a
./content/posts/bootstrapped-founder-year-1/index.md:177: NOW
./content/posts/bootstrapped-founder-year-1/index.md:177: NOW
./content/book-reports/chaos-monkeys/index.md:8: names
./content/book-reports/go-programming-blueprints/index.md:50: of
212 total files checked
15 total errors found

我已将 wordword 加入到博客的CI 构建Git pre-commit 钩子中。

而且由于它是用 Zig 编写的,速度非常快。它只需 28.7 毫秒就能检查完博客中的 212 个 Markdown 文件:

$ hyperfine 'wordword ./'
Benchmark 1: wordword ./
  Time (mean ± σ):      28.7 ms ±   1.3 ms    [User: 11.7 ms, System: 16.5 ms]
  Range (min … max):    26.8 ms …  31.7 ms    90 runs

其他小事

我加入了 Codeberg,成为其成员

我一直在寻找一个更少商业化、更加开源的 Git 托管服务。

我之前一直在用 Gitlab。但他们做出了每两周强制注销所有用户的奇怪决定

每次使用 Gitlab 时,我都发现自己已退出登录。而要重新登录,Gitlab 又会强行打断我的工作流,让我去邮箱里查一次性验证码,而不是让密码管理器自动填充凭据。

我试用了Codeberg,感觉很不错。它比 Gitlab 更简洁,而 Gitlab 对我来说总是显得过于复杂。而且它完全开源,采用 Go 和 HTML 模板实现,这正是我最喜欢的 Web 技术栈。

我看到支持 Codeberg 的方式之一就是加入成为公司的投票成员,于是我就加入了。我还没有真正行使过成员权利,但成为合作社的一员而不仅仅是用户,感觉挺不错的。

Codeberg 最大的缺点似乎是没有支持它的托管式持续集成服务商:

  • WoodpeckerCI:没有提供付费托管服务的供应商。
  • Forgejo Actions:实验性项目,没有付费支持。
  • CircleCI:不支持 Forgejo/Gitea。
  • Garnix:不支持 Forgejo/Gitea。
  • Buildkite:不支持 Forgejo/Gitea。
  • Drone:支持 Forgejo/Gitea,但似乎只为企业版提供托管服务。
  • Harness:这似乎是 Drone 的新项目,但我无法确定它是否支持 Forgejo/Gitea。

Codeberg 官方推荐自行托管 Woodpecker CI,这听起来既有趣又不切实际,于是我花了一天时间在我免费的 Oracle 云虚拟机上搭建了一套。现在,我为 wordword 和其他几个项目自行托管 CI。但我不太信任自己在安全方面的能力,不如付费服务商那样可靠,所以不敢在上面存放密钥。这极大地限制了我将其作为真正的 CI/CD 解决方案的能力。

入手了一台 10 Gbps 路由器

我的网络服务提供商首次提供了 2 Gbps 的对称速率,所以我想充分利用这一带宽。

我之前的路由器是 Qotom Q355G4,它一直表现不错,只是不能上机架,而且只有 1 Gbps 端口。

我想从 OPNsense 或 Protectli 这样可信的硬件厂商那里购买路由器,但 OPNsense 最便宜的 10 Gbps 机架式路由器要 1200 美元,而 Protectli 根本没有机架式可选。

最终我购买了Qotom C3758R 1U 10 Gbps 路由器(含运费和税费共 417 美元),并在其上安装了 OPNsense business。

我购买了一台 Qotom C3758R 10 Gbps 路由器(从上数第三台),以充分利用 ISP 新推出的 2 Gbps 套餐。

我总是担心路由器的内存或磁盘空间不够,但 OPNsense 其实需求很低。我选择了 8 GB 内存和 128 GB 磁盘。在运行测速时查看系统负载,内存使用率从未超过 13%,CPU 峰值约为 30%,所以这套硬件完全够用。需要注意的是,我没有设置太多防火墙规则,也没有使用 OPNsense 的 IDS/IPS 功能。

正式改用 Rackstuds

在我发表了关于搭建第一个家用服务器机柜的文章后,有几位读者推荐我试试Rackstuds,而不是卡式螺母。

我更喜欢 Rackstuds,远胜于标准的卡式螺母。

起初我持怀疑态度,因为 Rackstuds 是塑料的,看起来比金属卡式螺母更容易损坏。但 Rackstuds 的实验室测试显示其可承重高达 40 磅

Rackstuds 肯定比卡式螺母好用。卡式螺母让设备安装变得困难,尤其是较重的设备。你需要一只手托住组件并保持水平,同时用另一只手拧螺母来固定设备。

Rackstuds 解决了这个问题,因为你可以先装好支柱,然后直接把设备挂上去。

有一点让我感到困惑的是,Rackstuds 有两种型号:红色和紫色。它们的区分方式令人费解。紫色型号的产品页面上写道:

适用于厚度在 2.7 毫米/0.106 英寸至 3.2 毫米/0.125 英寸之间的导轨。如果 ≤ 2.2 毫米/0.086 英寸,请改用新款红色版本

什么?

我一直以为服务器机柜中的“导轨”是指安装在服务器上、用于将其滑入机柜的滑轨,它们在各个维度上都远大于 3 毫米。

我原本以为的服务器机柜中的“导轨”。

我最终才明白,Rackstuds 所说的导轨厚度,指的是机柜正面的那块金属:

在我的 StarTech 机柜上,紫色的 Rackstuds 似乎更合适。

还有一个坑需要注意:如果你购买 Rackstuds Duo,它只适用于恰好为 1U 的设备,而散装的 Rackstuds 则可以用于安装任何机架设备。我先买了一包 8 个的样品包,之后又为以后的机架设备买了一袋 20 个的。

总结

完成了什么?

经验教训

  • 考虑到所需的时间以及更能利用 AI 变革的其他项目,我需要重新评估写书的策略是否正确。
  • 我可以调整书中的内容,使其更适合网络传播并吸引读者。我不需要让摘录与完整书中的内容 100% 一致。

下月目标

  • 完成《重构英语》的博客章节。
  • 开始为《重构英语》进行预售。

求助

  • 如果你知道比 Kickstarter 更专注于电子书出版的众筹替代方案,请告诉我
    • 我知道 LeanPub,但我想要的是 Kickstarter 那种“达到最低目标,否则项目不成立”的机制。
  • 如果你对使用一种能同时渲染为 PDF 和 HTML 的标记语言来写书的工具有任何建议,请联系我或在下方留言。
    • 我正在考虑的选项有:
      • AsciiDoc
      • mdBook
      • Pollen - 我喜欢这个想法,但得先学 Pollen,这意味着要学 Racket,也就是要学 Lisp,所以需要投入很多。

原文由 Michael Lynch 发布

本文章由 muse-spark-1.2-contributor 进行翻译