Refactoring English:第 12 個月
原文由 Michael Lynch 于 發布,訂閱此部落格
一句話總結
好吧,那我就自己做一個分享寶寶照片的 App。
本月亮點
- 正在開發一款預測哪些貼文會登上 Hacker News 首頁的遊戲。
- 一氣之下,正在打造一款家庭照片分享 App。
- 改用了以鍵盤為主的視窗管理器。
目標成績單
每個月月初,我都會訂下當月想完成的目標。以下是這個月的達成狀況:
發表兩個新書章節
- 結果:只發表了一個新章節
- 評分:C
設計文件那一章卡住了。想涵蓋的內容很多,有些部分還沒想清楚該怎麼表達,也還沒決定到底有多少內容該放進書裡。
問題之一是這一章太長,光是想到要一次處理完就讓人覺得吃不消。我新的計畫是把這一章拆成更小的段落,一次專注處理一個部分。我覺得這應該是最後一個「硬骨頭」章節了,剩下的章節我對要寫什麼已經比較有頭緒。
聯繫 10 位讀者
- 結果:只聯繫了兩位讀者(有一位回覆)
- 評分:D
我一直在拖延這件事,雖然其實我很喜歡做,也總能得到有用的回饋。我不斷把其中繁瑣的行政流程自動化,希望降低一開始的阻力,就能更有動力去做。
打造一個能為 Refactoring English 網站帶來流量的工具或部落格文章
這篇文章有 3,508 人閱讀,算是成功吸引到一些新讀者。我在文中讚美的原作者 Bob Nystrom 也很喜歡這篇文章,讓我感到很欣慰。當初我就想,就算文章沒什麼人看,至少也能讓 Bob Nystrom 知道我有多欣賞他的作品。
Refactoring English 數據
| 指標 | 2025 年 10 月 | 2025 年 11 月 | 變化 |
|---|---|---|---|
| 不重複訪客 | 22,398 | 7,608 | -14,790 (-66%) |
| 預購收入 | $570.75 | $1,018.48 | +$447.73 (+78%) |
| 贊助收入 | $48.25 | $48.25 | $0.00 (0%) |
| 總收入 | $619.00 | $1,066.73 | +$447.73 (+72%) |
以造訪量和銷售額來看,11 月是個不錯的月份。雖然訪客數比 10 月略為下降,但仍是今年表現最好的月份之一。
我做了黑色星期五 30% 折扣的優惠。我只在電子報名單內宣傳,因為我總覺得在各處洗版促銷有點彆扭。不過公告效果不錯,有 18 位顧客購買,總額為 $359.41。
Peter Spiess-Knafl,zeitkapsl 的共同創辦人,在一篇部落格文章中引用了 Refactoring English,而該篇文章登上了 Lobsters 第一名。看到 Peter 的文章我很開心,因為我寫這本書的初衷,就是希望它能幫助讀者寫出成功的部落格文章,並讓讀者喜歡到願意主動推薦。
遊戲「它會上首頁嗎?」
我太常逛 Hacker News 了,總覺得自己很會預測哪些貼文會上首頁,但從來沒有認真驗證過。所以,我做了一個遊戲來測試自己的準確率。

遊戲會顯示 Hacker News 上最新的投稿,讓玩家預測它們會不會登上首頁:

這個遊戲最大的問題是,一篇投稿可能要花上 24 小時才會登上首頁。等 24 小時才知道結果,實在太掃興了。
我試著改規則,改成預測文章在發表後 30 分鐘內會不會上首頁,但 30 分鐘還是慢得讓人難受。
我新的想法是在投稿發表 10 分鐘後先做一次暫時性的判定。根據投稿的發表時間、得票數和留言數,我可以粗略計算出它上首頁的機率。所以,如果你預測某篇貼文會上首頁,但 10 分鐘後它依然沒有任何票數或留言,遊戲就會暫時判定你猜錯了,不過如果這篇貼文在接下來的 24 小時內奇蹟似地逆襲成功,你還是可以把分數拿回來。
我也考慮過做一個猜測過去投稿結果的版本。這樣就能即時給出答案,因為結果已經確定了,但感覺比較無趣,而且類似的遊戲已經有人做過了。再說,對於我希望吸引的那些 Hacker News 重度使用者來說,用過去的資料就破梗了,因為大家多少都記得哪些曾上過首頁、哪些沒有。
一氣之下,打造免費的 TinyBeans 替代品
我和太太去年迎來了第一個孩子,所以想找個能私下和家人分享寶寶照片的方式。有些朋友用過這類 App,但全都是靠廣告營利。我很討厭有人在孩子的照片旁邊塞廣告的想法,所以開始尋找其他選擇。
當我看到 TinyBeans 時,我以為找到了理想的解決方案。他們有付費版可以關閉廣告,而且主打隱私:太完美了!
結果開始使用後,才發現到處都是廣告。「來買我們的相片書吧!」「提供更多個人資訊吧!」
我剛剛才打開 App,為了看自己孩子的照片,竟然得先關掉三個不同的廣告。



即使我是付費用戶,而且已經關掉這些一模一樣的廣告數十次,TinyBeans 每次打開 App 還是會跳出三個巨大的廣告。
後來才發現,我的家人看到的廣告比我還多,甚至包含第三方服務的廣告。這是最近的一個例子,慫恿我的家人去投資某家可疑的 AI 公司:

TinyBeans 寄給我家人的電子郵件中,就會在兒子的照片之間塞進這種垃圾廣告。
付費版所承諾的「無廣告」只對我和太太有效;TinyBeans 還是會用廣告和推銷轟炸我家裡的其他人。
我很早就想換掉 TinyBeans,但剛當新手爸媽忙得不可開交,沒空去找新 App 並把全家人都遷移過去。所以每個月,我都心不甘情不願地付給 TinyBeans 9 美元。
然後,黑色星期五來了。
TinyBeans 寄了一封自我吹捧的電子郵件,說他們不會用黑色星期五的優惠塞爆我的收件匣,因為所有優惠都會放在 App 裡。

TinyBeans 寄了一封毫無意義的信,就為了炫耀他們不會用毫無意義的信來塞爆我的收件匣。
真棒,一封恭喜自己不會常寫信給我的信。
但那根本是騙人的!接著 TinyBeans 又寄了四封信叫我去 App 裡查看黑色星期五優惠:

在承諾不會用黑色星期五促銷轟炸我之後,TinyBeans 還是寄來了五封黑色星期五促銷信。
這成了壓垮駱駝的最後一根稻草,現在我帶著一股不甘心的幹勁,決心自己做一個 TinyBeans 的替代品,不再把錢給 TinyBeans。

「那你想打造一個分享寶寶照片的 App,理由是什麼呢?」
我在 TinyBeans 上真正在乎的功能只有:
- 家人可以瀏覽我上傳的寶寶照片和影片。
- 家人可以透過電子郵件訂閱,收到最新的照片和影片。
- 家人可以對照片留言或用表情符號回應。
這能有多難?大概 20 小時的開發工作吧?
反正 TinyBeans 的網頁版和 Android App 本來就很難用,能擺脫它們我求之不得。而且因為體驗主要還是以電子郵件為主,我可以用自己的 App 取代 TinyBeans,而家人在遷移過程中完全不需要多做任何事。
我不是要開一間公司來跟 TinyBeans 競爭。我只是想做一個能取代 TinyBeans 功能的網頁 App。
改用 Awesome Window Manager
身為開發者,我有個難以啟齒的秘密:我很不會管理螢幕上的視窗。我的補救方式是過度使用滑鼠,雖然又慢又沒效率。
去年,我從 Windows 換到 Linux 並買了一台 49 吋的超寬螢幕。Windows 對像我這種愛用滑鼠的人很友善,但 Linux 桌面更注重鍵盤操作,所以我缺乏鍵盤操作紀律的問題就暴露出來了。我會一直開新視窗卻從不關掉,結果同時開著 10 幾個 VS Code 視窗、10 幾個 Firefox 視窗,還有 5 個為了隨手計算而開的計算機。它們全都堆在桌面的正中央。
到那個時候,很明顯我在浪費大量螢幕空間,也浪費時間在找視窗。我試了幾種不同的視窗管理器,但一直遇到問題。像是鎖定螢幕無法運作,或是無法使用螢幕完整的 5120x1440 解析度。
我見過操作電腦最快的人是我的朋友 okay zed。我向他請教,他分享了他對視窗管理的看法。他的策略是使用多個虛擬桌面,讓每個桌面上的視窗幾乎都是全螢幕顯示。他用的是 xmonad,但他建議我試試 Awesome Window Manager。
我很喜歡 okay 那種單一用途虛擬桌面的理念,所以就依此打造了一個 Awesome window manager 設定。像是部落格有專屬桌面、寫書有專屬桌面、收信也有專屬桌面等等。我盡量讓每個桌面只放 1 到 2 個視窗,但有時查資料會臨時再開第三、第四個。
這是我的部落格桌面,算是很典型的配置:一個 VS Code 視窗用來編輯,一個 Firefox 視窗用來預覽成果,有時還會再開一個 Firefox 視窗來查資料:

我不喜歡任何預設的桌面模式,所以只好自己寫一個。它的邏輯是每個視窗佔螢幕寬度的 25%,如果開超過四個,就會全部擠在一起塞進畫面。我也可以用 Shift+Win+H 和 Shift+Win+L 手動放大或縮小視窗。只是有時會不小心把自己鎖在外面,因為 Win+L 是我鎖定螢幕的快捷鍵。
用了 Awesome 幾個星期後,我的感想如下:
- 喜歡的地方
- 鼓勵我維持單一用途的桌面,讓我更專注。
- 鼓勵我用鍵盤快捷鍵而非滑鼠點擊來操作。
- 不會像 Gnome 那樣在休眠時有 2% 的機率當掉。
- 不喜歡的地方
- 所有東西都是用 Lua 實作與設定的,而我根本不會這個語言。我的設定檔全是靠 LLM 幫我寫的。
- 設定相當底層,像是要讓視窗填滿可視範圍又不超出這類邏輯,都得自己寫。
- 我不喜歡任何預設的桌面模式,所以得自己打造。
- 文件全是文字,對於一套專為圖形介面設計的軟體來說,感覺有點怪。
- 如果不小心設定了衝突的快捷鍵,Awesome 不會警告你。
- 如果我在 Firefox 以外的地方點連結,有時它會在不是當前桌面的瀏覽器中開啟。我猜它是開在最近一次使用過的那個 Firefox 視窗裡。
- 還沒搞定的部分
- 如何實作「暫存視窗」功能。例如想把密碼管理器叫出來當成浮動視窗,或是快速叫出計算機算一下再關掉。
- 如何在狀態列中加入更多小工具,像是網路連線狀態和資源使用率。
值得一看的連結
在部落格中快取外部內容
我在 Mastodon 上和 LGUG2Z 聊到,在部落格裡嵌入推文有多惱人。如果使用者刪除了推文,我的文章裡就會出現死掉的內容。就算沒被刪除,讀者也得載入來自 Twitter 的追蹤器。我一直以來的變通方法是直接截圖推文,但那是個很醜的解法。
我想在 Hugo(我這個部落格用的靜態網站產生器)中用像 {<tweet id="12345">} 這樣的 shortcode 來嵌入推文,然後讓 Hugo 去抓取推文資料並納入版控,這樣就不用一直依賴 Twitter。
LGUG2Z 深入研究了這個想法並在他的 Zola 部落格上實作了支援。他會執行一個腳本,事先一次性從外部來源(如推文)下載資料,之後就能在部落格中嵌入內容,而不需要在建置部落格或讀者瀏覽時重新抓取。
我試著把 LGUG2Z 的解法移植到 Hugo,但變得太複雜了。我寫了一個獨立的腳本來下載來自 Twitter 的資料,然後再用類似推文的介面來呈現。一般的純文字推文還算正常,但一遇到帶有嵌入媒體或轉推的推文,就感覺像是在不穩固的基礎上蓋房子,越做越吃力。
Michael Stapelberg 使用 Immich 的心得
我以前把所有照片都存在 Google Photos。儘管有隱私上的顧慮,但 Google Photos 就是比其他任何服務好太多,所以我只好捏著鼻子把所有照片都交給它。後來我對隱私越來越敏感,也越來越不信任 Google,所以不再上傳新照片到 Google Photos,但一直還沒找到替代方案。
我聽說 Immich 和 Ente 的評價都不錯,所以看到 Michael Stapelberg 這篇關於用 NixOS 架設 Immich 伺服器的詳細心得文,覺得很有幫助。
Firefox 強化追蹤保護
Firefox 最近改進了強化追蹤保護,這項功能我之前甚至不知道它的存在。我開啟後,它擋掉了連 uBlock 都放行的追蹤器,而且目前還沒有出現誤判。
〈Rich Friend, Poor Friend〉
我最近才發現 2022 年的〈Rich Friend, Poor Friend〉以及幾週前發表的續篇。我非常能體會寧願花錢請專業人士,也不願開口請朋友幫忙的心態(例如請搬家公司而不是找朋友來幫忙搬家)。
我大概正處在曲線最尷尬的位置:有錢到不想叫朋友來幫忙搬家,卻又還沒富有到能擁有一間獨立的客房來好好招待他們。
更多證據顯示 Deel 聘用了商業間諜
Deel 的商業間諜案在我的同溫層裡,受到的關注少得令人意外。
2025 年 3 月,Rippling 揭露他們發現一名員工其實是競爭對手 Deel 派來的商業間諜。被揭穿時,這名間諜衝進廁所,試圖把手機沖進馬桶裡。

Rippling 在 11 月發布更新,表示他們找到了銀行紀錄,顯示 Deel 透過其營運長妻子的帳戶向該名間諜付款。巧的是,這位妻子正是 Robinhood 的法遵主管,而 Robinhood 也是一家以道德操守低劣聞名的公司。
身為一名曾對 Deel 體驗不佳的前客戶,看到他們遭到報應,我感到很痛快。
總結
完成了什麼?
- 發表了〈What Makes the Intro to Crafting Interpreters so Good?〉
- 發表了〈My First Impressions of MeshCore Off-Grid Messaging〉。
- 發表了〈Add a VLAN to OPNsense in Just 26 Clicks Across 6 Screens〉
- 寫了一個名為 count-clicks 的 Zig 小工具,用來在 x11 系統上計算點擊和按鍵次數。
- 讓 Awesome Window Manager 正常運作。
經驗收穫
- 要做出有趣的遊戲,快速回饋很重要。
- TinyBeans 其實有很多廣告,即使是付費版也一樣。
- Awesome window manager 比 Gnome 更符合我的需求。
下個月的目標
- 發表一款能為 Refactoring English 網站帶來流量的遊戲。
- 發表 Refactoring English 的兩個章節。
- 為那個純粹好玩的家庭照片分享 App 撰寫設計文件。
徵求協助
- 如果你有興趣參與「它會上首頁嗎?」遊戲的 Beta 測試,歡迎與我聯繫。
隨機一篇部落格
留言
登入後參與討論