下载 App
日志 #3 · 第三天
修改于7 小时前13 浏览 包含 AI 合成内容
本期进展
这一篇要讲的东西,是从一件很小的事开始的。
我给据点里的几个 NPC 做了交易 —— 你可以跟他们换点东西再上路。 顺手也给其中两个 NPC 故意没做任何功能:他们在设定里是老人和小孩。 我宁可他们站在那里什么也不给你,也不想让村子变成一排自动售货机。
做完之后我去游戏里试。一切正常。对话能翻页、提示会弹出来、位置也都对。
然后我按自己定下的流程,跑了一遍验收数据。
它告诉我:这套东西,在真实的游戏里,从来没有被触发过一次。


这就是我这两天真正的收获。我修好了它会动,却忘了检查它有没有被叫到。
顺着这条线往下挖,我发现这一类 bug 不是一个,而是五个。 它们的共同点是:全都不报错。
问题与风险
这一节是这篇的重点。
我把这五个 bug 的共同长相画出来了,因为它们实在太像了:
| 它长什么样 | 表面现象 | 真实情况 |
|---|---|---|
| 两块代码给同一个东西起了不同的名字 | 读数、显示、扣费全都"正常" | 它们操作的根本不是同一个东西 |
| 每处都写了"取不到就当作 0" | 永远显示 0,看起来像"恰好没有" | 名字对不上和真的没有,长得一模一样 |
| 一个功能"写完了",但没人调用它 | 游戏能跑、画面正常 | 这个功能不存在 |
| 一个东西加了标记,但没人消费它 | 扣费成功、提示弹出 | 效果是零 |
| 两个模块对同一个标识符的约定不一致 | 卡片能显示、能选中、能点 | 数字一点没变 |
说实话,最难受的是第五个。
我一开始根本不是在查它。我在查一个"效果没生效"的小问题, 查着查着才发现:它下面还埋着一个更大的 —— 有一整类奖励,玩家抽到之后什么都没有发生。 卡片会亮、会被选中、会被记下来。只有数字是死的。
而它不报错。它甚至在日志里留下了"我处理过了"的记录。
这一类问题为什么这么难查,我想明白了:
报错是一种会出声的失败。它吵,但它诚实。 而这一类是不出声的失败 —— 它安安静静地把功能变成零, 然后继续告诉你"一切正常"。
你没法用"有没有报错"来发现一个不报错的东西。
所以我这两天做的,实际上是换了一套验收标准:
- 以前我验收"界面/流程走到了没有";
- 现在我先问:"走到最后,数字变了吗?"
- 卡片出现 ≠ 生效。数字变了,才算接上了。
我把这条写进了流程:凡是新增一个"会被存下来、以后还会用到"的东西, 必须同时确认三件事 —— 谁初始化它、谁改它、谁读它, 三者用同一个名字。只查"谁读它"是不够的,因为读的地方全是"取不到当 0", 你会看到一片正常,什么都发现不了。


还有一件我必须写下来的事:我的检查工具本身也出错了。
我有几个用来自动验证的临时脚本。它们翻过两次车:
一次是脚本的清理逻辑写错了,把我刚写好的功能代码一起清掉了 —— 而我的静态检查照样全绿,因为它只验语法,不验"功能还在不在"。
也就是说:我的安全网有洞,而我是在它漏掉整段功能之后才知道的。
我现在的做法是:临时的验证代码必须用独一无二的标记包起来, 清理的时候只精确删掉那一段,绝不做"整体回退到某个时间点" —— 因为回退一定会连同那之后的真实改动一起吃下去。
教训:验证工具本身也是代码,它也会错。而它错了以后,你会更相信它。
下期计划
- 把这段时间欠下的手感补回来 —— 前两天全在修这些东西,明显偏了
- 验证"新玩家打开 1 分钟内,能不能明白自己要干什么"(这条从第一篇拖到现在)
- 把检查工具再补两条规则,让上面那五个坑不能再踩第二次













