2026 年 6 月 12 日,Pomofocus 的第一天。commit 紀錄是這樣的:
16:24 M0: project skeleton with transparency smoke test (1ff4a3a, 497 行)
17:25 M1: timer MVP — full state machine, timer panel UI, (b46b3d7, 699 行)
synthesized chimes
20:57 M2: data + settings — JsonStore base (atomic write + (a9a4c3d, 797 行)
debounce), settings/stats stores, settings panel UI
21:07 M2 補上秒級精度設定 (b8a2d90, 101 行)
22:51 M3: break guidance — break_window with 3 intensities, (dd1b96f, 1102 行)
5 eye-care step scenes, short/long break orchestration
六個半小時,四個里程碑,3196 行。
我知道這看起來很像「用 AI 三小時做完一個 App」的行銷文。所以這篇要講的是:為什麼這次可以,前面三次不行。
Sproutimer 也很快。4 月 7 日晚上 58 分鐘就有一個會跑的番茄鐘計時器,比這個還快。
差別在於,Sproutimer 那 58 分鐘之後沒有終點。
我做完計時器就開始想「接下來做什麼」,然後是設定視窗、標籤、筆記、音樂、自動變色⋯⋯每一個都是當下想到的。
Pomofocus 在動工前就有六個里程碑,每個里程碑寫死了內容和驗證方式:
階段 內容 驗證成果 | M0 骨架 | 建專案、目錄、project settings(透明/embed off)、autoload 空殼 | 主視窗能跑;透明冒煙測試 PASS |
| M1 計時 MVP | 狀態機完整 + timer_panel UI + 音效 | 自動測試以縮時設定跑完整循環(含長休/skip/overrun);pause/resume 凍結正確 |
| M2 資料+設定 | settings/stats store(原子寫檔)、settings_panel | store 自動測試 22 項 PASS |
| M3 休息引導 | break_window 三強度、五個 step、流程編排、達成回寫 | 自動測試 37 項 PASS |
底下還有一句:
MVP = M0-M2(可日常自用),靈魂功能在 M3/M5,招牌噱頭在 M4。
這句話定義了什麼可以晚點做。前三版每個功能在我眼裡都一樣重要,於是我照著「哪個做起來比較有趣」的順序做。
上面那張表右邊那欄是關鍵。「M2 自動測試 22 項 PASS」「M3 自動測試 37 項 PASS」——這些不是我事後補的,是當下就要跑過才算完成。
這對 vibe coding 是必要的。AI 產出的速度遠超過我 review 的速度,M3 那個 commit 1102 行,我不可能逐行看。我能做的是確認它自己跑過的測試涵蓋了關鍵行為:短休長休流程、跳過和完成的差別、強制模式的 ESC 逃生。
至於畫面好不好看、手感對不對,那是我的工作,交接文件裡另外列了一節「待人工驗證」。
M1 的狀態機有個細節我覺得值得講:所有計時都用 Time.get_unix_time_from_system() 的差值算,不是用每幀累加。
原因寫在風險清單裡——筆電闔上再打開,累加式的計時器會以為時間沒有經過。用絕對時間就不會有這個問題。
這是規劃階段就決定的事,不是踩到坑之後才修。
M2 的原子寫檔:設定和統計都存成 JSON,寫的時候先寫暫存檔再 rename,避免寫到一半當機造成檔案損毀。加上 debounce,不會每改一個設定就寫一次硬碟。
M3 的三種休息強度:柔性小視窗、全螢幕可跳過、強制全螢幕鎖定。這是整個程式最重要的功能,因為它直接對應我前三版失敗的原因——提醒太弱,我會忽略。
Sproutimer 13 個開發日、103 個 commit、40 小時,最後停在一個沒合併的分支。
Pomofocus 前三個里程碑只花一天,六天後(6/18)已經是我可以日常使用的狀態。
同樣的人、同樣的工具、幾乎同樣的每日時數。差別是有沒有先想清楚要蓋什麼,以及怎麼知道蓋好了。
我的里程碑表:
| 階段 | 內容 | 驗證成果 |
|---|---|---|
| M2 資料+設定 | store(原子寫檔)、設定面板 | store 自動測試 22 項 PASS |
| M3 休息引導 | 三強度視窗、五個步驟、達成回寫 | 自動測試 37 項 PASS;雙螢幕遮罩待實機 |
右邊那欄是整張表的價值所在。沒有驗證方式的里程碑,等於沒有終點——沒有終點就會一直覺得「好像還可以再加一點」,然後就變成我的第二版。
還有一句話建議寫在表格下面,一行就好:
MVP = M0–M2(可日常自用),靈魂功能在 M3/M5,招牌噱頭在 M4。
這句話定義了什麼可以晚點做。沒有它的話,每個功能在眼裡都一樣重要,於是就會照「哪個做起來比較有趣」的順序做——而最有趣的那個,通常不是最該做的那個。
最後一個實務細節:時長要能調到秒。 在 M2 特地加了秒級設定,就是為了讓 25 分鐘的循環可以在幾十秒內測完。這種「為了測試而做的功能」看起來像繞路,實際上它讓後面每一次驗證都快十倍。
明天講素材。6 月 15 日晚上 8 點 12 分到 8 點 47 分,35 分鐘之內,我用 AI 產的圖做出了一隻會走路的貓。