Refactoring English: Month 5

Michael Lynch

Refactoring English(《重構英文》):第五個月

一句話摘要

我該如何克制自己,不把同一章重寫五十遍?

本月亮點

  • 為什麼我的新書進度不如預期?
  • 我優化了 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 自製的熱重載 PDF 工作流程

我自製的熱重載流程比起 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 首頁上所有貼文的按讚數和留言數隨時間彙整起來,會浮現什麼樣的模式:

最讓我印象深刻的是,每天大約在美東時間中午時,貼文的平均年齡會大幅下降,也就是較舊的貼文會在此時從首頁下架,為較新的貼文騰出空間。

能看到自己投稿的更多細節也很有趣,例如〈My $6k Advance as a Self-Published Author〉的 HN 討論串。圖表顯示這篇貼文從未登上首頁,卻持續收到按讚,這讓人相當意外。我還是不確定這是怎麼發生的,因為我並沒有在任何地方連結到這個 Hacker News 討論串:

以下是我還想加入的一些功能:

  • 自動判斷當天在 Hacker News 上是新聞淡季還是首頁競爭激烈的日子。
  • 自動標記被管理員拉抬或壓制的貼文。
  • 根據投票和留言的初始情況,預測貼文的後續走勢。

這是我近年來最接近「大數據」專案的嘗試,因為我的多數網站每月只產生約 1 MB 的資料,而 HN Observer 每天就會產生 30 至 40 MB。我可以根據收集的資料量和更新頻率來調高或調低這個數字。

Hacker News 的資料儲存感覺是嘗試 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 進行翻譯