一名零基础的产品经理,仅凭6周时间和1万元预算,通过62,376次与ClaudeCode的对话交互,竟独立开发出具备长期记忆和自进化能力的AI桌面应用『阿布』。这款应用不仅能操作本地文件、抓取网页数据,还实现了7×24小时自动化运行和跨平台集成。本文将完整拆解这段从技术小白到AI开发者的奇幻旅程,揭秘8.5万行代码背后的高效工作流与避坑指南。

3月1日那天,我跟ClaudeCode发了9,259条消息,一天,从早到晚。那天是阿布(Abu)的首个版本发布。
从那天起的6周时间里,我用ClaudeCode写了一款叫阿布的AI桌面应用。到今天为止,8.5万行代码、386个文件、222次commit、1,362个测试。
作为一个不懂技术、不会编程的产品经理,我写代码的方式是描述需求,让Claude帮我写。这6周里我跟ClaudeCode总共交互了62,376条消息、45,004次工具调用,花了大约1万块钱(订阅5,740+API5,000+)。
如果你也「想用AI写自己的工具但不知道从哪开始」,或者「看到别人发产品很心动但觉得自己不行」,我想把我这6周经历的完整链路拆开给你看。一个真实案例、一套可复用工作流、一些避坑经验。
6周以前我也是从”我不会编程”开始的。
这篇文章会讲这些事:
1.我做了一款什么产品:阿布能干什么、使用场景、当前规模
2.我的工作流:从需求到代码到上线,5步循环怎么跑
3.用好ClaudeCode:CLAUDE.md、/plan、/insight、/simplify等我每天在用的功能
在3号馆的小米展区,主题被直接命名为“TheNewViewofAI”。展台分为“AIToday”和“AITomorrow”两个区域,一边是已经量产上市的终端产品和场景应用,一边是芯片、机器人、未来终端等偏技术储备的展示。
4.工作示范:从0加一个”让阿布操作浏览器”的功能,完整演一遍
5.怎么做UI:怎么让AI写出审美在线的界面
6.怎么可持续构建:分支纪律、版本管理、提交检查,附真实事故
7.怎么写测试:1,362个测试是怎么长出来的,附注册表实践
8.怎么评估:自建eval框架的思路、23个评测case、跨模型对比
9.几件让我重新理解AICoding的事:4个真实故事
10.能做到什么程度:边界、成本、给小白的6条建议
跟着这篇实战记录走一遍,你也能用ClaudeCode从0做出自己的产品。文末我也放上了阿布源码以及设计文档,你可以从中学习。
1.我做了一款什么产品
我做的东西叫阿布(Abu),一个AI桌面应用,你用自然语言告诉它要做什么,它在你的电脑上替你做。
阿布具备性格自定义、长期记忆、自进化能力,可写文档、做报表、操控电脑和浏览器,支持多Agent(智能体)并行和定时任务运行,所有数据本地运行。

常见的使用场景:
操作本地文件。发票整理,读取开票时间和金额,批量重命名并汇总统计。Excel数据分析,不用写公式,自然语言描述需求直接输出新表。跨文件信息提取,从多份合同里摘出付款条款,整理成对比表格。
网页数据抓取。让阿布替你看网页、提取信息、填表单。它直接操作你已经登录的浏览器,不需要重新登录任何系统,不需要你懂爬虫。
7×24小时自动化。接入飞书、钉钉、Slack机器人,有人在群里@阿布它就自动处理。支持定时任务,比如每月第一个工作日自动跑一份数据汇总。
自进化。阿布不是一个用完就忘的工具,它会根据聊天内容自动Review并沉淀为记忆,还能根据对话上下文自动创建定时任务和Skills技能卡片。你教它一次“每月第一个工作日帮我跑数据汇总”,它自己会把这件事变成一个定时任务+一张技能卡片,下次不用你再说。用得越多,它越懂你。
说完场景,说说阿布在技术上做到了什么程度。这些听起来像是一个工程团队干的事,但确实是我一个PM用ClaudeCode搭出来的:
双协议LLM适配:同时支持Anthropic(Claude)和OpenAI协议,一套代码接两套API,retry、成本统计、错误分类全部统一
OS级沙箱:macOS用Seatbelt(苹果自家的进程隔离)、Windows用ConstrainedLanguage,不是在应用层“假装”安全,是操作系统层面真的把危险操作拦住
ComputerUse+5层安全防御:AI能看屏幕、点鼠标、敲键盘。但有敏感app黑名单、危险按键拦截、全局停止快捷键、会话超时、双中止通道,5层独立兜底
MCP协议:对接外部工具服务器的标准协议,支持stdio和HTTP两种传输。阿布的浏览器操控就是通过MCP接入的
多Agent编排:主Agent可以把大任务拆给多个子Agent(Subagents)并行执行,每个子Agent独立上下文,完成后汇总
Skills技能系统:把重复性SOP沉淀成Markdown格式的技能卡片,AI自动识别何时激活
4种触发器引擎:HTTPwebhook、Cron定时、文件变更、IM消息,四种方式触发Agent执行
IM多平台集成:飞书(WebSocket长连接)、钉钉(eventcallback)、Slack(socketmode),一套抽象层适配三个平台
文件化记忆系统:Agent的长期记忆不是塞进一个大文件,而是文件化目录结构,自动迁移、跨设备同步
自建Eval框架:23个评测case,跨provider对比工具选择准确率,结构化报告可追踪趋势
1,362个自动化测试:76个测试文件,8秒跑完,覆盖工具安全、消息归一化、数据迁移、IM去重等
几个数字:
开发周期:6周(3月2日→4月12日)
代码规模:386个源文件,约8.5万行(7万行TypeScript+4,000行Rust+1.5万行测试)
ClaudeCode交互量:62,376条消息,45,004次工具调用
总花费:约1万元(订阅5,740+API5,000+)
峰值日:3月1日,单日9,259条消息
看到这你可能会想,这些东西我也能做到?能。这些功能不是我一次性设计出来的,是一周一周长出来的。每一个听起来很”工程”的东西,背后都是一个具体的产品需求+一段跟Claude的对话。后面我会一步步拆给你看怎么做到。
2.我用ClaudeCode写代码的工作流
这一节是核心干货。我把”我每天怎么做”拆开给你看,你看完可以直接照着来。
2.1一个功能从想到做完,我做的几件事
5步循环:想清楚→写一段需求描述→让Claude写→我review→跑测试+真机验证。
听起来简单,但重点在比例。我花在“想”上的时间,比花在“写”上多得多。Claude写一个功能可能10分钟,但我想清楚”这个功能到底要解决什么问题、用户使用链路是什么”可能要一个晚上。这个比例跟传统开发完全反过来了。
2.2多窗口并行:一个人同时推多个模块
这是我用ClaudeCode之后发现的最大提效点。
传统开发一个人一次只能写一个模块,你在写A的时候,B、C只能排队。,但ClaudeCode不一样。你可以同时开多个终端窗口,每个窗口跑一个独立的ClaudeCodesession,并行开发不同模块。

我经常的状态是:左边窗口让Claude写IM适配层,右边窗口让它写工具安全规则,中间窗口在跑测试。三条线同时推进,我在它们之间切换做review。等A窗口的代码写完我还没review完,B窗口已经出了初稿。
这种工作方式有几个要注意的:
模块之间要解耦。两个窗口同时改同一个文件会冲突。所以并行开发的前提是你把功能拆成了不会互相踩脚的模块
CLAUDE.md是共享的。所有窗口都会读同一份CLAUDE.md,所以你的规范和纪律会被统一遵守
最后统一跑一遍测试。并行写完之后,关掉多余窗口,在主窗口跑一遍全量测试确认没有互相影响
说实话这种体验很接近”我是一个技术负责人,手下有三个工程师同时在干活”。只不过三个工程师都是Claude,不需要开会对齐。
2.3不止让AI想技术,要让它先想产品方案和用户链路
这是我做阿布最深的一个体会。
很多人用ClaudeCode的方式是:”帮我加一个XX功能”。Claude马上开始写代码。可能写得还挺对,但做出来之后你会发现”好像不是我想要的”。
问题不在Claude,在你。你跳过了”想清楚用户场景”这一步。
我的做法是:每次加新功能,第一段对话完全不提技术。我会先聊:
用户什么时候会用到这个功能?
用户做这件事之前在哪、做完之后到哪?
用户怎么知道“做对了”?
有什么边界是不能碰的?
想清楚这些之后,技术方案自然就会浮出来。如果跳过这一步,Claude会默认用”技术上最合理”的方案,但技术上最合理的方案往往不是产品上最合理的。
后面工作示范那节我会用一个真实案例详细演给你看。
2.3怎么向Claude描述需求
我用一个简单的公式:
作为[角色],我想要[功能],以便[价值]。
比如:”作为一个要整理发票的运营,我想要一个能批量读取发票图片并按日期重命名的功能,以便我每月不用手动处理30张发票。”
这不是什么高级技巧,就是UserStory的标准格式。但你会发现,你把这段话写清楚的过程本身就在帮你想清楚。写不出来的地方就是你还没想清楚的地方。
反例:如果你只说”帮我做一个发票功能”,Claude可能做出一个全自动的发票识别系统——又大又复杂又不是你要的。
2.4怎么做迭代:不是”重写”,是”理解了再改”
阿布不是一次性写完的,每个功能都经过好几轮迭代。我觉得迭代过程要使用文档记录问题、预期功能,我会在Claude开发间隙,自己去写文档记录。

但我踩过一个大坑:直接说”帮我重构XX模块”,Claude不知道之前的代码为什么这么写,上来就改,结果把之前踩过的坑又重新踩了一遍。
现在我的习惯是,每次大改之前,先让Claude写一段“迭代分析”:
第一步:「先读一下这个文件,告诉我它现在的设计是什么、为什么这么做」
第二步:「如果我要加XX功能/改XX行为,有哪些方案?每个方案的利弊和风险是什么?」
第三步:我看完它的分析,觉得它理解对了,才让它开始写
这个多出来的5分钟回报非常大。Claude理解了上下文之后,生成的代码质量高很多,而且不会把之前的修复”无意识地撤销”。
2.5我怎么review它写的代码
说实话,我看不看得懂语法?大致能看懂,但这不是重点。
我review的时候真正在看的是4件事:
逻辑对不对:不是语法层面,是“这段逻辑跟我想的需求一致吗”。Claude经常写出来的代码“能跑”但“不是我要的”
边界条件有没有想到:比如“如果用户传了空字符串会怎样”。这是AI最容易漏的
跟其他模块的耦合影响:Claude看不到全局,它不知道改了这个文件会不会影响另一边。我会问它:“这段改动会影响哪些模块?有没有breakingchange?”
安全和用户体验:哪些路径不能碰、哪些操作需要用户确认、交互细节是不是顺畅
关键实践:我几乎不会一次就通过。一个方案或一段代码,我通常会review2-3轮。第一轮看大方向对不对,第二轮看边界和耦合,第三轮看细节。每一轮我都会把问题直接丢回去让Claude解释或修改:
「这段逻辑在XX情况下会怎样?」
「这个改动会影响XX模块吗?影响的话怎么处理?」
元股证券:ygzq.hk「这个方案的风险是什么?有没有更稳的做法?」
不要怕多问几轮。Claude不会不耐烦,而且每多问一轮,它给出来的方案就更完善。很多bug不是写出来的,是review没抓住的。多轮review的成本远低于事后修bug。
反过来,Claude比我强的地方:算法选型、性能优化、跨平台兼容这些事我都听它的。术业有专攻。
这倒是让我重新理解了产品经理的价值——在AI能写所有代码的时代,PM真正的工作不是不写代码,而是知道什么时候不能让AI自由发挥。
2.6出了bug我怎么跟它聊
三条原则:
第一,把报错原文贴回去,不要描述。不要说”有个地方报错了”,直接把终端里的errortrace粘过去。Claude能从报错信息里定位问题比你用文字描述精准得多。
第二,让它先解释根因再修。不要一上来就说”修一下”。先让它分析bug是怎么产生的,确认分析对了再动手。否则它可能只是在”糊”一个补丁,根因没解决。
第三,修完之后让它顺便写一条测试。提示词:「这个bug你刚才修了,请写一个最小的测试用例覆盖它」。这件事几秒钟,但6个月之后当Claude又要”优化”这段代码时,那条测试会拦下它。
3.用好ClaudeCode的几个功能
ClaudeCode不只是一个”帮你写代码的聊天框”。它有一些功能如果你不知道就会错过,知道了效率会翻倍。
3.1CLAUDE.md:你和Claude之间的合同
这是我觉得ClaudeCode最值钱的功能。
在项目根目录放一个叫CLAUDE.md的文件,每次Claude开始工作都会先读它。你在里面写什么,Claude就会遵守什么。
我的CLAUDE.md现在有273行,里面写了这些事:
技术约束:用什么框架、什么语法不许用(比如不许用enum,要用联合类型)
命名规范:变量用英文、UI文字用中文、commitmessage中英双语
踩过的坑:比如「必须用npmruntauri:dev(冒号),空格版会污染正式数据」。这条是我被坑过一次之后加上去的
分支纪律:禁止在main上直接开发,所有工作在dev分支
核心心法:每次踩坑就更新一条。你的CLAUDE.md会越长越厚,Claude的表现会越来越好,因为它每次都在读你所有的”教训”。
3.2/plan:先想清楚再让它写
输入/plan,Claude进入”只规划不动手”模式。它会列出方案、分析利弊,但不会写一行代码。
我的工作流:复杂功能先/plan出方案→我审→同意之后再让它写。这样避免”它写了500行代码然后你说不是我要的”的尴尬。
3.3/insight:每月让AI看看你怎么用它
这是一个分析你过去30天使用ClaudeCode数据的功能,它会生成一份报告,告诉你”你的工作模式是什么、摩擦点在哪、CLAUDE.md应该加什么规则”。
我自己每个月跑一次/insight,然后把它给的建议直接应用到CLAUDE.md里。相当于让Claude帮你回顾”你跟它的协作效率哪里可以提高”。
3.4/simplify:让AI自己review自己
每次写完一个大功能之后,我会跑一遍/simplify。它会扫描你改过的代码,找复用机会、质量问题、效率优化点,然后自动修。
你可以理解为”让Claude做自己的代码审查”。它写代码时是在往前赶,/simplify时是在回头看。这两步节奏配合起来,代码质量比”只管写不管审”好很多。
3.5/btw:不打断工作流的随手提问
有时候你在写一个功能写到一半,突然想问Claude一个不相关的问题,比如”这个API的参数是什么意思”。直接问的话会打断当前的开发上下文。
/btw解决这个问题。它开一个”旁白通道”,你随便聊什么都不影响当前的代码开发。聊完了回到主线继续写。像是在结对编程的时候侧过头问搭档一句话。
3.6/resume:第二天接着写
ClaudeCode的上下文在你关闭之后就没了。但如果你昨天写到一半,今天想接着来,输入/resume就能恢复上一次会话的上下文。

跨设备、跨时间段的开发,这个命令非常救命。
4.工作示范:从0加一个”让阿布操作浏览器”的功能
上面讲了方法论,这节用一个真实案例演一遍。
4.1起心动念
某天我想让阿布”帮我整理需求管理系统里的待评审需求清单”。阿布当时只能读本地文件,没法看网页。我心里想,能不能让AI也操控浏览器去获取数据?
4.2先想产品方案,不想技术
按照前面说的,我跟Claude的第一段对话完全没提技术。聊的全是用户场景:
用户什么时候需要让AI操作浏览器?填表、数据抓取、操作内部系统后台
用户希望AI看到的是什么?用户已经登录的页面,不是干净浏览器
用户怎么知道AI做对了?要看见过程
用户的隐私边界在哪?哪些Cookie不能碰
想清楚这些之后,一个核心设计决策自然浮出来——必须接入用户已有的浏览器,复用用户的登录态。不能启动一个新的浏览器实例。
这一步如果跳过,Claude默认会推给我Playwright方案:启动一个干净的Chrome、用户得重新登录,跟ComputerUse没本质区别。产品方案不对的时候,技术写得再漂亮也是白做。
4.3让Claude帮我拆解方案
想清楚用户场景之后,我跟Claude说的大概是这个意思:「我想让阿布能操作用户正在用的浏览器,不是打开一个新的,而是直接操作用户已经登录的那个。你帮我想想这件事要拆成哪几块来做。」
Claude给了我一个方案,拆成了三件事。我看了一下觉得合理:
第一件:做一个Chrome浏览器插件。装在用户的Chrome里,它能看到用户打开的所有网页,能帮阿布点按钮、填表单、提取页面上的文字。你可以理解为伸进浏览器的一只”手”。
第二件:做一个中间桥接程序。这个程序负责在阿布和浏览器插件之间传话。阿布说”帮我点一下那个按钮”,桥接程序翻译成浏览器插件能听懂的指令,然后把结果传回来。Claude用的是MCP协议(一种让AI调用外部工具的标准协议),一共封装了17个操作:截图、点击、填写、提取表格等等。
第三件:写一份Skill说明书。这份”说明书”是给阿布自己看的,告诉它”什么时候应该用浏览器工具、17个操作各是干什么的、用错了怎么办”。没有这份说明书,阿布虽然有了工具但不知道什么时候该用。
这三件事Claude帮我拆的。我做的事情是:看它拆得对不对、有没有漏、用户视角通不通。比如我追问了一个问题:「用户装这个插件复不复杂?能不能做到一键装好?」这种问题Claude自己不会主动想到。
4.4跟Claude怎么聊这个需求
拆完方案之后,我分三轮跟Claude聊,每轮解决一件事。
第一轮,我大概这么说的:「我要做一个Chrome浏览器插件,用户装上之后,阿布能通过它看到用户打开的网页、帮用户点按钮和填表单。先帮我把这个插件写出来。」
Claude写完之后会生成一份”通信格式”的定义(就是插件和外部程序之间怎么传消息的约定)。
第二轮,我把这份定义贴给Claude,说:「现在帮我写桥接程序。它要能跟刚才那个插件对接,把阿布的指令翻译成插件能执行的操作。对接的格式就按刚才那份来。」
第三轮,我说:「现在帮我写一份Skill说明书,教阿布什么时候用浏览器工具、什么时候不该用、每个操作是干什么的。」
关键技巧就一个:先让Claude定好“两边怎么对话”的规则,再分别写两边的代码。这样写出来的东西自然能对上,不会出现”插件发的消息桥接程序听不懂”的情况。
4.5写出来后我怎么验证
真机测试:
把Chrome插件手动装到浏览器里
启动桥接程序
让阿布“打开一个网页、提取标题”
看是不是真的能跑通
第一次跑就遇到两个坑:一个是插件和桥接程序之间的身份验证没对上(连不上),另一个是某些网页内容是动态加载的,插件去找的时候页面还没渲染完。都是”我本地测通了、换个网页就翻车”的经典场景。
修复之后我做了跟每次一样的事,让Claude给这两个坑各写了一条测试。
做这个功能让我意识到一件事。做“让AI操作工具”类产品,最难的不是让工具能跑,而是让AI知道什么时候该用。所以那份Skill说明书比代码本身更重要。一个看起来是”技术功能”的需求,从想到做完,技术只占30%,70%是想清楚用户场景和工具边界。
5.怎么让AI写出审美在线的UI
这是小白最容易踩的坑之一。你让Claude写UI,它默认给你的是灰色背景、蓝色按钮、Bootstrap既视感。不是Claude不会写好看的,是你没告诉它”什么叫好看”。
5.1怎么给AI描述”审美”
三种方式:
贴截图。找一个你喜欢的产品(Linear、Vercel、Notion),截一张图发给Claude,说”这个风格”。它能从截图里识别出颜色、间距、圆角、字体的感觉。
定designtoken。颜色、间距、圆角、字体先约定好,写进CLAUDE.md。阿布的designtoken是:主色用克莱因蓝系、背景用柔白、文字用温暖灰、圆角8/12/16三档。每次Claude写新组件都自动套用。
指定参考库。”用shadcn的组件风格”、”间距参照AppleHIG”。一句话就能框定审美范围。
关键:不要说“做漂亮一点”。这句话对AI来说没有任何信息量。你要给具体参照。
5.2约定一旦定下来,AI会自己保持一致
这是一个”复利效应”。你在CLAUDE.md里定好designtoken之后,后面每加一个组件、每做一个页面,Claude都会自动套用同一套视觉语言。你不用每次都重复说”用那个蓝色”。
几轮迭代之后,它甚至能理解你的审美偏好。比如我偏好暗色主题、毛玻璃质感、细边框,它后来自己做出来的东西就已经很接近我想要的了。
AI不会变美,是你要教它什么叫美——但你只需要教一次。
6.怎么可持续构建
很多人用AI写代码的方式是”一口气写完、扔上去就跑”。这在做demo的时候没问题,但如果你想做一个能持续迭代的产品,从第一天就需要一套框架。
我在做阿布的过程中摸索出来的框架大概是这样的,5条纪律,覆盖从”每天开始写代码”到”发版给用户”的全链路:
纪律1:分支隔离。dev分支写代码,main分支给用户。绝不在main上直接开发。
纪律2:版本号同步。发版时所有版本号一起改,不能漏。
纪律3:提交前检查。build能过、lint没报错、测试全绿,才允许commit。
纪律4:commit纪律。每个有意义的变更单独commit,格式conventionalcommits,中英双语。
纪律5:发版清单。版本号→merge到main→打tag→push→写changelog。
听起来像是”正确的废话”,但每一条都是事故教出来的。下面讲几个我真实踩过的坑。
6.1一个关于main分支的事故
某次发完版之后,我忘了切回dev分支,直接在main上继续写代码了。等我发现的时候已经在main上提交了好几个commit,跟dev的代码产生了冲突。
那一次手动解决合并冲突花了不少时间。修完之后我做了一件事,把这条规则写进了CLAUDE.md:
禁止直接在main上开发或pushcommit。所有工作在dev分支进行。
每次开始工作前必做:
1.gitbranch–show-current——确认当前分支
2.如果在main,先gitcheckoutdev
3.gitpullorigindev——拉取最新代码
从那以后Claude每次开始工作都会先检查当前分支。CLAUDE.md不只是约束你自己,也是约束AI的。
6.2三处版本号没同步,发版翻车
阿布有三个地方存版本号:package.json(前端)、src-tauri/tauri.conf.json(Tauri配置)、src-tauri/Cargo.toml(Rust构建)。发版时三处必须同时改。
有一次我只改了package.json的版本号,忘了改另外两处。结果构建出来的安装包版本号对不上,自动更新检测失效,用户那边怎么都收不到新版本。
修完之后这条也进了CLAUDE.md:
三处版本号必须同步更新:package.json、src-tauri/tauri.conf.json、src-tauri/Cargo.toml。
然后发版流程也被固化成了一个清单:
1.确保dev分支build+lint+test全绿
2.三处版本号同步更新
3.gitcheckoutmain&gitmergedev
4.gittagvX.Y.Z
5.gitpushoriginmain–tags
6.在GitHub创建Release
每次发版我让Claude按这个清单走,它比我自己记得牢。
6.3提交前检查:build+lint+test三连
这也是被坑出来的。有一次我改了一段代码,什么都没检查就提交了,结果代码有语法问题,整个应用构建失败。
现在的规则是,每次提交代码之前必须跑三样检查:
第一,编译检查(build)。让程序试着把你的代码”翻译”成计算机能跑的版本。如果代码里有语法错误、类型写错了,这一步就会报错。相当于”你写的东西能不能被机器读懂”。
第二,规范检查(lint)。自动扫描你的代码有没有违反预设的编码规范,比如变量命名不统一、有未使用的代码、格式不对。相当于”你写的东西符不符合团队约定”。
第三,测试检查(test)。跑一遍全部1,362个测试,看有没有哪个功能被你这次改动”误伤”了。相当于”你改完之后,原来能用的东西还能不能用”。
三样加起来不到20秒。20秒换一个”不会把有问题的代码推上去”的保证,我觉得这是做产品最便宜的保险。
6.4commit节奏和双语message
每个有意义的变更单独commit,不要积累一大堆一次性提交。格式用conventionalcommits:feat:新功能/fix:修bug/refactor:重构/docs:文档/test:测试。
我还有一个习惯,commitmessage写中英双语。英文在上面给社区开发者看,中文在下面给我自己6周之后看。举个真实例子:
feat(computer-use):sensitiveappblocking+dangerouskeyinterception
每个操作前检查前台app和按键组合安全性。敏感app用bundle_id匹配(跨语言)。
你可能觉得”我又不开源”,但我跟你说,gitlog是你未来最好的回忆。你3个月后想知道”我当时为什么改了这段代码”,就靠commitmessage。
Claude不会自动管这些纪律,你得替它想。但好消息是,你只需要把规则写进CLAUDE.md一次,之后每次它开始工作都会自动遵守。这套框架本质上就是你和AI之间的流程合同。
7.怎么写测试
我原来根本不写测试。「测试是个文件、跟代码放一起」这种事是做阿布之后才知道的。现在阿布有76个测试文件、1,362个用例,跑全量8秒。下面讲我的实践——不是”正确的做法”,是”我被坑出来的做法”。
7.1为什么写:Claude会反复修同一个bug
这是我开始写测试的直接原因。Claude在改一段相关代码的时候,会把之前的修复”无意识地”撤销,因为它没有那次修复的记忆。一条测试就是用来对抗这种遗忘的:下次它想”简化”这段代码,测试会立刻变红。
7.2怎么让AI帮你写
我的做法极简:每修一个bug,让Claude顺便写一条最小测试。提示词就一句:「这个bug你刚才修了,请写一个最小的测试用例覆盖它」。几秒钟的事。
测试文件和源码放同一个目录,chatStore.ts旁边就是chatStore.test.ts。约定一旦定下来,Claude自己会保持一致。
7.3真实实践:版本注册表
举一个我觉得最有价值的测试实践。
先说背景:阿布会把用户的设置、对话历史、定时任务等10类数据存在用户的电脑本地。问题是,我经常会让Claude改这些数据的格式(比如加一个新字段、改一个字段名)。每次改格式,都必须同时做一件事:写一段”把老格式自动转成新格式”的代码(叫migrate),否则老用户打开Abu就会因为格式对不上而崩溃。
我被这件事坑过一次之后(参见前面”搞炸用户数据”那个故事),做了一个机制:把所有会被存到本地的数据模块,登记在一张清单里。
这张清单大概长这样:设置(已改16次)、对话(已改4次)、定时任务(已改3次)、触发器(已改4次)…
清单有什么用?它跑两个自动检查:
第一个检查:版本号对不对。每次改格式都要把版本号+1。如果有人改了格式但忘了+1,检查会报错。
第二个检查:有没有漏登记的。自动扫描所有存在本地的数据,只要发现有数据不在清单里(说明有人加了新数据但忘了登记),立刻报错。
第二个检查是真正救命的。它意味着,只要Claude悄悄加了一个新的会被存到本地的数据类型,但忘了登记和写migrate,提交代码的时候就会被自动拦下来。
“设置”这类数据在短短6周里改了16次格式。如果没有这张清单,这16次里有任何一次忘了写格式转换,都会让一批用户的本地数据炸掉。
这个做法的核心启发是:最好的测试不是测“功能对不对”,而是测“我有没有忘了某件事”。
7.4测试分布:76个文件都在守护什么
按模块分:工具系统10个文件、IM集成8个、LLM适配7个、Agent引擎7个、上下文管理5个、数据持久化10个、跨模块集成4个。
其中用例最多的几个:工作流提取器80个case(消息流解析规则多到吓人)、路径安全42个(每条对应一个目录穿越/敏感路径场景)、消息归一化30+个(覆盖各种”模型可能返回的奇怪消息形态”)。
每一个数字的背后都有一个真实的事故。我不会为了”覆盖率”去写测试,只会在被坑了之后写。
7.5跑得越快越好
阿布1,362个测试跑全量8秒。这个数字很关键,如果跑一次要5分钟,我大概率就懒得跑。8秒意味着我每次提交前都会跑一遍,提交前检查不会变成负担。
6周,从0到1,362个测试。不是因为我爱写测试,是因为不写真的会翻车。测试是我跟Claude之间的合同——你想改什么都可以,但这些东西不能动。
8.怎么评估
AI产品有一件事跟传统软件不一样:你不知道它今天是不是变笨了。
你换了模型、改了prompt、加了新工具,怎么知道效果是变好还是变差?传统软件测试是”输入A期望输出B”,AI产品是”输入A期望模型做出大致正确的判断”,这种事没法精确断言。
我做了一件当时觉得”是不是太工程了”的事,自己搭了一个评估器。做完之后发现这可能是阿布里最值钱的一部分基础设施。
8.1构建思路:从”我想知道什么”倒推
搭eval的第一步不是写代码,而是想清楚”我到底想知道什么”。
配资炒股排行我最担心的问题是:阿布有26个内置工具,用户说一句话,模型选对工具了吗?比如用户说”帮我看看桌面的文件列表”,模型应该选list_directory还是run_command?用户说”把这段文字写进note.txt”,模型应该选write_file还是edit_file?
这个”选工具”的准确率直接决定产品体验。选错了,用户等半天发现阿布做了一件完全不相关的事。
想清楚要评估什么之后,设计就自然了:
输入:一句用户消息(比如”帮我看看~/Documents/report.md的内容”)模型行为:模型决定该调哪个工具、传什么参数判断标准:必须调的工具调了没有?禁止调的工具有没有误调?参数传对了没有?
这三条判断标准就是eval的核心,不需要真的执行工具,只看模型”选了什么”,不看”做得怎么样”。
8.2我的真实实践:23个评测case
我给阿布写了23个评测case,分成8个类别:
文件操作(4个)/搜索(8个)/命令执行(4个)/多步任务(2个)/记忆(2个)/网页(1个)/知识(1个)/代理委派(1个)
每个case长这样(用大白话讲):
Case:file-read-01用户说:「帮我看看~/Documents/report.md的内容」期望:模型必须调用read_file工具难度:easy
Case:file-edit-01用户说:「把src/config.ts里的API_URL从localhost改成production.api.com」期望:模型必须先调read_file(先看看文件内容),不能直接调write_file(不然会覆盖整个文件)难度:medium
你看,定义这些case不需要懂代码,需要的是“想清楚什么情况下算对”。这是PM的强项。
按难度分:13个easy、8个medium、2个hard。先把简单的覆盖全,再逐渐加难的。跟做产品一样的优先级思路。
8.3跨provider对比:同一组case跑在不同模型上
eval最有价值的用法是:同一组23个case,分别跑在Claude、OpenAI、国产模型(比如MiniMax)上,对比通过率。
跑的方式很简单,一行命令:
tsxsrc/eval/run.tstool-selection–provideranthropic–modelclaude-sonnet-4-20250514
换一个provider就换一下参数:
tsxsrc/eval/run.tstool-selection–provideropenai–modelgpt-4o
结果会自动生成一份报告,按类别和难度拆开看通过率。两份报告还能diff,你一眼就能看到”换了模型之后哪些case变差了”。
8.4eval不是工程师的专利
先说eval这个词。Eval是evaluation(评估)的缩写,在AI行业里指的是:写一组“考试题”来测AI做得对不对。就像老师出一套试卷考学生一样,你出一套试卷考你的AI产品。
具体怎么做?三步:
第一步,出题。想几个典型的用户场景,写下来。比如”用户说帮我看看桌面的文件列表”。
第二步,写标准答案。每道题写清楚”AI应该做什么才算对”。比如这道题的标准答案是”AI应该调用读取目录的工具,不应该去执行命令”。
第三步,让AI答题,自动判分。把题目喂给AI,看它选的工具跟标准答案对不对。对了就pass,错了就fail。跑完23道题出一份报告,一眼看到通过率。
你可能觉得”PM搞这个是不是小题大做”。但做完之后我发现,eval的本质不是技术,是“想清楚怎么判断对错”。
出题需要什么能力?
描述一个用户场景(PM天天干的事)
定义“做对了”长什么样(PM的核心能力)
定义“做错了”有哪些常见模式(PM的踩坑经验)
代码部分全是Claude帮你写的。你只需要想清楚那23道题应该考什么,这件事恰恰是PM最擅长的。
PM在AI时代真正不可替代的能力,是替模型定义”什么叫做对了”。
9.几件让我重新理解AICoding的事
6周里有4件事让我印象深刻。不是技术细节,是”我对AICoding的理解被改变了”的瞬间。
那一晚模型试图打开我的钥匙串。阿布有一个ComputerUse功能,模型能看屏幕、点鼠标。某天晚上我在dev环境跑测试,模型截屏看了一圈,然后在Spotlight搜索框里输入了”KeychainAccess”。那一瞬间我意识到,模型完全有能力打开我电脑上任何app。第二天我从早上写到深夜,连发5个commit,一次性加了敏感app黑名单、危险按键拦截、全局停止快捷键、会话超时。那是我做阿布以来最有”产品恐惧感”的一天。
我发了一次版搞炸了用户数据。改了一个字段名,我本地测了没问题就发版了。当晚用户说”打开是空白”。因为老用户存在硬盘上的是旧字段名,新代码读不到。从那以后我做了”版本号+migrate+注册表”三道锁,到现在设置数据结构已经改了16次,再没出过这种事。
在main分支上直接开发。发完版忘了切回dev,直接在main上继续写了好几个commit。等发现的时候已经跟dev冲突了。手动解决合并冲突花了不少时间。从那以后CLAUDE.md里多了一条硬规则。
3月1日单日9,259条消息。从stats里看到这个数字的时候我自己也吓了一跳。那天从早到晚就没停过,从一个空文件夹开始,到晚上已经有了一个能跑的桌面应用。那种”想法变成产品”的速度,以前是不可能的。
AICoding不是让你写代码更快——它逼你直面那些以前可以装看不见的问题。安全、数据迁移、分支管理——这些事你以前可以说”等有工程师了再想”,现在你就是那个工程师。
10.能做到什么程度+给小白的建议
说实话写到这里我自己也觉得有点不真实。一个产品经理,6周,8.5万行代码,一个有完整安全体系、跨平台(Mac+Windows)、1,362个测试、多模型适配、IM集成、浏览器操控的桌面应用。
但我想诚实地说一下边界。
能做到什么:一个从0到1的、真实可用的完整产品。不是demo,是能发版、有用户在用的东西。从产品设计到架构到实现到测试到发版,一个人全链路。
不能做到什么:极致性能优化(编译器层面的事我搞不定)、原创算法设计(什么时候该用BFS我不知道)、百万QPS级别的分布式系统(这不是一个人能做的事)。
需要付出什么:
钱:约1万元。订阅5,740+API5,000+。第一周会觉得烧得很快,别慌,节奏稳下来之后消耗会下降
时间:我这6周里有34天在写,平均每天4-6小时。峰值日干了一整天
心理建设:第一周会被Claude搞崩N次。报错看不懂、改了又坏、越改越乱。这是正常的。撑过第一周就好了
最重要的:愿意“想清楚”。Claude把“写代码”从瓶颈里拿掉了,但它没把“想清楚要什么”从瓶颈里拿掉。前者是工程师的事,后者一直是PM的事
想说给小白的你
如果你也想开始,这是我给过去自己的几条建议:
第一,先选一个你自己天天会用的小工具去做。不要做”大产品”,做”我自己每天会用的东西”。动力来自你自己的需求,做完了你就是第一个用户。
第二,第一周不写测试,找感觉。前期是做demo的阶段,写测试反而拖慢你。等你第一次被bug坑了再补,那时候你会自然而然地想写。
第三,成本会比你预期的高3倍。第一周烧1000块是正常的,别慌,ClaudeCode的消耗量跟你想象的不一样,Pro额度很快就不够用。
第四,从第一天就建CLAUDE.md。你跟Claude的每一次磨合都是在往这个文件里加一条”合同条款”。越早开始,后面越顺。
第五,不要追求一次性做大功能。一个一个加,每个加完都跑一遍测试。小步快跑比大步摔跤强。
第六,让Claude先想产品再想技术。这是我做阿布最深的体会。它默认会直接进入”怎么实现”,你要把它拉回来:”先告诉我用户是谁、场景是什么、做完之后是什么状态。”
你不需要学会编程,你需要学会跟一个会编程的伙伴说话。
阿布开源地址:https://github.com/PM-Shawn/Abu-Cowork配资平仓线
炒股配资排行提示:本文来自互联网,不代表本网站观点。