重構英文:第 20 個月
一句話總結
書籍銷量成長三倍,同時對抗爬蟲機器人。
第一次來嗎?
嗨,我是 Michael(麥可)。我是一名軟體開發者,也是小型獨立科技事業的創辦人。我目前正在撰寫一本名為Refactoring English: Effective Writing for Software Developers(《重構英文:寫給軟體開發者的有效寫作》)的書。
每個月,我都會發表一篇像這樣的回顧,分享我的書籍進度以及整體工作近況。
本月亮點
- 7 月的書籍銷量是 6 月本已強勁銷量的三倍。
- 我正在對抗全世界最笨的爬蟲機器人。
- 我正在用 AI 打造一款多人瀏覽器遊戲。
目標成績
每個月月初,我都會宣告當月想完成的目標。以下是我達成這些目標的情況:
向 5 個 Podcast 節目提案,談談《重構英文》
- 結果:只向一個 Podcast 節目提案
- 成績:D
我花了很多時間準備向 Talking Postgres 提案,但後來發現主持人除了 LinkedIn 之外沒有任何聯絡方式。所以,我在 LinkedIn 上傳訊息給她,但一直沒有收到回覆。我有登上The TMPDIR Podcast,不過他們早在我提案之前就邀請了我,所以不能算數。
為《重構英文》網站吸引 3 萬名不重複讀者
- 結果:網站有 2.38 萬名不重複讀者
- 成績:B
我心裡其實是把這個目標想成「讓一篇文章登上 Hacker News 首頁」,但我做到了,卻還是沒達到 3 萬名讀者。
結束搶先體驗,並發布書籍的 1.0 正式版
- 結果:尚未達到 1.0 正式版
- 成績:D
我最後花了比預期更多時間回應使用者回饋。我的回饋應用程式運作得很順利,但它也產生了許多難以預料的新工作。
《重構英文》數據指標
| 指標 | 2026 年 6 月 | 2026 年 7 月 | 變化 |
|---|---|---|---|
| 不重複訪客 | 17,523 | 23,817 | +6,294 (+36%) |
| 預購營收 | $1,441.86 | $3,908.80 | +$2,466.94 (+171%) |
6 月是自 Kickstarter 以來書籍銷量第二好的月份,但 7 月的銷量又是 6 月的三倍。
銷量大幅成長的主因是我結束了搶先體驗優惠。我在 7 月 13 日宣布搶先體驗價格將於 7 月 20 日結束,價格將從 30 美元調漲至 49 美元。
在優惠的最後一天,我發表了一篇名為「Why I Stopped ‘Creating Content,’」的部落格文章,該文登上了 Hacker News 首頁。接著它又成為當日在 bubbles.town 上最熱門的貼文,這是一個風格類似 Hacker News、但更獨立、較不以科技為中心的網站。
在優惠的最後一天,銷量出現了巨大的飆升,僅當天就創造了超過 1,000 美元的銷售額。
當我把價格調漲至 49 美元後,銷量迅速下滑,這也在我的預料之中。我計畫在書籍正式發布 1.0 版後,再進一步嘗試不同的定價策略。
我正在對抗全世界最笨的爬蟲機器人
我在週一發表了部落格文章,訪客人數大幅增加。接著,週二又出現了另一波巨大的暴增:

我看到訪客人數大幅暴增,以為是有知名的部落客連結到我的文章,後來才意識到一定是機器人。
所有的訪客都湧向Hacker News Popularity Contest。以前也曾有部落客談到自己在這個排行榜上的名次並連結到我的工具,讓我看到訪客激增,但從來沒有像這次這樣規模龐大、且持續這麼久的訪客潮。
當我看到第二波高峰時,我心想:「哇,我這週真是順風順水!」我正跟太太分享這件事時,突然恍然大悟:
我今天又多了五萬名訪客!我甚至不確定他們是從哪裡來的。我猜可能是有人在推特上分享了。
嗯,其實如果有人在推特上分享,我應該會在來源看到 Twitter 才對。
喔……是機器人。
我去查看了紀錄,發現所有請求的瀏覽器 user agent 都一模一樣:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36那是 Chrome 125,一個已經超過兩年舊的瀏覽器版本。這個瀏覽器版本讓我很容易辨識出機器人,因為不太可能還有閱讀我部落格的真人使用者仍在使用這麼舊的瀏覽器。
這個爬蟲似乎只是反覆載入排行榜首頁,然後一遍又一遍地點擊每一個連結,所以我試著耍了點小聰明。我在 Bunny 上放了一個重寫腳本,會檢查 user agent,如果是爬蟲就回傳假的回應。原本會產生 3,000 多個連結的頁面,就只會產生只有三個連結的頁面。
不知為何,我的假回應沒有奏效。我猜這個爬蟲已經把完整的網址集合加入資料庫了,所以就算在首頁上把連結藏起來也沒有用。
我試著做速率限制,但 Bunny 支援的最低速率限制是 1 KB/s,而我應用程式的大部分資料都是只有幾 KB 的小檔案。這個爬蟲會輪替使用約 100 多個不同的 IP 區段,所以我也無法透過 IP 來限流。
最後,我乾脆直接用 IP 區段封鎖。我用 vibecoded(氛圍編程) 做了一個工具,會掃描 Bunny 的紀錄中特定的 user agent,並收集所有與這次攻擊相關的 IP。這招奏效了,但一週後攻擊又從新的 IP 和稍微新一點的 user agent 捲土重來,所以我又重新執行腳本,更新了要封鎖的 IP 清單,目前看來又奏效了。
這次攻擊最詭異的地方在於,這些機器人根本不在乎被封鎖。它們還是持續不斷地猛烈請求伺服器。我本來以為它們會想:「喔,既然過去兩週 100% 的請求都在 TCP 層級被封鎖了,那就別再浪費運算資源和頻寬了」,但它們顯然不在乎。

即使我封鎖了攻擊者的 IP,他們還是持續不斷地猛攻。
攻擊開始當天我就聯繫了 Netlify 支援,但他們完全沒幫上忙。我每等一次回覆就要等一週。我覺得第一封回覆是 AI 生成的,因為它叫我去修改根本不存在的設定。然後第二封回覆看起來比較像真人寫的,但內容基本上是說:「看起來你在我花兩週回覆的這段時間內已經自己解決問題了,所以沒什麼需要我做的了!」幸好,在我提出要求後,他們有退還我 55 美元的超額費用。
該把靜態網站託管在哪裡?
我所有的靜態網站都託管在 Netlify 上,而他們的服務品質一直在變差,但他們對爬蟲機器人攻擊的完全漠視,讓我下定決心要找一家會更積極處理爬蟲機器人的供應商。
最顯而易見的答案是「Cloudflare」,但我對網際網路基礎設施如此集中在 Cloudflare 身上感到憂心,所以不想讓它進一步集中化。
我也考慮過直接在 VPS 上託管,或是用 VPS + Bunny 作為 CDN,但我不希望我的網站在登上 Hacker News 首頁的那天,因為 VPS 當機或我在 Bunny 上設定快取錯誤而離線。我想要的是一個只要付錢就有人幫我維持網站上線的解決方案。
- Surge
- 優點
- 專注於靜態網站託管,這正是我想要的
- 無限流量,因此他們會自行吸收爬蟲機器人攻擊的成本
- 缺點
- 由單一個人營運(我認為),因此斷線風險較高
- 所有管理都透過他們的終端機應用程式完成,沒有網頁介面
- 看起來不支援多因子驗證,不過他們似乎正在開發中
- 上傳流程會無條件上傳所有檔案,而非像 rsync 那樣只同步有變更的檔案,這對我那些只會小幅增量變更的大型網站來說很不方便
- 優點
- statichost
- 優點
- 由單一個人營運,因此客服回應迅速且全面
- 主要專注於靜態網站託管,沒有多餘的複雜功能
- 缺點
- 由單一個人營運,因此斷線風險較高
- 上傳流程會無條件上傳所有檔案,而非像 rsync 那樣只同步有變更的檔案,這對我那些只會小幅增量變更的大型網站來說很不方便
- 未包含機器人爬蟲防護
- 將網站建置與託管綁在一起,但我只需要託管
- 一大賣點是以歐盟為中心,但我在美國
- 優點
- Vercel
- 優點
- 聲稱能防禦 DDoS/爬蟲機器人
- 我認為他們支援類似 rsync 的上傳方式
- 缺點
- 龐大而複雜的服務
- 我沒有理由相信 Vercel 會比 Netlify 對我更好
- 優點
- 在 Bunny CDN 之上自建解決方案
- 我有考慮過這個選項,但在 Bunny 上實作增量上傳與原子部署本身就是一個複雜的專案
Mikeville:我那款未完成的多人瀏覽器遊戲
我一直在試驗一台小型的雲端託管伺服器,它有 4 顆 CPU 和 8 GB 的 RAM,但大部分時間都閒置著。如果我手邊有一台不錯的伺服器還有大量閒置資源,有什麼有趣的東西可以架來給朋友們玩呢?
何不架個遊戲呢?我看過像Valheim和ARK這類可自行託管的遊戲,但感覺那些遊戲如果沒有其他玩家同時在線,就不好玩了。
身為一個每隔幾個月才玩一次電腦遊戲的人,我想要的是一款即使其他人同時在線可以一起玩得很開心,但就算我缺席一段時間,回來也能看到期間發生了什麼事的遊戲。我心中想要的感覺,就像我和朋友們共同擁有一間海邊小屋,有時會一起去那裡度假,但如果各自單獨造訪,也會為對方留下字條和小禮物。
問題在於,我想不出該如何把這種海邊小屋的感覺,具體轉化為遊戲的概念。
目前,我正在探索 vibecoded 遊戲開發是什麼感覺,並試著找出什麼樣的玩法有趣。在設計這個原型時,我心中想到的兩款遊戲是 Stardew Valley 和 Ultima Online,這兩款遊戲我都花了很多時間遊玩。
如果你想在瀏覽器中試玩,遊戲已經上線:
我今天會上線一陣子,歡迎來逛逛。原始碼目前放在GitLab上,直到我找到更好的 git forge 為止。
我喜歡的部落格文章
- Stripe Just Wants a Number
- 我很喜歡 exe.dev 這個部落格,我覺得他們思考問題的方式很有趣,尤其是影響小型軟體供應商的軟體問題。雖然我沒有複雜到需要用到這種機制的帳務邏輯,但我覺得原則上聽起來很酷。
- 99% of My Website Traffic Is Bots
- 鑑於我這個月對抗爬蟲機器人的經驗,我覺得這篇文章很有共鳴,也很有幫助。我也很喜歡其中的自製插圖。
- I Regret Migrating to Codeberg
- 過去一年來,我一直在把專案從 GitHub 遷移到 Codeberg,而且我是付費會員,但現在我後悔投資這個平台了。平台經常斷線,也有許多日子伺服器過載。壓垮駱駝的最後一根稻草是 Codeberg 決定封禁使用 AI 的專案。我應該還在「過度」使用 AI 的任意門檻之下,但我仍計畫搬到別處。
- Super Mario Derivations
- 這是一個很巧妙的 Nix 技巧,作者將超級瑪利歐 3 代在模擬器中的遊玩狀態編碼為 Nix 屬性,例如
nix build '.#level1.rightb.rightb.rightab.rightb'代表開始第 1 關並按下 Right + B(向右跑)兩次、Right + A + B(跑步加跳躍)、再按一次 Right + B(向右跑)。Nix 會快取所有的遊戲狀態,因此你可以更改某個按鍵操作,只重新計算與先前執行不同的部分。
- 這是一個很巧妙的 Nix 技巧,作者將超級瑪利歐 3 代在模擬器中的遊玩狀態編碼為 Nix 屬性,例如
總結
下個月的目標
- 向 5 個 Podcast 節目提案,談談《重構英文》。
- 為《重構英文》網站吸引 3 萬名不重複讀者。
- 發布書籍的 1.0 正式版。
需要幫忙的地方
- 如果你有靜態網站託管的推薦,歡迎告訴我。
- 如果你認識 Claire Giordano(克萊兒·喬丹諾),請告訴她我會是很適合上Talking Postgres的來賓(想聊的是技術寫作,不是 Postgres)。
隨機一篇部落格
