
功能昨天还正常,今天却悄悄坏了。面对几十甚至几百个候选提交,逐个回退既慢又容易漏掉环境差异。git bisect 会在一段提交历史上执行二分查找;只要能稳定判断某个提交是“好”还是“坏”,就能用很少的检出次数逼近第一个引入问题的提交。

功能昨天还正常,今天却悄悄坏了。面对几十甚至几百个候选提交,逐个回退既慢又容易漏掉环境差异。git bisect 会在一段提交历史上执行二分查找;只要能稳定判断某个提交是“好”还是“坏”,就能用很少的检出次数逼近第一个引入问题的提交。

服务报出 Permission denied 时,最省事的处理似乎是 chmod -R 777。它往往能暂时消除报错,也同时把读、写、执行能力交给了所有本地用户;更麻烦的是,真正缺失的权限可能位于父目录、进程身份或 ACL,放开目标文件只是在掩盖原因。理解 Linux 如何逐层判断访问权,才能给出刚好够用的权限。

头像、附件和数据导入看起来只是“接收一个文件”,实际上却把磁盘、解析器和下载域名同时暴露给了不可信输入。只检查扩展名或请求头,挡不住伪装类型、超大文件、路径穿越和带主动内容的文档。稳妥的设计不是再补一个判断,而是建立一条先隔离、后验证、最后发布的管线。

浏览器提示“连接不安全”时,重新签发证书并不一定能解决问题。错误可能来自 SNI、主机名、有效期、中间证书、客户端信任库,也可能是负载均衡器仍在提供旧证书。有效的排障方式,是保留握手证据,再把“连接、身份、信任、部署”逐层拆开。

服务器提示“内存快满了”,第一反应往往是找出 RSS 最大的进程,甚至直接重启服务。但 Linux 会主动利用空闲内存缓存文件,同一份共享页也可能被重复计入多个进程。先分清指标含义,再沿着系统、cgroup、进程三层收集证据,才能判断是正常缓存、真实泄漏,还是容器限额过小。

安装包能解压,不代表它就是构建机产出的那一份;对象存储返回成功,也不代表每一层传输都没有截断或串包。要让发布结果可验证,关键是为确定的字节建立稳定身份,并让生产者与消费者在同一边界计算它。

事务能保证一组操作一起成功或失败,却不等于并发执行时业务结果一定正确。两个请求同时读库存、计算新值再写回,即使都提交成功,也可能覆盖彼此的修改。解决这类问题,关键不是机械地把隔离级别调到最高,而是先写清业务不变量,再为具体冲突选择原子更新、锁或版本检查。

域名打不开时,反复刷新、清浏览器缓存或直接改 hosts,往往只会暂时绕过问题。DNS 不是一次简单查询,而是一条包含本机、递归解析器、根与顶级域、权威服务器的缓存链路。排障的关键,是先确认“谁给出了什么答案”,再逐层缩小故障范围。

定时任务晚了一小时、接口明明只跑了两秒却被统计成负数、跨地区订单显示成“昨天”——这些问题往往不是计算写错了,而是程序把不同含义的“时间”混在了一起。时间处理的第一原则,不是统一格式,而是先明确用途。

配置、缓存索引和本地状态看似只是“小文件”,却常在进程被杀、机器断电或两个实例同时写入时变成半截 JSON。可靠写入的关键不是多调用一次 write,而是分清原子可见性与持久化,并按正确顺序提交数据。