第三篇 · 做出东西 / 第 9 章

真实案例:三个月,一个人

你的项目可能只有 5 张票,他的项目 26 张,坑是同一批。 这一章讲的是另一个项目——软考题库小程序,不是午饭登记; 你只需要看坑,不需要照搬它的规模。

预计阅读
20 分钟
前置
第 6–8 章
关键词
真实案例、复盘

读完这一章,你能

  • 说清这个案例与你项目的规模差异,只迁移坑,不照搬做法;
  • 把案例里的五个痛点分别对应到第 4、5 章的某个习惯;
  • 用“已提交 ≠ 已完成”检查一次你手上的任务。
本章地图
  • 必读:79 天时间线与五个痛点时刻——先看真实项目会怎么翻车。
  • 必读:坑与习惯的对应关系——把故事翻译成你能用的动作。
  • 可选以后再看:他自己总结的四条规则,做项目时再回来对照。
先说你该带着什么心态读这一章

这里的“票”指工单:一张票就是一件待办。 这个人在做这个项目的时候,还没有学过这份教程里的方法论。 所以他踩的每一个坑、绕的每一次远路,都是“没有方法论”的真实代价。

这正是它有价值的地方:你能清楚地看到,每一个坑本可以被前面哪一条挡住。

这个案例是什么

「大西瓜软考」——一个给软考考生用的刷题微信小程序,配后端和管理后台。 从第一行代码到正式上架,全程由一个人 + AI 完成。

时间

79 天

2026 年 5 月 18 日第一次提交,8 月 4 日最后一份日报。

规模

约 10.6 万行代码

188 次提交。后端、小程序、管理后台三端一体。

数据

16,459 道题

三个科目,含 696 道案例题。

结果

已正式上架

2026 年 7 月 15 日全量发布,有真实付费用户。

另一个数字更值得注意:他写了 76 份开发日报。 平均每天一份,最多的一天写了 4 份。这个习惯不是他天生勤快—— 而是被逼出来的,原因你很快就会看到。

79 天时间线

① ② ③ ④ ⑤ ⑥ 5/18 6/26 8/04 👆 事故最密集 👆 上架后补漏
条形长度按真实天数画的。③④⑤ 段加起来只有 27 天, 但几乎所有的血泪都集中在那里——因为那是"从本地走向真实用户"的跨越。
阶段时间发生了什么
①起步期5/18–5/29 小程序骨架、登录、错题本、AI 问答。12 天,没有一份日报——只有提交记录。
②功能膨胀期5/30–6/25 功能疯长。会员、兑换码、管理后台一口气 26 个页面。全程在本地跑,反复打磨界面。
③上云与合规期6/26–7/01 买服务器、备案、接微信支付。数据库文件损坏,被迫从 SQLite 迁到 PostgreSQL(两种数据库软件)。
④上线冲刺期7/02–7/14 多 Agent 全量测试找出 53 个 Bug、深度复盘、隐私合规审查、部署生产。
⑤上架磨合期7/15–7/22 7/15 上架成功。同一天服务器挂了。之后真实用户不断暴露新 Bug。
⑥多科目与数据质量期7/23–8/04 加第三个科目,引发"全链路串场"大扫除——加一个维度,撕开一长条口子。

五个真实的痛点时刻

下面这五件事,全部有日报原文可查。它们比任何理论都更能说明问题。

① 一个外行,两次否掉了 AI 的过度设计

做"学习报告"功能时,AI 给了一套方案:新增一个 kp_id(知识点编号)字段, 再新增一张 FeatureFlag 表(功能开关表:用来远程打开或关闭某个功能)。

这个人看了一眼,问了一句:

题库里已经有章节、小节、知识领域这三个标识了,用这三个还不能定位到知识点吗?

日报里老老实实记着:"用户说得对,不需要新增 kp_id 字段。" 紧接着又是一条:"不需要新增 FeatureFlag。"

这是第 1 章那句话的最强证据

一个连变量是什么都未必说得清的人,凭"我知道我的题库里有什么"这个业务直觉, 两次挡掉了不必要的复杂度。

这正是"人 + AI"里人最不可替代的部分。 AI 的默认倾向是"加东西"——加字段、加开关、加抽象层。 而只有你知道:这个不该加。

② 上下文溢出了,所以他被迫写日报

从 5 月 30 日开始,几乎每一份日报的开头都写着同一句话:

"本日工作基于上一轮未完成的会话继续推进……因上下文溢出压缩后继续。"

连续两天出现,然后变成每天的常态。 这就是第 4 章讲的“变笨区”,在真实项目里的样子。

他的应对方式是被迫的、也是正确的——把 AI 的短期记忆,转成项目的长期记忆:

  • 强制写日报(把上下文落到文件里)
  • 把关键结论写进项目的 CLAUDE.md,每次会话自动加载
  • 后来干脆规定:提交代码前必须先写日报,日报是提交的前置条件
他实际上发明了「习惯三」

只是他没有把它当成方法,而是当成了救命手段。 第 5 章 · 习惯三说的“写交接文档、开新会话”,他写了 76 遍。

③ 一天做完 26 个管理页面,然后花更多时间收拾

5 月 31 日那天,日报分了十三个部分。其中一项是: "管理后台全面增强:一口气新增 26 个页面"。 当天累计新增 16 个文件、修改 33 个文件。

结果呢?

半个多月后,他不得不启动 4 个 AI 并行审计这批页面,审出 10 个问题, 其中两个是致命的——有一个字段根本不存在,页面一打开就崩。

这就是「习惯二」要挡住的东西

26 个页面一口气生成 = 一次写出 26 处可能出错的地方,而且它们互相纠缠。 当时省下的时间,后面加倍还了回去。

④「已完成」其实没有写进代码

这是全篇最值得警惕的一条。在他的日报里,出现了这样一段自己写的勘误:

"勘误:下文'第二轮修复'中的两处改动当时仅写入了方案文档, 实际未编码提交。该部分已在次日补实现。"

更早的一天,他还记下了另一个更狠的案例:一个兑换码复制功能, 代码从提交起就一直在仓库里,从来没被删过——但在真机上"可能从未真正工作过"。

而就在同一天,他正在庆祝"正式上架,全量发布成功"。

vibe coding 最恐怖的地方

你以为你交付了 N 个功能,实际交付的是 N 减去若干。而你不知道减了几。

这不完全是 AI 的错。他的日报本身也是 AI 写的——AI 写的日报格式漂亮、结论清晰、 末尾还带"验证清单 ✅"。而那个 ✅ 未必是真的。

被这件事烫过之后,他自己写下了一条规则,写进了日报里:

"写日报时要区分「已提交」和「已完成」。"

⑤ 一个查不到的字典,让三个科目的题混在了一起

项目后来加了第三个科目。他在配置里写了一个对应关系:科目编号 3 对应"系规"。 但数据库里,系规的编号其实是 4。

于是代码是这样的:

prefix = COURSE_COLLECTION_MAP.get(course_id)   # 查 4 → 得到 None
if not prefix:
    return top_k_config                          # ⚠️ 悄悄回退到「搜索全部科目」

一个查不到的字典,没有报错,而是安静地退回到了"搜索全部科目"。 结果三个科目的教材内容全混在一起被检索。修好它只用改一个字符(3 → 4), 但发现它花了好几天。

他总结出的教训

一个查不到就悄悄回退的默认行为,比直接报错危险一百倍。 报错会告诉你出事了;静默回退只会让你以为一切正常。

停一下

把五个故事过一遍,只回答一个问题:你自己的项目里,哪一个最可能出现? 写下它的名字,再写下你准备用第 5 章的哪个习惯挡住它。

他踩的坑 → 五个习惯

把上面这些坑,和第 5 章的习惯对照一下,你会发现它们是严丝合缝对上的:

他踩的坑 本来能挡住它的习惯 同一个页面一天改三版 一口气做完 26 个页面 被迫写日报,因为 AI 记不住 "已完成"其实没写进代码 自己写的代码自己审 习惯一 · 让它先问你 需求没问清,就会反复返工 习惯二 · 一次只做一小片 26 个页面就是 26 处风险 习惯三 · 一个会话一件事 交接文档正是他被迫做的事 习惯四 · 定义清楚「完成」 能亲手验的清单才叫标准 习惯五 · 让 AI 审 AI 后来他正是这么做的
五个坑,五个习惯,一一对应。 这不是巧合——这份方法论本来就是从这类真实经历里长出来的。
再把故事接回主线

这张图只映射到第 4、5 章。他后面从立项、写规格到上线的过程, 对应的是第 6 章 · 完整实战流程、 第 7 章 · 从想法到规格和 第 8 章 · 从规格到上线。

读的时候不用记他的功能,只记他在哪个阶段、因为缺了哪个动作而返工。

他自己总结出的规则

到后期,他已经不满足于"踩了坑记一笔",而是开始把教训固化成规则, 写进项目的 AI 配置文件里,让 AI 每次开工都会读到。

他写的四条规则是这样的(这里做了通俗化改写):

  1. 先想清楚再动手

    不要假设、不要把困惑藏着、把权衡摊开来说。 如果有多种理解,全部列出来。如果不清楚,停下来,指出困惑,提问。

  2. 能少写就少写

    用最少的代码解决问题,不做"以后可能会用到"的设计。 "如果你写了 200 行但可以写成 50 行,重写它。"

  3. 只改必须改的

    每一行修改都应该能直接追溯到需求。只清理自己造成的混乱。

  4. 用成功标准驱动

    先定义"怎么样算成功",然后循环直到达成。 "强标准让你能独立循环;弱标准(比如『让它能跑』)需要不断澄清。"

你发现了吗

第一条就是习惯一, 第三条就是习惯二, 第四条就是习惯四。

他在完全不知道这份教程存在的情况下,自己把同一套东西推导出来了—— 只不过花了 79 天和一堆生产事故。 你可以直接从这里开始,不用再交一遍这份学费。

全篇最值得学的一件事

如果这一章你只记住一件事,请记住这件。

上线前,他用多个 AI 做了一轮全功能审计,一共报出 88 个问题。

他没有直接开修。他做了一件很反直觉的事—— 又派了一批完全独立的 AI,专门去"翻案":论证前面那些发现是错的。

结果:88 个里面有 6 个是假阳性(本来被报成问题,其实不是问题),被推翻了。 最严重那一档问题的准确率,从 33% 提升到 100%。

第一批 AI · 找问题 88 个发现 其中有真有假,混在一起 第二批 AI · 专门翻案 "请证明前面是错的" 不参与找问题,只负责反驳 交给它们 复核 结果:6 个被推翻 · 最严重那档的准确率 33% → 100%
注意第二批 AI 不参与找问题——如果让找问题的人自己复核, 它会倾向于替自己辩护。这和"让 AI 审 AI 要换个会话"是同一个道理。

他自己写下的结论是:

"『看起来有 bug』≠『真的是 bug』——必须追踪完整的业务流程。"

"对抗性验证必不可少——即使很有把握的发现,让独立的人做翻案审查也能发现盲点。"

为什么这是全篇最重要的

因为这是一个非程序员,在两个月里自己长出来的一套工程哲学:

不相信任何单方面的结论——包括 AI 的,也包括自己的。

这句话,比这份教程里所有的技巧都值钱。

这个案例的诚实说明

为了不让这个故事被误读,有几点必须说清楚:

要澄清的说明
他并不是"什么都不用管" 79 天里他投入的时间相当可观,而且承担了全部的产品判断、测试和运维。 AI 替他写代码,但没替他负责。
这些日报是 AI 写的 格式漂亮、结论清晰,末尾还常带"验证清单 ✅"。但正如上面第 ④ 个故事所示, 那些 ✅ 未必都是真的。日报宣称的和实际发生的,是两回事。
他的做法里也有反面教材 比如他把管理后台的登录凭据直接写进了项目的 AI 配置文件里(具体内容 此处略去生产凭据)。这是个应该避免的做法—— 配置文件会进版本库、会被人看到。
"上架"不等于"没问题" 上架那天服务器挂了。之后一个多月一直在补漏。 发布是问题开始变多的起点,不是终点。
他不是"零基础"的极端样本 他懂产品、懂业务、有很强的排查直觉。这些恰恰是 AI 替不了的。 AI 补上的是编码能力,不是判断力。
最后一句话,也是最实在的一句

这个项目之所以能成,不是因为 AI 强,而是因为 这个人一直在认真对待每一次失败——他把它们写下来、找原因、定成规则。

76 份日报不是形式主义。那是他给自己建的"长期记忆", 也是他能从 79 天的混乱里爬出来的唯一原因。

三句话带走

  1. 规模不同,坑相同:先看他在哪一步翻车,再对照自己的项目。
  2. 他被迫做的三件事——交接、切片、验证——正是第 5 章的三个习惯。
  3. 最值钱的一条:不相信任何单方面的结论,包括 AI 的,也包括自己的。
他的经历对应的道理
上下文溢出,被迫写日报交接第 4 章:AI 的工作台会满;习惯三
一天做完 26 个页面,后来花更多时间收拾习惯二:曳光弹
同一个页面一天改三版习惯一:先问清楚再动手
"已完成"其实没写进代码习惯四:定义清楚「完成」,并亲手验
自己写的代码自己审习惯五:换一个干净的会话来审
88 个发现里有 6 个是假的不相信单方面结论——包括自己的
改一个字符解决、发现却花了好几天静默失败比报错危险得多
你比他有优势

他用 79 天、76 份日报和一堆生产事故,把这套东西推导了出来。 你现在可以直接从这里开始。

下一章是工具箱——把前面所有能直接抄的东西集中到一页。

自测:三个问题

为什么这一章开头要说“你的项目 5 张票,他的项目 26 张”?

为了让你只迁移坑,不照搬规模。他的 26 个页面、79 天和 10 万行代码是另一个项目的量级; 但“一口气做完”“已完成的幻觉”这些问题,和你手上的小项目是同一批。

“已完成”其实没写进代码,这件事对应第 5 章的哪个习惯?

习惯四:定义清楚「完成」,并亲手验证。代码写完了不等于功能实现了; 只有你能亲手点一遍的清单,才算验收标准。

为什么他不直接修那 88 个问题,而是又派一批 AI 去“翻案”?

因为“看起来有 bug”不等于“真的是 bug”。找问题的人容易替自己辩护, 独立的翻案者能推翻假阳性。这和“让 AI 审 AI 要换个干净会话”是同一个道理。

动手 10 分钟

打开你正在做的项目,找一张你认为“已经做完”的票,回答三个问题:

  1. 它是“代码已提交”,还是“功能已在真实环境里跑通”?
  2. 如果现在让你演示,你能在 2 分钟内点出正确结果吗?
  3. 如果不能,缺的是哪一条验收清单?把它补上。

然后从这一章的五个痛点里挑一个最像你项目的,写下你准备用哪个习惯挡住它。

如果你看到 X,大概率是 Y

  • 日报或总结末尾全是 ✅ → 大概率是 AI 写的“漂亮的结论”,不等于真实验证。抽一条亲手试。
  • 一个配置查不到值,程序却继续跑 → 大概率是静默回退。让它改成报错,再决定怎么兜底。
  • 一天做了很多页面,感觉特别顺 → 大概率是切得太大了。停下来,先验证最小的一片。
  • “看起来有 bug” → 先追完整业务流程,再判断是不是真 bug;别直接开修。