乐于分享
好东西不私藏

AI越强,团队越小,但人越关键

AI越强,团队越小,但人越关键

那是一次 Code Review。

我盯着屏幕上 AI 改完时区 bug 的 PR,心里隐约有点不对劲,于是问了它一句:

“你验证过数据库实际存的是什么格式吗?”

AI 沉默了几秒,然后老实回答:没有,是假设的。

后来一查,数据库里有些表存的是 UTC,有些表是本地时间,还有的表第三种格式。一个我以为修了三次就该结束的 bug,又往后拖了两个月。

那一刻我突然意识到一件事:这半年来,AI 写代码的速度确实非常快,但它有一些盲区,是它自己永远不会主动发现的。而且这些盲区是系统性的,会反复出现。

这篇文章想分享的,就是我们在 Floeva(我们正在做的一款智能健康戒指)开发过程中,AI 反复掉进同一类坑的真实记录,以及我后来怎么调整自己的工作方式来跟它配合。

如果你也在重度用 Claude Code、Cursor、Codex这类 AI 编程工具,或许会有点共鸣。

先说一下背景

💍 Floeva 是什么?
一款戴在手指上的智能健康戒指。除了常见的睡眠、心率、运动监测,我们最想做好的,是一个用户每天看得懂、用得上的Flow 分——把睡眠节律、能量节律、身体节律三个维度合成一个分数,告诉你今天身体处在什么状态,是该冲一冲,还是该歇一歇。APP 是 Flutter 写的,iOS / Android 同步上线。目前还在打磨阶段,欢迎围观。

这个产品的后端、客户端、数据管线,几乎所有代码都是我们和 AI 一起写出来的。团队不大,但想做的事不小,所以我们把 AI 用到了非常深的程度——不仅仅是”用 AI 写代码”,而是把整个团队的工作方式按 AI 的能力重新梳理了一遍。

在讲那些坑之前,先说说我们这套工作方式本身——它构成了那些坑的土壤,也是这半年我自己最有感触的一部分。

一、我们这套”AI 原生”工作方式

先说几条已经成为日常的:

📁 项目文档从飞书全部迁到了 GitHub——大家都在用 Claude Code,文档放仓库里 AI 才读得更方便📝 周报不再手写,由 AI 根据全员 Git 提交记录自动生成,每周一一键出炉🎙️ 会议记录交给豆包,自动转写 + 整理纪要;我们还自己撸了一个”Claude Code + 飞书”的连接工具,在手机上也能改代码、看代码🐛 调试和测试也搬给了 AI:调试 Web 用 Chrome DevTools MCP,自动测试 App 用 midscene.js(烧 token,但能用自然语言写测试脚本,真香)

这些点单拎出来都不算稀奇,很多团队也在做。但里面最让我意外、也最值得单独拎出来说的,是下面这一条——它是真的把”工作量”重新定义了。

我们的后台管理系统,干脆不做新增和编辑界面了

传统做法是:后端写完接口,前端要再为运营同学做一套增删改查的管理界面。改字段、加配置、调参数,全靠人在后台点点点。

我们的做法是:后台只做查询和展示,新增和编辑的界面一律不做。需要改数据?写一句话给 AI,AI 直接调接口改库。需要批量修复?AI 写脚本跑。需要新增配置?AI 在 SQL 里塞一行。

这听起来有点反常识,但效果出乎意料的好。原本一个增删改查页面要前端写几个小时、还要长期维护;现在前端这部分工作量直接归零,AI 处理日常运营 case 的速度还更快。

当然这有前提:你得对 AI 操作数据这件事建立信任,并且把生产环境的兜底(备份、操作日志、回滚)做扎实。但这是一次性投入,比维护一堆”用了又没多用”的运营页面值多了。

这件事本身也是一个隐喻——AI 不只是改写”怎么写代码”,它也在改写”我们到底需要哪些代码”。有些过去你以为必须做的工作量,在 AI 时代根本就不该做。

顺带一提,我们团队的PM,从 PM 的视角写了一篇姊妹篇,讲的是 AI 怎么把一个小团队的战斗力撑到能和大厂百人团队的竞品掰手腕——以及职责边界、招聘标准、PM 直接读代码这些更”组织层面”的变化。如果你看完这篇还想读一些更宏观的视角,强烈推荐去看下面这篇:

📖 延伸阅读 · 来自团队PM3人团队,如何用AI对抗大厂百人团队竞品?从团队协作和职责边界的视角,讲我们这个小团队怎么用 AI 重新定义”小”——和这篇文章互为补充。

效率确实拉满。但效率拉满之后,新的问题就冒出来了——当 AI 写代码的速度远快于人 review 的速度,谁来兜底质量?

我们用半年时间、上百个 PR,踩出了一些规律。

二、AI 反复掉进的几个坑

坑一:Debug Bundle 全是空值

我们想给用户加一个”导出诊断信息”的功能,帮我们排查同步慢的问题。AI 接到任务,方案做得很漂亮:数据结构设计齐整,在编排器层加了时间戳记录,测试用例写完,Eval Criteria 全部通过。

发布。导出第一份真实用户的 Bundle,打开一看——所有时间字段都是 null

人在这里就会停下来问:”等等,这些值怎么都是空的?”AI 不会。它的”测试通过”,验证的是结构存在,不是字段有值。

根因后来查清楚了:观测点放在了编排器层(看到的是”评估完了 → 进入静默同步”这种宏观状态),但真实执行发生在 BLE 层(”连接 → 拉取 → 重算 → 上传”)。编排器层的”阶段”,和真实执行的”阶段”,根本不是一回事。

AI 在错误的抽象层放观测点,而它没有意识到。

坑二:「没改的代码」其实从来就没工作过

TopBar 同步完之后卡住不消失。AI 分析后给出修复方案,Plan 里写得清清楚楚:

// PlanPath 1: 现有行为,不改它Path 2: 恢复路径,本次修复 Path 2// 发布 v1.0.53// 用户继续报同样的问题 …

人接手之后画了一张状态机矩阵,把所有路径和状态转换都列出来——发现 Path 1 里 syncing → idle 这个转换根本没有 handler。也就是说,Path 1 从来就没正确工作过。

AI 默认了一个非常隐蔽的假设:“不在我修改范围内的代码 = 已经验证能工作的代码”。这是错的。但它不会自己问”我没改的这段,真的能跑吗?”

坑三:优化引入了隐藏耦合

AI 给 Flow 重算逻辑加了短路判断——版本没变就跳过重算,性能直接起飞。单独测试,全绿。

上线之后用户报:“为什么我今天的 Flow 分还是昨天的?” 也就是上面提到的、戒指给用户看的那个核心数字——它没刷新。

查下来,重算逻辑跳过的同时,连带跳过了下游一个叫 DHR(用户每天看到的健康总览)的数据刷新。Flow 分要拿 DHR 的最新数据来算,DHR 没刷,Flow 分自然也是旧的。这个刷新本来是重算的”副作用”,AI 改的时候根本没意识到有这层依赖。

它能测试”我改的代码”,但它不会主动问:”谁在读我改的东西?

坑四:时区,时区,还是时区

这个是最磨人的。最开始我们没把时区当回事,代码里到处直接写死 GMT+8。等用户开始跨时区使用,问题集中爆发。

我以为这是个小问题,几天就能改完。结果:改了一两个月。

每次 AI 给的修复方案看起来都对:

# 第一次修复“数据库存的是 UTC,所以转一下” — 改# 一周后“这个表不是 UTC,是本地时间” — 再改# 又一周“另一个表的格式还不一样” — 再改 …

AI 每次都在基于一个未经验证的假设写代码。直到我学会在 Code Review 里反复问那一句:

“你验证过数据库实际存的是什么格式吗?”

三、AI 的盲区是系统性的

把上面这些坑放在一起看,你会发现它们不是孤立的失误,而是同一类问题的不同变体:

盲区类型
AI 的表现
通常怎么被发现
数据假设
假设字段格式、字段存在,不验证
Review 一句”用真实数据证一下”
下游追踪
改了 A,不去问”谁在读 A”
用户报 bug,人去追数据流
抽象层错位
在编排层观测,执行在服务层
真实数据导出全是空的
未改 ≠ 已验证
“不改它” = “它能工作”
用户继续报同一个 bug
结构 ≠ 行为
字段存在 = 字段有值
真实场景里数据为空

这些问题的共同点是:AI 在”自己负责的范围内”做得很好,但它不会主动跨出这个范围去问问题。

而软件工程里大量真正的 bug,恰恰发生在范围的边界上。

四、半年下来,我对自己工作方式的几个调整

老实说,发现这些坑的过程,对我冲击挺大的。一开始我会有点烦躁——明明是 AI 写的代码,为什么我要花这么多精力 review?后来心态慢慢转过来:AI 不是用来替代我的,而是在重新定义我应该做什么。

写代码这件事,AI 八九不离十都能搞定。那剩下的那 10%,反而才是人真正应该死磕的地方。具体来说,我现在花更多时间在三件事上:

第一件:挑战假设

AI 写完 PR,我不再先看代码改得对不对,而是先看它的假设清单——它假设了数据是什么格式?它假设了哪些代码”不需要改”?每一个假设都要找证据。

第二件:做成本-收益判断

有一次 AI 报了个时区 bug,给了三个方案:A 重构数据模型(一周),B 加临时字段(一天),C 不修(影响 < 10 用户)。AI 倾向于选 A——技术上最干净。我选的是 B + 记录技术债。因为 Phase 5 马上要重构了,A 注定会被推翻。这种权衡,AI 不会主动做。

第三件:知道什么时候该看日志而不是加埋点

iOS 后台上传卡顿,AI 第一反应是加更多遥测。我直接去拉了服务器日志,5 秒钟定位到问题——服务器响应 250ms 以内,瓶颈在客户端。AI 那个方案,至少要再做 3 个 PR。

五、最重要的一条:教训要写成规则,不能靠记性

如果只能从这半年里带走一句话,那一定是这句。

我们一开始也试过”教训了之后下次注意”。结果每次新开一个 PR,AI 都是干净的上下文,它不记得上次踩过什么坑。同一个错,能换不同的马甲再犯一次。

后来我们改了做法:每次踩到一类新坑,就把教训直接写进项目规则文件。AI 不会自己记住,但只要规则在仓库里,它就会乖乖遵守。

到现在为止,我们项目里有几条规则就是这么沉淀下来的。挑两条最有用的,分享给在做类似事情的朋友——你可以直接抄作业,加进自己的 CLAUDE.md 或 cursor rules

📌 规则 1:涉及数据格式时,写代码前必须用查询验证任何涉及时间戳、时区、字段格式的代码,写之前必须用 SQL/PG 查询验证数据库实际存的是什么。不允许”假设它是 UTC”、”假设它有这个字段”。在 PR 描述里附上验证查询。

这一条直接终结了我们持续两个月的时区拉锯战。

📌 规则 2:”不改 X” 必须附带 “已验证 X 独立可工作”当 Plan 中说”Path A 不在本次修改范围内”时,必须额外说明”已验证 Path A 在当前代码下可以独立工作”,否则视为未经验证的假设。

这一条专治”AI 把没改的代码默认成正确的”这种错觉。

写到这,可能有人会觉得我在唱衰 AI 编程。其实不是。

这半年我们用 AI 写代码的速度,是过去的好几倍。如果没有它,Floeva 不可能这么快做到现在这个程度。AI 也让我们这个小团队,干出了过去要十几个人才能干的活。

但同样是这半年,我越来越清楚一件事:AI 越强,团队可以越小,但人反而越关键。关键不是写代码本身——这件事 AI 能干,而且越来越能干;关键是那些 AI 看不见的地方:挑战假设、做成本权衡、知道什么时候该看日志而不是加埋点、把踩过的坑写成下一次的规则。

它不是来替你写代码的同事,它更像一个非常勤奋、但缺乏长期记忆和跨边界思考的实习生。你不需要再帮他敲键盘,但你必须帮他守住边界。

下次当你看到 AI 说”测试已通过,可以发布”,请多问一句:

“你用真实数据验证过吗?”

这一句话,能省下你后面好几个月的时间。

最后,顺便聊聊我们在做的 Floeva

这篇文章里所有的 PR 编号、所有的坑、所有让人头大的时区 bug,背后是一个具体的产品——Floeva 智能健康戒指

我们为什么要在一个还在打磨期的小产品上,把 AI 用到这么深?因为团队不大,但想做的事不小:

💍 把睡眠、心率、运动这些冰冷的健康数据,合成一个你每天看得懂的”Flow 分📱 一个 APP 同时撑住 iOS 和 Android(Flutter)🔄 戒指 ↔ 手机 ↔ 云端的数据同步链路,要扛得住跨时区、断连、长时间不戴这些真实场景🧪 后台、数据管线尽量”无界面化“,让 AI 帮我们维护

简单来说,它既是一个面向用户的健康产品,也是我们对”小团队 + AI 协作怎么把硬件软件一起做出来”这个命题的真实答卷。

这条路上的坑还会继续踩,新的踩坑笔记我也会陆续发出来。如果你对 Floeva 这个产品本身感兴趣,或者想第一时间看到我们后续的开发实录,欢迎关注公众号 哈哈AI Lab,也欢迎进群一起聊。

🎉 加入「哈哈AI Lab实验室」交流群想跟更多人聊 AI 编程协作的真实踩坑,或者关注 Floeva 戒指的开发进展?后台私信「进群」即可获取入群二维码。

⚠️ 本文经验来自 2026 年初到 4 月间 Floeva 项目的真实开发记录,所述工具与做法在 AI 编程工具快速演进的当下,可能很快被新的工作流取代,请按需取用。