别只枚举样例:用 Property-Based Testing 自动寻找边界反例

基于性质的测试与自动反例搜索

传统单元测试由开发者挑选几个输入,再核对预期输出。它对已知场景很有效,却容易漏掉空数组、极端整数和意外组合。Property-Based Testing(基于性质的测试)换了一个角度:先描述对所有合法输入都应成立的规则,再让工具批量生成数据、寻找反例,并把失败输入缩减到最容易理解的形态。

Read More

Unicode 文本别按“字符”想当然:字节、码点、字素簇与安全截断

Unicode 文本处理边界

昵称限制 20 个“字符”、数据库字段最多 64 字节、前端把字符串截成 10 位——这些看似简单的需求,遇到重音符号、家庭 Emoji 或不同语言时就可能失效。问题不在 Unicode 太复杂,而在系统没有说清自己究竟在数什么。把文本的计量单位和规范化时机写进契约,才能避免乱码、半个 Emoji 和重复账号。

Read More

把数据库迁移做稳:Expand/Contract、回填与回滚清单

把数据库迁移做稳

线上数据库迁移最怕的不是 ALTER TABLE 本身,而是应用版本、数据形态和回滚路径没有对齐。一次看似简单的改字段,可能同时影响旧代码读写、新代码灰度、历史数据回填、索引构建和报表查询。要把迁移做稳,关键是把“改表”拆成可观察、可暂停、可回滚的多个小步骤。

Read More

把服务停得稳:优雅关闭、连接排空与 SIGTERM 清单

把服务停得稳

发布、扩容、缩容、节点维护都会让服务实例退出。退出本身不可怕,可怕的是进程收到 SIGTERM 后立刻消失:正在处理的请求被切断,队列任务做到一半,数据库事务悬着,负载均衡还在把新流量打进来。优雅关闭要解决的不是“退出得慢一点”,而是让实例从可接流状态,按顺序退到无副作用退出状态。

Read More

把测试数据管住:Fixtures、Factory 与隔离清理清单

测试数据管理

很多测试不稳定,并不是断言写错了,而是测试数据没有边界:上一条用例留下的用户还在库里,固定邮箱被并发任务重复创建,CI 里偶尔多一条历史订单,结果同一套测试今天过、明天红。测试数据管理的目标不是把数据造得越像生产越好,而是让每条用例都能清楚说明自己依赖什么、创建什么、清理什么。

Read More

把 Shell 脚本写稳:失败处理、临时目录与清理清单

可靠 Shell 脚本

Shell 脚本常常从一两行命令开始,后来慢慢变成构建、发布、备份、迁移和运维入口。它的问题也在这里:看起来只是“把命令串起来”,一旦变量为空、管道中间失败、临时文件没清理,影响就会被放大。写稳 Shell 脚本,不是把 Bash 语法背全,而是给失败路径、输入边界和资源清理留出明确位置。

Read More

数据库连接池别乱调:容量、排队、超时与背压清单

数据库连接池别乱调

很多服务的数据库故障,并不是 SQL 变慢才开始的,而是连接池先被打满,请求继续排队,应用线程被占住,最后把局部慢查询放大成整站超时。连接池不是越大越安全,它更像一个阀门:放得太小会限制吞吐,放得太大又会把数据库推到极限。要把它用稳,需要同时设计容量、排队、超时和背压。

Read More

用 Git Worktree 并行开发:少切分支,少 stash,少污染工作区

用 Git Worktree 并行开发

开发时最打断节奏的场景,往往不是写新功能,而是新功能写到一半,线上突然要修一个小 bug;或者正在做代码审查,本地又必须回到干净的 main 复现问题。反复 stash、切分支、装依赖,会让工作区越来越混乱。git worktree 的思路很朴素:同一个仓库可以挂出多个工作目录,每个目录检出不同分支,但共享同一份 Git 对象库。这样你可以保留当前现场,同时在另一个目录里处理热修复或评审。

Read More