问题优先级与机会判断矩阵
发现了十个真实问题,这不是成功,这是新的麻烦——因为资源只够做两个。优先级判断才是真正考验 PM 判断力的地方。
机会判断的双轴模型
graph LR
A["发现的问题清单"] --> B["评分维度"]
B --> C["影响力维度\n频率 × 痛感 × 用户规模"]
B --> D["可行性维度\n技术可行 × 数据可得 × 时间成本"]
C --> E["2×2 机会矩阵"]
D --> E
E --> E1["高影响 + 高可行\n→ 立即做"]
E --> E2["高影响 + 低可行\n→ 拆解后做"]
E --> E3["低影响 + 高可行\n→ 快速做或放弃"]
E --> E4["低影响 + 低可行\n→ 明确放弃"]
style E1 fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
style E4 fill:#fce4ec,stroke:#c62828,stroke-width:2px
三个评分子维度
频率(Frequency):问题多高频发生?每天遇到的问题比每月遇到一次的问题,优先级天然更高。不要被"重要但低频"的问题迷惑。
痛感(Pain):问题造成多大困扰?痛感要和用户当前的绕行方案结合看——如果绕行方案代价很高,痛感分就应该高。
绕行代价(Workaround Cost):用户没有你的产品时,他们怎么解决?这个解法越笨、越贵、越费时,说明问题空间越值得进入。
机会评分系统
from dataclasses import dataclass, field
from typing import List, Optional
from enum import Enum
class Quadrant(Enum):
DO_NOW = "立即做"
DECOMPOSE = "拆解后做"
QUICK_WIN = "快速做或放弃"
DECLINE = "明确放弃"
@dataclass
class OpportunityScore:
"""单个问题的机会评分"""
# 影响力维度(各 1-5 分)
frequency: int # 频率:1=极少 5=每天
pain_level: int # 痛感:1=轻微 5=严重阻塞
user_scale: int # 受影响用户规模:1=极少数 5=全量
workaround_cost: int # 绕行代价:1=很容易绕过 5=无法绕过
# 可行性维度(各 1-5 分)
tech_feasibility: int # 技术可行性:1=几乎不可能 5=完全可行
data_availability: int # 数据可得性:1=数据完全缺失 5=数据充足
time_cost: int # 时间成本:1=需要超长周期 5=短期可交付
strategic_fit: int # 战略契合度:1=偏离方向 5=高度契合
def impact_score(self) -> float:
return (self.frequency + self.pain_level +
self.user_scale + self.workaround_cost) / 4
def feasibility_score(self) -> float:
return (self.tech_feasibility + self.data_availability +
self.time_cost + self.strategic_fit) / 4
def composite_score(self) -> float:
# 影响力权重稍高,体现以用户价值为中心
return self.impact_score() * 0.6 + self.feasibility_score() * 0.4
def quadrant(self) -> Quadrant:
impact = self.impact_score()
feasibility = self.feasibility_score()
threshold = 3.0
if impact >= threshold and feasibility >= threshold:
return Quadrant.DO_NOW
elif impact >= threshold and feasibility < threshold:
return Quadrant.DECOMPOSE
elif impact < threshold and feasibility >= threshold:
return Quadrant.QUICK_WIN
else:
return Quadrant.DECLINE
@dataclass
class Problem:
name: str
description: str
source: str # 问题来源(如"用户访谈 U-042")
score: OpportunityScore
tags: List[str] = field(default_factory=list)
def report_line(self) -> str:
q = self.score.quadrant()
quadrant_icons = {
Quadrant.DO_NOW: "🟢",
Quadrant.DECOMPOSE: "🟡",
Quadrant.QUICK_WIN: "🔵",
Quadrant.DECLINE: "🔴",
}
icon = quadrant_icons[q]
return (
f"{icon} [{q.value}] {self.name}\n"
f" 影响力={self.score.impact_score():.1f} "
f"可行性={self.score.feasibility_score():.1f} "
f"综合分={self.score.composite_score():.2f}\n"
f" {self.description}"
)
@dataclass
class OpportunityMatrix:
product_name: str
problems: List[Problem] = field(default_factory=list)
def add(self, problem: Problem):
self.problems.append(problem)
def ranked(self) -> List[Problem]:
return sorted(self.problems,
key=lambda p: p.score.composite_score(),
reverse=True)
def by_quadrant(self, q: Quadrant) -> List[Problem]:
return [p for p in self.problems if p.score.quadrant() == q]
def report(self):
print(f"\n{'='*64}")
print(f" {self.product_name} — 机会判断矩阵报告")
print(f"{'='*64}")
for q in Quadrant:
problems = self.by_quadrant(q)
if not problems:
continue
sorted_p = sorted(problems,
key=lambda p: p.score.composite_score(),
reverse=True)
print(f"\n【{q.value}({len(problems)} 项)】")
for p in sorted_p:
print(f" {p.report_line()}")
print(f"\n{'─'*64}")
print(" 综合排名 Top 5:")
for i, p in enumerate(self.ranked()[:5], 1):
print(f" {i}. {p.name}(综合分 {p.score.composite_score():.2f})"
f" → {p.score.quadrant().value}")
print(f"{'='*64}\n")
# ── Demo ──────────────────────────────────────────────────────
matrix = OpportunityMatrix("电商运营 AI 助手")
matrix.add(Problem(
name="跨系统数据手动汇聚耗时",
description="运营每天花 2 小时手工整合 4 个系统的数据,错误率高",
source="用户访谈 U-042",
score=OpportunityScore(
frequency=5, pain_level=5, user_scale=4, workaround_cost=4,
tech_feasibility=4, data_availability=3, time_cost=3, strategic_fit=5
)
))
matrix.add(Problem(
name="竞品价格变动无预警机制",
description="价格变化只能人工对比发现,经常错过调价时机",
source="用户访谈 U-037, U-042",
score=OpportunityScore(
frequency=3, pain_level=4, user_scale=3, workaround_cost=3,
tech_feasibility=5, data_availability=4, time_cost=4, strategic_fit=4
)
))
matrix.add(Problem(
name="促销效果归因不清晰",
description="促销结束后无法判断是哪个渠道带来的转化",
source="用户访谈 U-019",
score=OpportunityScore(
frequency=2, pain_level=3, user_scale=2, workaround_cost=2,
tech_feasibility=2, data_availability=2, time_cost=1, strategic_fit=3
)
))
matrix.add(Problem(
name="库存预测精度低导致滞销",
description="人工预测库存偏差大,每季度滞销损失约 15%",
source="业务方反馈",
score=OpportunityScore(
frequency=4, pain_level=5, user_scale=5, workaround_cost=4,
tech_feasibility=3, data_availability=2, time_cost=1, strategic_fit=5
)
))
matrix.add(Problem(
name="图文内容生成依赖外包",
description="商品描述和 banner 文案需外包,响应慢且费用高",
source="运营总监访谈",
score=OpportunityScore(
frequency=4, pain_level=3, user_scale=4, workaround_cost=3,
tech_feasibility=5, data_availability=5, time_cost=5, strategic_fit=4
)
))
matrix.report()
优先级判断误区对比
| 误区 | 表现 | 正确做法 |
|---|---|---|
| 只看频率 | 高频但低痛的小麻烦排第一 | 频率、痛感、规模三维综合评分 |
| 只看影响力 | 选了最重要但完全做不到的问题 | 必须同时评估可行性 |
| 战略过度加权 | 老板说重要就排第一 | 战略契合度是一个维度,不是全部 |
| 忽视绕行代价 | 有临时方案就不做 | 绕行代价越高说明市场空间越大 |
| 不明确放弃 | 所有问题都列为"待做" | 明确标出放弃项,释放团队精力 |
本章 checklist
- 是否对每个候选问题都完成了影响力和可行性两个维度的评分,而不是凭感觉排序
- 频率、痛感、用户规模、绕行代价四个子维度是否都有数据支撑,而不是拍脑袋给分
- 是否明确标出了"放弃做"的问题,而不是把所有问题都堆进 backlog
- 对"高影响低可行"的问题,是否做了拆解分析,找到可以先交付的最小子集
- 优先级结论是否能向团队清晰解释决策依据,而不只是 PM 内部的直觉判断
本章小结
- 机会判断矩阵的核心是两个维度同时评估:影响力决定"值不值得做",可行性决定"能不能做",缺一不可。
- 评分必须细化到子维度(频率、痛感、规模、绕行代价、技术可行性等),避免"综合感觉"导致的判断偏差。
- 优先级的价值不只在于排出第一名,更在于明确"不做什么"——没有放弃项的优先级列表不是优先级,是愿望清单。
本章完:下一章进入 04-三条线,学会发现问题之后,如何在用户需求、业务目标、技术约束三条线之间找到可执行的平衡点。