Refactoring English:第 12 個月
一句話總結
好吧,那我就自己做一個分享寶寶照片的 App。
重點整理
- 我正在做一個預測哪些貼文會登上 Hacker News 首頁的遊戲。
- 我出於不爽,正在做一個家庭照片分享 App。
- 我換成了以鍵盤為主的視窗管理器。
目標成績
每個月月初,我都會訂下想完成的目標。以下是這個月的達成狀況:
發布兩個新章節
- 結果:發布了一個新章節
- 成績:C
我在設計文件(design docs)那一章卡住了。想涵蓋的內容很多,有些部分還沒想清楚該怎麼表達,也還沒決定多少內容該放進書裡。
問題的一部分是,這一章太長了,一次處理全部讓人很有壓力。我現在的新計畫是把這一章拆成更小的段落,一次專注處理一個。我覺得這應該是最後一個「困難」的章節了,因為剩下章節要寫什麼,我已經比較有方向了。
聯繫 10 位讀者
- 結果:我只聯繫了兩位讀者(其中一位有回覆)。
- 成績:D
我一直在拖延這件事,雖然我其實很喜歡做,也總能得到有用的回饋。我持續自動化其中的行政流程,希望降低一開始的阻力能讓我更願意去做。
製作一個能把人帶到 Refactoring English(《重構英文》)網站的工具或部落格文章
有 3,508 人閱讀了這篇文章,所以在吸引新讀者方面算是有些成效。我寫的對象、原作者 Bob Nystrom(鮑伯·尼斯特羅姆)喜歡我的文章,讓我很開心。我本來想,就算文章沒什麼迴響,至少也能讓鮑伯·尼斯特羅姆知道我有多欣賞他的作品。
《重構英文》數據
| 指標 | 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% off 的折扣。我只向電子報名單上的讀者宣傳,因為我總覺得這樣到處宣傳促銷有點不好意思。但公告效果不錯,有 18 位顧客購買,總金額為 $359.41。
Peter Spiess-Knafl(彼得·斯皮斯-克納夫爾),zeitkapsl 的共同創辦人,在一篇部落格文章中引用了《重構英文》,該文章還登上了 Lobsters 的第一名。看到彼得·斯皮斯-克納夫爾的文章我很開心,因為我寫這本書的初衷,就是希望幫助讀者寫出成功的部落格文章,並讓他們喜歡到願意推薦這本書。
遊戲「Will it Hit the Front Page?」
我太常看 Hacker News 了,總覺得自己很會預測哪些故事會登上首頁,但從來沒有嚴謹地驗證過這個想法。所以,我做了一個遊戲來測試自己的準確率。

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

這個遊戲最大的問題是,一篇投稿最多可能要花 24 小時才會登上首頁。等 24 小時才知道結果,讓遊戲的樂趣大打折扣。
我試著改規則,改成預測文章是否會在發布後的前 30 分鐘內登上首頁,但 30 分鐘還是慢得令人難受。
我的新想法是在投稿發布 10 分鐘後就先做出暫定判斷。根據故事的發文時間、推文數和留言數,我可以算出它登上首頁的大致機率。所以,如果你預測某篇故事會登上首頁,但 10 分鐘後它仍然沒有任何推文或留言,遊戲就會暫時判定你猜錯了,不過如果故事在接下來的 24 小時內奇蹟般逆轉,你還是可以拿回分數。
我也考慮過做一個猜測過去結果的版本。這樣就能即時給出回饋,因為答案已經有了,但那感覺比較無趣,因為已經有不少人做過類似的遊戲了。而且,對於我希望吸引的 Hacker News 死忠玩家來說,用過去的資料反而會破壞樂趣,因為你多少會記得哪些曾上過首頁、哪些沒有。
一氣之下打造免費的 TinyBeans 替代品
我和太太去年迎來了第一個孩子,所以想找個能私下和家人分享寶寶照片的方式。有些朋友用過這類 App,但全都是有廣告的。我討厭讓公司在孩子的照片上塞廣告,所以一直在找其他選擇。
當我找到 TinyBeans 時,還以為找到了理想的選擇。他們有付費版可以關掉廣告,而且主打的就是隱私:太完美了!
然後,我開始使用 TinyBeans,才發現到處都是廣告。「來買我們的相片書吧!」「再提供多一點個人資訊吧!」
我剛剛打開 App,就得先關掉三個廣告才能看到自己孩子的照片。



即使我是付費用戶,而且已經關掉過這些廣告幾十次了,TinyBeans 打開時還是會跳出三個巨大的廣告。
結果發現,我家人看到的廣告比我還多,還包括第三方服務的廣告。這是最近一封鼓勵我家人去投資某家可疑 AI 公司的廣告:

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 個不同的計算機 App 來做一次性計算。全部擠在桌面的正中央堆成一團。
到了那個地步,很明顯我浪費了大量螢幕空間,也浪費時間在找視窗。我試了幾種不同的視窗管理器,但一直遇到問題。像是無法讓鎖定畫面正常運作,或是無法使用螢幕完整的 5120x1440 解析度。
我見過操作電腦最快的人是我朋友 okay zed。我向他請教,他解釋了他的視窗管理理念。他的策略是使用多個虛擬桌面,視窗在桌面內幾乎永遠是全螢幕。他用的是 xmonad,但他建議我試試 Awesome Window Manager。
我喜歡 okay 的單一用途虛擬桌面理念,所以我以此為基礎做了一個 Awesome 視窗管理器設定。所以,我為部落格、書籍、電子郵件等各設了一個專屬桌面。我盡量把每個桌面限制在 1 到 2 個視窗,但有時查資料時會多開到第三或第四個。
這是我的部落格桌面長相,算是很典型的:一個 VS Code 視窗用來編輯,一個 Firefox 視窗用來看成果,有時還會再開一個 Firefox 視窗來查資料:

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

Rippling 在 11 月發布了更新,表示他們找到了銀行紀錄,顯示 Deel 透過 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 視窗管理器比 Gnome 更適合我的需求。
下個月的目標
- 發布一個能吸引大家到《重構英文》網站的遊戲。
- 發布《重構英文》的兩個章節。
- 為好玩而做的家庭照片分享 App 寫一份設計文件。
徵求協助
- 如果你有興趣參與「Will it Hit the Front Page?」遊戲的 Beta 測試,歡迎聯繫我。
隨機一篇部落格