
最近我用Claude Code从零搭了一个宠物生命周期管理App。过去搭新项目我一般得先找模板、初始化脚手架、设计目录、配环境变量、定义数据结构然后才开始写业务代码。这次换了一种方式我把整个项目当成一次“AI辅助开发试验”从需求拆解到第一版可运行的App基本都在终端里通过Claude Code完成。这篇文章就是这次全流程的记录包括AI是怎么帮我把模糊想法拆成功能模块的、怎么生成和改造代码的以及它在哪些环节会给你挖坑哪些地方最后还是得人来兜底。想尝试用AI开发新项目的朋友或者对“Claude Code到底能干什么、不能干什么”存疑的开发者都可以参考这条完整路径。我不打算把它写成工具手册更想聊一次真实项目的推进过程每一步怎么和AI对话哪些话术能让它更听话生成的代码怎么验收踩到坑之后怎么让它自己修。你把这篇文章当成一份“AI辅助开发的第一人称踩坑记录”也没问题。1. 项目整体设计与技术选型思路拆解1.1 为什么选宠物生命周期管理这个项目做起点宠物生命周期管理不是一个社交平台那种复杂度拉满的场景但它恰好覆盖了一个典型业务App的核心链路需要信息录入、数据存储、时间计算、定期提醒、图表展示还涉及多实体关联。这些能力放在一起刚好能检验AI编程工具在真实业务里的表现——既不会大到让AI失去上下文也没有简单到一条命令就能交差。拿我自己来说选这个题还有一个现实原因宠物主最关心的事情其实非常集中。毛孩子什么时候该打疫苗、什么时候该驱虫、体重变化是否正常、从小到大有哪些值得记录的照片和事件。这些需求听起来简单真做成App会发现隐藏着一堆细节疫苗有首次免疫和加强免疫驱虫有体内体外之分体重记录要能画趋势线提醒要能算准时差。这恰恰是观察AI能否处理“隐藏约束”的好机会。1.2 需求拆解与MVP边界在把项目丢给Claude Code之前我先自己把需求写成了最小可行产品MVP的边界避免AI理解发散。这颗“定盘星”非常重要。MVP阶段我圈定了六个核心模块宠物档案创建多只宠物维护名字、品种、性别、出生日期、头像和绝育状态。健康事件记录疫苗、驱虫、体检、用药四类事件每类事件关联到期时间。成长记录按日期记录体重、体长自动生成变化曲线。照片时间轴按拍摄时间排列宠物照片还原成长节点。提醒中心基于健康事件的到期日期提前N天在系统通知里提醒。数据备份把全部记录导出为JSON文件支持在新设备导入恢复。我更倾向于把“云端同步”“社区分享”“在线商城”这类功能一律砍掉。原因很直接MVP的第一目标是快速跑通完整链路而不是做全。功能越多AI需要同时维护的上下文越长出错概率越高。等你用这个流程把核心链路跑顺了再让Claude Code往项目里加模块也不迟。1.3 技术选型逻辑与备选方案技术栈这块我一开始就没有选“让AI自由发挥”而是先定好了方向再让Claude Code在框架内做实现。原因后面会讲AI在“选择A还是B”这类问题上经常摇摆但在“明确选A之后怎么实现”上很靠谱。我敲定的技术方案是前端框架React Native TypeScript。理由很实际一套代码覆盖iOS和AndroidTypeScript能给AI生成的代码加上类型约束明显减少低级错误。本地存储SQLite。宠物生命周期管理本质上是一个个人信息工具MVP阶段不需要服务器数据存在本机最简单。提醒能力系统本地通知。通过系统级调度做疫苗、驱虫的到期提醒不依赖推送服务。图表绘制轻量图表组件。体重的折线图、疫苗时间线都用它实现。为什么不是Flutter不是Flutter不好而是我这次更想验证Claude Code对RN生态的熟悉程度。RN的组件和原生模块分布比较分散AI容易在配置环节犯迷糊这正好暴露问题。为什么不上后端因为本地优先可以让整个项目少一个部署环境全流程只在“开发机 模拟器”这个闭环里完成省掉大量运维类干扰更适合作为全流程AI开发的第一个完整样本。2. 用Claude Code从零初始化项目环境、结构与提示词2.1 由一个产品愿景启动我给Claude Code的第一段Prompt第一次启动Claude Code时我并没有直接说“帮我写代码”而是先让它当一回产品经理。原话翻译成中文大概是这样的我要做一个宠物生命周期管理App目标用户是养猫养狗的人。核心功能包括宠物档案、疫苗和驱虫提醒、体重记录、成长照片时间轴、数据导出备份。请帮我拆解MVP需要的功能模块设计一个适合React Native TypeScript SQLite的项目目录结构并说明每个模块的职责边界。这段Prompt的写法是有讲究的。我没有只丢给它一句“做一个宠物App”而是给了三个关键约束目标用户、核心功能、技术底座。目标用户决定了功能颗粒度核心技术栈决定了它能直接生成可用代码而不是给你一堆Web方案。Claude Code很快返回了一段完整的产品模块拆解包括档案管理、事件记录、提醒服务、数据持久化四层同时给出了目录结构建议。第一次交互的重点不是让它写代码而是确认它是否理解了产品边界。如果这一步发现AI理解偏了后面所有代码都会跟着偏早期纠正成本最低。2.2 从自然语言到项目骨架目录与关键配置文件在我确认了模块拆解方向之后才让Claude Code进入“工程搭建”阶段。这一步我要求它按这个目录结构创建基础文件src/ api/ # 数据访问层统一封装SQLite操作 components/ # 通用组件表单、列表、日期选择等 models/ # 数据模型与TypeScript类型定义 screens/ # 页面宠物列表、宠物详情、健康记录、时间轴 services/ # 业务服务提醒调度、导出导入、图片处理 utils/ # 工具函数日期计算、格式化 constants/ # 常量疫苗类型、事件类型、提醒提前天数这个分层是我在需求拆解阶段就想好的Claude Code能顺着这个结构把初始化文件生成出来但真正考验人的是接下来这些细节。如果你直接把“帮我搭好项目”整段丢给它它往往会生成一个能跑但很臃肿的结构很多配置文件分散在根目录和src目录之间。我实际遇到的一个问题是配置文件层级混乱。因为中间改过一次目录约定AI生成的部分import路径还停留在旧结构里。这里想提醒一句改目录不要靠聊天让它“记住”最好直接让它用命令批量替换或者手动改完再让它做一次全局路径校验。AI的记忆没有你想象的那么可靠。2.3 对话式需求澄清把模糊描述变成可落地的表结构项目骨架搭好之后我让Claude Code设计数据库表。这一步我用的是连续追问的方式而不是一次性要求所有表结构。第一次问“根据宠物档案和健康事件模块设计SQLite的表结构要包含字段注释、主外键关系和索引设计。”它给出的初始版本里宠物表和健康事件表是分开的但事件表只有一种类型字段所有的疫苗、驱虫、体检都塞在同一张表里。我追问了一句“疫苗和驱虫的到期提醒规则不同驱虫是按间隔周期重复的疫苗是一次性到期。这两类事件放在同一张表里提醒逻辑会不会很绕”它立刻调整了设计方案把健康事件表拆分出“单次事件”和“周期事件”两种表或者在同一张表里增加recurring_interval字段来区分。最终我们采用的是后者health_events表增加repeat_interval_days字段空值表示单次事件有值表示按周期重复。这个改动让提醒调度变得非常简洁。这段对话给我的体会是AI能帮你建模但你要带着“业务规则”去挑战它。如果你自己没想清楚疫苗和驱虫的差异Claude Code也不会主动替你想因为它的默认目标是“完成任务”而不是帮你挑出产品逻辑漏洞。所以在和AI协作时你才是那个掌握领域知识的人。2.4 初始化阶段的踩坑记录脚手架初始化阶段最容易出的问题不是AI不会写而是它一次处理太多改动时容易“漏配置”。我有一回一次性给它提了十几个需求加路径别名、配ESLint、加Prettier、初始化SQLite、加导航、加状态管理。结果它确实把代码都生成了但运行时报了一个模块找不到的错误原因是它漏写了jsconfig.json里的路径映射。后来我学乖了把大批量改动拆成三次小提交第一次只做基础依赖安装和目录创建第二次加路径别名和代码规范第三次再接入SQLite和导航框架。每次做完都跑一次编译确认没问题再进入下一轮。小步快跑这套思路放到AI协作里依旧成立而且比人工协作时更重要因为AI不会自动记住上一次的遗漏。3. 核心功能模块的AI实现过程与代码实录3.1 宠物档案模块从表单到本地图片存储宠物档案是第一个开发的模块我要求Claude Code把数据访问和页面展示解耦。具体来说所有SQLite操作都放在data层页面只调用封装好的方法。我给的Prompt是在src/data/petRepository.ts中实现宠物表的增删改查包括createPet、getPetById、listPets、updatePet、deletePet方法。返回Promise所有错误用try/catch包裹。同时提供对应的TypeScript类型Pet字段包括id、name、species、breed、gender、birthDate、avatarUri、isNeutered。它生成的代码里核心部分长这样export interface Pet { id: number; name: string; species: cat | dog; breed: string; gender: male | female; birthDate: string; // ISO 8601 avatarUri: string | null; isNeutered: boolean; createdAt: string; } export async function createPet(db: SQLiteDatabase, pet: OmitPet, id | createdAt): PromisePet { const result await db.executeSql( INSERT INTO pets (name, species, breed, gender, birthDate, avatarUri, isNeutered) VALUES (?, ?, ?, ?, ?, ?, ?), [pet.name, pet.species, pet.breed, pet.gender, pet.birthDate, pet.avatarUri, pet.isNeutered ? 1 : 0] ); return { ...pet, id: result.insertId, createdAt: new Date().toISOString() }; }AI生成的这种封装本身没什么问题但要注意一个隐藏点avatarUri的处理。RN里图片选择器返回的通常是临时文件地址直接存进SQLite之后下次启动App临时文件可能已经被系统清理。我让Claude Code补了一个步骤把选中的图片复制到应用沙盒的Documents/avatars/目录再把持久化路径存到数据库。这个坑非常典型AI不会主动想到“临时文件会失效”因为它看不到真实运行环境。3.2 疫苗与健康提醒模块本地通知与日期计算提醒模块是整个App里最容易翻车的部分牵扯到日期计算、时区、系统权限三件套。我先让Claude Code实现一个纯函数模块核心是计算下一次提醒日期export function calculateNextDate( startDate: string, intervalDays: number | null ): string { const start new Date(startDate); if (intervalDays intervalDays 0) { const next new Date(start.getTime() intervalDays * 24 * 60 * 60 * 1000); return next.toISOString().split(T)[0]; } return startDate; }这个函数的逻辑在一开始其实是有问题的。我追问了一个边界条件“如果用户设置的提醒日期是今天应该算到期提醒还是提前一天”Claude Code最初没有区分“到期当天通知”和“提前N天通知”。我要求它改成这样remindDays存的是提前天数调度通知时用下一个到期日减去提前天数来决定通知发送时间。这个调整看起来很小但实际影响很大。疫苗提醒如果只算到期日很多用户会觉得突然反过来如果提前太多天用户又会忘记。我在产品里给默认值设成了“疫苗提前7天驱虫提前3天”这些默认值都写在constants/reminder.ts里方便后期调整。通知调度则用系统本地通知接口实现AI生成这部分代码时通常能写对但Android权限的声明极容易漏。所以我在验收时专门检查了AndroidManifest里的通知权限和后端提醒调度服务。3.3 体重记录与时间轴数据格式与图表适配体重曲线模块本质上是把weight_records表里的数据变成折线图。难点不在画图而在数据清洗。AI生成的第一版图表组件直接把体重数据和附加信息一起丢进去导致横轴标签挤成一团。我给出的修复指令是在priceChartData函数中把体重记录按日期排序输出格式为[{ date: 2024-01-01, value: 3.2 }]日期做标签抽稀最多显示7个刻度。这里其实暴露了AI一个常见问题它擅长生成“看起来正确”的代码但不一定会考虑视觉呈现的边界条件。日期抽稀、标签防重叠、空数据占位这些都是UI层面的隐性需求需要开发者在需求描述阶段主动提出来。我把这些要求写进Prompt之后Claude Code生成的图表代码就基本符合预期了。图表组件本身还有跨平台兼容问题Android上某些属性不生效这类问题靠AI看代码很难发现必须实机跑一遍才能暴露。3.4 多宠物管理与数据导入导出多宠物管理的核心不是UI层面加一个切换器而是所有查询方法都要接收一个petId参数。我让Claude Code把Repository层所有方法都检查了一遍确保没有遗漏过滤条件。AI在这个环节表现不错因为它能顺着类型定义和已有代码做全局搜索比人手动review效率高不少。数据导出的实现比较直接把所有表的数据序列化成一个JSON对象写入文件。导入则是反向过程。难的是导入校验。AI一开始生成的导入函数几乎没做任何校验把JSON直接塞进SQLite一旦文件字段缺失App就会直接崩溃。我要求它加了一层白名单校验只接受pets、health_events、weight_records这三个字段每条记录逐字段检查类型非法数据要么跳过、要么打日志绝不让整个导入流程崩掉。像这种涉及数据安全的位置我一般不会完全信任AI生成的代码一定会自己补一轮边界测试。4. 测试验收与问题排查实录4.1 构建、运行与AI辅助排错测试阶段的第一步是在模拟器里跑起来。遇到报错时我的做法很简单粗暴把终端里的报错信息原样复制给Claude Code再补一句“请根据这个报错定位问题并给出修复方案”。这个流程大多数时候是通的。AI擅长根据堆栈信息判断问题方向比如“模块找不到”“空指针异常”“本地通知权限被拒绝”这类常见错误它基本能直接给出修复代码。但我后来发现一个效率问题报错信息太长时AI会把注意力放到堆栈的噪音部分。后来我调整成只粘贴最关键的三行错误摘要再加上出错文件路径效果反而更好。有一个让我印象很深的报错在Android上加载头像图片时RN的Image组件一直显示空白。AI给出的第一轮修复方案是检查路径格式第二轮是检查文件是否存在。到头来真正的问题是Android的存储权限没有动态申请。这种问题靠AI读代码很难一次定位因为它缺少“设备端真实状态”。正确的做法是把Logcat里的权限拒绝日志贴回给AI让它在上下文中结合权限信息去推断而不是单纯分析代码逻辑。4.2 交互验收清单AI生成的代码能通过编译不代表产品能正常使用。我整理了一份验收清单每一轮都手动操作一遍新建一只宠物头像可以正常显示重启App后数据不丢失。添加一条疫苗记录设置提前7天提醒模拟到了提醒日期能收到本地通知。添加三条不同日期的体重记录折线图能正确展示趋势。在宠物A和宠物B之间切换健康记录互不串数据。导出JSON文件后清空App数据再导入全部记录恢复。验收清单的意义在于暴露AI代码在“真实用户路径”中的问题。比如我遇到过导出文件无法再次导入的情况原因是导出时多了app_version字段而导入白名单没有它。这种不大不小的问题只有走一遍完整流程才能发现。4.3 常见问题速查表下面这个表格是我这次项目中实际遇到、并且修复过的问题也包含我从同类AI开发实践中总结出来的高频坑。问题现象可能原因排查思路编译时报模块找不到路径别名未配置或依赖未安装检查jsconfig/tsconfig里的paths映射再确认依赖是否存在本地通知一直不触发Android缺少权限或调度时间未换算成时间戳查看Manifest检查通知渠道ID是否一致导入数据后App崩溃JSON字段类型不符缺少白名单校验在导入函数里加字段校验和try/catch图片重启后丢失存的是缓存临时路径复制到沙盒持久目录后再存入数据库切换宠物后数据串档查询没有按petId过滤检查Repository层每个方法是否都带petId条件日期显示差一天日期字符串和Date对象时区换算不一致统一用ISO字符串本地时区解析不要在中间环节混用时间戳这张表不能解决所有问题但它能给你一个“AI生成之后必须重点检查”的清单。AI生成的代码普遍在“配置类”和“设备权限类”问题上容易漏这两块恰恰是编译和运行时报错的重灾区。4.4 让Claude Code定位和修复运行时错误的Prompt模板依赖在排查时用一套顺手Prompt模板能让Claude Code少走弯路。我一般会按下面的格式给它发指令下面这段代码在Android模拟器上打开宠物详情页时崩溃报错的关键行是{错误关键行}。已确认导航可以正常进入页面问题只在加载健康记录列表时出现。请先分析可能原因再输出最小修复方案。这个模板包含四个要素问题现象、报错关键行、已经排除的可能性、期望输出。为什么强调“已排除的可能性”因为AI在默认情况下会从最宽泛的原因开始猜你把已经排查过的分支告诉它能帮它收敛搜索空间。实测下来这种写法比一句“帮我修bug”的命中率高非常多。5. 让Claude Code更好用的提效技巧与心得5.1 把大任务拆成小卡片再交给AI整个项目跑下来我最大的体会是Claude Code不是不能处理大任务而是处理大任务时“计划外遗漏”变多。比如让它一次生成整页表单加校验加存储它可能表单字段写得很全但提交按钮的loading状态没处理或者校验函数写好了但没有在提交事件里调用。后来我固定用“功能卡片”的方式推进每个功能描述里只包含一个完整闭环比如“宠物表单支持头像选择并保存到沙盒目录”然后拆成“UI组件”“存储逻辑”“校验规则”三步来实现。这种方式除了减少遗漏还让每次变更都能单独运行验证出了问题很容易定位是哪一步引入的。5.2 用变更说明维护上下文AI会话的上下文长度是有限的项目越大前面聊过的信息被遗忘的可能性越高。我的习惯是每完成一个模块让Claude Code给这个模块写一段“变更摘要”内容包括实现的功能、涉及的关键文件、依赖了什么第三方库、需要注意的限制条件。下次新会话启动时先贴最近几段变更摘要再提新需求。这相当于给AI喂了一份“项目记忆”能有效缓解上下文丢失的问题。曾经有一次我没有做摘要新会话里让它增加一个字段它把整个接口文件重写了一遍还改掉了之前的命名规范。从那以后变更摘要就成了我固定动作。5.3 一套可复用的提示词模板提炼几个经过验证的提示词模板可以直接应用到大部分新项目里。项目启动模板请拆解以下产品的MVP功能模块{一句话产品描述}。技术底座为{技术栈}。输出内容包括功能清单、目录结构、数据表设计、风险点提示。模块开发模板在{项目目录}中实现{功能名}。输入输出、数据结构、交互状态分别说明{详细说明}。接入方式遵循现有{代码规范}不要改动非相关文件。缺陷修复模板运行{平台/环境}时{功能名}报错。报错关键行{关键信息}。已排除{已排查项}。请分析原因并输出最小修复方案不要重构无关代码。这三个模板覆盖了“项目启动—模块开发—缺陷修复”三个最常用场景。模板的价值不在于措辞多么华丽而在于它强制你提供上下文信息减少AI的猜测空间。5.4 哪些代码必须人工review最后说一下“人的兜底边界”。Claude Code生成的大部分代码我都能放心用在业务逻辑里但有三类代码我绝对会自己重新读一遍。第一类是数据删除相关代码。删除宠物意味着级联删除它的健康记录、体重记录、照片引用。AI生成级联删除时偶尔会漏掉“确认弹窗”或者“删除前提醒”这类不可逆操作必须有完整的人为确认机制。第二类是权限相关代码尤其是Android的动态权限申请。AI生成的权限代码经常只有声明没有请求或者请求结果没有回调处理这些逻辑出问题很难通过静态代码发现。第三类是任何涉及时间的计算逻辑。时区、夏令时、跨年边界AI默认用最简单的算法但现实世界的日期远比它想象的复杂。这三类代码之外AI已经能帮我把大量重复劳动扛下来比如TypeScript类型定义、SQLite操作封装、通用组件样板、JSON序列化等。这些工作属于“写起来费时、读起来简单”的类型人类做容易走神AI做反而效率和质量都更稳定。整套流程走完我个人最明显的感受是Claude Code不是一个替你写代码的“外挂”更像一个能读懂上下文、可以随叫随到的结对程序员。它省掉的是从想法到代码之间的翻译成本但它不懂你的产品逻辑也不会替你做边界测试。我踩过几次坑之后慢慢调整了用法小步提交、频繁验收、把需求讲清楚这比一次性生成一大堆代码靠谱得多。如果你也准备用AI从零搭一个新项目我建议先从这样一个功能完整但规模不大的App练手把流程跑通再逐步放大到更复杂的工程。