架构团队最常遇到的困境不是"没有需求",而是需求太多、每个都紧急、每个都重要。产品要新功能,运维要稳定性,安全要合规,基础设施要升级——所有倡议挤在一起,谁先谁后全靠嗓门大小。Tech Roadmap Prioritization(TRP)就是为解决这个问题设计的:一小时、一张矩阵、一群利益相关方,产出一份可执行的架构 backlog。
矩阵的核心逻辑:成本 × 影响
TRP 的关键动作是把每条倡议放在一张二维矩阵上:
- 横轴:成本——人力、时间、风险、对现有系统的侵入程度。越高越靠右。
- 纵轴:影响——对业务指标、用户体验、系统健康度的正面贡献。越高越靠上。
放完之后,矩阵自然分成四个象限:
| 象限 | 特征 | 处置策略 |
|---|---|---|
| 低成本 × 高影响 | 快赢 | 立即排进下个迭代 |
| 高成本 × 高影响 | 大赌注 | 拆分阶段,逐步推进 |
| 低成本 × 低影响 | 填缝 | 有空再做,不占主线 |
| 高成本 × 低影响 | 避坑 | 明确拒绝或无限期搁置 |
这个分类并不新鲜,但 TRP 的价值在于让所有利益相关方在同一张图上当面落点。当产品经理看到自己提的需求落在"高成本 × 低影响"象限,而运维提的日志平台改造落在"快赢"区,讨论就不再是"谁更紧急",而是"数据怎么摆的"。
一小时会议怎么跑
整场会议分四个阶段,严格控时:
0–15 分钟:列出倡议清单
会前准备一份候选清单(来自架构评审、技术债务盘点、业务需求池)。会上快速通读,允许补充遗漏项,但不展开讨论细节。目标是拿到 8–15 条待排项。
15–40 分钟:逐条落点
每条倡议由提出者用一句话说明成本和影响的判断依据,然后所有人投票决定它在矩阵上的位置。可以用贴纸、白板,也可以用在线协作工具。关键是不允许辩论超过两分钟——位置有争议就先放中间,会后微调。
40–55 分钟:读图与分组
看整张矩阵,识别: - 快赢区有几条?能不能合并进同一个迭代? - 大赌注区的那几条,能不能拆成第一阶段(低成本)+ 第二阶段(高成本)的递进方案? - 避坑区的倡议,是否需要正式记录"为什么不做"?
55–60 分钟:确认 backlog 顺序
把快赢区项目按影响从高到低排序,作为 backlog 前几项;大赌注区项目写进路线图后续阶段;避坑区项目标记为"已评估-暂不推进"。拍照存档矩阵图,会后发全员邮件。
实践:用 Python 生成 TRP 矩阵图
白板贴纸很好,但远程团队需要数字化工具。下面是一个可以直接运行的 Python 脚本,用 matplotlib 把倡议清单画成 TRP 矩阵。改 initiatives 列表里的名字和坐标就能复用。
#!/usr/bin/env python3
"""Tech Roadmap Prioritization (TRP) 矩阵生成器"""
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
# ---- 改这里:倡议名称 + (成本, 影响) 坐标 ----
# 成本: 1-5 (1=极低, 5=极高)
# 影响: 1-5 (1=极低, 5=极高)
initiatives = [
("统一日志平台", (1.5, 4.5)),
("API 网关升级", (2, 4)),
("支付微服务拆分", (4.5, 4.5)),
("数据湖迁移", (4.5, 3.5)),
("内部工具 UI 重写", (3, 2)),
("旧版 SDK 兼容", (4, 1.5)),
("CI 流水线加速", (1, 3.5)),
("灰度发布框架", (2.5, 4)),
]
# ---- 画图 ----
fig, ax = plt.subplots(figsize=(10, 8))
# 象限背景色
colors = {
"快赢": "#d4edda", # 绿 - 低成本高影响
"大赌注": "#fff3cd", # 黄 - 高成本高影响
"填缝": "#d6d8db", # 灰 - 低成本低影响
"避坑": "#f8d7da", # 红 - 高成本低影响
}
mid = 3 # 成本/影响的分界线
ax.add_patch(mpatches.FancyBboxPatch((0, mid), mid, 5-mid,
boxstyle="round,pad=0.02", fc=colors["快赢"], alpha=0.4))
ax.add_patch(mpatches.FancyBboxPatch((mid, mid), 5-mid, 5-mid,
boxstyle="round,pad=0.02", fc=colors["大赌注"], alpha=0.4))
ax.add_patch(mpatches.FancyBboxPatch((0, 0), mid, mid,
boxstyle="round,pad=0.02", fc=colors["填缝"], alpha=0.4))
ax.add_patch(mpatches.FancyBboxPatch((mid, 0), 5-mid, mid,
boxstyle="round,pad=0.02", fc=colors["避坑"], alpha=0.4))
# 象限标签
ax.text(1.5, 4.7, "快赢", fontsize=14, ha="center", fontweight="bold", color="#155724")
ax.text(4, 4.7, "大赌注", fontsize=14, ha="center", fontweight="bold", color="#856404")
ax.text(1.5, 1.3, "填缝", fontsize=14, ha="center", fontweight="bold", color="#383d41")
ax.text(4, 1.3, "避坑", fontsize=14, ha="center", fontweight="bold", color="#721c24")
# 画倡议点
for name, (cost, impact) in initiatives:
ax.plot(cost, impact, "o", markersize=10, color="#2c3e50", zorder=5)
ax.annotate(name, (cost, impact),
textcoords="offset points", xytext=(8, 8),
fontsize=10, color="#2c3e50")
ax.set_xlim(0, 5)
ax.set_ylim(0, 5)
ax.set_xlabel("成本 →", fontsize=12)
ax.set_ylabel("影响 →", fontsize=12)
ax.set_title("Tech Roadmap Prioritization 矩阵", fontsize=16, fontweight="bold")
ax.set_xticks([0, mid, 5])
ax.set_xticklabels(["低", "中", "高"])
ax.set_yticks([0, mid, 5])
ax.set_yticklabels(["低", "中", "高"])
plt.tight_layout()
plt.savefig("trp_matrix.png", dpi=150)
print("✅ 矩阵已保存为 trp_matrix.png")
运行前安装依赖:
pip install matplotlib
python trp_matrix.py
生成的图会清晰标注四个象限和每条倡议的位置。会后把这张图贴到 Confluence 或飞书文档里,比一张模糊的白板照片好用得多。
把矩阵变成可执行 backlog
矩阵只是可视化,最终要落地为 backlog 条目。一个实用的做法是用 Markdown 或 YAML 把结果结构化,方便导入 Jira、Linear 或自建的项目管理系统。
下面是一个 YAML 模板,直接对应矩阵产出的分组结果:
# trp_backlog.yaml — TRP 会议产出
date: "2024-06-15"
participants: ["架构组-张三", "产品-李四", "运维-王五", "安全-赵六"]
quick_wins: # 低成本 × 高影响 → 下1-2个迭代
- id: AW-01
title: "统一日志平台"
cost: 1.5
impact: 4.5
owner: "运维-王五"
target_iteration: "Sprint 23"
- id: AW-02
title: "CI 流水线加速"
cost: 1
impact: 3.5
owner: "架构组-张三"
target_iteration: "Sprint 23"
big_bets: # 高成本 × 高影响 → 路线图后续阶段
- id: AW-03
title: "支付微服务拆分"
cost: 4.5
impact: 4.5
owner: "架构组-张三"
phases:
- phase: 1
title: "支付读路径拆分"
cost: 2
target: "Q3"
- phase: 2
title: "支付写路径拆分"
cost: 3
target: "Q4"
- id: AW-04
title: "灰度发布框架"
cost: 2.5
impact: 4
owner: "架构组-张三"
target_iteration: "Sprint 24"
fillers: # 低成本 × 低影响 → 有空再做
- id: AW-05
title: "内部工具 UI 重写"
cost: 3
impact: 2
status: "backlog-low"
avoid: # 高成本 × 低影响 → 明确不推进
- id: AW-06
title: "旧版 SDK 兼容"
cost: 4
impact: 1.5
decision: "暂不推进,记录原因:仅3个内部系统依赖,迁移成本更低"
recorded_by: "架构组-张三"
这个文件可以:
- 用简单脚本转成 Jira issue 的批量创建 JSON;
- 直接放在 Git 仓库的 docs/ 目录下,作为架构决策记录的一部分;
- 每季度重新跑 TRP 时,对比上次 YAML 看哪些倡议位置发生了移动。
几个容易踩的坑
成本和影响的刻度不统一。 产品经理觉得"两周"是低成本,架构师觉得"涉及三个核心服务"是高成本。会前必须约定刻度标准——建议用 1–5 分制,并给每个分数写一句定义(比如成本 3 = "需要改动两个以上服务且无现成方案")。
避坑区的倡议没人愿意认领。 落在避坑区的项目也需要有人写一句"为什么不做",否则下次会议它还会冒出来。把拒绝原因写进 backlog YAML 的 decision 字段,这是 TRP 最容易被忽略却最有长期价值的产出。
大赌注区不拆阶段就排不进迭代。 "数据湖迁移"成本 4.5、影响 3.5,如果整体排进一个季度,其他所有工作都要停。拆成"先搭管道读路径(成本 2)"和"再迁移写路径(成本 2.5)"两个阶段,第一阶段就能排进快赢区附近,启动阻力大幅降低。
落地检查清单
下次跑 TRP 之前,对照这几条:
- ✅ 倡议清单是否提前发给了所有参会人(至少提前一天)?
- ✅ 成本和影响的 1–5 分制定义是否写在会议邀请里?
- ✅ 是否准备了白板/贴纸或在线协作链接?
- ✅ 是否指定了计时员,确保每条倡议讨论不超过两分钟?
- ✅ 会后是否有人负责把矩阵图和 backlog YAML 发到全员可见的位置?
- ✅ 避坑区的每条倡议是否都写了"暂不推进"的原因?
TRP 不解决"哪个需求更重要"的终极哲学问题,但它让争论从"我觉得"变成"我们一起在图上看到了"。一小时换来一张所有人签字的路线图,比三周邮件拉锯划算得多。