Refactoring English: Month 20

Michael Lynch

Refactoring English:第 20 個月

原文由 Michael Lynch 發布,訂閱此部落格

一句話總結

在對抗爬蟲機器人的同時,書籍銷量成長至三倍。

第一次來嗎?

嗨,我是 Michael。我是一名軟體開發者,也是幾家小型獨立科技公司的創辦人。目前正在撰寫一本名為 Refactoring English: Effective Writing for Software Developers 的書。

每個月我都會像這樣發表一篇回顧,分享這本書以及整體工作近況的進展。

本月亮點

  • 7 月的書籍銷量是 6 月本已強勁銷量的三倍。
  • 我正在對抗全世界最蠢的爬蟲機器人。
  • 我正在用 AI 製作一款多人瀏覽器遊戲。

目標達成度

每個月初,我都會訂下當月想完成的目標。以下是這個月的達成狀況:

向 5 個 Podcast 節目毛遂自薦,聊聊 Refactoring English

  • 成果:只向一個 Podcast 節目提案
  • 評分:D

我花了很多時間準備要向 Talking Postgres 提案,結果才發現主持人除了 LinkedIn 之外沒有留下任何聯絡方式。於是我在 LinkedIn 上傳了訊息給她,但一直沒有收到回覆。我有 擔任《The TMPDIR Podcast》的來賓,不過那是對方在我提案之前就主動邀請的,所以不能算數。

Refactoring English 網站吸引 3 萬名不重複訪客

  • 成果:網站有 2.38 萬名不重複訪客
  • 評分:B

我心裡其實是把這個目標當成「有一篇文章登上 Hacker News 首頁」,雖然達成了,卻還是沒能達到 3 萬名訪客。

結束搶先體驗,並發布本書的 1.0 正式版

  • 成果:仍未發布 1.0 正式版
  • 評分:D

結果我花在回應讀者回饋的時間比預期多了很多。我的回饋 App 運作得很順利,但它也會不斷產生難以預料的新工作。

Refactoring English 數據一覽

指標2026 年 6 月2026 年 7 月變化
不重複訪客17,52323,817+6,294 (+36%)
預購收入$1,441.86$3,908.80+$2,466.94 (+171%)

6 月本來已經是我這本書自 Kickstarter 以來銷量第二好的月份,結果 7 月的銷量又是 6 月的三倍。

銷量暴增的主因是我結束了搶先體驗的優惠。我在 7 月 13 日宣布搶先體驗價格將於 7 月 20 日結束,價格會從 30 美元調漲至 49 美元。

顯示 7 月 20 日銷量暴增、之後銷量下滑的銷售圖表

在優惠的最後一天,我發表了一篇名為 〈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 上放了一段轉寫規則(rewrite script),檢查使用者代理,如果是那個爬蟲就回傳假的頁面。原本會產生 3,000 多個連結的頁面,就只會產生三個連結。

不知為何,假回應並沒有奏效。我猜這個爬蟲早就把完整的網址清單存進資料庫了,所以就算在首頁把連結藏起來也沒用。

我試過限速,但 Bunny 支援的最低限速是 1 KB/s,而這個 App 的大部分資料都是只有幾 KB 的小檔案。爬蟲還會輪流使用大約 100 多個不同的 IP 區段,所以也無法用 IP 來限流。

最後我乾脆直接封鎖 IP 區段。我用 vibe coding 做了一個工具,去爬 Bunny 的紀錄,找出特定使用者代理的所有 IP 並收集起來。這招奏效了,但一週後攻擊又從新的 IP 和一個稍微新一點的使用者代理捲土重來,所以我就重跑一次程式,更新封鎖清單,目前看來有效。

這次攻擊最詭異的是,這些機器人根本不在乎被封鎖。它們還是繼續猛烈地敲伺服器。照理說它們應該會想:「過去兩週所有請求都在 TCP 層就被 100% 擋掉了,再浪費運算資源和頻寬也沒意義吧,」但它們顯然不在乎。

即使我已經封鎖了攻擊者的 IP,他們還是持續不斷地發送請求。

攻擊開始那天我就聯繫了 Netlify 客服,但他們完全幫不上忙。每封回覆都要等上一週。我覺得第一封回覆是 AI 產生的,因為它叫我去修改根本不存在的設定。第二封回覆看起來比較像真人寫的,但內容基本上就是說:「看起來你在我花兩週才回覆的這段時間內已經自己解決問題了,所以也沒什麼需要我做的了!」幸好在我提出要求後,他們有退還我 55 美元的超量費用。

靜態網站還能託管到哪裡?

我所有的靜態網站都託管在 Netlify 上,他們的服務品質一直在走下坡,但這次對爬蟲攻擊完全漠不關心,讓我下定決心要找一家會更主動處理爬蟲機器人的廠商。

最顯而易見的答案是「Cloudflare」,但我對目前已有太多網路基礎設施集中在 Cloudflare 身上感到憂心,所以不想再進一步集中化。

我也考慮過直接用 VPS,或用 VPS + Bunny 當 CDN,但我不希望在我登上 Hacker News 首頁的那天,因為 VPS 當機或我在 Bunny 上快取設定錯誤而導致網站掛掉。我想要的是一個只要付錢就有人幫我把網站維持在線的解決方案。

  • Surge
    • 優點
      • 專注於靜態網站託管,正是我想要的
      • 無限流量,由他們承擔爬蟲攻擊帶來的成本
    • 缺點
      • (據我所知)由單一個人經營,因此斷線風險較高
      • 所有管理都透過他們的終端機 App 進行,沒有網頁後台
      • 看起來不支援多因子驗證,不過似乎正在開發中
      • 上傳時會無條件上傳所有檔案,而不是像 rsync 那樣只同步有變更的檔案,對於我那些只有小幅更動的大型網站來說很麻煩
  • statichost
    • 優點
      • 由單一個人經營,因此客服回應快速且周到
      • 主要專注於靜態網站託管,沒有多餘的複雜功能
    • 缺點
      • 由單一個人經營,因此斷線風險較高
      • 上傳時會無條件上傳所有檔案,而不是像 rsync 那樣只同步有變更的檔案,對於我那些只有小幅更動的大型網站來說很麻煩
      • 不包含防爬蟲保護
      • 將網站建置與託管綁在一起,但我只需要託管
      • 主打以歐盟為中心,但我人在美國
  • Vercel
    • 優點
      • 聲稱能防範 DDoS/爬蟲機器人
      • 我想他們有支援類似 rsync 的上傳方式
    • 缺點
      • 龐大又複雜的服務
      • 我沒有理由相信 Vercel 會比 Netlify 對我更好
  • 在 Bunny CDN 上自己打造解決方案
    • 我有考慮過這個做法,但在 Bunny 上實作增量上傳和原子化部署本身就是個複雜的專案

Mikeville:我那個還沒做完的多人瀏覽器遊戲

最近我在玩一台小型的雲端伺服器,它有 4 顆 CPU 和 8 GB 記憶體,但大部分時間都閒置著。既然手邊有一台還不錯、還有餘裕的伺服器,有什麼好玩的東西可以架來給朋友們用呢?

要不要架個遊戲?我看過像 ValheimARK 這類可以自己架設伺服器的遊戲,但感覺那些遊戲如果沒有其他玩家同時在線,就不好玩了。

身為一個每隔幾個月才玩一次電腦遊戲的人,我想要的是一款就算只有自己上線也能好玩、有人同時在線就更好玩,而且就算不在線,回來也能看到期間發生了什麼事的遊戲。我腦中想像的感覺,就像是和朋友共同擁有一間海邊小屋,有時一起去度假,分開去的時候則會為彼此留下紙條和小禮物。

問題是,我想不出該如何把這種「海邊小屋」的感覺,轉化成具體的遊戲概念。

目前我正在探索用 vibe coding 來做遊戲的感覺,試試看什麼樣的玩法有趣。設計這個原型時,我腦中想的是《星露谷物語》(Stardew Valley)和《網路創世紀》(Ultima Online),這兩款我都花了很多時間遊玩。

如果想在瀏覽器中試玩,遊戲已經上線:

今天我會稍微在線一下,歡迎來逛逛。原始碼目前放在 GitLab 上,等找到更好的 Git 託管平台再搬家。

我喜歡的部落格文章

  • 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 技巧,作者用 Nix 屬性在模擬器中編碼《超級瑪利歐 3》的遊玩狀態,例如 nix build '.#level1.rightb.rightb.rightab.rightb' 代表從第一關開始,依序按下 Right + B(向右跑)兩次、Right + A + B(跑步跳躍),再按一次 Right + B(向右跑)。Nix 會快取所有的遊戲狀態,所以你只要改一個按鍵,就只需要重新計算與之前不同的部分。

總結

下個月的目標

  • 向 5 個 Podcast 節目毛遂自薦,聊聊 Refactoring English
  • Refactoring English 網站吸引 3 萬名不重複訪客。
  • 發布本書的 1.0 正式版。

需要協助的地方

  • 如果你有靜態網站託管的推薦,歡迎告訴我。
  • 如果你認識 Claire Giordano,幫我跟她說我會是 Talking Postgres 很適合的來賓(是去聊技術寫作,不是聊 Postgres)。

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

留言