问题优先级与机会判断矩阵
High Contrast
Dark Mode
Light Mode
Sepia
Forest
4 min read802 words

问题优先级与机会判断矩阵

发现了十个真实问题,这不是成功,这是新的麻烦——因为资源只够做两个。优先级判断才是真正考验 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

本章小结

本章完:下一章进入 04-三条线,学会发现问题之后,如何在用户需求、业务目标、技术约束三条线之间找到可执行的平衡点。