Refactoring English: Month 4

Michael Lynch

重构英语:第四个月

原文由 Michael Lynch 发布,订阅该博客

一句话总结

我正式开始写书了!

亮点

  • 新书预售成功了——只是险险过关。
  • 写了好几篇博客,但对它们的表现预测完全不准。
  • 接下来,需要为写书挑选一种标记语言。

目标完成情况

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

在 Kickstarter 上为《Refactoring English》达成 5000 美元众筹目标。

  • 结果:Kickstarter 共筹得 6701 美元,来自 196 位支持者。
  • 评分:A+

Kickstarter 的表现超出我的预期,在最后时刻实现了逆转。

发布《Refactoring English》的博客写作章节。

这篇文章在 Hacker News 上Lobsters 上表现不错,但在 reddit 上反响平平。

在三月底前两次登上 Hacker News 首页。

既然完成了这个目标,现在感觉不错,但这个月大部分时间我都在担心——如果五个选题全都失败了,会有多难堪。好在五个里有两篇成功了。

新书预售成功了

这个月的大部分时间里,新书预售看起来都要失败了。按当时的进度,要比 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 提交4544
如何写出有用的提交信息2534
如何写出开发者爱看的博客文章2425
如何维护开源项目并保持快乐3342
打磨写作:善用有力动词5115
在 Windows 上用了 35 年后,使用 NixOS 的三个月3251
用 Zig 构建 C 应用3341

我最终挑选了这份清单里的前三篇,但它们的表现与预期并不一致。结果如下:

标题对销量的影响总阅读量Hacker Newsreddit
如何写出开发者爱看的博客文章22.3k9.7k325
如何写出有用的提交信息2.6k1261.2k
不再是我最喜欢的 Git 提交31.6k876.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 的技术类传统出版社支持这种格式?
    • 我打算自费出版第一版,但如果第二版能与传统出版社合作推出纸质版就更好了,所以希望格式能被他们接受。

可选的工具似乎有:

工具PDFepubHTML成熟度出版社支持
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 包并为其增加了更多测试:

起因是我想If-Modified-Since HTTP 请求头添加支持,但在查看负责发起 HTTP 请求的代码时,发现很难改动。存在几个问题:

  • 代码混合了太多不同职责:读取数据库、判断何时请求订阅源、解析外部数据、再把结果写回数据库。
  • 代码没有任何自动化测试来覆盖。
  • 如果我想写测试,唯一能覆盖这段逻辑的导出函数是Puller.PullAll,而这个函数还管理着一个工作进程池,进一步增加了复杂度。

我做的主要改动有:

我还想再进一步整理一下,但对目前的进展已经很满意,这些改动也帮我修复了几个 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 分享的几乎所有经验。根据我作为自筹资金创始人的经历,每一点都让我深有同感。

总结

完成了什么?

下月目标

  • 写一篇关于 Kickstarter 经验教训的博客。
  • 完成一个新的书稿章节,或就书中的某个主题做一次线上分享。
  • 与所有选择了公开致谢或博客文章编辑帮助作为回报的 Kickstarter 支持者对接兑现。

求助

如果你有用标记语言(而非 Word 或 Google Docs)出书的经验,请告诉我你的经历。

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

评论