Refactoring English: Month 4

Michael Lynch

重構英文:第 4 個月

一句話總結

我正式要寫一本書了!

重點回顧

  • 我的新書預售成功了(驚險過關)。
  • 我寫了好幾篇部落格文章,但完全沒猜中哪些會受歡迎。
  • 現在,我得為寫書挑選一種 markup language(標記式語言)。

目標成績單

每個月月初,我都會宣告這個月想完成的事。以下是達成狀況:

在 Kickstarter 上為 Refactoring English(《重構英文》)達成 5,000 美元的募資目標。

  • 結果:Kickstarter 共募得 6,701 美元,來自 196 位贊助者。
  • 評分:A+

Kickstarter 的表現比我預期的好,在最後關頭成功逆轉。

發表《重構英文》的部落格寫作章節。

這篇文章在 Hacker News Lobsters 上表現不錯,但在 reddit 上反應平平。

在三月底前兩度登上 Hacker News 首頁。

既然達成了這個目標,我現在感覺很不錯,但在這個月的大部分時間裡,我一直擔心如果五個構想全數失敗會有多難堪。還好,五篇中有兩篇成功了。

我的新書預售成功了

這個月的大部分時間裡,我的書看起來注定要失敗。預售進度顯示將比 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 提交〉4544
〈如何寫出實用的提交訊息〉2534
〈如何寫出開發者會想看的部落格文章〉2425
如何維護開源專案並保持快樂3342
微調寫作:使用強而有力的動詞5115
在 Windows 上用了 35 年後,使用 NixOS 的三個月3251
用 Zig 建置 C 應用程式3341

最後我從清單中挑了前三名,但表現不如預期。結果如下:

標題對銷售的影響總閱讀人次Hacker Newsreddit
〈如何寫出開發者會想看的部落格文章〉22.3k9.7k325
〈如何寫出實用的提交訊息〉2.6k1261.2k
〈不再是我最愛的 Git 提交〉31.6k876.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(數位版權管理) 技術類傳統出版社?
    • 我打算自行出版第一版,但若第二版能有與傳統出版社合作推出紙本版的選項會更好。

可選的工具似乎有:

工具PDFepubHTML成熟度出版社支援
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 套件並讓它獲得更多測試覆蓋:

起因是我想If-Modified-Since HTTP 標頭新增支援,但當我查看負責發起 HTTP 請求的程式碼時,發現很難修改。主要有幾個問題:

  • 程式碼混雜了許多不同職責:讀取資料庫、判斷何時查詢 feed 的邏輯、解析外部資料,以及將結果寫回資料庫。
  • 程式碼沒有自動化測試來驗證它。
  • 如果我想寫測試,唯一會執行到這段程式碼的公開函式是Puller.PullAll,而那個函式還管理著一組工作行程池,更加深了複雜度。

我做的主要改動有:

我還想再稍微整理一下,但目前為止的進展讓我很滿意,也幫助我修復了幾個錯誤並改善了 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 創辦人的經驗來看,每一點都完全符合實際情況。

總結

完成了什麼?

下個月的目標

  • 寫一篇關於 Kickstarter 經驗教訓的部落格文章。
  • 完成一個新的書籍章節,或針對書中主題開一場線上直播教學。
  • 與所有選擇公開致謝或需要部落格文章編輯協助的 Kickstarter 贊助者協調回饋事宜。

徵求協助

如果你有使用 markup language(也就是非 Word 或 Google Docs)出版書籍的經驗,請與我分享你的心得。

原文由 Michael Lynch 發布

本文章由 muse-spark-1.2-contributor 進行翻譯