05-任务编排实战:从需求到依赖分析的完整链路

89 阅读9分钟

任务编排实战:从需求到依赖分析的完整链路

这篇解决什么问题

拿到一个模糊需求后,怎么一步步把它变成可编排、可并发的原子任务?核心就一件事:画对依赖图。

但依赖图不是凭空画的——它依赖于前面的拆解质量。这篇文章用博客项目的"点赞功能"走一遍完整链路:五步拆解法从头走到尾,重点展开 Step 4 的依赖图分析。每一步给出可复用的操作方法。


一、接到需求

需求通常就是这样来的——一句话,模糊,没有细节:

用户可以给文章点赞,再点一次取消,显示点赞数

接下来要做的事:把这句话翻译成 AI 能理解的结构化信息。用"找名词→找动词→找条件"三步,把模糊需求变成结构化清单:

找名词(数据实体):

实体说明
点赞关系哪个用户对哪篇文章点了赞
文章点赞数文章的累计点赞计数

找动词(用户操作):

操作交互触发条件
点赞/取消点击红心图标已登录

找条件(业务规则):

规则前端后端
必须登录未登录点击 → 跳转登录页接口需 Guard 鉴权
防重复同一篇文章只有一个红心状态联合唯一索引防重复记录
数据一致乐观更新后用后端返回值校正关系表和计数必须在同一事务中更新
userId 来源前端不传 userId从 Token 中获取,禁止前端传参

到这一步,一句话需求已经变成前后端都能理解的结构化清单。这是五步拆解法的输入。


二、Step 1:顶层业务域解耦

把大项目切成独立模块——这是三层分工中"领域拆分层"的落地,由人类决策。

不要一上来就让 AI 面对整个项目。先把项目按业务闭环维度切成独立、无强耦合的模块。以博客系统为例:

模块核心职责独立性
内容消费首页列表、分类筛选、文章详情可独立开发
搜索发现关键词搜索、热门词UI 和逻辑独立
用户认证注册、登录、Token 刷新、登出完全独立的服务
互动功能点赞切换、点赞状态校正依赖文章和认证,但事务逻辑独立

为什么必须先切?AI 一次只能处理有限上下文。整个项目丢给它 → 上下文过载 → 逻辑混乱 → 输出不可控。切完后,AI 每次只聚焦一个模块,思维清晰,输出稳定。

点赞功能属于"互动功能"模块,依赖认证模块(获取当前用户)和文章模块(文章数据),点赞逻辑本身独立。


三、Step 2:三大前置锚定

模块开工前,锁死硬约束,消除 AI 幻觉——这是三层分工中"宏观编排层"的落地,由人类定义模块间的规则和依赖。

① 重要事项锚定(技术硬规范、不可修改的标准):

  • 点赞接口必须通过 RemoteJwtAuthGuard 获取 currentUserId,禁止前端传 userId
  • ArticleLikes 和 Articles.likes 必须在同一事务中更新
  • 前端 Token 使用 HttpOnly Cookie,禁止 localStorage 存储

② 影响面分析锚定(上下游依赖、数据流转规则):

  • Token 刷新涉及前端 axios 拦截器 → backend 代理转发 → auth-service 校验 → Redis 存储,整条链路必须提前理清
  • 多请求并发 401 时,只刷新一次,其他请求排队等待
  • 刷新失败需跳转登录页,并携带 redirect 参数

③ 边界规则锚定(触发条件、禁止触碰的边界):

  • 未登录用户点击点赞 → 跳转登录页,不调用接口
  • 数据库字段下划线(cover_url),DTO 字段驼峰(coverUrl),禁止混用
  • password_hash 绝不出现在任何 DTO 中

三大锚定完成后,输出一份清单文档,AI 每次执行任务前都必须读取。这就是它的"行为边界"。


四、Step 3:模块内线性流程拆解

模块内部按开发流水线拆成线性递进的子阶段——这是三层分工中"微观执行层"的入口,AI 主导,人 Review。

阶段做什么谁主导
准备梳理接口入参/出参、枚举映射、事务规则人
静态组件 UI 绘制、样式实现AI 主导
动态接口对接、状态判断、事件处理AI 执行,人审核
适配跨页面集成、跨模块数据传递AI 执行,人审核
兜底复杂边界场景、体验细节打磨人

关键原则:先静态后动态,先基础后复杂,先 AI 执行后人工兜底。

以点赞功能为例:

  • 阶段 1(准备):梳理 POST /article/toggle-like 的请求/响应结构 + 事务规则
  • 阶段 2(静态):LikeButton 组件 UI 绘制(红心图标 + 计数显示)
  • 阶段 3(动态):对接接口,乐观更新 UI,后端返回后校正
  • 阶段 4(适配):首页/详情页集成,请求 user-likes 校正点赞状态
  • 阶段 5(兜底):未登录跳转、文章不存在提示、网络异常兜底

五、Step 4:原子任务颗粒度 + 依赖图分析

这是整套方法论中最关键的一步——把流程阶段拆成 AI 可直接执行的原子任务,然后画依赖图确定执行顺序。

5.1 拆出原子任务

交给 AI 的每个任务,必须满足三个条件:单目标 + 明确输入 + 可校验的验收标准。

点赞功能
├── 原子任务 1:ArticleLikes Prisma Model + 联合唯一索引
├── 原子任务 2:ToggleLikeRequestDto / ToggleLikeResponseDto
├── 原子任务 3:ArticleService.toggleLike(事务:关系增删 + 计数更新)
├── 原子任务 4:ArticleController.toggleLike(Guard + 参数校验)
├── 原子任务 5:前端 LikeButton 组件 UI 绘制
└── 原子任务 6:前端接口定义 DTO 及页面调用接口

对比一下错误拆法和正确拆法:

❌ 错误✅ 正确
实现点赞功能新增 ArticleLikes Model + 联合唯一索引,迁移成功即可
处理 Token 过期实现 axios 401 拦截器:接口返回 401 且非刷新请求时,调用 /auth/refresh,成功重试原请求,失败跳转 /login?redirect=当前地址
做点赞接口实现 ArticleService.toggleLike:查询→增删→计数更新,$transaction 保证原子性

禁止开放式需求。如果你自己都写不出验收标准,AI 更不可能做对。

5.2 画依赖图

方法很简单:逐个任务问"这个任务要读谁的产出?"

任务我要读谁的产出谁要读我的产出
任务 1:Model无任务 2、3
任务 2:DTO任务 1(Model 字段结构)任务 3、4、6
任务 3:Service任务 1、2任务 4
任务 4:Controller任务 2、3无
任务 5:前端组件 UI 绘制无任务 6
任务 6:前端接口定义 DTO 及页面调用接口任务 2、5无

5.3 依赖的三种类型

依赖类型含义点赞案例
数据依赖下游要读上游产出的数据结构任务 2 要读任务 1 的 Model 字段才能定义 DTO
调用依赖下游要调用上游的函数/接口任务 4 要调用任务 3 的 Service
逻辑依赖下游的业务逻辑依赖上游的决策任务 6 要按 DTO 定义来定义前端接口类型

注意:依赖不等于顺序。任务 3 和任务 5 都没有互相依赖——它们可以并发。任务 1 和任务 5 也没有任何依赖——它们也可以并发。

5.4 依赖的两个方向

  • 上游依赖:我必须等谁先完成 → 决定我能不能开始
  • 下游影响:谁在等我完成 → 决定我完成后谁会被解锁

上游依赖为空的任务,可以立即启动。任务 1 和任务 5 都没有上游依赖,所以它们可以同时开始。

5.5 标记并发可行性

任务上游依赖可并发执行策略
任务 1:Model无✅ 可并发独立启动
任务 2:DTO1❌ 等 1跟任务 1 串行
任务 3:Service1、2❌ 等 1、2跟任务 2 串行
任务 4:Controller2、3❌ 等 2、3跟任务 3 串行
任务 5:前端组件 UI 绘制无✅ 可并发与任务 1 同时启动
任务 6:前端接口定义 DTO 及页面调用接口2、5🟡 DTO 完成后即可等任务 2 + 任务 5 完成后执行

5.6 从依赖图推出执行顺序

依赖图画完,执行顺序是自然推出来的,不是拍脑袋定的。两条规则:

规则 1:无依赖的任务可以并发

规则 2:有依赖的任务必须串行

后端链路 Model → DTO → Service → Controller 是一条依赖链,顺序推进。

关键并发点有两个:

  1. 启动时并发:任务 1(Model)和任务 5(前端 UI 绘制)无依赖,两个窗口同时开工
  2. DTO 分叉点并发:任务 2(DTO)完成后,窗口 A 继续推进 Service → Controller,窗口 B 开始任务 6(前端接口定义)——DTO 就是前后端的契约,契约一定,前端就能按契约定义接口并接入页面
后端链路:任务 1 → 任务 2 → 任务 3 → 任务 4
                      ↓ DTO 完成
前端链路:任务 5 → 任务 6(等 DTO + 任务 5)

时间线:

窗口 A: [1 Model] → [2 DTO] → [3 Service] → [4 Controller]
窗口 B: [5 UI 绘制] →  ↑ DTO 完成 → [6 接口定义 + 页面调用]

任务 2(DTO)是并发分叉点:DTO 之后前后端同时推进。


六、逐条生成提示词:四要素

把原子任务翻译成 AI 可直接执行的提示词,每个提示词包含四要素:目标 + 需求功能 + 完成标准 + 约束。

原子任务 1:ArticleLikes Model + 索引

要素内容
目标新增点赞关系的数据库模型
需求功能新增 ArticleLikes 模型(id, article_id, user_id, created_at),联合唯一索引 @@unique([article_id, user_id]),Articles 模型添加 likes 字段
完成标准npx prisma migrate dev 迁移成功,无类型错误
约束Model 用 PascalCase,数据库字段用下划线命名

原子任务 2:DTO

要素内容
目标创建点赞接口的请求/响应数据结构
需求功能ToggleLikeRequestDto(articleId + 校验装饰器),ToggleLikeResponseDto(articleId, likes, isLiked),统一导出
完成标准DTO 类型完整,校验装饰器齐全,tsc 编译无错误
约束禁止 any,可选字段加 @IsOptional,数字字段加 @Type

原子任务 3:Service 事务

要素内容
目标实现点赞/取消的核心业务逻辑
需求功能查询 ArticleLikes 是否存在记录,已点赞→删除+计数减1,未点赞→创建+计数加1
完成标准点赞/取消都走通,关系表和计数始终一致
约束必须在 Prisma $transaction 中执行,保证原子性

原子任务 4:Controller

要素内容
目标新增点赞/取消点赞的 API 端点
需求功能POST toggle-like 端点,UseGuards(RemoteJwtAuthGuard),从请求获取 currentUserId,参数用 ToggleLikeRequestDto
完成标准路由可访问,Guard 鉴权生效,Swagger 文档正确显示
约束Controller 不写业务逻辑;userId 从 Guard 获取,禁止前端传参

原子任务 5:前端 LikeButton 组件 UI 绘制

要素内容
目标绘制点赞交互组件的 UI 部分
需求功能LikeButton 组件 UI 绘制(红心图标、点赞数展示、点击动效),Props 预留 isLiked, likes, articleId, onToggle
完成标准组件渲染正常,点击动效流畅,Props 类型显式定义
约束使用 useObserver 包裹渲染;Props 类型必须显式定义;暂不接入接口调用,只做 UI

原子任务 6:前端接口定义 DTO 及页面调用接口

要素内容
目标定义前端接口类型并接入页面调用
需求功能按后端 DTO 定义前端 ToggleLikeRequest/Response 类型,实现 api.article.toggleLike 调用,在 LikeButton 中接入接口调用(乐观更新 + 后端校正)
完成标准接口类型与后端 DTO 一致,乐观更新流畅,后端返回后状态校正正确
约束接口类型必须与后端 DTO 严格对齐;禁止组件内直接使用 axios;未登录点击跳转登录页

四要素的作用

要素作用
目标让 AI 知道"做这个任务是为了什么"
需求功能告诉 AI"具体做什么"
完成标准让 AI 知道"做到什么程度算完成"
约束划清"不能做什么"

四要素齐全,AI 执行基本一次到位;缺任何一个,AI 就要猜,猜就是翻车的开始。


七、Step 5:测试验证闭环 + 执行节奏

执行节奏

按依赖图推导的执行顺序,逐条给 AI 执行,结合原子化开发的 /clear 策略:

  • 任务 1-4(后端链路 Model→DTO→Service→Controller)→ 上下文关联,AI 正常 → 不 clear,连续推进
  • 任务 5-6(前端链路 UI 绘制→接口定义)→ 上下文关联,AI 正常 → 不 clear,连续推进
  • 任务 5 可与任务 1 同时启动(不同窗口)
  • 任务 6 等任务 2(DTO)+ 任务 5(UI)完成后执行
  • 如果任何任务跑偏 → 立即 /clear,带四要素重新开始

/clear 的判断标准:上下文是否被污染,而不是任务是否完成。

逐任务验收清单

每个原子任务配套验证方案,做完即验,不等最后:

任务验收点
1Schema 正确 + 迁移生成成功
2DTO 类型完整 + 校验装饰器齐全 + 导出正确
3事务逻辑正确 + 点赞/取消都走通 + 计数一致
4路由可访问 + Guard 生效 + 参数校验正常
5组件渲染正常 + 动效流畅 + Props 类型正确
6接口类型与 DTO 对齐 + 乐观更新流畅 + 后端返回校正

全部通过 → 提交代码。


八、编排模板:可复用的五步法

把这个案例抽象成通用模板,下次拿到任何一组原子任务都能直接套:

步骤做什么方法
1. 顶层解耦把大项目切成独立模块按业务闭环维度划分
2. 三大锚定锁死硬约束重要事项 + 影响面分析 + 边界规则
3. 模块内流程按开发流水线拆阶段准备→静态→动态→适配→兜底
4. 原子任务 + 依赖图拆到 AI 可执行的颗粒度,画依赖图单目标+明确输入+可校验标准;逐个问"我要读谁的产出"
5. 验证闭环每个任务配套验收方案做完即验,不等最后

编排的本质:没有依赖的任务可以并发,有依赖的必须串行。前端 UI 绘制往往没有后端依赖,可以和后端链路同时启动;DTO 是最常见的并发分叉点——契约一定,前端接口定义和后端 Service/Controller 可以并行推进。


一句话收束

任务编排的核心不是"怎么执行",而是画对依赖图。但依赖图的前提是任务已经被正确拆解——五步拆解法就是从需求到原子任务的完整链路。画依赖图的方法就一句话:逐个任务问"我要读谁的产出",答案就是依赖关系。 从依赖关系到执行顺序,是自然推导,不是拍脑袋决定。