绘制假设地图,先化解风险最高的一项
路线图把不确定性藏进功能;假设地图则揭示:这些功能值得存在之前,什么必须为真。
类型: Learn + Build 语言: Python(标准库) 前置要求: 阶段 14 第 48 课 预计时间: ~65 分钟
学习目标
- 把拟议工作转为明确假设。
- 分别评估影响、不确定性和不可逆性。
- 按风险而非热情选择下一个实验。
- 用证据和决定取代已测试的假设。
每次构建都包含押注
一个事故工具可能依赖这些前提都成立:
- 告警上下文有足够信息识别服务;
- 工程师信任自己没有亲自推导的建议;
- 期望响应时间对运营确实重要;
- 能在不授予不安全权限的前提下访问所需数据;
- 工作流发生得足够频繁,值得维护。
这些不是实现任务,而是构建具有价值、可用、可行且安全的条件。
假设类别
| 类别 | 问题 |
|---|---|
| 价值 | 结果是否足够重要? |
| 易用性 | 用户能否理解并据此行动? |
| 可行性 | 系统能否在可用数据和约束下产出它? |
| 可持续性 | 组织能否承受成本、所有权和运营? |
| 安全性 | 它能否在不造成不可接受后果的情况下失败? |
把假设写成可证伪的陈述。“功能有用”无法测试;“十位值班工程师中有八位能用只读结果更快识别正确服务”可以。
风险不是一个数字
实验用一到五的三个维度:
- 影响: 假设为假时的损害。
- 不确定性: 当前证据的薄弱程度。
- 不可逆性: 承诺后才学习的代价。
示例分数将影响乘以不确定性,再加不可逆性。公式并不通用;目的在于迫使团队说明,为何某个未知项应先于另一个得到化解。
mermaid
flowchart LR
A[假设] --> S[评估风险]
S --> H[最高的未决风险]
H --> X[成本最低的决定性实验]
X --> E{证据}
E -->|支持| B[有边界的构建]
E -->|否定| R[重新界定或停止]设计实验,而非确认仪式
有用的测试需要:
- 可能为假的主张;
- 人群或现实样本;
- 可观察结果;
- 结果前决定的阈值;
- 通过、失败和模糊证据各自对应的下一决定。
避免只证明团队能把这个想法做出来的测试。
可逆性改变顺序
后果高、不可逆的选择需要更早的证据。只读回放可以先于生产集成;临时适配器可以先于数据迁移;人工批准的建议可以先于自动动作。
构建的形状应跟随不确定性的形状。
动手构建
实验对假设排序,区分已测试和未决主张,选出最高的未决风险,并写入 outputs/assumption-map.json。
bash
python3 code/main.py
PYTHONPATH=code python3 -m unittest discover code/tests -v改变最高风险假设的证据,观察下一个实验如何随之变化。
练习
- 为你想构建的一项功能写五个假设。
- 加入功能列表遗漏的一项安全假设。
- 定义一个会让你停止构建的阈值。
- 用更便宜、决定性的测试替换一个大型实验。
- 对比风险排序和路线图优先级,并解释不一致之处。
延伸阅读
- Barry Boehm, A Spiral Model of Software Development and Enhancement,了解在更深承诺前先化解不确定性的风险驱动开发周期。
- Dardenne, van Lamsweerde, and Fickas, Goal-Directed Requirements Acquisition,了解如何在揭示障碍和约束的同时细化目标。
拿去用
保留 outputs/assumption-map.json。下一课会用它选择能产生决定性证据的最小切片。