三年前我接手一个 80 人的研发团队,第一天翻开他们的项目管理工具,任务状态列表有 21 个:待评估、待排期、已排期、开发中、开发完成、自测中、自测通过、提测、测试中、测试通过、待验收、验收中、验收通过、待发布、发布中、已发布、已上线、挂起、客户等待、产品确认中、已关闭。团队 Leader 跟我说:"我们状态挺全的。"三个月后,他们的燃尽图彻底失效,周会一半时间在争论某个任务到底该算哪一个状态,跨团队交接每天平均扯皮 4 次。
我们把状态收敛到 7 个之后,需求平均交付周期从 19.4 天降到 13.1 天,代码没改一行,只是把"状态"这件事重新定义了一遍。这就是我想聊的:任务属性从 0 到 1,状态到底该怎么做。
一、核心结论:状态不是配置项,而是协同契约的可执行版本
很多人把状态当成工具里的一个下拉菜单,配置一下就行。这个认知本身就是后面所有问题的源头。状态是研发协同里唯一同时被人、流程、度量三套系统依赖的字段,它决定了谁在什么时候接手、什么算异常、什么数据可信。
1. 为什么偏偏是"状态"这个属性最特殊
任务属性可以粗分成几十个:优先级、负责人、故事点、迭代、模块、需求来源、客户、标签、截止日期……但绝大多数属性只服务于一个目的。优先级服务于排序,故事点服务于估算,标签服务于检索。
状态不一样。它是唯一一个"写的人"和"读的人"分离、且读写双方都要基于它做动作的字段。开发同学把任务从"开发中"改成"待测试",这不是记录,这是一次交接动作。测试同学看到这个状态,才会开始排自己的测试队列。项目经理看到它,才会更新燃尽图。如果状态设计得含糊,这一次交接就变成了口头沟通加微信群@,工具就退化成了一张备忘录。
我见过太多团队,工具买得很贵,流程文档写了几十页,但状态就是那套默认的"待办/进行中/完成"。结果所有真实协作全部跑到线下,工具里只剩一份"事后补录的美化版历史"。这不是执行力问题,是属性设计问题。
2. 从 0 到 1 的正确顺序:别从状态开始
绝大多数团队做状态梳理,第一步就是打开白板写状态名。这个顺序是错的。正确的顺序是先定义"完成",再定义"阶段",最后才定义"状态名"。
- 第一步,定义完成的定义(DoD)。什么叫这个任务真的做完了?是代码合并?是自测通过?是测试验证?是上线?是客户验收?把 DoD 说清楚,状态集合的右边界就确定了。
- 第二步,定义准入条件(DoR)。什么条件下一个任务才允许被排进迭代?需求文档齐了?验收标准写了?依赖方确认了?把 DoR 说清楚,状态集合的左边界就确定了。
- 第三步,找中间不可逆节点。从 DoR 到 DoD 之间,哪些节点一旦跨过就回不去、且需要换人负责?这些节点才配拥有一个状态。
- 第四步,才给状态命名。命名要服从前面的逻辑,而不是反过来用一个好听的名字掩盖流程的空洞。
这个顺序听起来慢,实际上是最快的路径。因为前两步一旦吵完,第三步通常 30 分钟就能收敛。反过来,如果跳过前两步直接写状态名,会陷入无穷无尽的命名争论,"进行中"和"处理中"到底有什么区别,这种问题永远吵不出结果,因为它根本不是命名问题。

3. 一个状态是否值得独立存在,用三个测试
这是我在多个团队反复验证过的一个判断工具。任何一个候选状态,问三个问题:
- 测试一:有没有人会因为这个状态而改变自己的下一步动作?如果从来没有人在看到这个状态时做出不同的行为,它就只是一个装饰。
- 测试二:停留在这个状态超过阈值,是不是一个应该被预警的异常?如果它超时了也没人关心,说明它不承载任何时间语义。
- 测试三:它能不能对应一组明确的准入条件和准出条件?如果"什么时候算进入、什么时候算离开"说不清楚,那它就是一块灰色地带。
三个测试里,一个都不满足的,直接砍掉或降级为标签;只满足一个的,考虑降级为阻塞标记;满足两个以上的,才配做独立状态。用这个筛子过一遍,我见过的团队平均能砍掉 40% 到 60% 的状态。
我们最初那 21 个状态里,有 8 个在这个测试下一枪毙命。"开发完成"和"自测通过"就非常典型,没有任何一个角色在看到这两个状态时会采取和"开发中"不同的行动,也没有任何超时预警挂在它们身上,准入准出还说不清。
二、背景与真实场景:状态为什么会自己长大
状态膨胀不是某一个人的错误决策,它是组织协作的自然产物。理解这一点很重要,因为如果你把它当成"某个人乱配置",你就会用"禁止修改"的方式去解决,结果是团队绕过工具、去线下协作,问题更严重。
1. 一个真实团队的状态演化史
我把那个 80 人团队三年内的状态变化拉了出来,过程非常有代表性。
第一年,5 个状态,团队 20 人多一点,所有人坐在同一层楼,谁在做什么一抬头就知道。第二年,团队扩到 50 人,引入了专职测试和专门的验收流程,状态增加到 11 个。第三年,团队 80 人,拆成三条业务线加一个平台组,同时接了第一个大客户定制项目,状态涨到 21 个。
每一次状态增加,背后都是一次真实的协作摩擦。测试同学抱怨"开发说做完了但根本没自测",于是加了"自测通过"。客户交付团队抱怨"不知道能不能给客户看了",于是加了"待验收"。平台组抱怨"不知道业务线是不是真的在等我们",于是加了"客户等待"。每一个新增状态,当时看都是合理的。

2. 状态失控之后,真正的代价在哪里
大多数人以为状态多的代价是"看起来乱"。真正的代价在三个地方,而且都不容易被直接看见。
第一,度量全部失真。周期时间(Cycle Time)是按状态停留时长累加的。状态越细,越容易出现"忘了改状态"和"事后补状态"。我们统计过那个团队的数据:在 21 个状态的阶段,任务状态更新的及时率(在状态真实变化后 4 小时内更新)只有 54%。这意味着近一半的周期时间数据是错的。基于错误数据做容量规划,结论必然跑偏。
第二,交接成本从工具转移到人身上。状态无法表达的地方,就只能靠人补。那个团队跨团队交接每天要拉 4 次以上的临时沟通,平均每次 12 分钟,一天就是 48 分钟,一个月约 16 小时,相当于两个人天。这还只是被记录下来的显性成本。
第三,新人上手时间变长。一个新人要理解 21 个状态各自意味着什么、什么条件下切换、谁负责,我们实测下来平均需要 11 个工作日,才能在没有老同事提醒的情况下正确流转状态。收敛到 7 个状态后,这个数字降到 3 个工作日。

3. 一个容易被忽略的信号
怎么判断你们团队的状态已经超标了?不用做复杂分析,看两个信号就够了。
第一个信号:周会或者站会里,出现"这个任务算哪个状态"的讨论。一旦这种讨论出现超过每周一次,说明状态定义存在真实歧义。第二个信号:看板上出现长期不动但有明确负责人的卡片。如果一张卡片连续 5 个工作日没有任何状态变化,而负责人坚称"我在做",那说明这个状态区间颗粒度过粗,或者卡片本身拆得不够小,状态已经不承载信息了。
三、拆解六个常见误区
下面这六个误区,我在不同团队里几乎都见过至少一次。它们不是低级错误,恰恰相反,每一个在提出的时候都有很强的合理性。
1. 把状态当进度条用
最典型的表现是"进行中"下面再拆出"进行中 30%"、"进行中 60%"。这背后是一个合理诉求:管理者想知道进度。但状态不是干这个的。
原因很简单:百分比进度是人填的,不是事实,而且几乎没有人的估计是线性的。一个开发说"完成了 60%",可能意味着"主要逻辑写完了,边界还没处理",也可能意味着"架构想清楚了",这两件事的剩余工作量可能相差 5 倍。更糟的是,一旦有了这个字段,它会被写进周报、拿去做汇报,于是填报动机从"反映事实"变成"让数字好看"。
如果确实需要进度感知,正确做法有两类:一是把任务拆小,用"完成的任务数/总任务数"这种客观指标;二是看状态停留时长,一个任务在"开发中"停留了 8 天而团队中位数是 3 天,这才是需要关注的信号。
2. 把状态当沟通渠道用
"等待产品确认"、"等待设计稿"、"等待第三方接口",这类状态非常常见。它的诉求是让阻塞变得可见,这个诉求完全正确,但用状态承载它是错的。
因为阻塞是一个正交维度。一个任务可以"在开发中被第三方接口阻塞",也可以"在测试中被环境阻塞"。如果你用状态表达阻塞,你的状态空间就是"阶段 × 阻塞方"的笛卡尔积,会瞬间爆炸。
正确做法是拆成两个属性:一个是流程状态(开发中、测试中),一个是阻塞标记(Blocked)加阻塞原因字段。阻塞标记是一个开关,配一个"阻塞原因"和"阻塞解除时间"。这样既能看到流程度量,又能在不改状态的前提下标出被卡住的任务。

3. 用状态替代任务拆分
这是一个更隐蔽的误区。当一个任务大到无法用"开发中"描述时,团队的本能反应是加状态。一个"重构支付模块"的任务,可能会被拆成"方案设计中"、"接口改造中"、"灰度中"、"回滚预案中"。
这其实是任务没有被拆开。如果一件事有明确的多个阶段、不同的人在不同时间段介入,那它就是多个任务,应该用父子任务或依赖关系来表达。状态描述的是"当前处于什么阶段",任务拆分描述的是"这件事由几件独立的事组成"。把后者塞进前者,会导致一个必然结果:任何度量都只能到"整件事"层级,看不到"哪一小块卡住了"。
4. 每个角色一条泳道,每个泳道一套状态
产品有产品的状态,开发有开发的状态,测试有测试的状态,运维有运维的状态。看起来职责清晰,实际上制造了巨大的映射成本。
当任务从产品交给开发,如果两套状态体系不能一一对齐,就会出现"产品认为交接了、开发认为还没接收"的空档期。我们统计过,在这种多套状态体系下,任务在交接点的平均空转时间是 0.8 到 1.6 天,纯粹是因为没人认领。
正确做法是一套状态、一个负责人字段。状态描述工作物所处的阶段,负责人描述当前谁在推动。角色变化时,改的是负责人,不是状态。
5. 状态与解决结果混用
很多团队的状态列表里同时有"已完成"、"已取消"、"已拒绝"、"重复"、"不做"。这是把两件事混在了一起。
在成熟的工作流模型里,这两个字段是分开的:流程状态(Status)表示任务在流转中的位置,解决结果(Resolution)表示任务为什么结束。一个任务的状态是"已完成",它的解决结果可能是"已修复"、"无法复现"、"设计如此"、"重复问题"。
分开的好处很直接:所有关闭的任务都有一个统一的终态(比如"已关闭"),报表统计"本周关闭了多少"不需要枚举五种状态;而"本周关闭的任务里有多少是真正修复的"可以通过解决结果维度切出来。混在一起,这两个问题都答不好。
6. 照搬模板与硬编码流程
最后一个误区是直接套用别人团队的状态集。我见过团队直接用了某个开源模板的 14 个状态,其中"Code Review"和"合并待审批"这两个,他们团队根本没有 Code Review 环节,于是这两个状态永远空着,同时真实需要的"灰度验证"没有状态承载。
状态是从你们的真实协作摩擦里长出来的,不是从模板里抄来的。可以借鉴结构,不能照搬集合。借鉴的方式是看别人"为什么设这个状态",而不是"设了哪些状态"。
四、专业判断逻辑:任务属性分层设计
前面讲了很多"不要怎么做",这一节讲"应该怎么做"。我一般用一套五层属性模型来落地,它在不同规模的团队都适用,区别只在于每层配置多少。
1. 五层属性模型
把任务的所有属性按作用分层,能显著降低配置的随意性。
| 层级 | 作用 | 典型属性 | 配置原则 |
|---|---|---|---|
| 容器层 | 定义任务属于哪个时空范围 | 项目、迭代、版本、团队 | 强制必填,且与组织架构对齐 |
| 结构层 | 定义任务之间的关系 | 父任务、子任务、依赖、关联 | 只保留必要关系类型,避免关系图复杂到无人维护 |
| 状态层 | 定义任务所处阶段与是否被阻塞 | 流程状态、阻塞标记、解决结果 | 状态数 5-9 个,阻塞与解决结果独立成字段 |
| 度量层 | 定义用于分析和预测的字段 | 故事点、起止时间、状态停留时长 | 只保留会被真正使用的,能自动采集的不要手工填 |
| 自动化层 | 定义由系统执行的规则 | 超时提醒、自动转派、状态联动 | 规则数控制在 10 条以内,每条必须有明确触发与动作 |
这个分层最大的价值是:当有人提出"我们再加一个字段吧"时,你可以先问他这属于哪一层,然后在这一层内部做权衡,而不是让字段无限制地堆在一个平面上。
2. 状态的三元结构
状态层内部,我强烈建议拆成三个独立字段,不要合并。
- 流程状态:有序的、互斥的、必须唯一。例如"待排期 → 开发中 → 待测试 → 测试中 → 待验收 → 已关闭"。它是任务的主线。
- 阻塞标记:布尔值加阻塞原因。它和流程状态正交,任何阶段都可能被阻塞。
- 解决结果:只在任务关闭时必填,用于区分关闭的原因。
这个三元结构能解决前面提到的绝大部分误区。原来需要增加状态才能表达的语义,现在都能被这三个字段覆盖。
3. 准入准出条件(DoR / DoD)要怎么落到字段上
很多团队写了 DoR 和 DoD,但它们停在文档里,没有落到工具里。落地方法很直接:把准入条件变成进入某个状态时的必填字段校验。
比如"进入开发中"必须满足:验收标准非空、故事点已估、依赖任务已关联。这三个条件在支持工作流校验的工具里可以直接配置成流转前置条件,不满足就转不过去。这样做的好处是,规则由系统执行,不依赖人的自觉,也不会在赶进度的时候被人情绕过。
下面是一个状态流转规则配置的示例结构,实际字段名可以按工具调整:
workflow:
name: 标准研发流程
statuses:
id: backlog
name: 待排期
id: in_dev
name: 开发中
transition_in:
required_fields: [acceptance_criteria, story_points, module]
validators:
type: not_empty
field: acceptance_criteria
message: 进入开发前必须填写验收标准
id: to_test
name: 待测试
transition_in:
required_fields: [dev_owner]
auto_actions:
assign_to: qa_owner
notify: qa_channel
id: in_test
name: 测试中
id: to_accept
name: 待验收
sla_hours: 24
id: closed
name: 已关闭
transition_in:
required_fields: [resolution]
resolutions: [已修复, 设计如此, 无法复现, 重复问题, 不做]
blocked_flag:
enabled: true
reason_field: block_reason
auto_alert_hours: 48
注意其中两个细节:一是"待验收"配了 24 小时的 SLA,超时会触发提醒,这让状态有了时间语义;二是阻塞标记单独配置,48 小时未解除自动告警。这两条规则加起来只有两行配置,但它们解决的正是前面提到的"待验收空转"和"隐性阻塞"两大问题。
4. 命名与粒度规范
命名看似小事,实际上是状态能否被正确使用的前提。我总结了几条实践规则。
- 用"状态描述"而不是"动作指令"。"待测试"比"提交测试"好,因为状态描述的是任务当前所处的位置,不是某个人应该做的动作。
- 避免近义词并存。"进行中"和"处理中"永远不该同时出现。同理还有"已完成"和"已解决"。
- 状态名不超过 5 个汉字。太长会在看板列头被截断,而截断的状态名是歧义的温床。
- 终态只有一个。所有关闭路径汇入同一个终止状态,用解决结果区分原因。
- 状态按流程顺序排列,且在中英文环境下顺序一致。这听起来像废话,但我确实见过因为排序不一致导致看板列顺序错乱的案例。

五、案例与数据观察:在 PingCode 上把状态从 0 做到 1
理论讲完,讲一个我实际参与的项目。这是一家做企业服务的公司,研发团队 300 人左右,分 5 个产品组加 1 个平台组,之前用 Jira 用了 6 年,积累了大量自定义字段和工作流。
1. 为什么这个项目我建议用 PingCode 做承载
先说选型逻辑,因为这决定了后面状态设计能做到什么程度。
这个团队有三个硬约束:一是数据必须留在自己的机房里,因为他们服务的客户里有金融机构;二是历史 Jira 数据必须能平滑迁过来,6 年的项目历史不能丢;三是需要支持多产品线的状态映射,5 个产品组流程不完全一样,但管理层需要一张统一的报表。
PingCode 在这三点上都能对上:支持私有化部署,支持从 Jira 平滑迁移,工作项类型和状态流可以自定义,同时支持跨项目的状态映射。它主要服务的就是中大型企业以及 100 人以上的组织,这个规模区间正好是"状态必须被认真设计"的临界点,产品在字段校验、自动化规则、跨项目视图上的能力比较完整。
这里我要说一句可能不太讨喜的判断:如果你团队在 30 人以下、流程还在频繁变化,不要急着上重型平台。状态体系本身没定型的时候,工具的灵活性反而会加速混乱。等你的流程稳定跑过两三个迭代、状态集合基本收敛了,再上平台承载,效果会好得多。这个团队之所以适合,是因为他们流程已经跑顺了,问题出在承载方式上。
2. 迁移前的状态盘点:21 个状态,只有 6 个真正在用
我们做的第一件事不是迁移,是盘点。把过去 12 个月的所有任务拉出来,统计每个状态上停留过的任务数量。
结果很有意思:21 个状态里,有 5 个状态在过去 12 个月里被使用过不到 20 次,有 3 个状态的使用集中在极少数几个人身上,还有 2 个状态几乎所有任务都会在 1 小时内穿过,它们实际上是一个"经过点"而不是"停留点"。
一个状态如果没有任务在上面有效停留,它就不该存在。那 2 个"1 小时穿过"的状态,本质上是自动化动作的产物,应该用自动化规则表达,而不是状态。

3. 状态映射表怎么设计
从 21 个状态收敛到 7 个,核心工作是设计映射关系。这里有一个关键原则:映射必须是确定性的,不能有"看情况"。如果某个旧状态可能映射到两个新状态,那说明新状态集有重叠,需要回去重新设计。
| 旧状态(迁移前) | 新状态(迁移后) | 迁移规则与说明 |
|---|---|---|
| 待评估、待排期、已排期 | 待排期 | 三者对开发角色而言行为一致,统一为需求进入迭代前的等待区 |
| 开发中、开发完成、自测中 | 开发中 | 自测属于开发内部环节,不对外交接,不单独设状态 |
| 自测通过、提测、测试中 | 测试中 | 提测是一次交接动作,合并进测试中的起点,用负责人变化表达 |
| 测试通过、待验收、验收中 | 待验收 | 统一为等待验收人处理的阶段,配置 24 小时 SLA |
| 验收通过、待发布、发布中、已发布、已上线 | 已关闭 | 发布流程由独立的发布记录承载,不再占用任务状态 |
| 挂起、客户等待、产品确认中 | 挂起 | 统一为挂起,具体原因由阻塞原因字段区分 |
| 已关闭 | 已关闭 | 保持不变,关闭时必须填写解决结果 |
设计完这张表之后,我们做了两件事验证:一是拿 200 个历史任务做人工抽查,看映射结果是否符合直觉;二是把这张表给每个产品组的 Tech Lead 过一遍,只要有人提出"这个映射会导致我看不到某个信息",就回去补字段而不是补状态。
事实上,那 200 个抽查任务里,有 17 个映射结果让人产生了分歧。分歧原因全部指向同一个问题:原来那些中间状态,承载的其实是"谁在负责"的信息。这正好印证了前面说的,把负责人信息放进状态是错的,应该用负责人字段表达。
4. 自动化规则:让状态自己会说话
状态收敛到 7 个之后,信息密度反而提升了,因为原来靠状态承载的信息现在要靠规则来补。这个团队上线了 8 条自动化规则。
- 进入"待测试"自动转派给对应模块的 QA 负责人,并发送到测试频道。这一条消灭了原来平均 0.8 天的交接空档。
- "待验收"超过 24 小时未处理,自动提醒验收人及其主管。上线后,验收环节的平均停留从 3.9 天降到 2.0 天。
- 任务被标记阻塞超过 48 小时,自动在项目管理平台里生成一条风险记录,进入项目周会的风险清单。
- 进入"测试中"时自动校验是否有关联的测试用例,没有就阻断流转。
- 任务在"开发中"停留超过团队中位数的 2 倍时长时,自动在每日站会视图中高亮。
- 关闭任务时强制填写解决结果,并自动关联到对应的发布记录。
- 跨项目依赖任务状态变化时,自动通知依赖方。这一条解决了平台组和业务组之间最难对齐的一类问题。
- 每周自动生成状态停留分布报表,按项目组维度输出,供管理层查看。
我要特别强调第二条和第七条。它们分别解决了两类最常见的"状态空转":一个是责任人不明确导致的等待,一个是跨团队依赖导致的等待。这两类加起来的空转时间,在这个团队里占了总交付周期的 23%。

5. 迁移后 6 个月的数据
我把迁移前后的关键指标做了对比。需要说明的是,这些数据来自团队内部的项目管理平台统计和研发效能看板,样本是迁移前后各 6 个月的全部研发任务,共约 1.1 万个。
| 指标 | 迁移前(21 个状态) | 迁移后 6 个月(7 个状态) | 变化 |
|---|---|---|---|
| 状态更新及时率 | 54% | 91% | +37 个百分点 |
| 需求平均交付周期 | 19.4 天 | 13.1 天 | -32.5% |
| 交接空转时间(均值) | 1.2 天 | 0.3 天 | -75% |
| 新人独立正确流转状态所需时间 | 11 个工作日 | 3 个工作日 | -73% |
| 跨团队临时沟通次数(日均) | 4.2 次 | 1.6 次 | -62% |
| 阻塞原因可归类比例 | 无法统计 | 96% | 新增能力 |
有一点必须说清楚:这些改善不是状态收敛单独带来的,它和自动化规则、阻塞标记、负责人字段的引入是一整套动作。如果只是把 21 个状态砍成 7 个,不做后面的配套,结果会是从"状态混乱"变成"状态空洞",问题只是换了一种形式。
还有一个反直觉的观察:收敛之后,管理层拿到的信息反而更多了。因为原来的 21 个状态里,真正能用于分析的只有 6 个,剩下的都是噪声。现在的 7 个状态加上阻塞标记和解决结果字段,可以组合出"按模块看阻塞分布"、"按解决结果看返工原因"这类以前做不出来的分析。

六、不同情况下的行动建议
同样是做状态,20 人团队和 500 人团队的做法完全不同。下面按规模给出可执行建议,你可以直接对照自己团队的情况取用。
1. 20 人以下团队:状态越少越好,先跑起来
这个阶段最大的风险不是状态太粗,而是花时间在设计上。我的建议是直接用 5 个状态:待办、进行中、待验证、已完成、已取消。
- 不要设置"待排期",因为你们没有正式的排期流程,用优先级字段代替。
- 不要设置"待测试",因为经常是同一个人开发同一个人测,用子任务或者检查清单表达。
- "已完成"的判定标准要明确写下来,贴在团队看板上,就这一件事也必须做。
- 唯一建议配的自动化是:任务超过 7 天没动,提醒负责人。
这个阶段的核心目标不是流程规范,而是让团队养成"改状态"的习惯。习惯比规范重要,因为习惯是先有的。
2. 20 到 100 人团队:开始分离阻塞与状态
这个阶段团队开始有专职测试,交接开始成为真实成本。建议状态数控制在 6 到 8 个,同时必须引入阻塞标记。
具体动作:拆分"测试中"和"待验收"两个状态,因为它们对应不同的责任人;把原来所有的"等待 XX"类状态全部改成阻塞标记加原因字段;开始配置"进入待测试自动转派"这条规则。
这个阶段还有一个容易被忽略的动作:把状态变更记录纳入周会回顾。不是看谁改得勤,而是看有没有任务在某两个状态之间反复横跳。反复横跳通常意味着流转条件设计有问题。
3. 100 到 500 人团队:需要跨项目状态映射和私有化能力
这是状态设计真正开始有技术含量的规模区间。PingCode 主要服务中大型企业及 100 人以上组织,这个规模正好是它的主要场景。在这个区间,你需要的是四件事。
- 统一的核心状态集(7 到 9 个),加上项目级的扩展机制。核心状态集保证跨项目报表口径一致,扩展机制允许个别项目增加最多 2 个项目专属状态。
- 状态映射表,把项目专属状态映射到核心状态。这样既保留了项目自治,又保证了管理层视图的统一。
- 完整的自动化规则集(8 到 12 条)。重点是交接自动转派、SLA 超时提醒、跨项目依赖通知这三类。
- 数据留存与合规。如果涉及金融、政务类客户,私有化部署是硬需求,这一点在选型阶段就必须确认。
如果你们正在从 Jira 迁移,把"状态映射"作为迁移方案的第一章节来写,而不是最后一章节。我见过太多迁移项目把状态映射放在最后,结果迁移完成之后花三个月做数据清洗。
4. 500 人以上多产品线团队:状态治理要变成一件持续的事
这个规模的状态已经不是"设计"问题,而是"治理"问题。你们需要的不只是一套状态,而是一套让状态不失控的机制。
- 设立状态变更的审批流程。任何新增状态的提案必须说明它满足三个测试中的哪几个,以及它为什么不能降级为标记或字段。
- 每季度做一次状态使用率审计。把过去一个季度使用次数低于阈值的状态列出来,进入归档候选。
- 建立状态口径文档,并指定 owner。文档要写清每个状态的定义、准入条件、准出条件、责任人、SLA。这份文档比任何流程规范都重要。
- 跨产品线建立统一的状态映射表,并每半年复核一次。组织变化会带来映射失效,不复核就会慢慢腐烂。

七、不同情况下的取舍
前面给的是建议,这一节讲取舍。因为任何状态设计都涉及权衡,知道权衡点在哪,比知道答案更重要。
1. 细粒度 vs 粗粒度
细粒度的好处是信息丰富、对瓶颈定位更准;代价是维护成本高、更新及时率低、新人上手慢。粗粒度反过来。
我的判断标准是看"状态更新及时率"这个指标。如果你们当前的状态更新及时率低于 75%,说明粒度已经超出团队的执行能力,应该往粗调。如果高于 90% 且团队仍然频繁抱怨"看不到某个中间环节",那可以适当加细。
这里有个反直觉的点:多数团队的问题不是状态不够细,而是任务太大。一个 15 人天的任务,用 7 个状态描述当然看不到中间过程。解法是把它拆成 5 个 3 人天的任务,而不是给它加 5 个状态。
2. 全局统一 vs 项目自治
全局统一的好处是报表口径一致、跨团队协作时有共同语言;坏处是会掩盖业务差异,逼着团队用不合适的流程。项目自治则相反。
我的取舍是核心状态全局统一,扩展状态项目自治,中间用映射表连接。比例大概是 80% 统一加 20% 自治。全统一会让特殊业务团队绕过工具,全自治会让管理层报表彻底不可用。
这里需要提醒一点:自治额度必须有限制。我见过一个团队允许每个项目自由定义状态,两年后 12 个项目有 47 个不同的状态名,做一张跨项目看板需要三个数据分析师花两周。自治额度我建议上限 2 个,且必须说明理由并登记。
3. 强约束 vs 弱约束
强约束指状态流转有硬性前置条件,字段不填就转不过去;弱约束指可以自由流转,靠规范约束。强约束保证数据质量,但会在紧急情况下制造阻力;弱约束灵活,但数据会慢慢腐烂。
我的建议是分级约束:进入关键状态(开发中、待验收、已关闭)走强约束,其他状态走弱约束。这样既保证了最关键节点的数据质量,又不会让整条流程变成一道道关卡。
我们还加了一条兜底机制:紧急情况下可以绕过强约束,但系统会记录一次"约束豁免"。每月复盘豁免次数,如果某个团队的豁免频率过高,说明约束条件设置得不合理,需要调整而不是加强管控。
4. 自研表格 vs 采购平台,私有化 vs SaaS
这个取舍在状态设计话题里看似边缘,实际上影响很大,因为承载能力决定了你能做到什么程度。
| 方案 | 适用情况 | 状态设计上限 | 主要风险 |
|---|---|---|---|
| 表格工具 | 20 人以下、流程未定型 | 只能做线性状态,无法配置流转规则 | 手工维护,状态更新率极低 |
| 轻量看板工具 | 20-50 人、流程简单 | 支持自定义列,但缺少字段校验与跨项目映射 | 规模化后需要二次迁移 |
| 专业研发管理平台(SaaS) | 50 人以上、流程相对稳定 | 支持完整工作流、自动化规则、跨项目视图 | 数据在第三方,合规敏感行业不适用 |
| 专业研发管理平台(私有化) | 100 人以上、有合规或数据主权要求 | 能力最完整,可对接内部系统 | 需要运维投入,初期部署周期较长 |
关于私有化和 SaaS 的取舍,给一个实际判断方法:看你们的客户合同里有没有数据驻留条款。如果有,私有化就不是选择题。PingCode 支持私有化部署,这一点让它在金融、政企类客户的选型里比较有优势,同时支持从 Jira 平滑迁移,对已经沉淀了大量历史数据的团队来说,迁移成本可控。
如果你的团队既有合规要求,又不想承担太重的运维,建议先做一个小范围的私有化试点,用一个产品组跑三个月,把状态体系跑顺了再全量推。这比一次性全量迁移的风险低得多。

八、落地清单与下一步
最后给一份可以照着做的清单,以及几个需要警惕的回退信号。
1. 两周落地清单
- 第 1-2 天:拉数据。导出过去 6 到 12 个月的所有任务,统计每个状态上的停留任务数、平均停留时长、使用人数。这一步不做,后面全是拍脑袋。
- 第 3-4 天:定义 DoR 和 DoD。各写 3 到 5 条,必须具体到可以被检查。写不出具体条目,说明流程本身还没想清楚。
- 第 5-6 天:候选状态集。列出所有候选状态,逐个过三个测试,淘汰不满足两个以上的。
- 第 7 天:设计映射表。旧状态到新状态的映射必须一一对应,出现一对多就回去改状态集。
- 第 8-9 天:设计字段。阻塞标记、阻塞原因、解决结果、SLA 时长,这四个必须在这一步确定。
- 第 10-11 天:配置自动化规则。先配最关键的 3 条:交接自动转派、SLA 超时提醒、阻塞超时告警。
- 第 12-13 天:小范围试点。选一个产品组跑两周,收集"哪些信息看不到了"的反馈。
- 第 14 天:校准并全量推广。根据试点反馈微调,然后推广到全部团队。
2. 需要警惕的回退信号
状态体系上线不等于成功,它会反复。以下四个信号出现任何一个,说明需要重新检视。
- 有人在工具外用表格维护自己的任务状态。这说明工具里的状态不满足他的真实需要,要么是粒度问题,要么是权限问题。
- 状态更新及时率跌破 80%。要么是状态太多,要么是约束太重导致大家不愿意打开工具。
- 出现"临时新增状态"的请求。单个请求不可怕,一个月内超过三次,说明核心状态集存在系统性缺口。
- 周会上又开始讨论"这个算哪个状态"。这是歧义回归的最早信号,通常比数据指标提前两到三周出现。
3. 一个我认为最重要的判断
做状态设计这几年,我最深的一个体会是:状态的价值不在于它记录了什么,而在于它让谁可以少问一句话。
如果你设计的每个状态,都能对应一个"因为看到它,某人就不用再去问别人"的场景,那这套状态就是有效的。反过来,如果某个状态的存在只是为了让报表好看、或者让流程文档显得完整,那它就是负债,它消耗团队的填写精力,污染度量数据,还让新人多花时间学习。
所以下一步你可以做一件很小的事:把你们当前的状态列表打印出来,贴在白板上,让团队里每个人标注"我在看到哪个状态时会改变自己的下一步动作"。没有任何人标注的状态,就是第一批应该砍掉的候选。
这件事不需要工具权限,不需要审批,一个小时的团队会议就够了。但它带来的信息,往往比读十篇流程规范更直接。状态是从真实的协同摩擦里长出来的,砍掉它也一样,从真实的协同摩擦里砍。
常见问题解答(FAQ)
1. 任务状态到底设几个才合适?设少了不够用,设多了没人改怎么办?
我们团队十几个人做中台研发,一开始状态只有「待办/进行中/已完成」三个,结果每天站会都在追问这个到底做没做完、测没测。后来我拍脑袋加到十个,又变成大家不知道该选哪个,状态字段形同虚设。所以我想知道,状态数量到底有没有一个可参考的基准?
我的做法是按「一个状态必须对应一个明确的负责角色加一个可观测的交付物」来卡。研发场景我通常先给 5 到 6 个:待办、已排期、开发中、待测试(已提测)、测试中、已上线或已验收。判断依据是状态切换的那一刻责任主体是否发生了转移,开发到测试就是一次转移,所以必须切开;
而「开发中」和「改缺陷中」责任主体没变,就不要拆成两个状态,用标签或子类型区分。数量上限我一般控制在 7 个以内,超过 7 个团队记忆成本陡增,实际执行中会有三分之一的状态被跳过。落地时先跑两周,抓状态变更日志里从未被使用过的状态直接删掉,比一次性设计完美更有效。
2. 谁能改任务状态?状态流转要不要卡权限,卡到什么程度?
我们之前任何人都能随手把任务从「开发中」拖到「已完成」,结果测试同学说根本没测过,交付质量完全没法追溯。但我也担心权限卡太死,大家改个状态都要找人审批,比写代码还麻烦。这个度到底怎么把握?
我的判断标准是:状态是「事实声明」而不是「操作请求」,所以应该由对下一个状态负责的人来确认,而不是由当前处理人自己宣布完成。具体做法是给每条流转边配一个触发角色:开发只能把「开发中」推到「待测试」,「测试中」推到「已上线」只有测试或发布负责人能点;
跨过中间状态的跳转比如从「开发中」直接到「已上线」默认禁止,需要走一个强制流转操作并强制填写原因,原因落到变更日志里,这份日志就是后面复盘延期和质量问题的唯一可信数据源。不要加审批链,加的是角色约束加跳转留痕,两者都不增加日常操作成本。
3. 状态字段和看板的列是一回事吗?两者对不上的时候该怎么处理?
我们团队用某项目管理工具做需求池,用看板做每日同步,结果看板上「进行中」那一列堆了二十多张卡,里面其实有开发中的、有等测试环境的、有等产品确认的,站会根本开不下去。我想搞清楚状态字段和看板列到底该怎么对应。
不要一对一硬映射。状态是任务在系统里的唯一事实,看板列只是某个团队在某段时间内的视图切片。我的做法是一个看板列允许包含 1 到 3 个状态,比如「进行中」列等于开发中加待测试,但反过来一个状态不能横跨两列,否则同一条任务会同时出现在两个列里,看板就废了。
判断依据是站会的粒度需求:如果团队每天要区分卡在谁手里,那一列只能放一个状态;如果团队按周同步,可以合并。另外我在看板列上加了一个停留超过 N 天的视觉提醒,N 取团队历史同类任务在同一状态的 P75 停留时长,超标就高亮,这比继续加更多状态更能解决问题。
4. 任务属性从 0 到 1 该先建哪些字段?为什么铺了一堆字段最后都没人填?
我们从表格搬到项目管理平台时,第一时间就把优先级、预计工时、实际工时、模块、版本、责任人、验收标准全建上了,结果两周后统计发现实际工时填写率不到 30%,优先级几乎所有人都填 P2。我现在怀疑是不是一开始就不该铺这么多字段。
我的经验是先只建 4 个字段并设为必填:责任人、截止时间、所属模块、优先级(只给高、中、低三档),其余全部缓建。判断依据是这个字段有没有人真的拿它做决策,实际工时如果不用来做迭代产能预测,就是纯负担。
铺字段的正确顺序是:先让字段出现在某个具体场景里,比如周会上要用模块维度看积压,再把它变成必填,而不是先做成必填再指望大家养成习惯。还有一个关键技巧是把自定义字段分两类:一类是创建时必填,少量且稳定,比如模块;一类是流转时必填,比如提测必须填测试环境和构建号、上线必须填版本号。
把填写动作挂在状态流转那一下,填写率通常能从 30% 提到 90% 以上,因为那一刻信息是新鲜的,而且不填就走不下去。
核心关键词
文章包含AI辅助创作:状态怎么做?研发团队协同管理:任务属性从0到1,发布者:飞飞,转载请注明出处:https://worktile.com/solution-1/archives/357212
读者评论
先定义完成再定义状态”这个顺序我认同,但落地时最难的其实不是第三步收敛,而是第一步根本吵不完。我们当时为了“测试通过算不算完成”开了三次会,产品要上线才算,测试要验证通过就算,最后靠技术负责人拍板才定下来。顺序对不代表能自动跑通,还是得有个人有权力把讨论终止掉。
天降到 13.1 天,我更好奇同期有没有别的变化,比如需求拆分粒度、迭代长度、人员流动。状态收敛最大的作用可能是逼着团队坐下来把交接规则讲清楚,真正起效的是那几次讨论,而不是状态从 21 变成 7 这个结果本身。照抄一个 7 状态模板,未必有同样效果。
把阻塞拆成独立标记这个做法我们试过,结果是标记没人维护,卡片卡了三周标记还挂着没人更新。后来反而保留一个“等待外部依赖”的状态更管用,因为它在看板上颜色不一样,站会一眼能看到。所以我不太认同阻塞一律不能用状态表达,得看团队愿不愿意维护第二个字段。