把技术债和新需求放进同一张代价对照表,是让取舍可被讨论的前提。做法不是给两者各打一个模糊的“重要性”分数,而是分别列出:如果现在不做,接下来一到两个迭代里会发生什么具体动作、由谁承担、代价何时显现。只有代价被写成可观察的事件,团队才能判断哪一边更值得先投入。
技术债的代价通常不是立刻爆发,而是以摩擦的形式累积:改一处要动三处、发布前需要人工核对、故障排查时间变长。新需求的代价则相反,它往往在当下就可见——错过窗口、客户等待、销售无法承诺。两者放在一起比较时,容易犯的错误是拿“技术债的远期风险”去对“新需求的近期压力”,结论自然偏向新需求。
更可比较的写法是统一时间尺度。假设团队以两周为一个迭代,那么技术债也要回答:如果不处理,这个迭代内会多出哪些具体动作?例如某段逻辑重复出现在三个页面,每次改动都要同步修改,那么下一次需求变更时就会多出两次同步修改的工作量。这个工作量可以被估算,而不是停留在“以后会很难维护”。
面对同一块技术债,团队实际可选的动作不止“做”或“不做”,常见的是三种:保留现状、局部改写、退出当前实现。它们成立的前提不同。
三种动作没有通用优先级。判断依据是:这块债在接下来的需求里被触碰的频率,以及触碰一次的平均代价。频率高、单次代价大,改写的理由就强;频率低,保留并记录触发条件更合理。
要让讨论不陷入“技术重要还是业务重要”,可以把两边的代价写成同一组条目:需要投入的人天、影响的范围、如果推迟会阻塞哪些具体动作、最晚可推迟到什么时候。这里的关键是“阻塞哪些具体动作”——它把抽象风险翻译成可验证的事件。
假设一个场景:某列表页的筛选逻辑由三段重复代码拼成,下一次需求要新增一个筛选维度。选项一是先合并这三段逻辑再新增,选项二是直接加第四段。前者的代价是本次多花时间但后续每次改动只动一处;后者的代价是本次快,但下次同类需求仍要重复处理。这里的比较依据不是“代码整洁”,而是“未来同类需求的触碰频率”。如果筛选维度预计还会持续增加,合并的代价就更值得先付;如果这已是最后一个维度,直接加反而更省。
资源争夺往往不是一次决策,而是反复出现。与其排一张固定的优先级表,不如为技术债设定触发条件:当某段实现在一个迭代内被修改超过约定次数,或当某类故障重复出现,就自动进入下一次排期讨论。触发条件的好处是它不依赖某个人持续呼吁,而是由可观察的事实推动。
对应的动作是:在需求评审时,把“本次是否触碰已知技术债”作为一个固定检查项。如果触碰了,就当场记录这块债的本次额外代价,并判断是否达到触发条件。这个动作的结果会直接影响下一步——达到条件就进入排期,未达到就继续保留并更新记录。它不保证技术债一定被处理,但保证它不会因为没人提而永远沉底。
一种偏差是只呈现技术债的代价,不呈现推迟新需求的代价。新需求的代价同样需要写清楚:推迟一个迭代会影响谁、是否可逆、是否有替代方案。另一种偏差是把技术债的代价写成“将来会拖慢所有需求”,这种说法无法比较,因为它没有边界。
可操作的做法是限定范围:只描述这块债影响到的具体模块、具体动作和具体频率。范围越窄,代价越可信,也越容易和其他选项放在一起判断。
最后,代价比较的结论应当允许“暂时不做决定”。如果两边代价都不足以形成明显差异,保留现状并设定复查时间点,比强行排序更诚实。复查时间点本身就是一个动作,它决定了下一次讨论何时发生,也决定了这次取舍是否真的被跟进。