Refactoring English: Month 5

Michael Lynch

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

一句话总结

我该如何克制自己把同一章重写五十遍的冲动?

亮点

  • 为什么我在书稿上的进展比预期要慢?
  • 我优化了 Asciidoctor 的写作与预览工作流。
  • 我正在做一个实时追踪 Hacker News 表现的副业项目。

目标评分

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

写一篇关于 Kickstarter 经验教训的博客文章

最初我打算写一篇聚焦 Kickstarter 的指南,但越写越觉得 Kickstarter 并不是最有趣的部分。我更感兴趣的是众筹作为自出版作者的一条路径,而 Kickstarter 只是众筹的一种方式。

完成一个新书章节或就书中的某个主题开展一次直播课

  • 结果:开展了一次直播课,并开始撰写新的章节。
  • 评分:A

我邀请了所有预购本书的读者参加直播课,整个过程我很享受。我见到了一些多年来一直在阅读我博客、却从未交流过的人,他们提出的问题也帮助我打磨了书中的内容。

与 Kickstarter 支持者协调回报发放

  • 结果:与所有购买了高级回报的 Kickstarter 支持者取得了联系。
  • 评分:A

我一直为没有及时联系大家而感到焦虑。我担心支持者会想:“嘿,你怎么一直在写关于 Kickstarter 的博客文章,却不去联系真正支持你的人?”但我不想群发消息,因为如果有人预购了 75 至 150 美元的套餐,我觉得他们值得收到个性化的回复。

我一直拖着没发邮件,但当我最终动手时,只花了大约两个小时就给每个人都写了信。如果支持者有个人网站或我们之前有过交流,我就会个性化消息,让对方清楚这是我一封一封亲手写的。

写书过程中的时间管理

我每周都在写书,但感觉进展缓慢。

很难衡量自己的进度,因为我知道哪些章节已完成、哪些还没完成,但不同章节的难度和篇幅差异很大。

另一个问题是,我可以无休止地反复重写同一章。我必须在某个时刻认定它已经足够好,然后转向其他章节。如果没有必须在特定时间前完成某一章的压力,我就会一直重写下去。

我还发现,写作大约一小时后,效率会显著下降。我会感到精力耗尽,更容易分心,或在无关紧要的细节上投入过多。虽然通过上午和下午写不同主题可以在一定程度上缓解,但无论哪个时段,一小时后还是会感到疲惫。

好在,我没有遇到写作障碍,也没有失去动力。每个工作日我都能坚持写作,并且依然对这本书充满热情。

考虑到这些情况,以下是我接下来更专注写作的计划:

  • 每天至少留出 60 分钟进入心流状态专心写作。
    • 如果需要进一步研究、修复格式或添加图片,就先加上 TODO,以免打断心流。
    • 如果感到无聊,要克制查看邮件或社交媒体的冲动。即使不喜欢写出来的内容,也要坚持写到该时间段结束。
  • 每天一早规划当天的工作,决定为各项写作任务分配多少时间。
    • 我会查看日历和待办清单,然后在一张纸上以 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 时,我的写作-构建-阅读流程是:

  1. 保存文件。
  2. 切换到终端。
  3. 运行 nix run .#pdf
  4. 切换到浏览器窗口。
  5. 重新加载 PDF。

现在把流程写出来,我意识到应该把它自动化,于是我让 LLM 给了一个简单脚本:

#!/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 帖子的元数据。

我一直很好奇,如果把 Hacker News 首页上所有帖子的投票和评论数据聚合起来,随时间会呈现出什么模式:

最引人注目的是,每天美国东部时间中午左右,帖子的平均发布时间会显著下降,也就是说那时较老的帖子会从首页掉落,为新帖子腾出位置。

查看自己投稿的更多细节也很有意思,比如关于《作为自出版作者的 6000 美元预付款》的 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 的服务条款要求强制仲裁,因此如果 Vimeo 做了违法的事情,你无法在法庭起诉他们,也无法参与集体诉讼。这种条款在美国竟然合法是荒谬的,因为仲裁员极度偏向企业而非消费者。你可以选择退出强制仲裁,我已经这样做了。

总结

完成了什么?

  • 为《重构英语》举办了一场直播课。
  • 与每一位购买了高级回报的 Kickstarter 支持者进行了单独联系。

经验教训

  • 我应该为书的每一章设定时间限制,以避免无止境地打磨。时间目标也能让我更清楚地了解整本书的总进度。
  • 用 Asciidoctor 搭建一个简易的实时重载流程其实很容易。

下月目标

  • 向预购读者发布本书的两章内容。
  • 为书的每一章分配弹性的写作时间预算。
  • 将本书的预览章节适配为 Asciidoc 格式。

原文由 Michael Lynch 发布

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