亚马逊AI编程工具Kiro工具初体验——人工实测,非AI生成
背景
先前尝试过多款国内免费的AI编程工具,其中使用频次最高的是字节跳动的TRAE,全程免费无门槛,也是我体验下来最顺手的一款;其次是百度的文心快码,我仅少量使用过,这两款工具均推出了独立的IDE,实际视觉和功能底层来看,本质上都是基于VS Code改造而来,保留了基础操作逻辑,上手难度不高,对熟悉VS Code的开发者很友好。
除此之外,腾讯的CodeBuddy和阿里的千问AI编程助手,则是以插件形式安装在现有主流IDE(如IDEA、VS Code)上。实际使用中能明显感受到,受限于插件的权限边界,它们的使用体验远不如独立IDE便捷——这类插件大多只能实现基础的编程问答、代码修订功能,无法与操作系统进行交互,比起能让程序跑起来、抓取报错后自动分析并修复BUG的全流程操作,其自动化程度明显偏低,难以满足实际开发的高效需求。
相比于市面上的宣传造势,这些国内AI编程工具的实际使用体验,远低于我的预期。处理简单业务逻辑这类简单的重复性编程体力活,它们还算够用;但一旦遇到稍微复杂的业务逻辑、算法实现或框架深层适配问题,就显得力不从心,甚至会输出误导性代码——这些代码看似逻辑通顺,实际编译、运行时往往无法通过验证,还需要花费大量时间排查修正,反而增加了额外工作量。
目前来看,国内这些AI编程工具仍处于“辅助工具”的定位,无法独立承担核心开发任务:你需要明确告诉AI要做什么,还要全程盯着它的输出结果,一步步指导它调整优化,全程离不开人工审核和方向把控。这种交互体验,大概就像是在跟一位有两三年工作经验的新手程序员沟通,能帮你分担基础工作,但无法独立搞定核心复杂任务,更谈不上自主规划开发流程。
一直以来,我都想亲自体验下国外的AI编程模型,尤其是号称“最强编程模型”的Claude。毕竟不能只听外界的宣传,唯有切身体验,才能客观评估当前AI编程模型的真实发展水平——比如它在复杂任务处理、代码质量把控、流程自主规划上的能力到底如何,避免被国内这些能力有限的模型固化认知、产生偏差。Claude在SWE-bench软件工程基准测试中表现突出,其相关工具已能实现“80% AI写代码、20%人工修正”的工作模式,这种效率提升是国内工具目前难以企及的。
之所以迟迟没有付诸行动,核心是两个关键难题难以突破:一是网络环境限制,首先要解决科学上网的问题,即便通过VPN勉强实现访问,我也对网络延迟有不小顾虑,卡顿、响应缓慢都会严重破坏开发节奏;二是价格与支付门槛,国外主流AI编程工具的月订阅费大多从20美元起步,而且还会限制使用次数和token额度,对于普通个人开发者来说,成本和使用限制都比较高,长期使用并不划算。
不过最近,我关注到不少开发者分享,发现了一个不错的替代选择——亚马逊云科技推出的AI编程工具Kiro,其独特的设计理念十分有吸引力。它最大的优势在于对国内开发者极其友好:国内IP可正常访问,无需额外配置特殊网络;而且内置了Claude Sonnet/Haiku 4.5模型,能直接调用这款顶尖编程模型的能力,同时还会赠送免费使用额度(新用户可获500 credits,30 天有效),个人开发者的日常需求完全能满足。
更值得一提的是,与市面上常见的Vibe Coding(氛围编程)不同,Kiro主打Spec Coding(规范驱动编程),这也是它最具吸引力的地方。区别于传统AI编程“输入提示就生成代码”的“黑箱模式”,Kiro会像资深系统架构师一样,先拆解开发流程:第一步生成详细的需求文档,明确用户故事和验收标准;第二步生成设计文档,包含API接口、数据库结构、技术架构等细节;第三步拆解为具体可执行的任务列表,确认无误后再自动完成开发、测试,甚至能自动修复测试中出现的问题。
这种模式让每一个开发环节都清晰可见,开发者能全程掌控进度,避免AI生成的代码偏离需求,也解决了传统AI编程“中间环节不可控、修正成本高”的痛点。更难得的是,Kiro作为原生构建的IDE,还集成了诸多工程化最佳实践,比如能自动生成编码规范、联动外部项目管理工具、自动完成单元测试和文档更新等,其内置的基于属性的测试(PBT)功能,还能自动生成海量测试场景,帮助快速定位bug根源,真正让AI编程从“快速原型”迈向“工程化落地”,不少企业实测后效率提升显著,对追求效率与质量的开发者来说,无疑是一个不错的选择。
规范驱动开发
首先我们得明确一个概念,什么是规范驱动开发(Spec Coding),官方说明如下:
在规范驱动开发中,开发过程依然保留了 Vibe Coding 的创造性与灵活性,但克服了后者在复杂任务或大型代码库中的一些局限。Vibe Coding 在处理复杂逻辑时往往需要大量人工引导,或容易误解上下文。而且在实现任务的过程中,开发者很难系统地记录每个决策及其理由,导致团队协作和复盘困难。通过采用“规范”(Spec),Kiro 会在正式编写代码之前,与开发者一起明确需求、系统设计以及待实现的任务。这种方法能清晰记录思考过程与实现决策,使 Kiro 能够在更少的迭代中完成更复杂的任务
我理解是与热门的Vibe Coding(氛围编程)相对的一种方式,按照软件工程的模式,先确认需求,然后进行功能设计,再安排任务开发,通过模板化来规范软件系统核心的需求、设计与实现三个环节,解决以聊天对话为主要方式的氛围编程的痛点。
下载安装
访问官网
https://kiro.dev/downloads/?refid=94c37f13-562e-4af8-89f8-1cd138f5db1b,下载 windows 程序安装包,接近 200M,安装一路下一步就好了。
运行
第一次运行可以选择从 vs code 中导入插件,自动识别,以及选择 UI 风格是深色还是浅色,然后进入登录界面,可以使用谷歌账号、GitHub 账号、亚马逊账号等方式来认证,这一步往往意味着要科学上网了。

登录完成后进入主界面如下:

说实话,界面还是做得挺漂亮的,而且一下就能看到同时支持两种模式,氛围编程和规范驱动编程。
关于计费
免费账户默认每月送 50 点数(credit),20 刀是 1000 点,40 刀 2000 点,200 刀则是 10000 点,超量的计费模式是一样的,都是 4 美分一个点,如下图:

至于点数是什么,官方说明如下:
credit 是 Kiro 用来衡量响应用户请求所需工作量的单位。简单的指令可能不到 1 点就能完成,而像执行 spec 任务这样的复杂操作通常会消耗更多点数。不同模型的点数消耗速率也不相同:同一项任务,如果在 Auto 模型中需要 1 点,那么在 Sonnet 4 中大约会需要 1.3 点。credit 的计量精确到小数点后两位,因此任务的最低消耗量是 0.01 点。
查看我的状态,提示每月 50 点尚未使用,另外还有 30 天 500 点的赠送,这是官方的一个活动,通过社交账号,比如谷歌登录,就会赠送,如下图:

这个量,看起来体验是足够用了,等实际用起来后,再观察下点数的实际消耗情况。
打开项目
选取我自己研发的时光助手项目目录打开,这是一个相对复杂点的项目,前端 vue3,后端 java,同时使用 uni-app 实现了微信小程序和安卓、鸿蒙原生应用,并使用 tauri 框架做了 windows 桌面端的封装,如下图:

模型选择
首页的右下角,对话窗口有模型选择下拉,原本想看看都有哪些模型可以用,结果点了没反应。
然后打开项目后,模型可以选择了,如下图:

暂时保持默认的 auto 就好了,让 kiro 根据自己的判断来选择用哪个模型。
基于源码逆向生成规范文件
正常情况下项目是从需求到设计再到开发,而我手头的时光助手是已经开发完成的一个产品,因此我想尝试来个逆向工程,让 kiro 基于源码反向来生成规范文件,选择规范驱动模式,我推测 AI 能做到这一点,因此在聊天窗口里告知以下要求:
这是一个面向个人的时间管理系统,前端 vue3,后端 java,同时使用 uni-app 实现了移动端微信小程序和安卓、鸿蒙原生应用,并使用 tauri 框架做了 windows 桌面端的封装,请阅读前端目录platform和后端meet目录源码,忽略移动端app目录下的源码,反向生成规范驱动开发的需求、设计与任务,以便后续产品的长久研发
然后 kiro 开始运作了,输出如下:


任务跑完了,生成了一个需求文档,让我确认,并询问是否可以进入设计环节。
任务开始前担心读取整个项目目录会消耗大量点数,实际运行下来该任务总共消耗了 1.46 点,看上去还是可以接受的。
虽然我是用中文提问的,不影响 kiro 思考和回答,但是 kiro 用英文思考和回答影响我阅读,并且输出的需求文档也是英文的……
从网上找了一段,直接扔到聊天窗口里去了,如下:
请始终使用中文回答用户的所有问题和请求。无论用户使用什么语言提问,都应该用中文进行回复。语言规则所有回答都使用简体中文技术术语可以保留英文,但要提供中文解释代码注释使用中文错误信息和提示使用中文文档和说明使用中文例外情况代码本身(变量名、函数名等)可以使用英文命令行指令保持原样配置文件内容根据实际需要决定语言
然后输出了这么个东西:



可以看到,思考过程和输出经过几句延迟,变到中文了,但是活也继续往下干了,把设计文档给输出出来了,问题是方向已经跑偏了……
我的期望是基于现有源码生成需求文档和设计文档,而不是让 kiro 根据自己生成的需求文档,从头设计……我大概看了下设计,后端是 微服务+docker,跟已有设计完全无关。
设计过程大概消耗量 2.83 点,累计 4.29 点。
然后沟通如下:

从这轮交流来看……kiro 不是那么聪明,傻傻的感觉。之前用过的国产工具 trae,在理解需求和上下文方面相当强悍,没出现过这么大的偏离。
然后 我不得不把要求重新提了一遍,kiro 也从头开始读取源码分析结构,相当于把最开始的工作又重新干了一遍,如下:



这个运行时间比较长,然后卡死在删除原需求文档环节,如下图:

长时间(10 分钟+)无响应后,我输入了询问,才继续往下走,结果思考过程和输出的需求文档,又恢复成英文了,这个有点智障吧……如下图:

而且消耗的点数直接从 4.29 蹦到了 10.34……
让其修改设置,思考和输出采用中文,它居然回答它理解了我的需求,但是因为英文需求文档已经创建了,当前主要的任务是继续跑流程,再次要求确认英文的需求文档,如果没问题,进入设计环节,如下图:

这个 AI 跟以前用过的国内模型可不太一样,国内模型很“顺从”,你让它干啥它就干啥,而且有一定的迎合、附和成分,我就遇到过当排查一个报错的时候,我提出来一个排查思路和方向,ai 就按照那个思路去给出的过程,后来验证是行不通的。
不过,这么 呆板地执行预设流程,不接受用户中间给出的指令,也不是一个好用的 AI 吧,无奈之下,只能进一步明确指令:

这时候才把思考过程和需求文档输出转换成了中文。
需求文档
总体来说,根据代码反向生成,需求文档的准确率我人为评估了下,大概在七成左右,没啥惊喜,只是粗粒度的框架,并且有一定的偏差,需求文档如下:
需求文档介绍
Meet(遇见)是一个综合性的个人时间管理系统,结合了任务管理、时间跟踪、个人日记功能和生产力分析。该系统提供多租户架构,支持微信集成和AI驱动的内容提取功能。术语表任务管理器: 负责任务操作的核心系统组件时间跟踪器: 管理工作会话和持续时间跟踪的组件日记系统: 处理个人日记条目和内容的组件分析引擎: 生成生产力报告和统计数据的组件内容提取器: AI驱动的从视频中提取内容的组件微信集成器: 管理微信小程序集成的组件调度器: 处理作业调度和重复任务的组件用户管理器: 管理多租户用户操作的组件任务: 具有层次结构、优先级和状态的工作项任务日志: 记录的工作会话,包含持续时间和进度笔记日记条目: 带有分类的个人日记记录任务分类: 用于分组任务的组织结构重复任务: 按定义计划重复的任务需求需求1:层次化任务管理
用户故事: 作为用户,我希望创建和管理具有分类、优先级和状态跟踪的层次化任务,以便有效地组织我的工作。验收标准当用户创建任务时,任务管理器应存储标题、描述、优先级、状态和分类当用户创建子任务时,任务管理器应建立父子关系并维护层次完整性当用户更新任务状态时,任务管理器应验证状态转换并更新时间戳当用户为任务分配分类时,任务管理器应验证分类存在并正确关联当用户设置任务优先级时,任务管理器应接受预定义优先级范围内的值任务管理器应为所有操作维护任务创建和修改时间戳需求2:时间跟踪和工作会话
用户故事: 作为用户,我希望通过工作会话跟踪在任务上花费的时间,以便监控我的生产力和进度。验收标准当用户开始工作会话时,时间跟踪器应创建带有开始时间和关联任务的任务日志当用户结束工作会话时,时间跟踪器应计算持续时间并存储完成时间当用户向会话添加进度笔记时,时间跟踪器应将笔记与任务日志一起存储时间跟踪器应汇总每个任务在所有工作会话中花费的总时间当创建工作会话时,时间跟踪器应验证关联的任务存在时间跟踪器应防止同一用户的活动工作会话重叠需求3:重复任务管理
用户故事: 作为用户,我希望创建具有灵活计划的重复任务,以便自动化重复性工作规划。验收标准当用户创建重复任务时,调度器应存储重复模式并生成未来实例当重复任务到期时,调度器应自动创建新的任务实例当用户修改重复任务模板时,调度器应仅将更改应用于未来实例调度器应支持每日、每周、每月和自定义重复模式当重复任务实例完成时,调度器不应影响重复计划需求4:个人日记系统
用户故事: 作为用户,我希望维护带有分类的个人日记条目,以便反思我的日常经历和进度。验收标准当用户创建日记条目时,日记系统应存储内容、分类和时间戳当用户对日记条目进行分类时,日记系统应验证分类并正确关联日记系统应支持日记条目中的富文本内容当用户搜索日记条目时,日记系统应返回匹配内容或分类过滤器的结果日记系统应维护日记条目的时间顺序需求5:AI驱动的内容提取
用户故事: 作为用户,我希望从B站视频中提取和转录内容,以便为我的任务和日记捕获有价值的信息。验收标准当用户提供B站视频URL时,内容提取器应检索视频元数据和内容当处理视频内容时,内容提取器应使用AI服务生成转录当转录完成时,内容提取器应存储提取的文本内容内容提取器应处理多个AI服务提供商(阿里巴巴、百度、腾讯)如果内容提取失败,则内容提取器应记录错误并通知用户需求6:微信集成
用户故事: 作为用户,我希望通过微信小程序无缝登录访问系统,以便在移动设备上管理任务。验收标准当用户通过微信登录时,微信集成器应使用微信凭据进行身份验证当微信身份验证成功时,微信集成器应创建或绑定用户账户微信集成器应为已认证的微信用户维护会话状态当用户通过微信访问功能时,微信集成器应提供与Web界面相同的功能微信集成器应优雅地处理微信API速率限制和错误条件需求7:分析和报告
用户故事: 作为用户,我希望查看生产力统计和报告,以便分析我的工作模式并提高效率。验收标准当用户请求每日统计时,分析引擎应计算任务完成率和花费时间当用户请求每周报告时,分析引擎应汇总七天期间的数据当用户请求每月报告时,分析引擎应提供全面的生产力指标分析引擎应为统计数据生成图表和可视化分析引擎应计算时间段内的生产力趋势当生成报告时,分析引擎应包括任务分类和优先级细分需求8:配置管理
用户故事: 作为系统管理员,我希望管理任务分类和系统设置,以便为不同用户需求定制系统。验收标准当管理员创建任务分类时,任务管理器应存储名称、描述和层次级别当管理员修改系统设置时,任务管理器应验证并应用配置更改任务管理器应支持具有父子关系的层次分类结构当删除分类时,任务管理器应适当处理现有任务关联任务管理器应维护所有配置更改的审计日志需求9:多租户用户管理
用户故事: 作为系统管理员,我希望管理用户、角色和权限,以便控制对系统功能的访问。验收标准当新用户注册时,用户管理器应创建具有适当默认权限的账户当管理员分配角色时,用户管理器应验证角色权限并应用它们用户管理器应对所有系统功能强制执行基于角色的访问控制当用户尝试受限操作时,用户管理器应拒绝访问并记录尝试用户管理器应支持用户账户激活、停用和删除用户管理器应维护用户活动日志和会话管理需求10:数据持久化和完整性
用户故事: 作为系统用户,我希望我的数据能够可靠地存储和维护,以便不丢失重要信息。验收标准任务管理器应将所有任务数据持久化到MySQL数据库,符合ACID规范时间跟踪器应确保任务日志数据完整性,防止并发操作期间的数据丢失日记系统应维护日记条目和分类之间的引用完整性当数据库操作失败时,系统应记录错误并提供适当的用户反馈系统应执行定期数据备份并支持数据恢复程序系统应在持久化之前验证所有数据输入以防止损坏
设计文档
接下来,我确认了需求文档,然后担心 AI 又根据需求文档另行生成设计,强调基于源码生成,指令及相应如下:

设计文档文档输出出来了,这个过程中没有额外消耗新的点数,估计是从自己缓存中进行的分析和处理,这点倒是不错的,客观上节省成本,生成的设计文档经评估,大概也就是 六七层的准确率,大框架基本准确,具体的功能实现偏差比较大,部分内容跟实际代码实现不符,如下:
概述
Meet(遇见)个人时间管理系统采用前后端分离的架构设计,前端使用Vue3 + TypeScript + Element Plus构建现代化的用户界面,后端采用Java Spring Boot + MyBatis Plus提供RESTful API服务。系统支持多租户架构,集成微信小程序,并提供AI驱动的内容提取功能。
架构
整体架构
系统采用三层架构模式:

技术栈
前端技术栈:
- Vue 3.x - 渐进式JavaScript框架
- TypeScript - 类型安全的JavaScript超集
- Element Plus - Vue 3组件库
- Vite - 现代化构建工具
- Pinia - 状态管理
- Vue Router - 路由管理
后端技术栈:
- Java 8+ - 编程语言
- Spring Boot 2.x - 应用框架
- Spring Security - 安全框架
- MyBatis Plus - ORM框架
- MySQL 8.0 - 关系型数据库
- Redis - 缓存和会话存储
- WebSocket - 实时通信
集成服务:
- 微信SDK - 小程序集成
- 阿里云AI - 语音识别和NLP
- 百度AI - 内容分析
- 腾讯AI - 多媒体处理
组件和接口
核心组件
1. 任务管理组件 (TaskManager)
职责:
- 管理层次化任务结构
- 处理任务状态转换
- 维护任务分类和优先级
主要接口:
publicinterfaceTaskService{TaskcreateTask(CreateTaskRequest request);TaskupdateTask(Long taskId,UpdateTaskRequest request);voiddeleteTask(Long taskId);List<Task>getTasksByUser(Long userId,TaskQueryFilter filter);List<Task>getSubTasks(Long parentTaskId);TaskupdateTaskStatus(Long taskId,TaskStatus status);}2. 时间跟踪组件 (TimeTracker)
职责:
- 记录工作会话
- 计算时间统计
- 管理任务日志
主要接口:
publicinterfaceTimeTrackingService{TaskLogstartWorkSession(Long taskId,Long userId);TaskLogendWorkSession(Long sessionId,String notes);List<TaskLog>getWorkSessions(Long taskId);TimeStatisticsgetTimeStatistics(Long userId,DateRange range);}3. 日记系统组件 (DiarySystem)
职责:
- 管理个人日记条目
- 处理富文本内容
- 提供搜索和分类功能
主要接口:
publicinterfaceDiaryService{DiarycreateDiary(CreateDiaryRequest request);DiaryupdateDiary(Long diaryId,UpdateDiaryRequest request);voiddeleteDiary(Long diaryId);List<Diary>searchDiaries(DiarySearchCriteria criteria);List<DiaryCategory>getDiaryCategories(Long userId);}4. 内容提取组件 (ContentExtractor)
职责:
- 从B站视频提取内容
- 调用AI服务进行转录
- 管理提取任务状态
主要接口:
publicinterfaceContentExtractionService{ExtractionTasksubmitExtractionTask(String videoUrl,Long userId);ExtractionResultgetExtractionResult(Long taskId);List<ExtractionTask>getUserExtractionTasks(Long userId);voidretryFailedExtraction(Long taskId);}5. 微信集成组件 (WeChatIntegrator)
职责:
- 处理微信登录认证
- 管理用户绑定
- 提供小程序API
主要接口:
publicinterfaceWeChatService{WeChatLoginResultlogin(String code);UserbindWeChatUser(String openId,Long userId);WeChatUserInfogetUserInfo(String openId);voidsendTemplateMessage(String openId,TemplateMessage message);}6. 分析引擎组件 (AnalyticsEngine)
职责:
- 生成生产力报告
- 计算统计指标
- 创建数据可视化
主要接口:
publicinterfaceAnalyticsService{DailyReportgenerateDailyReport(Long userId,LocalDate date);WeeklyReportgenerateWeeklyReport(Long userId,LocalDate weekStart);MonthlyReportgenerateMonthlyReport(Long userId,YearMonth month);ProductivityTrendgetProductivityTrend(Long userId,DateRange range);}API接口设计
RESTful API端点
任务管理API:
GET /api/tasks # 获取任务列表 POST /api/tasks # 创建新任务 GET /api/tasks/{id} # 获取任务详情 PUT /api/tasks/{id} # 更新任务 DELETE /api/tasks/{id} # 删除任务 GET /api/tasks/{id}/subtasks # 获取子任务 POST /api/tasks/{id}/subtasks # 创建子任务 时间跟踪API:
POST /api/tasks/{id}/sessions # 开始工作会话 PUT /api/sessions/{id}/end # 结束工作会话 GET /api/tasks/{id}/sessions # 获取任务会话 GET /api/users/{id}/statistics # 获取时间统计 日记API:
GET /api/diaries # 获取日记列表 POST /api/diaries # 创建日记 GET /api/diaries/{id} # 获取日记详情 PUT /api/diaries/{id} # 更新日记 DELETE /api/diaries/{id} # 删除日记 GET /api/diaries/search # 搜索日记 内容提取API:
POST /api/extraction/submit # 提交提取任务 GET /api/extraction/{id} # 获取提取结果 GET /api/extraction/tasks # 获取用户提取任务 POST /api/extraction/{id}/retry # 重试失败任务 微信API:
POST /api/wechat/login # 微信登录 POST /api/wechat/bind # 绑定微信账户 GET /api/wechat/userinfo # 获取微信用户信息 分析报告API:
GET /api/analytics/daily # 每日报告 GET /api/analytics/weekly # 每周报告 GET /api/analytics/monthly # 每月报告 GET /api/analytics/trends # 生产力趋势 数据模型
核心实体模型
任务实体 (Task)
@Entity@Table(name ="tasks")publicclassTask{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;privateString title;privateString description;privateTaskStatus status;privateTaskPriority priority;@ManyToOne@JoinColumn(name ="parent_id")privateTask parent;@OneToMany(mappedBy ="parent")privateList<Task> children;@ManyToOne@JoinColumn(name ="category_id")privateTaskCategory category;@ManyToOne@JoinColumn(name ="user_id")privateUser user;privateLocalDateTime createdAt;privateLocalDateTime updatedAt;privateLocalDateTime dueDate;// 重复任务相关字段privateRecurrenceType recurrenceType;privateString recurrencePattern;privateLocalDateTime nextOccurrence;}任务日志实体 (TaskLog)
@Entity@Table(name ="task_logs")publicclassTaskLog{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;@ManyToOne@JoinColumn(name ="task_id")privateTask task;@ManyToOne@JoinColumn(name ="user_id")privateUser user;privateLocalDateTime startTime;privateLocalDateTime endTime;privateLong duration;// 以分钟为单位privateString notes;privateLogType logType;privateLocalDateTime createdAt;}日记实体 (Diary)
@Entity@Table(name ="diaries")publicclassDiary{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;privateString title;@LobprivateString content;@ManyToOne@JoinColumn(name ="category_id")privateDiaryCategory category;@ManyToOne@JoinColumn(name ="user_id")privateUser user;privateLocalDateTime createdAt;privateLocalDateTime updatedAt;// 关联的提取内容@OneToMany(mappedBy ="diary")privateList<ExtractedContent> extractedContents;}用户实体 (User)
@Entity@Table(name ="users")publicclassUser{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;privateString username;privateString email;privateString passwordHash;privateUserStatus status;// 微信相关字段privateString wechatOpenId;privateString wechatUnionId;privateString wechatNickname;privateString wechatAvatar;@ManyToMany@JoinTable(name ="user_roles")privateSet<Role> roles;privateLocalDateTime createdAt;privateLocalDateTime lastLoginAt;}内容提取实体 (ExtractionTask)
@Entity@Table(name ="extraction_tasks")publicclassExtractionTask{@Id@GeneratedValue(strategy =GenerationType.IDENTITY)privateLong id;privateString videoUrl;privateString videoTitle;privateExtractionStatus status;@ManyToOne@JoinColumn(name ="user_id")privateUser user;@LobprivateString extractedText;privateString errorMessage;privateLocalDateTime createdAt;privateLocalDateTime completedAt;// AI服务提供商信息privateString aiProvider;privateString taskId;// 外部任务ID}数据库设计
表结构关系

索引策略
性能优化索引:
-- 任务查询优化CREATEINDEX idx_tasks_user_status ON tasks(user_id,status);CREATEINDEX idx_tasks_parent_id ON tasks(parent_id);CREATEINDEX idx_tasks_due_date ON tasks(due_date);-- 时间跟踪优化CREATEINDEX idx_task_logs_task_user ON task_logs(task_id, user_id);CREATEINDEX idx_task_logs_start_time ON task_logs(start_time);-- 日记搜索优化CREATEINDEX idx_diaries_user_created ON diaries(user_id, created_at);CREATE FULLTEXT INDEX idx_diaries_content ON diaries(title, content);-- 用户认证优化CREATEUNIQUEINDEX idx_users_email ON users(email);CREATEUNIQUEINDEX idx_users_wechat_openid ON users(wechat_open_id);正确性属性
属性是应该在系统的所有有效执行中保持为真的特征或行为——本质上是关于系统应该做什么的正式陈述。属性作为人类可读规范和机器可验证正确性保证之间的桥梁。
基于预工作分析,以下是从验收标准中提取的核心正确性属性:
属性1:任务创建完整性
_对于任何_有效的任务创建请求,创建的任务应该包含所有必需字段(标题、描述、优先级、状态、分类),且所有字段值应该与请求中的值匹配
验证:需求 1.1
属性2:任务层次完整性
_对于任何_父子任务关系,子任务的父任务引用应该正确指向父任务,且父任务的子任务列表应该包含该子任务
验证:需求 1.2
属性3:任务状态转换有效性
_对于任何_任务状态更新,新状态应该是当前状态的有效后继状态,且更新时间戳应该晚于创建时间戳
验证:需求 1.3
属性4:工作会话时间一致性
_对于任何_完成的工作会话,结束时间应该晚于开始时间,且计算的持续时间应该等于结束时间减去开始时间
验证:需求 2.2
属性5:时间聚合准确性
_对于任何_任务,其总工作时间应该等于所有关联工作会话持续时间的总和
验证:需求 2.4
属性6:用户会话唯一性
_对于任何_用户,在任何给定时间点只能有一个状态为"进行中"的工作会话
验证:需求 2.6
属性7:重复任务生成一致性
_对于任何_重复任务模板,生成的任务实例应该遵循定义的重复模式,且下次出现时间应该根据重复规则正确计算
验证:需求 3.1, 3.2
属性8:日记搜索准确性
_对于任何_日记搜索查询,返回的结果应该只包含内容或分类匹配搜索条件的日记条目
验证:需求 4.4
属性9:内容提取状态一致性
_对于任何_内容提取任务,如果状态为"完成",则应该存在提取的文本内容;如果状态为"失败",则应该存在错误消息
验证:需求 5.3, 5.5
属性10:微信用户绑定唯一性
_对于任何_微信OpenID,系统中最多只能存在一个绑定该OpenID的用户账户
验证:需求 6.2
属性11:统计数据一致性
_对于任何_时间范围的统计报告,报告中的总工作时间应该等于该时间范围内所有工作会话持续时间的总和
验证:需求 7.1, 7.2, 7.3
属性12:角色权限传递性
_对于任何_用户,其有效权限集合应该等于其所有分配角色的权限的并集
验证:需求 9.2, 9.3
属性13:数据引用完整性
_对于任何_删除操作,系统应该确保不存在指向已删除实体的悬空引用
验证:需求 10.3
属性14:输入验证一致性
_对于任何_数据输入操作,系统应该在持久化之前验证所有输入数据,拒绝无效数据并提供适当的错误消息
验证:需求 10.6
属性15:并发数据完整性
_对于任何_并发数据操作,系统应该确保数据的一致性,防止竞态条件导致的数据损坏
验证:需求 10.2
错误处理
异常处理策略
1. 业务异常处理
@ControllerAdvicepublicclassGlobalExceptionHandler{@ExceptionHandler(TaskNotFoundException.class)publicResponseEntity<ErrorResponse>handleTaskNotFound(TaskNotFoundException ex){returnResponseEntity.status(HttpStatus.NOT_FOUND).body(newErrorResponse("TASK_NOT_FOUND", ex.getMessage()));}@ExceptionHandler(InvalidTaskStatusTransitionException.class)publicResponseEntity<ErrorResponse>handleInvalidStatusTransition(InvalidTaskStatusTransitionException ex){returnResponseEntity.status(HttpStatus.BAD_REQUEST).body(newErrorResponse("INVALID_STATUS_TRANSITION", ex.getMessage()));}@ExceptionHandler(ConcurrentWorkSessionException.class)publicResponseEntity<ErrorResponse>handleConcurrentSession(ConcurrentWorkSessionException ex){returnResponseEntity.status(HttpStatus.CONFLICT).body(newErrorResponse("CONCURRENT_SESSION", ex.getMessage()));}}2. 外部服务异常处理
@ComponentpublicclassContentExtractionService{@Retryable(value ={ExternalServiceException.class}, maxAttempts =3)publicExtractionResultextractContent(String videoUrl){try{return aiServiceClient.extractContent(videoUrl);}catch(ServiceUnavailableException ex){thrownewExternalServiceException("AI service temporarily unavailable", ex);}}@RecoverpublicExtractionResultrecover(ExternalServiceException ex,String videoUrl){// 记录失败并返回默认结果 log.error("Content extraction failed after retries for URL: {}", videoUrl, ex);returnExtractionResult.failed("Service temporarily unavailable");}}3. 数据库异常处理
@Service@TransactionalpublicclassTaskService{publicTaskcreateTask(CreateTaskRequest request){try{return taskRepository.save(buildTask(request));}catch(DataIntegrityViolationException ex){if(ex.getCause()instanceofConstraintViolationException){thrownewInvalidTaskDataException("Task data violates constraints", ex);}thrownewTaskCreationException("Failed to create task", ex);}catch(OptimisticLockingFailureException ex){thrownewConcurrentModificationException("Task was modified by another user", ex);}}}错误恢复机制
1. 自动重试机制
- AI服务调用失败时自动重试3次
- 数据库连接失败时使用指数退避重试
- 微信API调用失败时根据错误码决定是否重试
2. 降级策略
- AI服务不可用时提供基础文本提取
- 统计服务异常时返回缓存数据
- 实时通知失败时记录待发送队列
3. 数据一致性保障
- 使用数据库事务确保操作原子性
- 实现分布式锁防止并发冲突
- 定期数据一致性检查和修复
测试策略
双重测试方法
系统采用单元测试和基于属性的测试相结合的综合测试策略:
单元测试:
- 验证特定示例、边界情况和错误条件
- 测试组件间的集成点
- 关注具体的业务逻辑实现
基于属性的测试:
- 验证跨所有输入的通用属性
- 通过随机化实现全面的输入覆盖
- 每个属性测试最少运行100次迭代
测试框架配置
Java后端测试:
- JUnit 5 - 单元测试框架
- Mockito - 模拟框架
- jqwik - 基于属性的测试库
- TestContainers - 集成测试数据库
前端测试:
- Vitest - 测试运行器
- Vue Test Utils - Vue组件测试
- fast-check - 基于属性的测试库
基于属性的测试配置
每个正确性属性必须通过单个基于属性的测试实现:
测试标签格式:Feature: personal-time-management-system, Property {number}: {property_text}
示例配置:
@Property@Label("Feature: personal-time-management-system, Property 1: 任务层次完整性")voidtaskHierarchyIntegrity(@ForAll("tasks")Task parentTask,@ForAll("tasks")List<Task> childTasks){// 测试删除父任务时子任务的处理 taskService.deleteTask(parentTask.getId());for(Task child : childTasks){Task updatedChild = taskService.findById(child.getId());assertThat(updatedChild.getParent()).isNotEqualTo(parentTask);}}测试覆盖率目标
- 单元测试代码覆盖率:≥ 80%
- 集成测试API覆盖率:≥ 90%
- 基于属性的测试:覆盖所有正确性属性
- 端到端测试:覆盖主要用户流程
小结
对亚马逊云科技 Kiro 工具的实际体验,同样低于网络宣传的预期。不过 Kiro 解决了国内开发者使用海外 AI 编程工具的两大痛点 ——无网络门槛与低使用成本,通过内置 Claude顶尖模型,直接拉满了工具的核心编程能力。
Vibe Coding 听上去很美好,但在当前 AI 的智能化发展阶段, 我不看好,也许只有当 AI 高度智能,特别是实现了 AGI 后方能落地。而规范驱动开发模式,将软件工程的成熟理念和框架整合到人与 AI 协作过程中,我认为是当下的最优解,使 AI 不再是需要人工全程把控的 “新手搭档”,而是能依托规范驱动开发理念,自主完成需求拆解、代码生成、BUG 修复的高效助手。