重构英语:第五个月
原文由 Michael Lynch 于 发布,订阅该博客
一句话总结
怎样才能不把同一章重写五十遍?
亮点
- 为什么写书的进度比预期慢?
- 我优化了 Asciidoctor 的写作与预览流程。
- 我在做一个边项目,实时追踪帖子在 Hacker News 上的表现。
目标复盘
每个月初,我都会定下当月想完成的事。下面是本月的完成情况:
写一篇关于 Kickstarter 经验教训的博客
我本来想写一篇聚焦 Kickstarter 的指南,但越写越觉得,Kickstarter 本身并不是最有意思的部分。更让我兴奋的是众筹作为自出版作者的一条路径,而 Kickstarter 只是众筹的方式之一。
完成一个新的书稿章节,或就书中某个主题开一场直播课
- 结果:开了一场直播课,并开始撰写新的一章。
- 评分:A
我邀请了所有预购了这本书的读者来参加直播课,整个过程我很享受。见到了一群关注我博客多年的读者,我们之前从未聊过天、也没通过邮件,他们提出的问题也帮助我打磨了书中的内容。
与 Kickstarter 支持者对接回报
- 结果:已与所有购买了高阶回报档位的 Kickstarter 支持者取得联系。
- 评分:A
我一直为没有及时联系大家而感到焦虑。担心支持者会想:“喂,你怎么有空写关于 Kickstarter 的新 博客 文章,却不先跟真正支持你的人聊聊?”但我又不想群发消息,觉得既然大家预购的是 75 到 150 美元的套餐,就值得我一条一条亲自回复。
我一直拖着没发这些邮件,但真正动手后,给所有人写完也只花了大约两个小时。如果支持者有自己的网站,或者我们之前聊过,我就会在邮件里加上个性化的内容,让对方明白这是一封一封亲手写的。
写书期间的时间管理
我每周都在写书,但总觉得进度很慢。
很难衡量自己的进度,因为我虽然知道哪些章节已经完成、哪些还没完成,但不同章节的难度和篇幅差异很大。
另一个问题是,我可以无休止地重写同一章。必须在某个时刻认定“已经够好了”,然后转向下一章。如果没有在某个时间点前必须完成某一章的压力,我就会一直重写下去。
我还发现,连续写作大约一小时后,效率会明显下降。精力跟不上了,更容易分心,或者在无关紧要的细节上过度纠结。早上和下午换个主题写,能在一定程度上缓解,但不管哪个时段,一小时左右还是会后劲不足。
好在,我没有遇到写作瓶颈,也没有丧失动力。每个工作日都能动笔,而且依然对这本书充满热情。
考虑到这些情况,接下来我打算这样更专注地写作:
- 每天至少留出 60 分钟进入心流状态写作。
- 如果需要查资料、改格式或加图片,就先记下 TODO,不打断心流。
- 如果感到无聊,忍住不去查邮件或刷社交媒体。就算写得不满意,也要坚持写到这个时间段结束。
- 我一开始觉得 LeechBlockNG 很有用,但它经常导致 Firefox 卡死,所以就没再用了。我猜这和那个已知问题有关,“LeechBlock 与 Firefox 的垃圾回收不太兼容。”我提交了几个小 修复,但似乎没有起作用。
- 每天早上第一件事就是规划当天的工作,决定各项写作任务各分配多少时间。
- 我会查看日历和待办清单,然后在一张纸上把全天按 30 分钟为一个时间块排好。
- 为每一章设定应投入的写作时长。
- 比如,提前决定在把邮件那一章的草稿发给读者之前,最多只花 10 小时来写。
清单上的有些事我已经在做了,接下来想执行得更严格一些;有些则是为了应对第一次写书的挑战而新增的。
Asciidoctor:目前为止还不错
上个月我写过对比各种写作方案的文章,最终选定了 Asciidoctor。目前用下来感觉不错。
我以 Liran Tal 的 asciidoc-book-starter 为起点,并适配到了 Nix。现在我配置了一个 Nix flake,运行 nix run 就能把书渲染成 PDF、epub3 和 HTML。也可以用 nix run .#pdf 这样的命令单独渲染某一种格式。
我还没确定是否会同时支持这三种格式。还没尝试过自定义格式,甚至还没插入过图片或表格,最终要看在三种格式下把版式和样式都调好需要多少额外工作量。
Asciidoctor 最大的局限是无法实时重载。我习惯了用 Hugo 写作,会在一个窗口打开 VS Code,在另一个窗口打开浏览器看渲染效果。在 VS Code 里每按一次保存,几百毫秒内就能在浏览器里看到更新。
用 Asciidoctor 时,我的写作-构建-预览流程是这样的:
- 保存文件。
- 切换到终端。
- 运行
nix run .#pdf。 - 切换到浏览器窗口。
- 刷新 PDF。
现在回头把流程写出来,才意识到应该把它自动化,于是我问了一下大语言模型,得到了这个简单的脚本:
#!/usr/bin/env bash
set -euo pipefail
nix run .#pdf
zathura dist/Refactoring\ English.pdf &
ZATHURA_PID=$!
trap 'kill $ZATHURA_PID' EXIT
find book -type f \
| entr -dr nix run .#pdf
我之前没听说过 zathura,它是一个开源 PDF 阅读器,文件变化时会自动重载。下面是实际效果:
我用 Asciidoctor、Zathura 和 Nix 搭的 DIY 热重载 PDF 工作流
这个 DIY 热重载流程比我用 Hugo 时那种近乎瞬时的速度要慢不少,但比手动操作要轻松 5 倍。
边项目:Hacker News Observer
我在 Hacker News 上有一个特别的“超能力”:通常能看出一个帖子为什么会从首页消失。但其实只要知道 HN Rankings 这个网站,任何人都能做到。它会把 Hacker News 的历史数据画成图表,只要认出几种模式就行。
在 HN Rankings 上最明显的就是帖子排名的突然大幅上升或下降。如果一个帖子正慢慢爬到第 3 名,下一个时间点却突然掉到第 45 名,那很可能是版主手动降权了。

当 Hacker News 帖子排名突然下跌,很可能是版主手动降权了。
图表也能看出版主何时手动置顶了某个帖子。如果一个帖子原本沉在第 300 名,突然跳到第 10 名,就说明版主提权了,可能是因为二次机会池(second chance pool)——一套由版主和志愿者人工挑选那些在常规投票中错过首页的好帖子的机制。
HN Rankings 很好用,但我还想在排名之外看到更多数据,比如得票数和评论数,于是自己做了一个版本。还没正式发布,它每分钟轮询一次 Hacker News API,追踪当前所有帖子的元数据。
我一直很好奇,如果把 Hacker News 首页上所有帖子的得票和评论随时间汇总起来,会呈现出什么样的规律:

最让我注意的是,每天美国东部时间中午前后,帖子的平均发布时间会显著下降,也就是说那时老帖子会陆续从首页下沉,给新帖子腾出位置。
看到自己投稿的更多细节也很有意思,比如 “My $6k Advance as a Self-Published Author” 这篇的 HN 讨论。图表显示这个帖子从未登上首页,却一直在获得点赞,这让我很意外。我到现在也不清楚这是怎么发生的,因为我从未在任何地方放过这个 Hacker News 讨论的链接:

还有一些功能我想继续加上:
- 自动判断在 Hacker News 上当天是新闻淡日还是首页竞争激烈。
- 自动标记被版主置顶或降权的帖子。
- 根据投票和评论的开局情况预测帖子的后续走势。
这算是我很久以来最接近“大数据”的项目了,我的大多数网站每月只产生约 1 MB 数据,而 HN Observer 每天就要产生 30–40 MB。我可以根据采集的数据量和更新频率来调高或调低这个量。
存储 HN 的数据正好是试用 Turso 的好机会。我已经关注它一段时间了,它像是一种数据库即服务,同时保留了使用 SQLite 的大部分好处。
购买无 DRM 电影
我最近跟朋友抱怨,说现在找不到可以合法购买的无 DRM 电影或电视剧。我知道大制片厂和流媒体平台不愿意放弃 DRM,但对小工作室或独立电影人来说,搭一个结账页面,让用户花 10 美元买一部 4K 无 DRM 的 mp4 电影,似乎并不难。
我到处搜了一下,发现还真有类似的东西。Vimeo on Demand 就提供无 DRM 电影。虽然大多是独立电影和非英语影片,但这是我见过的可合法购买的无 DRM 影片中选择最多的平台。

Vimeo on Demand 是我找到的可合法购买的最大无 DRM 电影合集。
我试用了 Vimeo on Demand,体验只能说一般。但他们是唯一在卖无 DRM 电影的平台,所以我还是会推荐,只是要加上一些提醒。
一定要确认你要买的影片提供下载,并非所有影片都支持。如果按钮上写的是 “Stream anytime”,那就不是无 DRM 的:


要认准提供下载选项的,那才是真正的无 DRM 资源。写着“Stream anytime”的购买则不支持下载,也不是无 DRM 的。
犯了这个错并尝试取消购买的经历,也让我不太愿意推荐 Vimeo。他们没有明显的入口可以联系真人客服。我只能和一个聊天机器人对话,它告诉我“出于安全原因”无法退还在 Vimeo on Demand 上的购买(尽管他们能看到我根本没观看过)。唯一的办法是联系影片的发行方申请退款,于是我照做了。但如果一周内没有回复,我就打算直接走信用卡拒付了。
Vimeo 的服务条款要求强制仲裁,也就是说如果 Vimeo 做了违法的事,你不能去法院起诉,也不能参与集体诉讼。这种条款在美国竟然合法,实在荒谬,因为仲裁员往往严重偏向企业而非消费者。你可以选择退出强制仲裁,我已经这么做了。
总结
完成了什么?
- 为 Refactoring English 开了一场直播课。
- 逐一联系了每一位购买高阶回报档位的 Kickstarter 支持者。
经验教训
- 应该为书的每一章设定时间限制,避免无止境地打磨。设定时间目标也能让我更清楚地把握整本书的总体进度。
- 用 Asciidoctor 也能很容易地搭起一套简易的实时重载流程。
下月目标
- 向预购读者发布书中的两章内容。
- 为书中每一章设定弹性的写作时长限制。
- 把书的预览章节转换为 Asciidoc 格式。
随机一篇博客
评论
登录后参与讨论