重構英文:第 4 個月
一句話總結
我正式要寫一本書了!
重點回顧
- 我的新書預售成功了(驚險過關)。
- 我寫了好幾篇部落格文章,但完全沒猜中哪些會受歡迎。
- 現在,我得為寫書挑選一種 markup language(標記式語言)。
目標成績單
每個月月初,我都會宣告這個月想完成的事。以下是達成狀況:
在 Kickstarter 上為 Refactoring English(《重構英文》)達成 5,000 美元的募資目標。
- 結果:Kickstarter 共募得 6,701 美元,來自 196 位贊助者。
- 評分:A+
Kickstarter 的表現比我預期的好,在最後關頭成功逆轉。
發表《重構英文》的部落格寫作章節。
- 結果:已發表〈如何寫出開發者會想看的部落格文章〉
- 評分:A
這篇文章在 Hacker News 和 Lobsters 上表現不錯,但在 reddit 上反應平平。
在三月底前兩度登上 Hacker News 首頁。
- 結果:〈如何寫出開發者會想看的部落格文章〉與 HN Popularity Contest 都登上了首頁。
- 評分:A
既然達成了這個目標,我現在感覺很不錯,但在這個月的大部分時間裡,我一直擔心如果五個構想全數失敗會有多難堪。還好,五篇中有兩篇成功了。
我的新書預售成功了
這個月的大部分時間裡,我的書看起來注定要失敗。預售進度顯示將比 5,000 美元的目標少 1,500 美元。
在預售結束前四天,我的一篇部落格文章在 Hacker News 上受到關注,徹底扭轉了銷售狀況。
最終,Kickstarter 募得 6,551 美元,超過了 5,000 美元的目標。若加上延後預購,現在已達到 6,701 美元。

上週我寫了更完整的預售紀實:
我打算另外寫一篇關於 Kickstarter 的專文,不過這次的體驗很不錯。事實證明,這是衡量讀者對我的書感興趣程度的好方法。而且 6,500 美元的預購金額,也比傳統出版社願意支付給我的預付版稅還要高。
我能讓 Julia Evans(茱莉亞·伊凡斯)的商業模式為我所用嗎?
《重構英文》預售最令人興奮的地方,在於它讓我看到靠部落格維生的那線曙光。
在經營 TinyPilot 時,寫部落格確實幫我找到了最初的幾十位客戶。但到後來,我感覺個人部落格對銷售幾乎沒有幫助了。這也很合理,因為對獨立創業者日記感興趣的人,未必會想買一台 400 美元的 KVM over IP 裝置。
由於硬體事業的複雜性,我的時間總是很有限,很難把一天中大部分「深度思考」的時段投入到個人部落格。自那以來,我一直在思考該經營什麼樣的事業,才能讓寫部落格與獲利好好結合。
我的假設是,透過打造教育性產品,我可以讓部落格經營變得可持續。如果我寫下自己正在做的事,同時擁有一本更深入探討的書或課程,讀者就能學得更多,也能資助我的工作。
靠相關內容賺錢的部落客,最好的例子就是伊凡斯。她經營一個軟體部落格,並透過販售插畫小誌來獲利。
伊凡斯現在已不再公開營收,但在 2019 年時,她靠小誌每年就有約 10 萬美元的營收。那 10 萬美元還是她全職投入部落格之前的成績。雖說那是營收而非獲利,但由於小誌是數位產品,只需支付給 Gumroad 等付款處理商與內容平台的手續費,我預期毛利約在 90% 至 95% 之間。
所以,還是副業時就能有 10 萬美元的營收,已經相當不錯。假設伊凡斯轉為全職經營後,銷量成長為三倍。如果我能達到她一半的成功程度,那靠部落格與相關產品每年也能有 15 萬美元的收入。聽起來很有挑戰性,但並非不可能。
像攸關生計般地寫部落格
三月是一次有趣的部落格挑戰,因為我試圖透過撰寫成功的部落格文章來為新書尋找客戶。這對我來說很不尋常,因為我平常不會為了截稿期限而寫,也不會為了追求最多讀者來挑選主題。
我有一長串的主題構想和寫到一半的草稿,因此我從以下幾個面向來評估它們:
- 難易度:要寫出一篇感覺完整的文章有多容易?
- 潛在受眾:如果這篇文章成功,會有多少潛在讀者喜歡它?
- 成功機率:這篇文章有多大可能觸及目標讀者?
- 與書籍的重疊度:如果讀者發現這篇文章,他們對我的書感興趣的可能性有多高?
我沒有坐下來正式為每個構想打分數,但大致上的心算結果如下:
| 標題 | 難易度 | 潛在受眾 | 成功機率 | 與書籍的重疊度 |
|---|---|---|---|---|
| 〈不再是我最愛的 Git 提交〉 | 4 | 5 | 4 | 4 |
| 〈如何寫出實用的提交訊息〉 | 2 | 5 | 3 | 4 |
| 〈如何寫出開發者會想看的部落格文章〉 | 2 | 4 | 2 | 5 |
| 如何維護開源專案並保持快樂 | 3 | 3 | 4 | 2 |
| 微調寫作:使用強而有力的動詞 | 5 | 1 | 1 | 5 |
| 在 Windows 上用了 35 年後,使用 NixOS 的三個月 | 3 | 2 | 5 | 1 |
| 用 Zig 建置 C 應用程式 | 3 | 3 | 4 | 1 |
最後我從清單中挑了前三名,但表現不如預期。結果如下:
| 標題 | 對銷售的影響 | 總閱讀人次 | Hacker News | |
|---|---|---|---|---|
| 〈如何寫出開發者會想看的部落格文章〉 | 高 | 22.3k | 9.7k | 325 |
| 〈如何寫出實用的提交訊息〉 | 中 | 2.6k | 126 | 1.2k |
| 〈不再是我最愛的 Git 提交〉 | 低 | 31.6k | 87 | 6.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 作者相比如何。去年夏天我做了一個基本原型,因為我打算在重啟我的Hit the Front Page of Hacker News(《登上 Hacker News 首頁》)課程時使用它。
當我擱置課程、專注於《重構英文》時,我不知道該怎麼處理這個部落格排名工具。到了三月,我急於讓預售成功,才意識到可以花一兩天時間把原型整理到可發布的程度。

Popularity Contest 是我為了推廣《重構英文》而打造的工具
這個工具成功登上了 Hacker News 首頁,但對書籍銷售沒有任何影響。
一個出乎意料的反應是,前 100 名中有很多人很在意自己的排名。我原本以為,如果你是 Hacker News 上最受歡迎的個人部落客之一,你已經夠有名,Hacker News 對你來說應該沒那麼重要,但前 100 名中有不少人公開或私下透過私訊/電子郵件向我留言。
許多頂尖部落客似乎特別關心自己的排名如何隨時間變化,最明顯的就是 John Gruber(約翰·葛魯伯),他覺得我的工具佐證了他的理論:Hacker News 近年來對他的網站施加了人工懲罰。
基於這個反應,我新增了查看個別部落格更詳細數據的功能,但目前還沒看到太多人對這項功能做出回應。

頂尖部落客似乎對分享自己網域的數據很感興趣,因此我建立了個別部落格檢視頁面。
為新書挑選 markup language
到目前為止,我都是用 Markdown 搭配 Hugo 來寫書。我還沒開始製作正式的 PDF 版本,所以一直把挑選出書技術的決定往後延。
既然出書已經確定,我需要挑選一種寫作方式。我在意的功能有:
- 該工具能否原生輸出 PDF?
- 該工具能否原生輸出 epub?
- 該工具能否原生輸出 HTML?
- 該工具的成熟度如何?我在嘗試完成簡單需求時,遇到新錯誤或走進死胡同的可能性有多高?
- 有哪些支援此格式的無 DRM(數位版權管理) 技術類傳統出版社?
- 我打算自行出版第一版,但若第二版能有與傳統出版社合作推出紙本版的選項會更好。
可選的工具似乎有:
| 工具 | epub | HTML | 成熟度 | 出版社支援 | |
|---|---|---|---|---|---|
| Asciidoctor | ✅ | ✅ | ✅ | 高 | 無 |
| LaTeX | ✅ | ❌ | ❌ | 非常高 | No Starch Press |
| Pollen | ❌ | ❌ | ✅ | 低 | 無 |
| Typst | ✅ | ❌ | ❌ | 低 | 無 |
| mdBook | ❌ | ❌ | ✅ | 低 | 無 |
看起來勝出者不是 Asciidoctor 就是 LaTeX。
有第三方工具可以把 AsciiDoc 轉換成 LaTeX。過程大概不會太愉快,但如果 No Starch 表示想出版我這本書的第二版,我大概也能咬牙做一次轉換。
我花了幾個小時試用 Typst。我喜歡它是 open-source(開源) 而且比 LaTeX 簡單,但改進幅度還不足以讓人改用一個更新、較不成熟的工具。而且,它似乎是為撰寫研究論文最佳化的,比較不是為寫書而設計。
副專案
讓 fusion RSS reader 獲得更多測試覆蓋
幾個月前換成 NixOS 後,我很享受在個人電腦上託管更多服務。我最喜歡的是 fusion,這是一款以 Go、Svelte 和 SQLite 打造的極簡 RSS reader。

fusion 是一款以 Go、Svelte 和 SQLite 打造的極簡 RSS reader。
我最喜歡 fusion 的一點是,它的維護者對程式碼貢獻一直很友善且樂於接受,所以我利用空閒時間做了一些小幅改進。
我最引以為傲的貢獻是重構 pull 套件並讓它獲得更多測試覆蓋:
pull套件修改前(v0.8.9)與修改後(v0.9.3)
起因是我想為 If-Modified-Since HTTP 標頭新增支援,但當我查看負責發起 HTTP 請求的程式碼時,發現很難修改。主要有幾個問題:
- 程式碼混雜了許多不同職責:讀取資料庫、判斷何時查詢 feed 的邏輯、解析外部資料,以及將結果寫回資料庫。
- 程式碼沒有自動化測試來驗證它。
- 如果我想寫測試,唯一會執行到這段程式碼的公開函式是
Puller.PullAll,而那個函式還管理著一組工作行程池,更加深了複雜度。
我做的主要改動有:
- 我把 HTTP 邏輯移到獨立的檔案中。
- 我把 RSS 解析移到獨立的檔案中。
- 我把查詢單一 feed 的邏輯從管理多個工作行程的元件中解耦出來,讓單一 feed 的邏輯更容易測試。
- 我為這段程式碼與資料庫的互動方式建立了更簡單、更清晰的介面,讓在測試中模擬資料庫變得更容易。
- 我建立了一個專門用來決定是否更新 feed 的函式,而不是讓這個判斷與更新流程的其他部分混在一起。
我還想再稍微整理一下,但目前為止的進展讓我很滿意,也幫助我修復了幾個錯誤並改善了 fusion 的功能。
我應該正式讓 What Got Done 退役了
2019 年,我建立了一個名為 What Got Done 的網頁應用程式。這是我第一次嘗試打造真正的 SaaS(軟體即服務) 事業,但找不到任何客戶。
我到現在每週仍在使用它。現在已經連續五年每週發文,但我是唯一持續使用的使用者。偶爾會有人加入,但通常幾週後就覺得無聊而不再發文。
我寫它的時候對網頁開發還懂得不多。網站最初使用 Go、Vue 2、AppEngine 和 Google Cloud Firestore。我後來已用 fly.io 取代 AppEngine,並用 SQLite 取代 Firestore,這讓開發體驗稍微好一些,但在 Vue 中工作仍讓我感到痛苦。我不知道有什麼好方法可以漸進地從 Vue 遷移到 vanilla JavaScript,也不想投入 30 多個小時進行大規模重寫。
我最近意識到,這個網站改成由 Hugo 產生的靜態網站會更合理:我可以用任何想用的編輯器寫每週更新,然後推送到主分支時,就由 continuous integration(持續整合) 來建置並發布網站。這個部落格就是這樣運作的。對 What Got Done 來說,這樣可以省去許多圍繞使用者帳號、身分驗證和資料庫管理的複雜性。此外,這也意味著我所有的更新都是可搜尋的純文字檔,而不是被困在 SQL 資料庫中的紀錄。
維持網站運作不需要任何成本,而且我每年只需花約五小時維護。所以,我並不急著讓它退役,但我已經邁出了第一步:關閉註冊。
未來某個時間點,我可能會寫信給最近的使用者,宣布專案即將退役,並讓他們匯出自己的資料。
精選連結
- 在競爭激烈的市場中經營 SaaS 四年 - 這是我讀過關於打造 bootstrapped(自籌資金) 公司最棒的部落格文章之一。我幾乎同意 Max Rozen(麥克斯·羅森)分享的所有觀點。以我作為 bootstrapped 創辦人的經驗來看,每一點都完全符合實際情況。
總結
完成了什麼?
- 發表了〈不再是我最愛的 Git 提交〉
- 發表了〈如何寫出開發者會想看的部落格文章〉
- 發表了〈我的新書預售驚險過關〉
- 發布了 Hacker News Popularity Contest 作為新書的行銷工具
下個月的目標
- 寫一篇關於 Kickstarter 經驗教訓的部落格文章。
- 完成一個新的書籍章節,或針對書中主題開一場線上直播教學。
- 與所有選擇公開致謝或需要部落格文章編輯協助的 Kickstarter 贊助者協調回饋事宜。
徵求協助
如果你有使用 markup language(也就是非 Word 或 Google Docs)出版書籍的經驗,請與我分享你的心得。
隨機一篇部落格