我把 300 行 if-else 拆成狀態機,然後後悔了一半
這篇沒有什麼驚心動魄的線上事故,就是一個關於「過度設計」的自我檢討。我把一段醜到不行的訂單狀態判斷——大概三百行的巢狀 ifelse——重構成了一台漂亮的狀態機。同事都說好看。半年後我回頭看,一半覺得值得,一半覺得我當初想太多。這篇講我為什麼重構、為什麼後悔了…
後端、系統設計與工程實戰的第一手筆記
這篇沒有什麼驚心動魄的線上事故,就是一個關於「過度設計」的自我檢討。我把一段醜到不行的訂單狀態判斷——大概三百行的巢狀 ifelse——重構成了一台漂亮的狀態機。同事都說好看。半年後我回頭看,一半覺得值得,一半覺得我當初想太多。這篇講我為什麼重構、為什麼後悔了…
凌晨三點多,值班手機響了。對帳服務噴出一堆「主鍵衝突」的錯誤——有兩筆完全不同的訂單,拿到了一模一樣的訂單編號。我們的訂單 ID 是用 Snowflake 演算法自己產的,理論上全域唯一、絕不重複。結果它重複了。這篇覆盤那晚到底發生什麼事,以及「時鐘」這個我們…
有一次線上 DB 的 CPU 莫名其妙飆到 90%,但 QPS 沒有暴增,慢查詢日誌也沒特別多。我查了快一個小時才發現真正的兇手:一堆「使用者早就取消、但後端還在跑」的查詢。前端請求逾時、使用者關了分頁,連線斷了,可是我的 Go 服務完全不知道,還老老實實地把…
我換過幾次工作,也以面試官的身分面過大概兩三百個人。有一陣子,我幾乎每週都要花掉好幾個下午坐在會議室裡,看著對面那個緊張到把履歷捏出摺痕的人,心裡盤算著「我願不願意每天跟這個人一起 debug」。後來自己又出去面試,坐到桌子的另一邊,被別人這樣盤算。 這兩個角…
從一次搶購事故說起 那是一個很普通的週四晚上八點。我們在做一檔限量商品的搶購活動,行銷估計大概會有幾萬人同時湧進來。後端服務早就壓測過了,DB 也升級到更高規格,我心想應該穩。 結果開賣後不到三十秒,監控就開始噴錯。不是 DB 掛掉,也不是 CPU 燒滿,而是…
我以前真的把人講跑過 我講一件不太光彩的事。 大概是我入行第四、五年的時候,技術上自認小有底氣,做過撮合引擎的核心,扛過幾次大流量。有一次公司要上一個新功能,PM 來找我估時間,順便問我為什麼前一個版本會卡。我記得我滔滔不絕講了快二十分鐘,從資料庫的鎖講到我們…
一次「應該很安全」的改名 那次我很有信心,結果翻車翻得很難看。 需求只是把一個欄位改個更清楚的名字。我在一個 migration 裡把欄位 rename 了,程式碼也同步改成用新名字,兩個一起打包上線。在我的認知裡這很乾淨——舊名字沒人用了,改掉剛好。 問題是…
我寫程式快十五年了。這段時間裡,我看著 jQuery 從神壇上跌下來,看著 AngularJS 整碗砸掉重練變成 Angular,看著 React 從一個臉書內部專案變成半個前端世界的共主,看著容器化、微服務、Serverless、然後是現在每天都有人在講的 …
做後端做久了,你會發現有一類 bug 特別陰險:平常都好好的,壓力測試也過了,上線跑了三個月相安無事,結果某天半夜流量一尖峰,帳就對不上了。客訴進來說「我明明只點了一次提現,怎麼被扣兩次」,或是行銷活動的限量券被同一個人搶了五張。你翻 log 翻到天亮,最後發…