修复上线之后:拿什么证明它真的生效
改完代码、跑通测试、部署上线——到这一步很多人就收工了。
但这个月有四次,“看起来修好了”和”真的修好了”之间差着一次取证:一次是日志里还有旧报错、一次是打包显示成功但关键步骤没执行、一次是审计报告把数据问题写成了代码 bug、还有一次是构建失败其实是本机网络的问题。
这篇记一下取证的具体做法。
改完代码、跑通测试、部署上线——到这一步很多人就收工了。
但这个月有四次,“看起来修好了”和”真的修好了”之间差着一次取证:一次是日志里还有旧报错、一次是打包显示成功但关键步骤没执行、一次是审计报告把数据问题写成了代码 bug、还有一次是构建失败其实是本机网络的问题。
这篇记一下取证的具体做法。
给一套跑了多年的管理后台补移动端,最常见的做法是再做一套 m.* 视图:复制一份模板、改改布局,按 UA 分流出不同的控制器。
这个方案看着干净,实际代价很高——这个项目有 488 个视图,复制一份就是 488 个新的维护点,之后每个功能改动都要改两遍。
这次换了个做法:不加视图,只重做响应式层。三个文件、一次断点调整,覆盖从 320px 手机到桌面的全部宽度。过程里踩的坑比预想的多,记一下。
用 Rust + egui 重写一个 MarkText 风格的 Markdown 编辑器,功能本身不难——难的是三件事:输入法要能用中文、导出要能看、大文件要能不卡。
这三件事有个共同点:写完不报错,用起来才发现不行。输入法不接就是打不出字,导出不处理就是一堆方块,每帧哈希就是滚动条抖。这篇把这三个方向上的具体坑记下来,顺带记两处桌面集成的连带问题。
给 AI agent 加”长期记忆”,第一版几乎都会这么做:在系统提示里约定一个 MEMORY.md,让模型”觉得重要就自己写进去”,下一轮再把它读回来。
能跑,但撑不过几周。这篇记录把它换成 SQLite 主库的过程,以及同一时期在流式管道、定时任务、客户端联网边界上踩到的坑。
一个 Fedora 上管理 Copr / OBS 第三方源的命令行工具,跑了一遍 pytest:124 个测试全绿,ruff 和 mypy 也没有意见。看起来挺健康。
但实际用起来,copa audit 稳定崩溃、多关键词搜索搜不到东西、正则搜索永远空、标着”高风险”的仓库照样能装。单元测试覆盖的是函数,不是集成路径——这些缺陷没有一个能在单元测试里暴露。
这篇记录那次审计找出的一批真实缺陷、修法,以及中文化和打包时另外两个坑。
这个月做了一堆看起来毫不相干的事:给一个模拟器写 AVX-512 优化、给桌面应用补 FreeBSD 安装包、把一个 Node 项目从空库跑起来、修一个 Electron 分支的冷启动白屏、给两本开源书提 PR。
它们的共同点是:每一个都在”看起来已经完成”的地方翻车。
这篇按”验证”这条线把它们串起来。
给一套老系统接 MCP(Model Context Protocol),让 AI 客户端能直接读写业务数据,是这两年被问得很多的需求。真正做起来会发现:协议本身不难,难的是”人”——谁在操作、怎么证明是他、出了问题怎么追溯。
本文记录一次自建 MCP 服务端的完整过程,重点在认证设计上翻过的车。
打包分发的坑分两类:CI 的「静默吞」与发行版差异。这篇把开源项目的多平台打包(RPM / DEB / Arch / Electron / AppImage)、CI 流水线,以及 overlay 隔离层与 FreeBSD 移植的经验收在一起。
在 Wayland 上跑虚拟机的桌面集成(剪贴板同步、拖放、指针注入、分辨率自适应),常会遇到一种尴尬处境:功能看着有、实际不工作;翻文档,上游明确写着”不支持 Wayland,请用 X11”。
本文记录一次完整的补全过程。结论先放这里:这类问题很少是”缺一段代码”,多数是”架构上刻意绕开了 Wayland”,所以第一步永远不是写代码,而是搞清楚上游到底绕在哪。
接手一套跑了十多年的 PHP 系统,第一件事往往不是加功能,而是”让它在新版 PHP 上别崩”。这类迁移的坑特别有迷惑性:有些是直接白屏,有些是页面看起来正常、数据悄悄错了,还有些是”只有某一个入口才会踩”。
本文汇总四次移植:一套禅道内核(PHP 5/7 时代的代码迁到 PHP 8.5)、2003 年的 Discuz! 2.5 SP1(全程 GBK 编码,125 个 PHP 文件)、跑了多年的 Discuz 4.1(移植 + 安全加固)、以及一套老建站系统 chanzhiEPS(PHP 8.4+ 全量移植 + 自动发布)。最后附一个 Delphi 7 老客户端上的同类问题——技术栈差二十年,踩的坑却高度同构。