重构英语:第四个月
原文由 Michael Lynch 于 发布,订阅该博客
一句话总结
我正式开始写书了!
亮点
- 新书预售成功了——只是险险过关。
- 写了好几篇博客,但对它们的表现预测完全不准。
- 接下来,需要为写书挑选一种标记语言。
目标完成情况
每个月初,我都会定下当月想完成的目标。以下是本月的完成情况:
在 Kickstarter 上为《Refactoring English》达成 5000 美元众筹目标。
- 结果:Kickstarter 共筹得 6701 美元,来自 196 位支持者。
- 评分:A+
Kickstarter 的表现超出我的预期,在最后时刻实现了逆转。
发布《Refactoring English》的博客写作章节。
- 结果:发布了《如何写出开发者爱看的博客文章》
- 评分:A
这篇文章在 Hacker News 上和 Lobsters 上表现不错,但在 reddit 上反响平平。
在三月底前两次登上 Hacker News 首页。
- 结果:《如何写出开发者爱看的博客文章》和《Hacker News 人气大比拼》都登上了首页。
- 评分:A
既然完成了这个目标,现在感觉不错,但这个月大部分时间我都在担心——如果五个选题全都失败了,会有多难堪。好在五个里有两篇成功了。
新书预售成功了
这个月的大部分时间里,新书预售看起来都要失败了。按当时的进度,要比 5000 美元的目标少 1500 美元。
预售结束前四天,其中一篇博客在 Hacker News 上获得了关注,彻底扭转了销量。
最终,Kickstarter 筹得了 6551 美元,超过了 5000 美元的目标。算上后期的预购,现在总额已达到 6701 美元。

上周我写了更详细的预售经过:
我打算专门写一篇关于 Kickstarter 的文章,但这次体验非常好。它成了衡量读者对新书是否感兴趣的好方法。而且 6500 美元的预购金额,已经高于传统出版社会付给我的预付款。
Julia Evans 的商业模式对我适用吗?
《Refactoring English》预售最令人兴奋的地方,在于它让我看到了一丝靠写博客谋生的希望。
运营 TinyPilot 时,写博客确实帮我找到了最初的几十位客户。但到后来,个人博客似乎对销售毫无帮助。这也合情合理——对独立创业者的创业日记感兴趣的人,未必想买一台 400 美元的 KVM over IP 设备。
硬件业务的复杂性让我时间总是很紧张,很难把每天最适合深度思考的时间都花在个人博客上。从那以后,我一直在思考能做怎样的生意,让写博客与盈利能够很好地结合起来。
我的假设是,通过制作教育类产品,可以让博客变得可持续。如果我写自己正在做的事情,同时有一本更深入的书或课程,读者就能学到更多,也能为我的工作提供资金支持。
靠相关内容赚钱的博主,最好的例子是Julia Evans。她运营一个软件技术博客,通过销售插画小册子(zine)来实现变现。
Julia 现在不再公开收入了,但在 2019 年,她靠小册子每年就有约 10 万美元的收入。那还是在她全职投入博客之前。当然,这是营收而非利润,不过由于小册子是数字产品,只需向 Gumroad 这类支付和内容平台支付手续费,我估计利润率在 90% 到 95% 左右。
所以,作为副业就有 10 万美元的营收已经相当不错了。假设 Julia 全职投入后销量翻了三倍,如果我能达到她一半的成功程度,那也能通过博客和相关产品每年获得 15 万美元。听起来有挑战,但并非不可能。
像靠它谋生一样写博客
三月的写作挑战很有意思,因为我想通过写出受欢迎的博客来为新书寻找读者。这对我来说很不寻常——我通常不会按截稿期限写作,也不会为了最大化读者量来选题。
我有一长串选题和写了一半的草稿,于是从以下几个维度对它们进行了评估:
- 易写度:写出一篇感觉完整的文章有多容易?
- 潜在受众:如果文章成功,有多大潜在受众会喜欢它?
- 成功概率:文章触达目标受众的可能性有多大?
- 与书的关联度:如果读者发现了这篇文章,他们对我的书感兴趣的可能性有多大?
我没有正式地给每个想法打分,但大致的心算如下:
| 标题 | 易写度 | 潜在受众 | 成功概率 | 与书的关联度 |
|---|---|---|---|---|
| 不再是我最喜欢的 Git 提交 | 4 | 5 | 4 | 4 |
| 如何写出有用的提交信息 | 2 | 5 | 3 | 4 |
| 如何写出开发者爱看的博客文章 | 2 | 4 | 2 | 5 |
| 如何维护开源项目并保持快乐 | 3 | 3 | 4 | 2 |
| 打磨写作:善用有力动词 | 5 | 1 | 1 | 5 |
| 在 Windows 上用了 35 年后,使用 NixOS 的三个月 | 3 | 2 | 5 | 1 |
| 用 Zig 构建 C 应用 | 3 | 3 | 4 | 1 |
我最终挑选了这份清单里的前三篇,但它们的表现与预期并不一致。结果如下:
| 标题 | 对销量的影响 | 总阅读量 | Hacker News | |
|---|---|---|---|---|
| 如何写出开发者爱看的博客文章 | 高 | 22.3k | 9.7k | 325 |
| 如何写出有用的提交信息 | 中 | 2.6k | 126 | 1.2k |
| 不再是我最喜欢的 Git 提交 | 低 | 31.6k | 87 | 6.4k |
《不再是我最喜欢的 Git 提交》在我看来是最稳妥的选题,因为我知道能很快写完,而且原作非常受欢迎,我以为会有很大的潜在受众。它在 Lobsters 上表现不错,在 reddit 上还行,在 Hacker News 上则没什么水花。直到坐下来写这篇回顾时我才发现,Google Discover(我甚至不知道有这个东西)推荐了我的文章,带来了 1.5 万阅读量。
这篇文章对我来说有点特别,因为我以前从未写过反驳类博客。刚开始写时我很兴奋,因为我对原作有很强烈的看法。写完初稿后,我开始犹豫——感觉自己在无端攻击另一位博主六年前写的东西。我调整了措辞,让它听起来不那么像攻击,但仍免不了带有对抗意味。
《如何写出有用的提交信息》本应是为预售造势的文章。它在 Lobsters 上表现不错,在 reddit 上还行,但在 Hacker News 上反响平平。很难判断它对销量究竟有多大影响,因为我无法区分哪些预购来自这篇文章,哪些来自我当天向新书邮件列表发布的预售公告。
《如何写出开发者爱看的博客文章》则是拯救了这本书的意外爆款。它在 Lobsters 上表现尚可,在 reddit 上则彻底没人看。我第一次提交到 Hacker News 时毫无水花,但第二天早上有人重新提交后,却获得了极好的反响,最终位列当天第 4 名。最棒的是,许多通过 Hacker News 发现这篇文章的人都通过预售成了付费读者。
Hacker News 人气大比拼
“工程即营销”是一种在不擅长营销的工程师(比如我)中很流行的营销手法。
思路是,你做一个与付费产品相关的免费工具,然后指望人们对免费工具印象足够深刻,进而去关注你的付费产品。
我很早就想做一个 Hacker News 博客排名系统,因为我一直好奇自己与其他热门 Hacker News 作者相比如何。去年夏天我做了一个基础原型,本想用于重启我的《登上 Hacker News 首页》课程。
当我搁置课程、专注于《Refactoring English》后,一时不知道该怎么处理这个博客排名工具。到了三月,我急于让预售成功,才意识到可以花上一两天把它完善到可发布的程度。

“人气大比拼”是我为推广《Refactoring English》而创建的工具
这个工具成功登上了 Hacker News 首页,但对图书销量没有任何影响。
一个出乎意料的反应是,前 100 名中有那么多人在意自己的排名。我本以为,如果你已经是 Hacker News 上最受欢迎的个人博主之一,你已经足够出名,不会在意 Hacker News 的排名,但前 100 名中有很多人都公开或私下通过私信/邮件向我评论了这件事。
许多头部博主似乎特别关心自己的排名随时间如何变化,最典型的是 John Gruber,他觉得我的工具印证了他的猜想——Hacker News 近年来对他的网站进行了人工降权。
基于这一反馈,我增加了查看单个博客更详细数据的功能,不过目前这个功能还没引起太多反响。

头部博主似乎乐于分享各自域名的统计数据,于是我创建了按博客查看的页面。
为新书挑选标记语言
到目前为止,我一直用 Markdown 配合 Hugo 来写书。正式的 PDF 版本还没开始做,所以挑选出版技术的决定一直被我搁置着。
现在书已经确定要写了,我必须选定一种写作方式。我关心的功能有:
- 该工具能否原生输出 PDF?
- 能否原生输出 epub?
- 能否原生输出 HTML?
- 工具的成熟度如何?尝试实现简单功能时遇到新 bug 或走进死胡同的可能性有多大?
- 哪些支持无 DRM 的技术类传统出版社支持这种格式?
- 我打算自费出版第一版,但如果第二版能与传统出版社合作推出纸质版就更好了,所以希望格式能被他们接受。
可选的工具似乎有:
| 工具 | epub | HTML | 成熟度 | 出版社支持 | |
|---|---|---|---|---|---|
| Asciidoctor | ✅ | ✅ | ✅ | 高 | 无 |
| LaTeX | ✅ | ❌ | ❌ | 非常高 | No Starch Press |
| Pollen | ❌ | ❌ | ✅ | 低 | 无 |
| Typst | ✅ | ❌ | ❌ | 低 | 无 |
| mdBook | ❌ | ❌ | ✅ | 低 | 无 |
看起来胜出者要么是 Asciidoctor,要么是 LaTeX。
有第三方工具可以把 AsciiDoc 转成 LaTeX。过程大概不会很愉快,但如果 No Starch 说想出版我这本书的第二版,我大概也能忍一忍,做一次性的转换。
我花了几个小时试用 Typst。我喜欢它是开源的,也比 LaTeX 简单,但改进幅度还不足以让我选用一个更新、更不成熟的工具。而且它似乎更适合写学术论文,而不是写书。
业余项目
为 fusion RSS 阅读器增加测试覆盖
几个月前切换到 NixOS 后,我很享受在个人机器上托管更多服务。最喜欢的是fusion,一款用 Go、Svelte 和 SQLite 构建的极简 RSS 阅读器。

fusion 是一款用 Go、Svelte 和 SQLite 构建的极简 RSS 阅读器。
我最喜欢 fusion 的一点是,它的维护者对代码贡献非常友好和开放,所以我在业余时间一直在做一些小的改进。
我最引以为豪的贡献是重构了 pull 包并为其增加了更多测试:
pull包 重构前(v0.8.9) vs. 重构后(v0.9.3)
起因是我想为 If-Modified-Since HTTP 请求头添加支持,但在查看负责发起 HTTP 请求的代码时,发现很难改动。存在几个问题:
- 代码混合了太多不同职责:读取数据库、判断何时请求订阅源、解析外部数据、再把结果写回数据库。
- 代码没有任何自动化测试来覆盖。
- 如果我想写测试,唯一能覆盖这段逻辑的导出函数是
Puller.PullAll,而这个函数还管理着一个工作进程池,进一步增加了复杂度。
我做的主要改动有:
- 我把 HTTP 相关逻辑移到了独立文件。
- 把 RSS 解析移到了独立文件。
- 把查询单个订阅源的逻辑从管理多 worker 的组件中解耦出来,从而简化了对单个订阅源逻辑的测试。
- 为这段代码与数据库的交互创建了更简单清晰的接口,便于在测试中 mock 数据库。
- 创建了专门用于判断是否更新订阅源的函数,而不是将这一决策与其他更新流程混在一起。
我还想再进一步整理一下,但对目前的进展已经很满意,这些改动也帮我修复了几个 bug 并改进了 fusion 的功能。
是时候正式关闭 What Got Done 了
2019 年,我创建了一个名为 What Got Done 的网页应用。那是我第一次尝试做真正的 SaaS 生意,但没能找到客户。
我自己每周仍在使用它,已经连续五年每周发布更新,但我是唯一坚持使用的用户。偶尔也有其他人来尝试,但通常几周后就感到厌倦,不再更新。
写这个网站时,我对网页开发的了解还很少。网站最初使用 Go、Vue 2、AppEngine 和 Google Cloud Firestore。我后来用 fly.io 替代了 AppEngine,用 SQLite 替代了 Firestore,这让开发体验好了一点,但我依然觉得用 Vue 开发很痛苦。我不知道有什么好办法能从 Vue 渐进式地迁移到原生 JavaScript,也不想投入 30 多个小时去做一次大规模重写。
我最近意识到,这个网站如果做成用 Hugo 生成的静态网站会更合理:我在任何想用的编辑器里写每周更新,然后推送到主分支时,由持续集成构建并发布网站。我的这个博客就是这么做的。对 What Got Done 来说,这样能省去大量围绕用户账户、身份验证和数据库管理的复杂性。而且,我的所有更新都会是可搜索的纯文本文件,而不是被困在 SQL 数据库里的记录。
维持网站运行不需要任何成本,每年也只需花大约五小时维护。所以,我并不急于关闭它,但已经迈出了第一步——关闭了注册。
在某个时候,我可能会给最近的用户发邮件,宣布项目即将关闭,并让他们导出自己的数据。
值得一看的链接
- 在竞争激烈的市场中运营 SaaS 四年 - 这是我读过的关于打造自筹资金创业公司最好的博客文章之一。我赞同 Max 分享的几乎所有经验。根据我作为自筹资金创始人的经历,每一点都让我深有同感。
总结
完成了什么?
- 发布了《不再是我最喜欢的 Git 提交》
- 发布了《如何写出开发者爱看的博客文章》
- 发布了《我的新书预售险些失败》
- 发布了Hacker News 人气大比拼作为新书的营销工具
下月目标
- 写一篇关于 Kickstarter 经验教训的博客。
- 完成一个新的书稿章节,或就书中的某个主题做一次线上分享。
- 与所有选择了公开致谢或博客文章编辑帮助作为回报的 Kickstarter 支持者对接兑现。
求助
如果你有用标记语言(而非 Word 或 Google Docs)出书的经验,请告诉我你的经历。
随机一篇博客
评论
登录后参与讨论