我朋友 Priya 負責管理一個 34 床醫療病房的排班,兩年來一直靠一個沒人按順序讀的群組簡訊來處理換班請求。她想要一個護理人員能在休息時間用手機打開、貼出需要有人代班的班次、並在值班護理長必須手動重新調整排班表之前就有人認領的東西。我花了三週的晚上時間把它做出來。這是它真正上線那天的紀錄——發佈、自訂網域、真實的護理人員、真實的班次——因為「在測試中能運作」和「早上七點病房人手短缺兩人時能運作」之間的落差,本身就是一種獨特的教訓。
早上 6:58 — 發佈
我前一晚就已經把部署目標設定成 Priya 自己的網域了,所以這部分反而有點虎頭蛇尾:按下發佈,看著建置的驗證紀錄跑過各項檢查:
- 路由是否正常解析
- 認領班次的端點回傳的是真實回應,而不是佔位資料
- 簡訊通知掛勾確實已設定完成,而不是模擬測試模式
全部通過。我在早上 6:58 傳連結給 Priya,因為我知道她這時正好要走進去上班,我想在這一天開始前就讓她看到它已經上線了,而不是事後才看到。
早上 7:15 — 第一個真實使用者做了一件我沒測試過的事
Priya 在二十分鐘內就貼出當晚的空缺班次,比我預期的快,這代表我連咖啡都還沒喝完,第一筆真實資料就已經出現了。接著一位叫 Denise 的護理人員認領了那個班次,四分鐘後取消認領,然後又重新認領。我完全不知道為什麼——也許她認領到一半查了自己的行事曆,發現有牙醫預約。應用程式處理得很正常。但我沒測試過的是三個人在同一個十秒鐘的視窗內試圖認領同一個班次,因為在三週獨自測試的過程中,這個情境一次都沒有出現在我腦海裡。此刻它也沒有出現在我腦海裡。它是在大約五小時後,出現在現實裡的。
早上 9:40 — 安靜下來,而我對這份安靜感到不安
接下來兩個半小時什麼事都沒發生。沒有認領、沒有貼文、日誌裡也沒有錯誤。我還是檢查了儀表板四次,這是一個我應該戒掉的習慣——一個沒人使用的建置專案並不是壞掉了,只是還沒被使用而已,這是兩個不同的問題,需要不同的解法。我強迫自己關掉分頁,去做點正事。
中午 11:52 — 那個缺陷
認領端點三個都接受了,因為我把「標記為已認領」的邏輯寫成一個簡單的「若為開放狀態則更新」檢查,沒有加鎖,在一般單使用者測試情況下,這種競爭條件根本沒有機會發生。但在三支不同手機同時點擊的情況下,它有大把機會發生。三位護理人員都收到了確認簡訊,說他們已經接下這個班次。Denise 是其中之一,這已經是她那天第二次遇到這種事,而這次她真的不太開心。
我想誠實說明我是怎麼發現這個問題的——不是靠監控系統發現的。是 Priya 傳訊息告訴我的,還附了一個笑臉表情符號,雖然我不認為她是真心覺得好笑,因為這對她的下午來說,確實是個麻煩:
app 說有 3 個人搶到同一個班欸 笑死
中午 12:10 — 進入建置對話
我用白話描述了這個缺陷:如果多人在差不多同一時間點擊,就可能有多人同時認領同一個班次,但應該只有一個認領能成立。我沒有先嘗試自己寫修正方案,部分原因是我當時人在停車場、用手機操作,部分原因是精準描述失敗現象通常比精準診斷問題更快。代理將問題追溯到認領資料表缺少資料列鎖定,並提出改用原子式條件更新——只有在班次狀態仍為「open」時認領才會成功,而且由這個操作本身來決定誰勝出,而不是先檢查再寫入,讓三個請求都同時看到「open」狀態。這就是那個缺陷用一句話說清楚的樣子,而這類問題往往是一旦說出來就顯而易見,但在被逼著浮現之前完全看不見。
下午12:34——修正上線,我讓Priya等了一下
這次的修補很小。但我仍然沒有在班次進行中直接把它推上正式網域——我先在預覽版上執行,請Priya那位沒上班的護理長同事,從三個瀏覽器分頁同時試了三次連點認領的情境。結果扛住了。一個認領成功通過,另外兩個收到「這個班次剛被其他人認領」的訊息,而不是出現錯誤的成功確認。我在下午12:34把它推上線,大約是缺陷發生後四十二分鐘,當下覺得很慢,回頭看卻覺得很快。
下午2:00到6:00——無聊卻美好的那段時間
- 再多發布了 11 個班次
- 9 個順利被認領
- 2 個過期未被認領,轉回Priya仍手動管理的看板——這沒關係,這個工具不需要第一天就解決所有問題,它只需要解決當初真正壞掉的那個問題
- 0 次再發生重複認領
我盯著的是數字,而不是在腦中想像結果,這是完全不同、也更冷靜的一種活動。
我會怎麼做得不一樣
兩件事。
- 我會在最初的建構提示詞裡就描述同時認領的情境,而不是在上線後才臨場發現——「多個使用者、同一個動作、同一個瞬間」就是一句話的事,不是什麼困難的要求,我只是沒想到要加進去,因為我自己測試時本質上是依序操作的;我一次也只會點一個按鈕。
- 第二週我把太多時間投入在簡訊通知文字的措辭上——同一則確認訊息重寫了三次,根本沒人抱怨——卻在正好相反的地方投入不足:一整個休息室裡護理師同時盯著手機的那種並行情境,第一天本來就注定會遇到的那種邊界情況。
下次上線,我會少花時間在沒人會來挑剔的文案潤飾上,多花時間問「如果五個人同時做這件事會怎樣」,因為只要有超過一個真實使用者,遲早會有人這麼做。



