10 第三篇 · 日常:每个变更任务

从需求到 feature 的分解流

一坨需求摆在面前——一份 PRD、一句”把这个做了”、一个 bug——在判它走哪一档、动手写规格之前,先要把它切成能一个一个交付的单元。这一步叫分解。分解做错,后面每一步都在错的粒度上使劲:要么一个单元大到写不出清晰的规格,要么切出来的”单元”根本不是用户能用的东西。

分解不是一次把需求拆到底,而是按规模分层下钻:大的先分组,再切成可交付的 feature,feature 内部的实现任务留给后面的流程。多数需求用不到全部层级——这一章先讲清楚层级和每层的判断,下一章再讲每个 feature 定档后怎么走。

10.1 分解的四层:PRD → Epic → Feature → Task

业界拆分需求有一条相对稳定的层级链,从大到小是四层:

层级是什么能不能直接开发谁来切
PRD / 需求一整坨待开发的东西,还没有边界否人写 / 产品给
Epic面向用户的粗粒度能力分组,跨多个 feature否,它只是容器/td-epic-discovery(需要时)
Feature可独立交付、用户能感知的纵向切片是/td-feature-discovery
Taskfeature 内部的实现步骤是spec-kit 的 tasks 阶段

关键是看清哪一层由谁负责,不要越层:

按规模缩放,不是人人走全程

四层是能力清单,不是固定流程。真正要做的判断是”这次需要走到哪一层”:

层级是给”大到握不住”的需求准备的脚手架;需求不大时,跳过上面的层,直接落到 feature 甚至直接一个单元。为了凑齐层级而硬分 Epic,只会凭空多一层维护负担。

10.2 Epic 层:什么时候需要先分组

Epic 是一个选择性工具。大多数变更不需要它。判断要不要先分 Epic,由人决定——你觉得这坨大,才运行 /td-epic-discovery;觉得不大,直接去切 feature。

倾向需要 Epic:需求跨几个不同的能力领域或用户群;明显是多阶段、多月的规模;直接切成 feature 会切出十几个以上、而且没有自然归类的一堆。

倾向不需要 Epic:一个内聚的能力;围绕单一工作流的一小把 feature;一个 bug 或单模块的迭代。

运行 /td-epic-discovery 时,它先过这道判断——不够大就直说”不必分 Epic”,并把你导向 /td-feature-discovery,不写任何文件。够大才进入分组。

分组时还有一个要人来定的选择:按什么轴分 Epic。同一坨需求可以沿不同的轴切,哪种合适取决于项目,所以提示词给候选、让人选,不自己替你定:

Epic 切出来是一张”选哪个往下做”的薄菜单,每个 Epic 带一句面向用户的目标和几条”大致包含什么”的提示,不写验收条件、不写设计。真正的 feature 切分是下一层的事。

10.3 Feature 层:切成可独立交付的纵向切片

选定一个 Epic(或需求本来就不大、直接从这里开始)后,运行 /td-feature-discovery 把它切成 feature。它先判断这坨是一个、多个,还是太模糊:

single 和 foggy 都不产文件;只有 multi 才写一张 feature 菜单。需求本来清楚时,不因为流程”应该”切分就硬切。

纵切,不要横切

这是整个分解里最常做错、也最值得讲清的一条。

一个 feature 必须是纵向切片:用户能感知的一个结果,端到端穿过它需要的所有层。只上这一个 feature,用户就能多做到或多看到一件事。

反过来,按技术层切是横切,是反模式。“数据层""接口层""页面层""后端”——这些单独拿出来,用户什么也感知不到,也没法独立验证它带来了什么价值。如果你发现自己在用一个技术层给 feature 命名,那就是在横切,停下来,改成”用户能做什么”重新切。

判断一个候选 feature 是不是纵切,用一句话试金:“只上这一片之后,用户能多做到或多看到什么?” 如果诚实的回答是”还看不到什么,这是给后面打的地基”,那它就是横切,应该并进第一个真正用到它的纵向 feature,而不是单独成为一个 feature。

场景对比(中性化)。 一个把文档内容渲染成可浏览网站的应用,第一期要做”内容能展示、能按状态发布、读起来顺、能在条目间跳转”。

横切的切法(错):切成”数据模型层 / 渲染层 / 样式层”三块。每一块单独交付,用户都看不到任何可用的东西——数据层做完,屏幕上什么都没有。这三块是技术分层,不是 feature。

纵切的切法(对):切成”能打开并读到一篇内容 / 发布状态真正生效(草稿不出现、已发布可见)/ 读起来是规整的阅读排版 / 条目之间能导航”。每一片上线后,用户都能实实在在多做到一件事;而且第一片(能读到一篇)天然是其余几片的共享地基,排在最前。

同一坨需求,横切出”三个技术层”,纵切出”四个用户能用的结果”。数量相近,性质完全不同:前者没有一片能独立交付价值,后者每片都能。

切出来的每个 feature 要有:面向能力的名字(不是层的名字)、一句话意图、范围边界(哪些在内、哪些挪给兄弟片)、依赖关系。把多个片共用的底层能力挑出来、作为最早交付的那一片,避免每片各搭一遍地基——但只在共享需求真实存在时才这么做,不要为了有个”地基片”而硬造一个。

粒度:太大沿用户旅程再切,不要切回层

10.4 切完之后:怎么接上后面的流程

/td-feature-discovery 的 multi 结果是一张薄菜单,每个 feature 带两样接下去要用的东西:一句可以直接喂给 /specify 的草稿,和一个清晰度判断。

挑一个 feature,照它的清晰度走:

这句草稿是初稿、起点,不是终稿。需求本就不清晰时,grill 正是用来打磨它的——所以不清晰的 feature 不要跳过 grill 直接 specify。打磨过程中产生的、需要长期保留的术语和决策,写进术语表或 ADR。

还有两件事决定要不要先绕一下:是否值得投入尚未决定时,先走 /speckit.assess 评估,得到放行再往下;是否先做一层轻架构或 UX 草图,由改动的性质决定——交互密集、信息架构还没谱的 feature,先定设计再 specify 更稳。

接的时候守两条:一次一个 feature,不要把整张菜单一起丢给 specify;按依赖顺序,先做被别人依赖的地基片。每个 feature 各自走一遍下一章的定档与交付流程。

命令名注意:菜单里写 /specify,实际项目里 spec-kit 命令通常带前缀(如 /speckit.specify)。按你项目里的实际命令名用。

10.5 分解不替后面的步骤做决定

分解只回答”这坨是几个可交付单元、各自边界在哪、谁先谁后”。它不澄清领域细节(那是 grill)、不判断值不值得做(那是 assess)、不决定每个单元走多重的流程(那是下一章的任务分档)、不拆实现任务(那是 spec-kit 的 tasks)。

把这些下游责任留在下游,分解这一步才能保持薄和快。切出来的是一张”接下来一个一个做什么”的地图,不是设计文档。一张画过头的地图——提前写进验收条件、实现方案、任务清单——反而会在后面真正做每个 feature 时变成要不断返工的噪声。

本章小结

分解是把一坨需求按规模分层切成可交付单元:大的先用 /td-epic-discovery 分成面向用户的 Epic(分组容器,不可直接开发,人选分组轴),每个 Epic 再用 /td-feature-discovery 切成 feature。feature 必须是纵向切片——用户能感知的端到端结果,不是技术层;判断就问”只上这片用户能多做什么”。切出的每个 feature 带一句 specify 草稿和清晰度判断:清晰的直接 specify,不清晰的先 grill,一次一个、按依赖顺序接上后面的流程。Epic 层是选择性的,需求不大就跳过——分解覆盖的是能力,不是每次都走全程。

参考与出处