所有文章,由新到舊。想通的就寫一下,沒想通的就先擱著。
Every post, newest first. I write when something has finally clicked.
去年我花兩週解掉的 deadlock,我完全忘了。翻回當時的筆記,看到的自己像個陌生人。這篇是我給未來自己的備忘。
The two-week deadlock I survived last year? I forgot it. Not half-forgotten — gone. Notes met a stranger. This is my memo to future-me.
大部分 Go 並發的 bug 都是「用錯姿勢」,不是工具本身有問題。這篇整理我看過的三種最常見模式。
Most Go concurrency bugs aren't tool bugs — they're shape mismatches. Three patterns I keep reaching for, and when each is the wrong answer.
邊讀邊寫的筆記,不是完整文章。主要記我原本以為懂、讀完才發現不懂的那些。
Notes in progress, not a finished essay. Mostly tracking the "I thought I knew this" moments.
每兩年重寫一次 config。這次砍掉 40% 的 plugin,反而比較順手。
I rewrite my config every two years. This round I dropped 40% of the plugins and it's faster, not slower.
SELECT FOR UPDATE 的鎖範圍不是你想的那樣。一篇關於 row-level lock、advisory lock、與我踩過的三個坑。
SELECT FOR UPDATE doesn't lock what you think. Row-level locks, advisory locks, and three footguns.
把寫作當肌肉練。從 commit message 到 postmortem 到文章,中間的卡點在哪。
Writing as a practice. From commit messages to postmortems to essays — and where the uncomfortable jumps are.
最近才想清楚:client timeout、server timeout、context timeout 三者該怎麼配合。
Client, server, and context timeouts — how they actually compose. One diagram, one page.
explain analyze 從 300 行讀到 0 行,中間換了三次假設。這是慢 query 修復的完整過程。
Reading explain analyze, going from 300 lines to zero, revising the hypothesis three times. A full slow-query autopsy.
不是 ORM 不好,是 default 選擇太便宜,常常遮掉了資料庫真正在做的事。
ORMs aren't bad — they're just too cheap a default, and the cheap default often hides what the DB is doing.
一個下午的遷移紀錄,包含一個我忘記備份 DNS 的尷尬時刻。
An afternoon's move, including the awkward moment I forgot to back up DNS.