跳到主要内容
亚马逊 AI 编程工具 Kiro 初体验与规范驱动开发实践 | 极客日志
Java SaaS AI 大前端 java
亚马逊 AI 编程工具 Kiro 初体验与规范驱动开发实践 综述由AI生成 体验了亚马逊云科技推出的 AI 编程工具 Kiro,重点介绍了其规范驱动开发(Spec Coding)模式与传统氛围编程(Vibe Coding)的区别。通过逆向工程现有项目,测试了 Kiro 基于源码生成需求文档和设计文档的能力。结果显示 Kiro 解决了国内开发者访问海外 AI 工具的门槛问题,内置 Claude 模型能力较强,但在中文理解、流程控制及准确性上仍有优化空间。规范驱动模式有助于提升 AI 协作的工程化落地效率。
念念不忘 发布于 2026/4/6 更新于 2026/5/23 28 浏览背景
此前尝试过多款国内免费的 AI 编程工具,其中使用频次最高的是字节跳动的 TRAE,全程免费无门槛。其次是百度的文心快码,这两款工具均推出了独立的 IDE,本质上基于 VS Code 改造而来,上手难度不高。
此外,腾讯的 CodeBuddy 和阿里的千问 AI 编程助手以插件形式安装在现有主流 IDE 上。实际使用中受限于插件权限边界,其自动化程度明显偏低,难以满足实际开发的高效需求。
相比于宣传造势,这些国内 AI 编程工具的实际使用体验低于预期。处理简单业务逻辑尚可,但遇到复杂业务逻辑、算法实现或框架深层适配问题时显得力不从心,甚至会输出误导性代码,增加了额外工作量。
目前来看,国内 AI 编程工具仍处于'辅助工具'定位,无法独立承担核心开发任务。需要明确告诉 AI 要做什么,还要全程盯着输出结果,离不开人工审核和方向把控。
一直以来,都想亲自体验国外的 AI 编程模型,尤其是号称'最强编程模型'的 Claude。Claude 在 SWE-bench 软件工程基准测试中表现突出,其相关工具已能实现'80% AI 写代码、20% 人工修正'的工作模式。
之所以迟迟没有付诸行动,核心是两个关键难题:一是网络环境限制,需解决访问问题;二是价格与支付门槛,国外主流 AI 编程工具的月订阅费大多从 20 美元起步,且限制使用次数和 token 额度。
最近关注到亚马逊云科技推出的 AI 编程工具 Kiro,对国内开发者极其友好:国内 IP 可正常访问,无需额外配置特殊网络;内置了 Claude Sonnet/Haiku 4.5 模型,能直接调用顶尖编程模型的能力,同时赠送免费使用额度(新用户可获 500 credits,30 天有效)。
与市面上常见的 Vibe Coding(氛围编程)不同,Kiro 主打 Spec Coding(规范驱动编程)。区别于传统 AI 编程'输入提示就生成代码'的黑箱模式,Kiro 会像资深系统架构师一样,先拆解开发流程:第一步生成详细的需求文档;第二步生成设计文档;第三步拆解为具体可执行的任务列表,确认无误后再自动完成开发、测试,甚至能自动修复测试中出现的问题。
这种模式让每一个开发环节都清晰可见,开发者能全程掌控进度。更难得的是,Kiro 作为原生构建的 IDE,还集成了诸多工程化最佳实践,比如能自动生成编码规范、联动外部项目管理工具、自动完成单元测试和文档更新等,其内置的基于属性的测试(PBT)功能,还能自动生成海量测试场景。
规范驱动开发
首先明确一个概念,什么是规范驱动开发(Spec Coding),官方说明如下:
在规范驱动开发中,开发过程依然保留了 Vibe Coding 的创造性与灵活性,但克服了后者在复杂任务或大型代码库中的一些局限。Vibe Coding 在处理复杂逻辑时往往需要大量人工引导,或容易误解上下文。通过采用'规范'(Spec),Kiro 会在正式编写代码之前,与开发者一起明确需求、系统设计以及待实现的任务。
我理解是与热门的 Vibe Coding 相对的一种方式,按照软件工程的模式,先确认需求,然后进行功能设计,再安排任务开发,通过模板化来规范软件系统核心的需求、设计与实现三个环节。
下载安装
访问官网下载 windows 程序安装包,接近 200M,安装一路下一步即可。
https://kiro.dev/downloads/
运行
第一次运行可以选择从 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 目录下的源码,反向生成规范驱动开发的需求、设计与任务,以便后续产品的长久研发
任务跑完了,生成了一个需求文档,让我确认,并询问是否可以进入设计环节。
任务开始前担心读取整个项目目录会消耗大量点数,实际运行下来该任务总共消耗了 1.46 点,看上去还是可以接受的。
虽然我是用中文提问的,不影响 kiro 思考和回答,但是 kiro 用英文思考和回答影响我阅读,并且输出的需求文档也是英文的……
请始终使用中文回答用户的所有问题和请求。无论用户使用什么语言提问,都应该用中文进行回复。语言规则所有回答都使用简体中文技术术语可以保留英文,但要提供中文解释代码注释使用中文错误信息和提示使用中文文档和说明使用中文例外情况代码本身(变量名、函数名等)可以使用英文命令行指令保持原样配置文件内容根据实际需要决定语言
可以看到,思考过程和输出经过几句延迟,变到中文了,但是活也继续往下干了,把设计文档给输出出来了,问题是方向已经跑偏了……
我的期望是基于现有源码生成需求文档和设计文档,而不是让 kiro 根据自己生成的需求文档,从头设计……我大概看了下设计,后端是微服务+docker,跟已有设计完全无关。
设计过程大概消耗量 2.83 点,累计 4.29 点。
从这轮交流来看,kiro 不是那么聪明。之前用过的国产工具 trae,在理解需求和上下文方面相当强悍,没出现过这么大的偏离。
然后我不得不把要求重新提了一遍,kiro 也从头开始读取源码分析结构,相当于把最开始的工作又重新干了一遍。
这个运行时间比较长,然后卡死在删除原需求文档环节。
长时间(10 分钟+)无响应后,我输入了询问,才继续往下走,结果思考过程和输出的需求文档,又恢复成英文了。
而且消耗的点数直接从 4.29 蹦到了 10.34……
让其修改设置,思考和输出采用中文,它居然回答它理解了我的需求,但是因为英文需求文档已经创建了,当前主要的任务是继续跑流程,再次要求确认英文的需求文档,如果没问题,进入设计环节。
这个 AI 跟以前用过的国内模型可不太一样,国内模型很'顺从',你让它干啥它就干啥,而且有一定的迎合、附和成分。
不过,这么呆板地执行预设流程,不接受用户中间给出的指令,也不是一个好用的 AI 吧,无奈之下,只能进一步明确指令:
需求文档 总体来说,根据代码反向生成,需求文档的准确率我人为评估了下,大概在七成左右,没啥惊喜,只是粗粒度的框架,并且有一定的偏差,需求文档如下:
需求文档介绍
Meet(遇见)是一个综合性的个人时间管理系统,结合了任务管理、时间跟踪、个人日记功能和生产力分析。该系统提供多租户架构,支持微信集成和 AI 驱动的内容提取功能。
术语表
任务管理器 : 负责任务操作的核心系统组件
时间跟踪器 : 管理工作会话和持续时间跟踪的组件
日记系统 : 处理个人日记条目和内容的组件
分析引擎 : 生成生产力报告和统计数据的组件
内容提取器 : AI 驱动的从视频中提取内容的组件
微信集成器 : 管理微信小程序集成的组件
调度器 : 处理作业调度和重复任务的组件
用户管理器 : 管理多租户用户操作的组件
任务 : 具有层次结构、优先级和状态的工作项
任务日志 : 记录的工作会话,包含持续时间和进度笔记
日记条目 : 带有分类的个人日记记录
任务分类 : 用于分组任务的组织结构
重复任务 : 按定义计划重复的任务
需求 1:层次化任务管理
用户故事: 作为用户,我希望创建和管理具有分类、优先级和状态跟踪的层次化任务,以便有效地组织我的工作。
验收标准 当用户创建任务时,任务管理器应存储标题、描述、优先级、状态和分类...(略)
需求 2:时间跟踪和工作会话
用户故事: 作为用户,我希望通过工作会话跟踪在任务上花费的时间,以便监控我的生产力和进度。
验收标准 当用户开始工作会话时,时间跟踪器应创建带有开始时间和关联任务的任务日志...(略)
需求 3:重复任务管理
用户故事: 作为用户,我希望创建具有灵活计划的重复任务,以便自动化重复性工作规划。
验收标准 当用户创建重复任务时,调度器应存储重复模式并生成未来实例...(略)
需求 4:个人日记系统
用户故事: 作为用户,我希望维护带有分类的个人日记条目,以便反思我的日常经历和进度。
验收标准 当用户创建日记条目时,日记系统应存储内容、分类和时间戳...(略)
需求 5:AI 驱动的内容提取
用户故事: 作为用户,我希望从 B 站视频中提取和转录内容,以便为我的任务和日记捕获有价值的信息。
验收标准 当用户提供 B 站视频 URL 时,内容提取器应检索视频元数据和内容...(略)
需求 6:微信集成
用户故事: 作为用户,我希望通过微信小程序无缝登录访问系统,以便在移动设备上管理任务。
验收标准 当用户通过微信登录时,微信集成器应使用微信凭据进行身份验证...(略)
需求 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)
管理层次化任务结构
处理任务状态转换
维护任务分类和优先级
public interface TaskService {
Task createTask (CreateTaskRequest request) ;
Task updateTask (Long taskId, UpdateTaskRequest request) ;
void deleteTask (Long taskId) ;
List<Task> getTasksByUser (Long userId, TaskQueryFilter filter) ;
List<Task> getSubTasks (Long parentTaskId) ;
Task updateTaskStatus (Long taskId, TaskStatus status) ;
}
2. 时间跟踪组件 (TimeTracker) public interface TimeTrackingService {
TaskLog startWorkSession (Long taskId, Long userId) ;
TaskLog endWorkSession (Long sessionId, String notes) ;
List<TaskLog> getWorkSessions (Long taskId) ;
TimeStatistics getTimeStatistics (Long userId, DateRange range) ;
}
3. 日记系统组件 (DiarySystem)
管理个人日记条目
处理富文本内容
提供搜索和分类功能
public interface DiaryService {
Diary createDiary (CreateDiaryRequest request) ;
Diary updateDiary (Long diaryId, UpdateDiaryRequest request) ;
void deleteDiary (Long diaryId) ;
List<Diary> searchDiaries (DiarySearchCriteria criteria) ;
List<DiaryCategory> getDiaryCategories (Long userId) ;
}
从 B 站视频提取内容
调用 AI 服务进行转录
管理提取任务状态
public interface ContentExtractionService {
ExtractionTask submitExtractionTask (String videoUrl, Long userId) ;
ExtractionResult getExtractionResult (Long taskId) ;
List<ExtractionTask> getUserExtractionTasks (Long userId) ;
void retryFailedExtraction (Long taskId) ;
}
5. 微信集成组件 (WeChatIntegrator)
处理微信登录认证
管理用户绑定
提供小程序 API
public interface WeChatService {
WeChatLoginResult login (String code) ;
User bindWeChatUser (String openId, Long userId) ;
WeChatUserInfo getUserInfo (String openId) ;
void sendTemplateMessage (String openId, TemplateMessage message) ;
}
6. 分析引擎组件 (AnalyticsEngine) public interface AnalyticsService {
DailyReport generateDailyReport (Long userId, LocalDate date) ;
WeeklyReport generateWeeklyReport (Long userId, LocalDate weekStart) ;
MonthlyReport generateMonthlyReport (Long userId, YearMonth month) ;
ProductivityTrend getProductivityTrend (Long userId, DateRange range) ;
}
API 接口设计
RESTful 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 # 创建子任务
POST /api/tasks/{id}/sessions # 开始工作会话
PUT /api/sessions/{id}/end # 结束工作会话
GET /api/tasks/{id}/sessions # 获取任务会话
GET /api/users/{id}/statistics # 获取时间统计
GET /api/diaries # 获取日记列表
POST /api/diaries # 创建日记
GET /api/diaries/{id} # 获取日记详情
PUT /api/diaries/{id} # 更新日记
DELETE /api/diaries/{id} # 删除日记
GET /api/diaries/search # 搜索日记
POST /api/extraction/submit # 提交提取任务
GET /api/extraction/{id} # 获取提取结果
GET /api/extraction/tasks # 获取用户提取任务
POST /api/extraction/{id}/retry # 重试失败任务
POST /api/wechat/login # 微信登录
POST /api/wechat/bind # 绑定微信账户
GET /api/wechat/userinfo # 获取微信用户信息
GET /api/analytics/daily # 每日报告
GET /api/analytics/weekly # 每周报告
GET /api/analytics/monthly # 每月报告
GET /api/analytics/trends # 生产力趋势
数据模型
核心实体模型
任务实体 (Task) @Entity
@Table(name = "tasks")
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String description;
private TaskStatus status;
private TaskPriority priority;
@ManyToOne
@JoinColumn(name = "parent_id")
private Task parent;
@OneToMany(mappedBy = "parent")
private List<Task> children;
@ManyToOne
@JoinColumn(name = "category_id")
private TaskCategory category;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private LocalDateTime dueDate;
private RecurrenceType recurrenceType;
private String recurrencePattern;
private LocalDateTime nextOccurrence;
}
任务日志实体 (TaskLog) @Entity
@Table(name = "task_logs")
public class TaskLog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "task_id")
private Task task;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
private LocalDateTime startTime;
private LocalDateTime endTime;
private Long duration;
private String notes;
private LogType logType;
private LocalDateTime createdAt;
}
日记实体 (Diary) @Entity
@Table(name = "diaries")
public class Diary {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@Lob
private String content;
@ManyToOne
@JoinColumn(name = "category_id")
private DiaryCategory category;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
@OneToMany(mappedBy = "diary")
private List<ExtractedContent> extractedContents;
}
用户实体 (User) @Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String email;
private String passwordHash;
private UserStatus status;
private String wechatOpenId;
private String wechatUnionId;
private String wechatNickname;
private String wechatAvatar;
@ManyToMany
@JoinTable(name = "user_roles")
private Set<Role> roles;
private LocalDateTime createdAt;
private LocalDateTime lastLoginAt;
}
@Entity
@Table(name = "extraction_tasks")
public class ExtractionTask {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String videoUrl;
private String videoTitle;
private ExtractionStatus status;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@Lob
private String extractedText;
private String errorMessage;
private LocalDateTime createdAt;
private LocalDateTime completedAt;
private String aiProvider;
private String taskId;
}
数据库设计
表结构关系
索引策略
CREATE INDEX idx_tasks_user_status ON tasks(user_id, status);
CREATE INDEX idx_tasks_parent_id ON tasks(parent_id);
CREATE INDEX idx_tasks_due_date ON tasks(due_date);
CREATE INDEX idx_task_logs_task_user ON task_logs(task_id, user_id);
CREATE INDEX idx_task_logs_start_time ON task_logs(start_time);
CREATE INDEX idx_diaries_user_created ON diaries(user_id, created_at);
CREATE FULLTEXT INDEX idx_diaries_content ON diaries(title, content);
CREATE UNIQUE INDEX idx_users_email ON users(email);
CREATE UNIQUE INDEX 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. 业务异常处理 @ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(TaskNotFoundException.class)
public ResponseEntity<ErrorResponse> handleTaskNotFound (TaskNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ErrorResponse ("TASK_NOT_FOUND" , ex.getMessage()));
}
@ExceptionHandler(InvalidTaskStatusTransitionException.class)
public ResponseEntity<ErrorResponse> handleInvalidStatusTransition (InvalidTaskStatusTransitionException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ErrorResponse ("INVALID_STATUS_TRANSITION" , ex.getMessage()));
}
@ExceptionHandler(ConcurrentWorkSessionException.class)
public ResponseEntity<ErrorResponse> handleConcurrentSession (ConcurrentWorkSessionException ex) {
return ResponseEntity.status(HttpStatus.CONFLICT).body(new ErrorResponse ("CONCURRENT_SESSION" , ex.getMessage()));
}
}
2. 外部服务异常处理 @Component
public class ContentExtractionService {
@Retryable(value = {ExternalServiceException.class}, maxAttempts = 3)
public ExtractionResult extractContent (String videoUrl) {
try {
return aiServiceClient.extractContent(videoUrl);
} catch (ServiceUnavailableException ex) {
throw new ExternalServiceException ("AI service temporarily unavailable" , ex);
}
}
@Recover
public ExtractionResult recover (ExternalServiceException ex, String videoUrl) {
log.error("Content extraction failed after retries for URL: {}" , videoUrl, ex);
return ExtractionResult.failed("Service temporarily unavailable" );
}
}
3. 数据库异常处理 @Service
@Transactional
public class TaskService {
public Task createTask (CreateTaskRequest request) {
try {
return taskRepository.save(buildTask(request));
} catch (DataIntegrityViolationException ex) {
if (ex.getCause() instanceof ConstraintViolationException) {
throw new InvalidTaskDataException ("Task data violates constraints" , ex);
}
throw new TaskCreationException ("Failed to create task" , ex);
} catch (OptimisticLockingFailureException ex) {
throw new ConcurrentModificationException ("Task was modified by another user" , ex);
}
}
}
错误恢复机制
1. 自动重试机制
AI 服务调用失败时自动重试 3 次
数据库连接失败时使用指数退避重试
微信 API 调用失败时根据错误码决定是否重试
2. 降级策略
AI 服务不可用时提供基础文本提取
统计服务异常时返回缓存数据
实时通知失败时记录待发送队列
3. 数据一致性保障
使用数据库事务确保操作原子性
实现分布式锁防止并发冲突
定期数据一致性检查和修复
测试策略
双重测试方法 系统采用单元测试和基于属性的测试相结合的综合测试策略:
验证特定示例、边界情况和错误条件
测试组件间的集成点
关注具体的业务逻辑实现
验证跨所有输入的通用属性
通过随机化实现全面的输入覆盖
每个属性测试最少运行 100 次迭代
测试框架配置
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: 任务层次完整性")
void taskHierarchyIntegrity (@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 修复的高效助手。
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online