为AI助手系统增加多窗口能力时,遇到三个因模块间约定冲突导致的Bug,而非逻辑错误。修复后总结:代码约定需显式化,避免硬编码;每个模块边界应加验证;系统启动时执行自我体检,可有效预防此类问题。
今天花了大约四个小时,为AI助手系统新增了一个“多窗口”功能——如同浏览器同时打开多个标签页,每个标签页独立运行、互不干扰。共修改了1480行代码、30个文件,并顺利通过了20个自动化测试。
但测试阶段接连遇到三个Bug。修复后复盘发现:这三个Bug均非逻辑错误,而是“你认为A模块会如此执行,但A模块实际行为不同”的约定冲突。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
更关键的收获是:如果在编码前正确运用了一个AI调试技能(systematic-debugging),其中两个Bug完全能够避免。
新会话的创建流程是:先create(创建),再open(打开)。创建时顺便记录了“进程号”(PID),但打开时系统查验发现“该进程号仍存活”——误以为被其他窗口占用,直接拒绝加载。
真相:那个“存活进程”正是自身。创建与打开发生在同一进程内,系统拦截了自己。
解决方案:创建时不记录进程号,仅在真正打开时记录。明确责任边界后Bug消除。
系统原本依赖Google的Gemini模型进行规划分析。检查后发现Gemini在我们的中转服务中不存在,于是将所有Gemini职责迁移至Claude Opus。
此次迁移修改了22个文件、80多处引用——涵盖代码、提示词、测试和文档。然而运行中的飞书Bot由旧代码启动,仍在尝试调用不存在的模型。
真相:代码已迁移,但进程未重启。静态文件与运行状态之间的“约定”断裂。
解决方案:迁移后重启Bot,并增加启动自检——每次启动时验证所有配置的一致性。
飞书Bot每天需推送日报,查看日志发现全部失败:open_id cross app。
排查发现:Bot配置中写明了“推送到群聊(chat_id)”,但发送方法默认使用了“推送到个人(open_id)”。配置指向东,代码指向西。
真相:Bot实例本身存有正确的配置chat_id,然而方法的默认参数硬编码了open_id。调用方未传参,Python采用了硬编码的默认值,而非Bot实例上保存的正确值。
解决方案:将默认值改为“我不设默认值,由Bot自身的配置决定”,并增加启动自检。
---三个Bug具有共同模式——缺少“防御层”。
用系统化调试技能(systematic-debugging)的方法论解释:修复Bug本身只解除了“症状”,真正根因是每一层边界都缺少验证。输入未校验格式、操作未检查前置条件、输出未验证一致性。
修复策略称为“纵深防御”——在每一层添加检查点:
try/finally确保状态恢复本次工作中使用的几个AI技能,本身也是“优秀提示词”的范例:
1. systematic-debugging——它强制AI先定位根因再修复,避免“随手改一下试试”。如同先理清文章结构再调整措辞。
2. brainstorming——强制AI先厘清需求再行动。大幅减少“做完了才发现并非所需”的情况。
3. writing-plans——将设计拆解为小任务,每个任务具备明确的输入、输出和测试标准。
核心原则:优秀提示词并非“指令更详细”,而是“流程更结构化”。明确告知AI先做什么、再做什么、何时停止,远比堆砌细节描述有效。
---1. 代码的“约定”需显式化。默认值不应硬编码,应去查询存有正确答案的地方。参数设计中,None(“我不设默认值,由你自己查询”)比"open_id"(“我就用此值,错误概不负责”)安全得多。
2. 每个模块的边界都需验证。输入校验格式、操作检查条件、输出验证一致性。今天多花10分钟编写检查代码,可节省未来2小时的排查时间。
3. 启动时进行一次自我体检。系统启动时花3秒验证“我依赖的资源是否真正可用”,比运行24小时后才发现推送全部失败要有效百倍。
---本次工作使用了4个AI技能:superpowers:brainstorming(需求设计)、superpowers:writing-plans(实施计划)、superpowers:subagent-driven-development(分任务执行)、superpowers:systematic-debugging(Bug排查与复盘)。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述