PostgreSQL WAL 预写日志
PostgreSQL WAL 预写日志

很多人第一次接触 PostgreSQL WAL,会把它记成一句话:PostgreSQL 的 WAL 就是 MySQL 的 binlog。这句话很好理解,可惜不是一个正确的说法。要真正理解 WAL,不能从文件名、参数或复制命令开始。应该先问一个更朴素的问题:一笔事务已经向客户端返回 COMMIT 成功,但它修改过的数据页还没有写入磁盘;此时突然断电,数据库凭什么保证这笔数据不会消失?WAL 的原始目的就是回答这个问题。流复制、持续归档、PITR 和逻辑复制,都是从这条可靠的变更

2026-07-10•约 10.7 千字
关于打磨产品的一些思考
关于打磨产品的一些思考

一个产品怎样才算「打磨好了」?这个问题听起来像是在问圆角该用 8px 还是 12px,动画该持续 200ms 还是 300ms。可真正使用一个产品时,让人放弃的通常不是圆角不够圆,而是另一批更朴素的问题:不知道下一步该点哪里,表单填错后内容全部消失,弱网下按钮毫无反应,服务出了故障却没人说话,想导出自己的数据还得给客服写小作文。精致的视觉当然有价值,但它只是产品质量露在水面上的一小部分。水面下面还有需求边界、交互反馈、性能、可靠性、可访问性、技术债和发布机制。只抛光水面,产品

2026-06-20•约 6.0 千字
AI 带来的变革:能力变便宜之后,什么会变得更贵?
AI 带来的变革:能力变便宜之后,什么会变得更贵?

改革春风吹满地,世界人民真争气;齐心合力跨世纪,A 不 AI 没咋地。AI 有没有「咋地」,2026 年已经不太需要争论。写代码、做客服、整理资料、生成图片、分析合同、起草营销方案,许多原本需要专门软件或专门人员才能开始的工作,如今在一个对话框里就能得到像模像样的第一版。真正值得争论的是另一件事:当生成内容、调用知识和跨越专业门槛变得异常便宜,企业、职业与个人的价值会怎样重新分配?有人把 AI 当成新一代搜索框,有人把它描述成电子员工,还有人已经开始为「全面失业」倒计时。这些

2026-05-31•约 5.9 千字
sync.Mutex:抢人锁难
sync.Mutex:抢人锁难

sync.Mutex 看起来只有两个方法:Lock 和 Unlock。它的零值可以直接用,结构体也只有一个状态字段和一个信号量字段,于是很多人会把它当成一颗无害的螺丝:需要保护数据时拧上,结束时拧下。真正的故事要长得多。一次没有竞争的 Lock,可能只是对一个 32 位整数做 CAS;一次有竞争的 Lock,会先在 CPU 上短暂自旋,再进入 Go runtime 的信号量队列,必要时让 goroutine 休眠、唤醒并发生调度。这个状态还要在缓存一致性协议、编译器重排、Go

2026-03-15•约 5.2 千字
Go 的舒适圈:它适合解决什么,又该把什么交给别人?
Go 的舒适圈:它适合解决什么,又该把什么交给别人?

每门语言都有舒适圈。Python 坐在数据和自动化旁边很自在,Java 走进大型企业系统像回自己家,C 靠近硬件时几乎不用换鞋。Go 的位置比较微妙:它没有 C 那样贴近机器,也没有 Java 那么丰富的应用框架,更没有 Python 在 AI 领域的库山库海,却在云基础设施、网络服务和命令行工具中反复出现。这不是因为 Go 在每项指标上都赢。恰恰相反,Go 的价值是把开发速度、运行效率、并发模型和部署成本放进同一张账单后,给出一个很难拒绝的中间值。 它的舒适圈位于「需要长期

2026-02-28•约 4.9 千字
代码审查指北
代码审查指北

写代码的人,十有八九都干过一件事:把 PR 往群里一丢,然后祈祷「这次能一次过」。但代码审查 (Code Review) 从来不是走个过场。它是一套让代码库整体健康随时间改善的机制,Google 用它来维护代码和产品的质量。说到底,代码审查就是除作者之外的其他人,来检查这段代码的过程。为什么需要代码审查?先把它的价值说清楚,不然谁都懒得去做:尽早发现问题:在合并前抓住 Bug 和设计缺陷,此时修改成本最低知识共享:让至少另一个人熟悉这段代码,消除「巴士因子」提升代码质量:当人

2025-12-29•约 2.9 千字