
文章目录
- [软件开发模型系列(三):螺旋模型 ------ 让风险来驱动一切](#软件开发模型系列(三):螺旋模型 —— 让风险来驱动一切)
- 1、什么是螺旋模型
- 2、为什么需要螺旋模型
- 3、风险分析:螺旋模型的灵魂
- [3、历史实例:TRW-SPS 项目](#3、历史实例:TRW-SPS 项目)
- 4、螺旋模型的优点
- 5、螺旋模型的局限
- 6、螺旋模型的当代影响
- 7、本篇要点速记
- 补充
软件开发模型系列(三):螺旋模型 ------ 让风险来驱动一切
瀑布和 V 模型都假设"需求是确定的",但现实中有些项目从一开始就充满未知。螺旋模型的创造者 Barry Boehm 说:既然风险不可避免,那就让风险来主导开发过程。
1、什么是螺旋模型
螺旋模型(Spiral Model) 由美国软件工程大师 Barry W. Boehm 于 1986 年在论文 "A Spiral Model of Software Development and Enhancement" 中正式提出。它是软件工程史上第一个风险驱动(Risk-Driven) 的开发模型。
想象一个从中心向外不断扩大的螺旋:
#mermaid-svg-kTYffvVxHn42B80M{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kTYffvVxHn42B80M .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kTYffvVxHn42B80M .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kTYffvVxHn42B80M .error-icon{fill:#552222;}#mermaid-svg-kTYffvVxHn42B80M .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kTYffvVxHn42B80M .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kTYffvVxHn42B80M .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kTYffvVxHn42B80M .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kTYffvVxHn42B80M .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kTYffvVxHn42B80M .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kTYffvVxHn42B80M .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kTYffvVxHn42B80M .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kTYffvVxHn42B80M .marker.cross{stroke:#333333;}#mermaid-svg-kTYffvVxHn42B80M svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kTYffvVxHn42B80M p{margin:0;}#mermaid-svg-kTYffvVxHn42B80M .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kTYffvVxHn42B80M .cluster-label text{fill:#333;}#mermaid-svg-kTYffvVxHn42B80M .cluster-label span{color:#333;}#mermaid-svg-kTYffvVxHn42B80M .cluster-label span p{background-color:transparent;}#mermaid-svg-kTYffvVxHn42B80M .label text,#mermaid-svg-kTYffvVxHn42B80M span{fill:#333;color:#333;}#mermaid-svg-kTYffvVxHn42B80M .node rect,#mermaid-svg-kTYffvVxHn42B80M .node circle,#mermaid-svg-kTYffvVxHn42B80M .node ellipse,#mermaid-svg-kTYffvVxHn42B80M .node polygon,#mermaid-svg-kTYffvVxHn42B80M .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kTYffvVxHn42B80M .rough-node .label text,#mermaid-svg-kTYffvVxHn42B80M .node .label text,#mermaid-svg-kTYffvVxHn42B80M .image-shape .label,#mermaid-svg-kTYffvVxHn42B80M .icon-shape .label{text-anchor:middle;}#mermaid-svg-kTYffvVxHn42B80M .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kTYffvVxHn42B80M .rough-node .label,#mermaid-svg-kTYffvVxHn42B80M .node .label,#mermaid-svg-kTYffvVxHn42B80M .image-shape .label,#mermaid-svg-kTYffvVxHn42B80M .icon-shape .label{text-align:center;}#mermaid-svg-kTYffvVxHn42B80M .node.clickable{cursor:pointer;}#mermaid-svg-kTYffvVxHn42B80M .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kTYffvVxHn42B80M .arrowheadPath{fill:#333333;}#mermaid-svg-kTYffvVxHn42B80M .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kTYffvVxHn42B80M .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kTYffvVxHn42B80M .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kTYffvVxHn42B80M .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kTYffvVxHn42B80M .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kTYffvVxHn42B80M .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kTYffvVxHn42B80M .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kTYffvVxHn42B80M .cluster text{fill:#333;}#mermaid-svg-kTYffvVxHn42B80M .cluster span{color:#333;}#mermaid-svg-kTYffvVxHn42B80M div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kTYffvVxHn42B80M .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kTYffvVxHn42B80M rect.text{fill:none;stroke-width:0;}#mermaid-svg-kTYffvVxHn42B80M .icon-shape,#mermaid-svg-kTYffvVxHn42B80M .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kTYffvVxHn42B80M .icon-shape p,#mermaid-svg-kTYffvVxHn42B80M .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kTYffvVxHn42B80M .icon-shape .label rect,#mermaid-svg-kTYffvVxHn42B80M .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kTYffvVxHn42B80M .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kTYffvVxHn42B80M .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kTYffvVxHn42B80M :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-kTYffvVxHn42B80M .stage>*{fill:#dbeafe!important;stroke:#2563eb!important;stroke-width:1px!important;color:#1e3a8a!important;}#mermaid-svg-kTYffvVxHn42B80M .stage span{fill:#dbeafe!important;stroke:#2563eb!important;stroke-width:1px!important;color:#1e3a8a!important;}#mermaid-svg-kTYffvVxHn42B80M .stage tspan{fill:#1e3a8a!important;}#mermaid-svg-kTYffvVxHn42B80M .pain>*{fill:#fee2e2!important;stroke:#dc2626!important;stroke-width:1px!important;color:#7f1d1d!important;}#mermaid-svg-kTYffvVxHn42B80M .pain span{fill:#fee2e2!important;stroke:#dc2626!important;stroke-width:1px!important;color:#7f1d1d!important;}#mermaid-svg-kTYffvVxHn42B80M .pain tspan{fill:#7f1d1d!important;} 进入下一圈(半径更大)
① 确定目标
方案与约束
② 风险评估
识别 · 分析 · 缓解 · 原型验证
③ 开发验证
设计 · 编码 · 测试
④ 评审规划
评估成果 · 规划下一轮
说明:Mermaid 画不出"半径递增的螺旋线",这里用四象限闭环 + "下一圈半径更大"的回环来表达。若要忠实还原 Boehm 论文里的经典螺旋形,需要单独的 SVG 图。

每一圈螺旋包含四个阶段:
| 象限 | 活动 | 核心问题 |
|---|---|---|
| 第一象限 | 确定目标、方案与约束 | 这一轮要达成什么?有哪些选项? |
| 第二象限 | 风险识别与评估、原型开发 | 最大的风险是什么?怎么降低它? |
| 第三象限 | 工程开发与验证 | 设计、编码、测试本轮要交付的内容 |
| 第四象限 | 评审与规划下一轮 | 干得怎么样?下一轮做什么? |
2、为什么需要螺旋模型
瀑布和 V 模型面对的是这样的项目:
text
需求明确 → 流程清晰 → 按时交付
但有一类项目是这样的:
text
技术可行性未知(这个算法真的能跑吗?)
性能目标不确定(能做到实时吗?)
需求随时可能调整(市场还在验证中)
外部依赖不可控(供应商的 SDK 稳定吗?)
这类项目如果硬套瀑布模型,大概率会翻车。Boehm 自己的总结很精准:
"瀑布模型是文档驱动的,增量模型是代码驱动的,螺旋模型是风险驱动的。在每一个决策点,你先问的不是'下一步该做什么',而是'什么最可能让这个项目失败'。"
3、风险分析:螺旋模型的灵魂

螺旋模型和其他模型最本质的区别在于第二象限:风险评估。
在每个螺旋周期开始,团队必须系统性地回答:
text
┌────────────────────────────────┐
│ 风险识别 │
│ - 技术风险:算法可行吗? │
│ - 人员风险:关键人才会离职吗? │
│ - 进度风险:供应商能按时交付吗? │
│ - 需求风险:用户真的需要这个吗? │
├────────────────────────────────┤
│ 风险评估 │
│ - 发生概率有多高? │
│ - 影响有多大? │
│ - 哪些风险必须优先处理? │
├────────────────────────────────┤
│ 风险缓解 │
│ - 原型验证 │
│ - 技术预研(Spike) │
│ - 备选方案 │
│ - 如果无法缓解 → 终止项目 │
└────────────────────────────────┘
螺旋模型有一个看似残酷但实际很理性的设计:如果某个风险无法被有效缓解,就应该尽早终止项目。比起瀑布模式下开发两年才发现项目不可行,这种"早死早超生"反而更节省资源。
3、历史实例:TRW-SPS 项目

Boehm 在他的论文中详细描述了螺旋模型的首次实践------TRW 软件生产力系统(TRW-SPS),一个 130 万行代码的超大型系统。
text
第 0 轮(最内圈):可行性研究
→ "这个项目值不值得做?"
→ 产出:概念文档 + 风险评估报告
第 1 轮:概念验证
→ "关键技术上能走通吗?"
→ 产出:概念原型 + 更新的风险清单
第 2 轮:顶层设计
→ "架构能不能支撑预期的规模?"
→ 产出:软件需求规格 + 架构原型
第 3 轮:详细设计与实现
→ "开始正式开发"
→ 产出:可运行的产品增量
每一轮都是前一轮的放大版,风险逐层被消化。不是等所有需求都决定了再动手,而是先解决最不确定的部分。
4、螺旋模型的优点

风险管理是内置的,不是附加的
在瀑布模型中,风险管理通常是项目经理自己默默担心、偶尔在周会上提一嘴。螺旋模型把它变成了正式的、必须执行的流程步骤。
适合高风险、高不确定性项目
| 典型场景 | 风险来源 |
|---|---|
| 自动驾驶系统 | 技术可行性、安全标准 |
| 航天软件 | 极端环境、不可维护 |
| 金融交易系统 | 性能、数据一致性 |
| AI/ML 产品 | 模型效果不可预测 |
| 机器人系统 | 硬件-软件协同不确定性 |
支持早期决策
因为每一轮结束都要重新评估"值不值得继续",螺旋模型天然支持"止损"决策。对于探索性项目,这个特性非常重要。
兼顾多种方法的优点
Boehm 有意将瀑布模型的系统性、原型法的探索性和增量模型的迭代特性都融合进了螺旋模型中。
5、螺旋模型的局限

复杂且昂贵
四个象限的完整执行需要大量文档、评审和分析工作。对小型项目来说,风险管理本身的成本可能就超过了项目预算。
依赖有经验的团队
风险评估不是一个初级程序员或初级项目经理能胜任的工作。螺旋模型要求团队中有经验丰富的系统架构师和风险管理专家。
不适合合同驱动的外包项目
螺旋模型假设项目目标和范围可以灵活调整,但这与固定价格、固定工期的外包合同天然冲突。客户会说:"你别跟我谈螺旋,我就要这个功能、这个时间、这个价格。"
终止条件模糊
"什么时候可以停止螺旋?"没有一个明确的答案。如果风险评估团队过于保守,项目可能永远在原型阶段打转。
6、螺旋模型的当代影响

虽然今天很少有人完全按照 Boehm 的四象限模型来做项目,但螺旋模型的核心思想已经渗透进了几乎所有现代开发方法中:
text
螺旋模型的影响可见于:
Agile 的 Sprint → 每个 Sprint 本质上是一个迷你螺旋
(计划→开发→评审→回顾 = 确定目标→开发→评审→规划下一轮)
Design Thinking → "先做原型验证最关键的假设" = 螺旋的第二象限
Lean Startup 的 Build-Measure-Learn → 风险驱动的快速迭代
技术 Spikes → 敏捷团队做技术预研时,本质上在跑一个单圈螺旋
7、本篇要点速记

text
螺旋模型 = 风险驱动 + 四象限循环 + 原型验证
诞生于 1986 年,Barry Boehm 提出。
核心循环:目标 → 风险分析 → 开发 → 评审 → 下一轮
灵魂所在:第二象限的风险评估(识别、分析、缓解、必要时终止)
优点 → 风险管理内置、适合高风险项目、支持早期止损
局限 → 复杂昂贵、依赖经验、不适合合同外包
一句话:什么时候开始编码不重要,什么时候确定最大的风险已经解决了才重要。
补充
第一性原理结论:软件开发/算法研发的本质是一个信息熵减的过程。螺旋模型通过高频的"假设-验证-反馈"闭环,用最小的成本(原型)去换取最大的信息量(风险消除),从而在混沌中逐步逼近最终的正确解。
在目标检测任务中,螺旋模型体现为"不要试图一次性设计出一个完美的网络"。而是通过不断构建 Baseline -> 分析 Bad Case(暴露风险)-> 针对性修改网络结构/数据策略(消除风险)-> 评估部署可行性,像螺旋一样一圈圈将模型的精度、鲁棒性和工程落地能力提升到目标水平。

上一篇:V 模型
下一篇:迭代开发 ------ 先让东西跑起来,再慢慢变好