CATEGORY / 16
工程效率与质量
测试、交付、Git、容器、监控和日常工具。 这里的文章按实际问题组织,可以从任意一篇开始。
Monorepo 不只是把仓库放在一起:用工作区守住模块边界
从目录职责、依赖方向和发布边界出发,搭建一个不会随着项目增长而失控的 Monorepo。
TypeScript 大项目提速:从一个 tsconfig 拆到 Project References
用 Project References 拆分类型检查边界,降低编辑器负担,并让 CI 只重建真正受影响的项目。
给 API 错误一个稳定契约:别再只返回 message
设计可被前端、日志和监控共同理解的错误结构,让失败既能展示给用户,也能快速定位。
不停机数据库迁移:用 Expand and Contract 拆掉危险变更
把字段重命名、约束收紧等破坏性操作拆成兼容阶段,降低应用与数据库同时切换的风险。
测试金字塔落地:按风险选测试,不按数量凑比例
从系统边界和故障成本出发选择测试层级,让测试套件既快又能发现真正的问题。
Playwright 稳定性实践:消灭等待、串扰和偶发失败
用可观察条件替代固定等待,隔离测试数据,并为偶发失败保留可诊断证据。
微服务契约测试:在部署前发现接口不兼容
由消费者描述真实依赖,再由提供者验证契约,减少联调环境中的意外破坏。
测试数据 Builder:让用例只表达与场景有关的差异
用合理默认值和链式覆盖生成测试对象,避免每次模型加字段都修改整套测试。
CI 缓存别靠运气:设计可解释的缓存键与恢复策略
区分依赖缓存与构建产物缓存,设计完整缓存键,并避免旧缓存制造难以复现的结果。
金丝雀发布实战:用指标决定继续还是回滚
从小流量开始逐步放量,把健康指标、观察窗口和自动回滚写进发布流程。
更小也更可信的容器镜像:多阶段构建、固定版本与 SBOM
缩小运行镜像、固定基础镜像来源,并生成软件物料清单,让容器既轻量又可审计。
线上故障前 15 分钟:一份能真正执行的 Runbook
明确指挥、止损、证据保全和沟通节奏,避免故障现场所有人同时猜原因。
Pre-commit Hook 怎么配才不惹人关:只检查这次改动
把快速、确定的检查前移到本地,同时把完整验证留给 CI,兼顾反馈速度与质量门禁。
可复现开发环境:让新成员半小时跑起项目
固定运行时版本、自动准备依赖服务,并用干净环境持续验证项目启动文档。
结构化日志落地:从 requestId 一路追到后台任务
统一字段、传递上下文并控制敏感信息,让日志真正支持跨服务检索和故障定位。
团队 CLI 设计:把散落脚本做成可靠的自助工具
统一参数、退出码和安全确认,让部署、数据修复等高频操作既容易发现又不容易误用。