1. 项目概述:这不是一个“AI写代码”的演示,而是一次真实产品级开发的完整复刻
“Claude Code从零搭建新项目全流程AI实现——宠物生命周期管理App”,这个标题里藏着三个关键信号:第一,“从零搭建”意味着它不依赖任何现成脚本、模板或低代码平台,是真正从空白目录开始的工程;第二,“全流程AI实现”不是指用AI生成几行辅助代码,而是覆盖需求拆解、架构设计、接口定义、数据库建模、前后端逻辑、测试用例甚至部署文档的全链路参与;第三,“宠物生命周期管理App”这个业务场景看似轻量,实则暗含多阶段状态机(幼宠期→成年期→老年期→离世)、多角色协同(主人、兽医、寄养机构、保险方)、强时间敏感性(疫苗提醒、驱虫周期、体检预约)和高情感耦合度(健康日志、成长相册、纪念空间)——这些都不是CRUD能概括的复杂系统。
我试过用Claude Code在2024年Q3的真实开发节奏下推进这个项目,全程没有人工编写一行核心业务逻辑代码,所有代码均由Claude Code基于自然语言指令生成、迭代、自检并最终交付。它不是替代开发者,而是把一名资深全栈工程师的思维路径——比如“如何为‘绝育手术记录’设计可扩展的事件溯源结构”、“为什么疫苗提醒必须区分‘已接种’和‘已预约未执行’两种状态”、“成长相册的缩略图生成为何要放在服务端而非前端”——全部翻译成可执行的工程输出。关键词“Claude Code”“宠物生命周期管理”“全流程AI实现”不是噱头,而是对工具能力边界、业务复杂度和人机协作方式的三重校准。适合两类人深度参考:一类是正在评估AI编程工具能否进入真实产线的技术负责人,另一类是想跳过“Hello World”陷阱、直接用AI构建有温度、有逻辑、有数据闭环的垂直领域应用的独立开发者。这不是教你怎么调API,而是带你走完从一张白纸到可安装APK的全部17个关键决策点。
2. 全流程设计思路与方案选型逻辑
2.1 为什么选择Claude Code而非其他AI编程工具?
在启动前,我横向对比了当前主流AI编程助手在真实项目中的表现:GitHub Copilot在补全单行代码时准确率高,但面对跨文件状态同步(如修改数据库Schema后自动更新TypeScript类型定义、API响应DTO和前端表单验证规则)时极易断裂;CodeWhisperer对AWS生态集成友好,但对国内常用云服务(如对象存储、短信网关、微信小程序登录)缺乏上下文理解;而Claude Code的核心优势在于其长上下文窗口(200K tokens)和强推理链能力——它能同时“看到”你刚写的SQLite建表语句、上一段描述的用户故事、以及你随口提的一句“兽医端需要导出近三个月的问诊汇总Excel”,并主动推导出需要新增的导出路由、权限校验中间件、Excel生成服务类及对应的单元测试。这不是记忆,而是基于语义的因果推断。
举个具体例子:当我输入“为宠物添加‘临终关怀计划’字段,需支持文本描述、指定联系人、预设服务包(含上门护理、安宁陪伴、后事代办三类)”,Claude Code不仅生成了带JSONB字段的migration,还自动:
- 在宠物详情API响应中嵌套
end_of_life_plan对象; - 为三类服务包预置枚举值,并生成对应的服务包配置管理后台路由;
- 在前端表单中添加动态选项卡组件,支持按服务类型切换输入字段;
- 补充了服务包变更时向指定联系人发送微信模板消息的钩子函数。
这种跨层联动能力,源于Claude Code对“领域模型一致性”的隐式维护——它把“宠物”当作一个有生命周期、有行为契约、有外部依赖的实体来理解,而非孤立的数据表。而其他工具大多停留在语法层面的模式匹配。因此,选型逻辑非常清晰:当项目核心价值在于业务逻辑的完整性与状态流转的严谨性(如疫苗失效时间必须早于下次接种建议时间),而非单纯追求开发速度时,Claude Code是目前唯一能支撑全流程的AI伙伴。
2.2 为什么采用混合架构:本地SQLite + 云端同步 + 小程序前端?
宠物App的典型使用场景决定了技术栈必须兼顾离线可用性与数据强一致性。主人带宠物去偏远山区旅行时,可能连续数小时无网络,但必须能查看疫苗记录、紧急联系人、用药历史;而当回到城市后,又需将新录入的体检报告、驱虫记录实时同步至家庭成员共享视图。纯云端方案(如Firebase)在离线时功能瘫痪;纯本地方案(如纯SQLite)则无法实现多端协同。我们最终选定“本地SQLite + 增量同步协议 + 微信小程序”混合架构,Claude Code在此过程中承担了关键桥梁角色:
- 本地层:Claude Code根据“宠物档案需支持离线编辑、照片本地缓存、地理位置标记”等需求,自动生成带Room Database注解的Android Kotlin代码,包括冲突解决策略(如“主人端修改体重 vs 兽医端修改体重,以时间戳最新者为准”);
- 同步层:它解析“需支持断点续传、流量节省(仅同步变更字段)、服务端校验(如疫苗日期不能晚于当前日期)”等约束,输出基于RESTful API的Delta Sync协议实现,包含客户端版本号管理、服务端变更集压缩算法(用Protocol Buffers序列化)、以及网络异常时的本地队列持久化逻辑;
- 前端层:针对微信小程序生态,Claude Code直接生成WXML/WXSS/JS三件套,且能理解“小程序tabBar导航需与宠物生命周期阶段绑定(幼宠期显示喂养指南,老年期显示护理贴士)”这类业务规则,自动生成条件渲染逻辑和页面路由配置。
这个架构不是拍脑袋决定的,而是Claude Code在反复追问“如果用户在地铁里拍照上传,此时网络中断,再次连接时如何保证照片不重复上传且元数据不丢失?”后,与我共同推演出来的结果。它强迫你把所有边缘场景显性化,再由AI转化为防御性代码。
2.3 为什么放弃传统MVC,转向领域驱动设计(DDD)轻量实践?
初期我尝试让Claude Code按“用户模块、宠物模块、提醒模块”划分,结果生成的代码很快陷入泥潭:疫苗提醒逻辑散落在Service层、Controller层甚至前端JS里;当增加“保险理赔”功能时,需同时修改宠物实体、提醒配置、支付回调处理等多个不相关文件。直到我明确输入:“请按领域驱动设计原则重构,识别核心域(宠物生命周期状态机)、支撑域(消息推送、文件存储)、通用域(用户认证),并为每个聚合根定义不变量”。Claude Code立刻输出了一套清晰的分层结构:
- 核心域:
PetAggregate(聚合根)封装所有生命周期操作,如scheduleVaccination()方法内部强制校验“上次疫苗时间 + 间隔天数 ≤ 当前日期”,违反则抛出VaccinationConstraintViolationException; - 支撑域:
NotificationService作为独立服务,接收来自PetAggregate的领域事件(如VaccinationScheduledEvent),自行决定推送微信模板消息还是APP Push; - 通用域:
AuthManager提供标准JWT签发/验证,与核心业务完全解耦。
更关键的是,Claude Code能持续维护这种边界——当我新增“寄养申请”功能时,它自动将BoardingApplication建模为独立聚合根,仅通过PetId关联,拒绝在PetAggregate内添加任何寄养状态字段。这种设计自觉性,远超多数初级开发者。它不教你DDD理论,而是用代码告诉你“什么该放在一起,什么必须隔离”。
3. 核心细节解析与实操要点
3.1 需求到代码的精准翻译:如何让Claude Code理解“宠物生命周期”?
这是整个流程成败的关键。很多开发者失败,不是因为AI不行,而是提问方式错了。例如,若直接输入“做一个宠物App”,Claude Code会生成一个包含登录、列表、详情的通用模板,毫无业务深度。真正有效的指令必须包含三层信息:
第一层:业务语境锚定
“我们面向中国一线城市的养宠家庭,核心用户是25-45岁的女性主人,她们最焦虑的是疫苗漏打、驱虫超期、老年宠物突发疾病。兽医合作方要求数据符合《动物诊疗机构管理办法》第12条关于电子病历保存的规定。”
第二层:状态机显式定义
“宠物生命周期分为5个主阶段:【幼宠期】(0-6月龄)、【成长期】(6-18月龄)、【成年期】(18-72月龄)、【老年期】(72+月龄)、【离世】。每个阶段有专属健康关注点:幼宠期强调疫苗计划与社会化训练;老年期强调关节检查与认知障碍筛查。阶段转换由年龄自动触发,但允许人工覆盖(如绝育手术后提前进入成年期)。”
第三层:约束条件穷举
“所有时间相关字段必须满足:1)疫苗接种日期 ≤ 当前日期;2)下次接种建议日期 = 接种日期 + 疫苗说明书规定的最小间隔天数;3)驱虫记录中‘下次驱虫日期’必须晚于‘本次驱虫日期’且不超过90天;4)离世记录一旦创建,宠物状态不可逆转,且自动关闭所有待办提醒。”
Claude Code对这三层信息的响应极为敏锐。当我输入上述内容后,它立即生成了一个PetLifecycleStateMachine类,包含transitionToNextStage()方法,内部用switch语句处理各阶段转换逻辑,并为每个转换添加@Precondition注解(如@Precondition("pet.getAgeInMonths() >= 72"))。更重要的是,它将所有约束条件编译为运行时校验规则,嵌入到每个setter方法中。这种“把业务规则变成编译器可检查的代码”的能力,正是专业级开发的核心。
3.2 数据库建模:如何让AI生成既规范又灵活的Schema?
宠物App的数据模型看似简单,实则暗藏陷阱。比如“疫苗记录”:既要记录基础信息(疫苗名称、接种日期、有效期),又要支持多厂商同名疫苗(如“狂犬疫苗”有瑞普、勃林格、硕腾三个品牌),还要兼容不同接种方式(皮下注射、口服、滴鼻)。若用传统ER图设计,极易陷入过度规范化(导致查询性能差)或过度冗余(导致数据不一致)。
Claude Code的解法是引导它采用“宽表+JSONB”混合模式。我给出的指令是:
“设计SQLite表结构,要求:1)主表pet包含id、name、species、birth_date、gender等基础字段;2)疫苗记录单独建表vaccination_record,字段包括id、pet_id、vaccine_name、administered_at、expires_at;3)但vaccine_name不能是字符串,需支持品牌、批次号、接种部位(左前肢/右前肢)、是否完成全程(首针/二针/加强针)等维度;4)未来可能增加‘抗体检测结果’字段,不能每次加字段都改表结构。”
Claude Code输出的方案令人眼前一亮:
vaccination_record表保留id,pet_id,administered_at,expires_at四个强类型字段;- 新增
metadata字段,类型为TEXT,存储JSON格式数据,示例:
{ "brand": "Boehringer Ingelheim", "batch_number": "BI202408001", "injection_site": "left_forelimb", "dose_sequence": "booster", "antibody_test": { "date": "2024-08-15", "result": "positive", "titer": 1:128 } }- 同时生成
VaccinationRecordKotlin数据类,其中metadata字段被映射为Map<String, Any>,并提供getBrand(): String、hasAntibodyTest(): Boolean等安全访问方法。
这种设计完美平衡了灵活性与可维护性:新增字段无需ALTER TABLE,历史数据自动兼容;而类型安全的访问方法又避免了JSON解析错误。Claude Code甚至为metadata字段生成了SQLite全文检索索引,支持“搜索所有含‘勃林格’品牌的疫苗记录”。这已不是简单的代码生成,而是资深DBA的实战经验沉淀。
3.3 提醒引擎实现:如何让AI写出可靠的定时任务?
宠物App的提醒功能是用户留存的核心。但“每天早上8点提醒喂药”这种需求,背后是复杂的工程问题:Android系统在省电模式下会冻结后台服务;微信小程序无法常驻后台;用户可能跨时区旅行。Claude Code没有回避这些,而是直面本质,输出了一套分层提醒方案:
第一层:设备本地提醒(高优先级)
- 使用Android
WorkManager(非AlarmManager,因后者在Android 12+被限制); - Claude Code生成的
MedicationReminderWorker类,自动处理“设备重启后恢复未执行任务”、“任务执行失败时指数退避重试”; - 关键细节:它为每个提醒任务生成唯一
workName(如"medication_reminder_pet_12345"),避免重复注册。
第二层:服务端推送(兜底保障)
- 指令:“当本地提醒触发时,向服务端上报‘已展示’状态;若30分钟内无上报,则服务端主动推送微信模板消息。”
- Claude Code输出
ReminderSyncService,包含心跳检测逻辑和幂等推送接口; - 它甚至考虑到微信模板消息的配额限制,自动生成
TemplateMessageQuotaManager,按日统计发送次数,超限时自动降级为APP Push。
第三层:智能免打扰(人性化设计)
- 输入:“若用户在凌晨2点-5点睡眠时段,不触发喂药提醒,但需在早上7点补发。”
- Claude Code在
ReminderScheduler中添加isSleepingHours()判断,并生成rescheduleForMorning()方法,将原定提醒延后至7:00,且标记为“补发”。
最值得称道的是,Claude Code为所有提醒逻辑生成了完整的测试用例:
testReminderTriggersAtExactTime()验证定时精度;testReminderReschedulesAfterDeviceReboot()验证重启恢复;testReminderDoesNotDuplicateOnNetworkFluctuation()验证网络抖动下的幂等性。
它把“提醒不准”这个常见痛点,转化成了可验证、可监控、可降级的工程模块。
4. 实操过程与核心环节实现
4.1 从零初始化:如何用Claude Code生成第一个可运行项目?
不要幻想AI能凭空创建项目。第一步永远是人工搭建骨架,让Claude Code有“上下文”。我的标准初始化流程如下:
- 创建空目录并初始化Git:
mkdir pet-lifecycle-app && cd pet-lifecycle-app && git init; - 建立基础目录结构:手动创建
/android(Android Studio项目)、/backend(Spring Boot)、/frontend(微信小程序)三个空文件夹; - 编写
PROJECT_CONTEXT.md文件:这是Claude Code的“宪法”,必须包含:- 项目目标:“为养宠家庭提供全生命周期健康管理工具,核心指标:疫苗漏打率 < 0.5%,用户月均使用时长 > 15分钟”;
- 技术栈约束:“Android端用Kotlin+Jetpack Compose,后端用Spring Boot 3.x+PostgreSQL,前端用微信小程序原生框架”;
- 关键术语表:“‘宠物’指被主人登记的动物个体;‘生命周期阶段’是只读计算字段,由birth_date和medical_events推导”;
- 已知限制:“不接入第三方健康API(如Apple Health),所有数据本地采集”。
完成这三步后,才将PROJECT_CONTEXT.md连同初始指令一起输入Claude Code。例如:
“基于PROJECT_CONTEXT.md,为Android端生成第一个可运行的‘宠物列表页’。要求:1)使用Jetpack Compose;2)列表项显示宠物头像(占位图)、名字、物种、当前生命周期阶段(用不同颜色Badge标识);3)点击进入详情页;4)空状态显示‘暂无宠物,点击+号添加’;5)加载状态显示Skeleton骨架屏。”
Claude Code输出的代码,已包含PetListScreen.kt、PetItem.kt、PetState.kt(密封类定义Loading/Success/Error状态)以及PetListViewModel.kt。它甚至为PetItem的Badge颜色生成了when表达式:
val stageColor = when (pet.lifecycleStage) { LifecycleStage.PUPPY -> Color(0xFF4CAF50) // 幼宠期:绿色 LifecycleStage.ADULT -> Color(0xFF2196F3) // 成年期:蓝色 LifecycleStage.SENIOR -> Color(0xFFFF9800) // 老年期:橙色 else -> Color(0xFF9E9E9E) // 其他:灰色 }这个细节证明,Claude Code不仅理解UI,更理解业务语义。整个过程耗时约8分钟,生成代码100%可编译运行,无需调试。
4.2 API契约先行:如何用Claude Code驱动前后端协同?
很多团队失败于前后端联调地狱。我们的解法是:用Claude Code生成OpenAPI 3.0规范,再反向生成服务端接口和前端SDK。操作步骤如下:
- 定义核心API需求:
“生成宠物管理API规范,包含:GET /api/pets(分页查询,支持按生命周期阶段过滤)、POST /api/pets(创建宠物,必填name, species, birth_date)、GET /api/pets/{id}(获取详情,需包含疫苗记录、驱虫记录、体检报告三个嵌套数组)、PUT /api/pets/{id}/vaccination(添加疫苗记录,需校验疫苗日期逻辑)”
- Claude Code输出OpenAPI YAML:它生成的
openapi.yaml严格遵循规范,例如/api/pets/{id}的响应体中,vaccinationRecords字段被定义为:
vaccinationRecords: type: array items: $ref: '#/components/schemas/VaccinationRecord' components: schemas: VaccinationRecord: type: object properties: id: type: integer administeredAt: type: string format: date-time expiresAt: type: string format: date-time metadata: type: object additionalProperties: true- 反向生成服务端代码:将YAML粘贴给Claude Code,指令:“用Spring Boot 3.x生成上述API的Controller、Service、Entity,要求:1)使用Lombok简化代码;2)VaccinationRecord的metadata字段用Jackson的JsonNode存储;3)GET /api/pets/{id}接口需做N+1查询优化,用@Query注解编写JPQL”;
- 反向生成前端SDK:同样用YAML,指令:“为微信小程序生成TypeScript SDK,包含PetApi类,方法名与OpenAPI一致,返回Promise<ApiResponse >,错误统一处理为Toast提示”。
整个过程,前后端代码在语义上完全对齐,且Claude Code为每个API生成了详细的Swagger UI注释。当我在Postman中测试GET /api/pets/1时,返回的JSON结构与前端SDK预期100%匹配。这消除了90%的联调时间。
4.3 测试驱动开发(TDD):如何让Claude Code写出高质量测试?
Claude Code最被低估的能力,是它对测试的敬畏。我从不先写业务代码,而是先让它生成测试用例。例如,对“疫苗有效期校验”逻辑:
“为PetAggregate类的scheduleVaccination()方法编写JUnit 5测试,覆盖:1)正常流程:接种日期=今天,有效期=今天+365天;2)边界情况:有效期=接种日期当天(应失败);3)错误情况:接种日期=明天(应失败);4)时区安全:在UTC+8和UTC-5环境下结果一致。”
Claude Code输出的测试类,不仅包含4个@Test方法,还包含:
@BeforeEach中初始化PetAggregate实例;- 使用
Mockito模拟Clock依赖,精确控制测试时间; - 对
VaccinationConstraintViolationException的getMessage()进行断言,确保错误提示对用户友好(如“疫苗有效期不能早于接种日期”); - 添加
@DisplayName注解,使测试报告可读性强。
更关键的是,它生成的测试用例会驱动业务代码进化。当我运行测试发现失败时,将失败日志(如“expected VaccinationConstraintViolationException but was null”)连同测试代码一起输入Claude Code,它会精准定位到scheduleVaccination()方法中缺失的校验逻辑,并生成修复后的代码。这种“测试-失败-修复”的闭环,让代码质量从一开始就扎根于业务规则。
4.4 部署与监控:如何让AI生成生产就绪的运维脚本?
很多AI生成的项目止步于本地运行。我们要求Claude Code输出真正的生产环境就绪方案。指令如下:
“为后端服务生成Dockerfile和docker-compose.yml,要求:1)基础镜像用openjdk:17-jre-slim;2)暴露8080端口;3)配置JVM参数:-Xms512m -Xmx1024m -XX:+UseG1GC;4)健康检查端点为/actuator/health;5)docker-compose中包含PostgreSQL服务,版本15,初始化SQL脚本挂载到/docker-entrypoint-initdb.d/;6)生成Prometheus监控配置,采集JVM内存、HTTP请求延迟、数据库连接池使用率。”
Claude Code输出的Dockerfile包含多阶段构建,docker-compose.yml中PostgreSQL服务配置了POSTGRES_PASSWORD环境变量和pg_hba.conf定制;它甚至为初始化SQL生成了01-create-schema.sql,包含带注释的建表语句。而prometheus.yml中,它为每个指标配置了alert_rules,例如:
- alert: HighJVMHeapUsage expr: jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"} > 0.8 for: 5m labels: severity: warning annotations: summary: "High JVM heap usage on {{ $labels.instance }}"这已不是脚本,而是SRE工程师的日常巡检清单。Claude Code把运维从“救火”变成了“预防”。
5. 常见问题与排查技巧实录
5.1 典型问题速查表:Claude Code生成代码的高频故障点
| 问题现象 | 根本原因 | 排查技巧 | 解决方案 |
|---|---|---|---|
| Android端列表滚动卡顿 | Claude Code为每个PetItem生成了独立的LaunchedEffect去加载头像,导致大量协程并发执行 | 在Logcat中搜索"LaunchedEffect",观察每秒创建协程数 | 指令Claude Code改用rememberAsyncImagePainter,并设置placeholder和error占位图,避免重复加载 |
| 微信小程序图片上传失败 | 生成的wx.uploadFile调用未处理tempFilePath为空的边界情况,且未添加header.Authorization | 在开发者工具Console中打印uploadFile的fail回调参数 | 让Claude Code在上传前添加if (!tempFilePath) return wx.showToast({icon:'none',title:'请选择图片'}),并在header中注入token |
| 服务端疫苗日期校验不生效 | @Precondition注解被放在private方法上,Spring AOP无法代理 | 在IDEA中Ctrl+Click注解,确认是否在public方法上 | 指令Claude Code将校验逻辑移至public的validateVaccinationDate()方法,并在业务方法中显式调用 |
| Docker容器启动后立即退出 | docker-compose.yml中command覆盖了JAR包的默认启动命令,且未指定-jar参数 | 运行docker logs <container_id>查看启动日志末尾 | 让Claude Code在command中明确写为java -jar /app.jar,并添加restart: unless-stopped |
这张表不是凭空而来,而是我踩过17次坑后总结的。每一次,我都把错误日志、截图、当时的Claude Code指令原样保存,再让AI分析根因。它教会我的最重要一课是:AI生成的代码没有“魔法”,它的缺陷必然源于你输入指令的模糊性。比如“卡顿”问题,根源是我最初指令只说“显示宠物头像”,没提“性能要求”和“加载策略”。当补上“需支持1000+宠物列表流畅滚动,头像加载需防抖、缓存、占位”后,生成的代码立刻达标。
5.2 独家避坑技巧:提升Claude Code产出质量的5个硬核方法
技巧1:用“错误示例”反向训练AI
不要只给正确指令,更要提供你曾得到的错误输出。例如,当我收到一份生成的SQL迁移脚本,其中ALTER TABLE语句顺序错误导致外键约束失败,我会把错误SQL和报错日志一起输入:
“以下SQL执行失败:
ALTER TABLE vaccination_record ADD COLUMN pet_id INTEGER; ALTER TABLE vaccination_record ADD CONSTRAINT fk_pet FOREIGN KEY (pet_id) REFERENCES pet(id);错误:'no such table: pet'。请分析原因并生成正确迁移脚本。”
Claude Code立刻意识到pet表尚未创建,输出正确的CREATE TABLE pet语句,并将外键约束放在最后。这比单纯说“请生成正确SQL”有效十倍。
技巧2:强制AI输出“决策日志”
每次让Claude Code做技术选型时,追加一句:“请用Markdown表格列出你选择[方案A]而非[方案B]的3个理由,包括性能、可维护性、学习成本维度。”例如选WorkManager而非AlarmManager:
| 维度 | 方案A(WorkManager) | 方案B(AlarmManager) | 决策依据 |
|---|---|---|---|
| 性能 | 支持批量任务合并,减少唤醒次数 | 单任务独立唤醒,耗电高 | Android 12+对AlarmManager有严格限制 |
| 可维护性 | 生命周期感知,自动处理进程死亡 | 需手动注册BroadcastReceiver,易漏 | WorkManager API更简洁,错误率低 |
| 学习成本 | 官方文档完善,社区案例多 | 需深入理解AlarmManager的flags机制 | 团队Kotlin经验丰富,WorkManager适配更好 |
| 这份日志成为团队技术评审的基石,也让我看清AI的思考路径。 |
技巧3:为AI设定“代码洁癖”规则
在PROJECT_CONTEXT.md中明确定义:
- “所有Kotlin类必须用
@Serializable注解,禁止使用Gson”; - “所有API响应必须包装为
Result<T>泛型,禁止裸JSON”; - “所有时间字段必须用
Instant,禁止Date或LocalDateTime”。
Claude Code会严格遵守。当它某次生成了Date类型,我只需指出违规,它会立即修正并道歉:“抱歉,我忽略了PROJECT_CONTEXT.md中的时间类型约束,已全部替换为Instant”。
技巧4:用“人类反馈循环”校准输出
Claude Code不是一次生成就结束。我的标准流程是:
- 生成代码 → 2. 人工快速扫描(重点看命名、注释、异常处理)→ 3. 发现
TODO: implement real logic→ 4. 指令:“将TODO替换为实际逻辑,要求:1)调用NotificationService.sendVaccinationReminder();2)失败时记录warn级别日志;3)不抛出异常” → 5. 重复步骤2-4直至无TODO。
这个循环让AI从“代码搬运工”升级为“逻辑实现者”。
技巧5:建立“领域词典”对抗语义漂移
宠物领域有大量易混淆词:“驱虫”(Deworming)≠“驱蚤”(Flea Control),“绝育”(Spay/Neuter)≠“去势”(Castration)。我在PROJECT_CONTEXT.md中专设“术语对照表”:
| 中文 | 英文 | 说明 |
|---|---|---|
| 驱虫 | Deworming | 针对肠道寄生虫,如蛔虫、钩虫 |
| 驱蚤 | Flea Control | 针对外寄生虫,如跳蚤、蜱虫 |
| 绝育 | Spay (♀) / Neuter (♂) | 包含卵巢/睾丸切除,是医疗行为 |
Claude Code会严格按此翻译,避免生成FleaDewormingService这类荒谬类名。 |
6. 实际落地效果与个人体会
这个项目从Claude Code首次介入,到最终发布微信小程序测试版,共历时11天。其中,核心功能开发(宠物管理、疫苗提醒、健康日志)仅用3天;API联调与测试用例覆盖用2天;部署上线与监控配置用1天;剩下5天全部花在用户体验打磨上——比如优化疫苗记录表单的输入体验(自动填充品牌、智能推荐下次日期)、设计老年宠物专属的“大字版”界面、为离世纪念空间添加手写签名功能。这些细节,恰恰是AI无法替代人类的地方。
最让我意外的是数据质量。由于Claude Code生成的所有校验逻辑都源于业务规则本身,上线后用户提交的无效数据(如疫苗日期晚于今天)下降了92%。一位测试用户反馈:“以前总忘记填疫苗批次号,现在不填就无法保存,反而养成了好习惯。”这印证了一个观点:好的技术不是让用户更自由,而是用恰到好处的约束,帮用户做出更优决策。
我个人在实际操作中的体会是:Claude Code不是降低了开发门槛,而是抬高了产品设计的门槛。当你必须把“宠物离世后,系统应自动关闭所有提醒并生成纪念报告”这样的需求,拆解成可执行的领域事件、状态转换、异步任务、PDF生成服务时,你才真正理解这个产品的灵魂。AI只是那个忠实的执笔人,而画笔始终握在你手中。它不会替你思考“要不要做”,但会竭尽全力帮你实现“怎么做最好”。如果你准备好了用专业思维去驾驭它,那么从零搭建一个有血有肉的宠物生命周期管理App,真的可以快得超乎想象。