Refactoring English: Month 4

Michael Lynch

英语重构:第 4 个月

一句话总结

我正式要写一本书了!

本月亮点

  • 我的新书预售成功了(只是勉强过关)。
  • 我写了一堆博客文章,但在预测它们的表现方面很不准。
  • 现在,我需要为写书挑选一种标记语言。

目标完成度评分

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

在 Kickstarter 上为 Refactoring English(《英语重构》)达成 5000 美元的目标。

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

Kickstarter 的成绩超出预期,在最后一刻实现了逆转。

发布《英语重构》的博客写作章节。

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

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

既然实现了这个目标,我现在感觉不错,但在当月的大部分时间里,我一直担心如果五个选题全都失败会显得很蠢。好在五个中有两个成功了。

我的新书预售成功了

当月的大部分时间里,我的书似乎都要黄了。预售按当时的进度,预计会比 5000 美元的目标少 1500 美元。

预售结束前四天,我的一篇博客文章在 Hacker News 上获得了关注,彻底扭转了销售局面。

最终,Kickstarter 筹得了 6,551 美元,超过了 5000 美元的目标。算上后期的预订,目前总额为 6,701 美元。

上周我写了一篇更详细的预售回顾:

我计划专门写一篇关于 Kickstarter 的文章,但这次体验非常好。它被证明是衡量大家对我的书感兴趣程度的好方法。而且 6,500 美元的预订额已经高于传统出版社愿意支付给我的预付版税。

我能让 Julia Evans(朱莉娅·埃文斯)的商业模式为我所用吗?

《英语重构》预售最令人兴奋的地方在于,它让我看到了一丝靠写博客谋生的希望。

经营 TinyPilot 时,写博客确实帮我找到了最初的几十位客户。后来,我感觉个人博客对销售已经毫无帮助了。这也合乎情理,因为对独立创始人的日记感兴趣的人,未必想买一台 400 美元的 KVM over IP 设备。

由于硬件业务的复杂性,我的时间总是很紧张,很难把一天中“深度思考”的时间主要用在个人博客上。从那以后,我一直在思考能经营什么样的业务,让写博客与盈利更好地结合起来。

我的假设是,通过制作教育类产品,我可以让写博客变得可持续。如果我写下自己正在做的事情,并提供一本书或一门课程进行更深入的讲解,读者就能学到更多,也能为我的工作提供资金支持。

靠写博客加相关内容赚钱的最佳例子是朱莉娅·埃文斯。她运营着一个软件博客,并通过销售插画版 zine来变现。

朱莉娅·埃文斯现在不再公开披露收入了,但截至 2019 年,她通过 zine 每年能获得约 10 万美元的收入。那是在她开始全职投入博客之前。诚然,这指的是营收而非利润,但由于 zine 是数字产品,我预计其利润率在 90-95% 左右,因为她只需向 Gumroad 等支付处理和内容平台支付手续费。

因此,作为副业时就有 10 万美元的营收,已经相当不错了。假设朱莉娅·埃文斯全职投入后销量翻了三倍。如果我能达到她一半的成功程度,那么靠写博客和销售相关产品每年就能赚到 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 人气竞赛

“Engineering as marketing(工程即营销)”是一种营销技巧,在不擅长营销的工程师中很流行(比如我)。

其思路是,你创建一个与付费产品相关的免费工具,然后寄希望于人们对你的免费产品印象足够深刻,进而去关注你的付费产品。

我很早就有了一个想法:搭建一个 Hacker News 博客排名系统,因为我一直好奇自己与其他热门 Hacker News 作者相比如何。去年夏天我做了一个基础原型,因为我原本打算用它来重启我的《登上 Hacker News 首页》课程

当我搁置课程、专注于《英语重构》后,我不知道该如何处置这个博客排名工具。到了三月,当我迫切希望预售成功时,我意识到可以花一两天时间把原型打磨好并发布出来。

Popularity Contest 是我为推广《英语重构》而创建的工具

该工具成功登上了 Hacker News 首页,但对图书销售没有任何影响。

一个出乎意料的反应是,前 100 名中有很多人很在意自己的排名。我原以为,如果你是 Hacker News 上最受欢迎的个人博主之一,你已经足够出名,Hacker News 对你来说应该不算什么大事,但前 100 名中的很多人都在公开场合或通过私信/邮件向我表达了对排名的关注。

许多顶级博主似乎特别关注自己的排名随时间的变化,最值得注意的是 John Gruber(约翰·格鲁伯),他觉得我的工具印证了他的观点,即 Hacker News 在近年来对其网站进行了人工降权

基于这一反应,我增加了查看单个博客更详细数据的功能,但目前还没看到对该功能有多少反响。

顶级博主们似乎很乐意分享自己域名的统计数据,因此我创建了按博客查看的功能。

为本书挑选标记语言

到目前为止,我一直在使用 Markdown 配合 Hugo 来写书。我还没有开始制作正式的 PDF 版本,所以一直在回避选择图书出版技术的问题。

既然出书已成定局,我需要选定一种写作方式。我关注的功能包括:

  • 该工具能否原生输出 PDF?
  • 该工具能否原生输出 epub?
  • 该工具能否原生输出 HTML?
  • 该工具有多成熟?我在实现简单功能时遇到新错误或死胡同的可能性有多大?
  • 哪些无 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,而该函数还额外管理着一个工作进程池,增加了复杂性。

我做的主要改动包括:

我还想再进一步整理一下,但对目前的进展已经很满意,这也帮助我修复了几个错误并改进了 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 Rozen(马克斯·罗曾)分享的几乎所有经验。根据我作为自筹资金创始人的经历,每一点都让我感同身受。

收尾

完成了什么?

下月目标

  • 写一篇关于从 Kickstarter 中学到的经验教训的博客文章。
  • 完成一个新的书章节或就书中的某个主题进行一次线上直播教学。
  • 与所有选择公开致谢或需要博客文章编辑帮助的 Kickstarter 支持者协调回报事宜。

求助

如果你有使用标记语言(即非 Word 或 Google Docs)出版书籍的经验,欢迎分享你的经历。

原文由 Michael Lynch 发布

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