Refactoring English:第四個月
原文由 Michael Lynch 于 發布,訂閱此部落格
一句話總結
我正式要寫一本書了!
亮點
- 新書的預售成功了(驚險過關)。
- 寫了一堆部落格文章,結果完全猜不準哪篇會紅。
- 現在,得為寫書挑選一種標記語言。
目標達成度
每個月月初,我都會宣告當月想完成的目標。以下是這個月的達成狀況:
為《Refactoring English》在 Kickstarter 上達成 5,000 美元的募資目標。
- 結果:Kickstarter 共募得 6,701 美元,來自 196 位贊助者。
- 成績:A+
Kickstarter 的表現比我預期好,在最後關頭逆轉勝。
發表《Refactoring English》的部落格寫作章節。
- 結果:發表了〈如何寫出開發者會想看的部落格文章〉
- 成績:A
這篇文章在 Hacker News 和 Lobsters 上反應不錯,但在 reddit 上則沒有起色。
在三月底前兩度登上 Hacker News 首頁。
- 結果:〈如何寫出開發者會想看的部落格文章〉和《Hacker News 人氣大比拼》都登上了首頁。
- 成績:A
現在總算達標,感覺很不錯,但這個月大部分時間我都很擔心——要是五篇構想的文章全都失敗,看起來一定很蠢。還好,五篇中有兩篇成功了。
新書預售成功了
這個月大部分時間,我的書看起來註定要失敗。預售進度落後 5,000 美元的目標約 1,500 美元。
在預售截止前四天,其中一篇部落格文章在 Hacker News 上受到關注,完全扭轉了銷售狀況。
最終,Kickstarter 募得了 6,551 美元,超過了 5,000 美元的目標。若加上後續的預購,總額已達 6,701 美元。

上週我寫了更詳細的預售經過:
我打算另外寫一篇專門談 Kickstarter 的文章,但這次的體驗很不錯。它成了衡量大家對這本書興趣的好方法。而且 6,500 美元的預購金額,已經高於傳統出版社願意付給我的預付版稅。
我能複製 Julia Evans 的商業模式嗎?
《Refactoring English》預售最讓人興奮的地方,在於它讓我看到靠寫部落格維生的可能性。
經營 TinyPilot 時,寫部落格確實幫我找到了最初的幾十位顧客。但到後來,感覺個人部落格對銷售已經沒什麼幫助。這也很合理,因為對獨立創業者的日記感興趣的人,不一定會想買一台 400 美元的 KVM over IP 裝置。
由於硬體事業的複雜度,我的時間總是很吃緊,很難把一天中精神最好的「深度思考」時段留給個人部落格。從那之後,我一直在思考能經營什麼樣的事業,讓寫部落格能與獲利好好結合。
我的假設是,透過製作教育性產品,可以讓寫部落格變得可持續。如果我寫自己正在做的事,同時有一本書或一門課程能更深入探討,讀者就能學到更多,也能支持我的工作。
靠部落格內容賺錢的最佳範例就是 Julia Evans。她經營一個軟體部落格,並透過販售插畫小誌來獲利。
Julia 現在已經不再公開營收,但她在 2019 年靠小誌就有約 10 萬美元的年營收。那 10 萬美元還是她開始全職經營部落格之前的數字。雖然那是營收而非獲利,但由於小誌是數位產品,只需支付給 Gumroad 等金流與內容平台的手續費,我預期毛利率大約有 90 到 95%。
所以,還是副業時就能有 10 萬美元的營收,表現已經相當好。想像一下,如果 Julia 全職投入後銷量成長三倍;若我能達到她一半的成功程度,那就是靠寫部落格與販售相關產品年收 15 萬美元。聽起來很有挑戰性,但並非不可能。
當作生計般認真寫部落格
三月寫部落格是個有趣的挑戰,因為我試著透過寫出受歡迎的文章來為新書找顧客。這對我來說很不尋常,因為我平常寫作沒有截稿壓力,也不會為了追求最多讀者來挑選主題。
我有一長串的主題點子與寫到一半的草稿,所以我從以下幾個面向來評估它們:
- 難易度:要寫出一篇感覺完整的文章,有多容易?
- 潛在讀者:如果這篇文章成功了,有多大族群會喜歡它?
- 成功機率:這篇文章成功觸及目標讀者的機率有多高?
- 與新書的關聯:如果讀者透過這篇文章認識我,他們對我的書感興趣的機率有多高?
我沒有坐下來正式幫每個點子打分數,但心裡大致的盤算是這樣:
| 標題 | 難易度 | 潛在讀者 | 成功機率 | 與新書關聯 |
|---|---|---|---|---|
| 不再是我最愛的 Git Commit | 4 | 5 | 4 | 4 |
| 如何寫出實用的 Commit 訊息 | 2 | 5 | 3 | 4 |
| 如何寫出開發者會想看的部落格文章 | 2 | 4 | 2 | 5 |
| 如何維護開源專案並保持快樂 | 3 | 3 | 4 | 2 |
| 精煉寫作:使用強而有力的動詞 | 5 | 1 | 1 | 5 |
| 用了 35 年 Windows 後,使用 NixOS 的三個月心得 | 3 | 2 | 5 | 1 |
| 用 Zig 來建置 C 應用程式 | 3 | 3 | 4 | 1 |
我最後挑了清單上的前三名,但表現不如預期。結果如下:
| 標題 | 對銷售的影響 | 總讀者數 | Hacker News | |
|---|---|---|---|---|
| 如何寫出開發者會想看的部落格文章 | 高 | 22.3k | 9.7k | 325 |
| 如何寫出實用的 Commit 訊息 | 中 | 2.6k | 126 | 1.2k |
| 不再是我最愛的 Git Commit | 低 | 31.6k | 87 | 6.4k |
〈不再是我最愛的 Git Commit〉我原本覺得是最強的點子,因為我知道可以很快寫完,而且原作非常受歡迎,潛在讀者應該很多。結果它在 Lobsters 上表現不錯,在 reddit 上表現普通,在 Hacker News 上則徹底失敗。直到坐下來寫這篇回顧時我才發現,有個我甚至不知道存在的東西——Google Discover——推薦了我的文章,帶來了 1.5 萬名讀者。
這篇文章對我來說有點特別,因為我以前從來沒寫過反駁別人的部落格文章。剛開始動筆時我很興奮,因為我對原作有很多想法。寫完初稿後,我卻開始猶豫,覺得自己是不是在無端攻擊一位六年前寫了那篇文章的部落客。我調整了用詞,讓語氣不那麼像攻擊,但還是感覺有點挑釁。
〈如何寫出實用的 Commit 訊息〉本來是打算用來為預售暖身的文章。它在 Lobsters 上表現不錯,在 reddit 上表現普通,但在 Hacker News 上失敗了。很難判斷它對銷售到底有多大影響,因為我無法區分讀者是因為這篇文章而預購,還是因為同一天我向新書的郵件名單宣布了預售消息。
〈如何寫出開發者會想看的部落格文章〉則是拯救這本書的意外之作。它在 Lobsters 上表現普通,在 reddit 上慘敗。我第一次投稿到 Hacker News 時也失敗了,但隔天早上有人重新投稿,結果獲得了極大的迴響,最終拿下當日第 4 名。最棒的是,許多透過 Hacker News 找到這篇文章的人,都成了預售的顧客。
Hacker News 人氣大比拼
「用工程技術做行銷」(engineering as marketing)是那些不擅長行銷的工程師(比如我)很愛用的一招。
概念是,你打造一個與付費產品相關的免費工具,然後期待大家對你的免費東西印象夠深刻,進而去看看你的付費產品。
我很久以前就想做一個 Hacker News 部落格排名系統,因為我一直很好奇自己跟其他在 Hacker News 上受歡迎的作者相比如何。去年夏天我做了一個基本原型,本來是打算用在我即將重啟的打上 Hacker News 首頁課程中。
當我把課程擱置、專注於《Refactoring English》後,就不知道該怎麼處理這個部落格排名工具。三月時,當我迫切想讓預售成功,就意識到可以花一兩天把原型整理到能上線的程度。

Popularity Contest 是我為推廣《Refactoring English》而打造的工具
這個工具成功登上了 Hacker News 首頁,但對書的銷售沒有任何影響。
一個出乎意料的反應是,前 100 名中有很多人很在意自己的排名。我原本以為,如果已經是 Hacker News 上最受歡迎的個人部落客之一,應該已經夠有名,不會太在意 Hacker News 的排名,但很多前 100 名的人都在公開或私下透過私訊/電子郵件向我回應。
許多頂尖部落客似乎特別關心自己的排名隨時間如何變化,最引人注目的是 John Gruber,他覺得我的工具印證了他的理論:Hacker News 近年來對他的網站施加了人工降權。
基於這樣的反應,我新增了查看個別部落格更詳細數據的功能,但目前還沒看到太多對這項功能的回饋。

頂尖部落客似乎很想分享自己網域的數據,所以我建立了單一部落格檢視。
為新書挑選標記語言
到目前為止,我都是用 Markdown 搭配 Hugo 來寫書。我還沒開始製作正式的 PDF 版本,所以一直把挑選出書技術的決定往後延。
現在書已經確定要寫了,我得選一種寫作方式。我在意的功能有:
- 這個工具能否原生輸出 PDF?
- 能否原生輸出 epub?
- 能否原生輸出 HTML?
- 這個工具的成熟度如何?我會不會很容易遇到新的臭蟲或卡關,做一些簡單的事卻做不到?
- 哪些支援無 DRM、走技術路線的傳統出版社支援這種格式?
- 我打算第一版先自助出版,但如果第二版有機會與傳統出版社合作推出紙本書,能有這個選項會很好。
目前看來的選項有:
| 工具 | epub | HTML | 成熟度 | 出版社支援 | |
|---|---|---|---|---|---|
| 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 套件並讓更多程式碼被測試覆蓋:
pull套件重構前(v0.8.9) vs. 重構後(v0.9.3)
起因是我想新增對 If-Modified-Since HTTP 標頭的支援,但當我查看負責發起 HTTP 請求的程式碼時,發現很難修改。有幾個問題:
- 程式碼把很多不同職責混在一起:讀取資料庫、判斷何時查詢 feed、解析外部資料、以及把結果寫回資料庫。
- 這段程式碼完全沒有自動化測試覆蓋。
- 如果我想寫測試,唯一能執行到這段程式碼的公開函式是
Puller.PullAll,而那個函式還額外管理了一組 worker 處理程序,更加複雜。
我做的主要改動有:
- 把 HTTP 邏輯移到獨立的檔案。
- 把 RSS 解析移到獨立的檔案。
- 把查詢單一 feed 的邏輯從管理多個 worker 的元件中抽離出來,讓針對單一 feed 的邏輯更容易測試。
- 為這段程式碼與資料庫的互動方式建立了更簡單、更清晰的介面,讓在測試中模擬資料庫變得更容易。
- 建立了一個專門用來決定是否更新 feed 的函式,而不是把判斷邏輯與更新流程的其他部分混在一起。
我還想再稍微整理一下,但目前的進展我已經很滿意,也幫我修掉了幾個臭蟲、改善了 fusion 的功能。
我該正式讓 What Got Done 退役了
2019 年,我做了一個叫 What Got Done 的網站應用程式。那是我第一次嘗試做真正的 SaaS 事業,但找不到任何顧客。
我到現在每週都還在用。現在已經連續五年每週發表更新,但我是唯一穩定使用的使用者。偶爾會有人來試用,但通常幾週後就覺得無聊、不再發文了。
我寫這個網站時,對網頁開發還懂得不多。網站原本使用 Go、Vue 2、App Engine 和 Google Cloud Firestore。我後來已經把 App Engine 換成 fly.io、把 Firestore 換成 SQLite,讓開發變得稍微愉快一點,但我還是覺得用 Vue 開發很痛苦。我找不到什麼好方法可以漸進地從 Vue 搬到原生 JavaScript,也不想投入 30 多個小時做一次大重構。
我最近意識到,這個網站其實更適合做成用 Hugo 產生的靜態網站:我在喜歡的編輯器裡寫每週更新,然後推送到 main 分支時,持續整合就會建置並發布網站。這就是這個部落格的運作方式。對 What Got Done 來說,這樣可以省去很多關於使用者帳號、驗證與資料庫管理的複雜度。而且,這代表我所有的更新都是可搜尋的純文字檔,而不是被困在 SQL 資料庫裡的資料。
維運這個網站不用花我任何費用,每年也只要花大約五小時維護。所以我並不急著讓它退役,但我已經踏出了第一步:關閉了註冊功能。
之後某個時間點,我可能會寫信給最近的使用者,宣布專案即將退役,並讓他們匯出自己的資料。
有趣的連結
- 在競爭激烈的市場中經營 SaaS 四年 - 這是我讀過關於打造自給自足(bootstrapped)公司最棒的部落格文章之一。我贊同 Max 分享的幾乎所有觀點。以我作為自給自足創辦人的經驗來看,每一點都深有同感。
總結
完成了什麼?
- 發表了〈不再是我最愛的 Git Commit〉
- 發表了〈如何寫出開發者會想看的部落格文章〉
- 發表了〈我的新書預售驚險過關〉
- 發布了Hacker News 人氣大比拼作為新書的行銷工具
下個月的目標
- 寫一篇關於從 Kickstarter 中學到的教訓的部落格文章。
- 完成一個新的書籍章節,或針對書中主題開一場線上直播課程。
- 與所有選擇公開致謝或需要協助潤飾部落格文章的 Kickstarter 贊助者協調回饋事宜。
徵求協助
如果你有使用標記語言(也就是非 Word 或 Google Docs)出版書籍的經驗,請跟我分享你的經驗。
隨機一篇部落格
留言
登入後參與討論