
文章目录
- [软件开发模型系列(一):瀑布模型 ------ 让软件工程像盖房子一样有序](#软件开发模型系列(一):瀑布模型 —— 让软件工程像盖房子一样有序)
- 1、什么是瀑布模型
- 2、为什么会出现瀑布模型
- 3、瀑布模型的优点
- 4、瀑布模型的问题
- 5、瀑布模型在今天的定位
- [6、AI 时代的思考](#6、AI 时代的思考)
- 7、本篇要点速记
软件开发模型系列(一):瀑布模型 ------ 让软件工程像盖房子一样有序
本系列文章系统介绍软件开发生命周期(Software Development Life Cycle,SDLC)中的各种开发模型,从最经典的瀑布模型开始,一路梳理到 AI 时代的 Agentic Workflow。帮助读者建立完整的软件工程方法论框架。

1、什么是瀑布模型
瀑布模型(Waterfall Model) 是软件工程史上第一个被正式定义的软件开发流程模型。它的核心思想非常简单:把软件开发拆分成若干个顺序执行的阶段,每个阶段完成后才能进入下一阶段,像瀑布一样自上而下、不可逆流。
1970 年,美国计算机科学家 Winston W. Royce 在 IEEE WESCON 会议上发表了论文 "Managing the Development of Large Software Systems",首次系统性地描述了这一模型。

一个有趣的历史细节:Royce 在这篇论文中其实是反对纯瀑布式开发的。他在论文后半部分明确提出了带有反馈循环和原型设计的迭代方法,并警告说"单次顺序执行是有风险的,会导致失败"。
然而,美国国防部在 1985 年制定 DOD-STD-2167 标准时,只读了论文的前半部分,将瀑布模型强制规定为军用软件的标准流程------这个误读深刻影响了整个软件行业几十年。
瀑布模型通常包含以下六个阶段:
#mermaid-svg-DzLOVY3uIMSImZ9W{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-DzLOVY3uIMSImZ9W .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DzLOVY3uIMSImZ9W .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DzLOVY3uIMSImZ9W .error-icon{fill:#552222;}#mermaid-svg-DzLOVY3uIMSImZ9W .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DzLOVY3uIMSImZ9W .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DzLOVY3uIMSImZ9W .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DzLOVY3uIMSImZ9W .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DzLOVY3uIMSImZ9W .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DzLOVY3uIMSImZ9W .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DzLOVY3uIMSImZ9W .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DzLOVY3uIMSImZ9W .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DzLOVY3uIMSImZ9W .marker.cross{stroke:#333333;}#mermaid-svg-DzLOVY3uIMSImZ9W svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DzLOVY3uIMSImZ9W p{margin:0;}#mermaid-svg-DzLOVY3uIMSImZ9W .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DzLOVY3uIMSImZ9W .cluster-label text{fill:#333;}#mermaid-svg-DzLOVY3uIMSImZ9W .cluster-label span{color:#333;}#mermaid-svg-DzLOVY3uIMSImZ9W .cluster-label span p{background-color:transparent;}#mermaid-svg-DzLOVY3uIMSImZ9W .label text,#mermaid-svg-DzLOVY3uIMSImZ9W span{fill:#333;color:#333;}#mermaid-svg-DzLOVY3uIMSImZ9W .node rect,#mermaid-svg-DzLOVY3uIMSImZ9W .node circle,#mermaid-svg-DzLOVY3uIMSImZ9W .node ellipse,#mermaid-svg-DzLOVY3uIMSImZ9W .node polygon,#mermaid-svg-DzLOVY3uIMSImZ9W .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DzLOVY3uIMSImZ9W .rough-node .label text,#mermaid-svg-DzLOVY3uIMSImZ9W .node .label text,#mermaid-svg-DzLOVY3uIMSImZ9W .image-shape .label,#mermaid-svg-DzLOVY3uIMSImZ9W .icon-shape .label{text-anchor:middle;}#mermaid-svg-DzLOVY3uIMSImZ9W .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DzLOVY3uIMSImZ9W .rough-node .label,#mermaid-svg-DzLOVY3uIMSImZ9W .node .label,#mermaid-svg-DzLOVY3uIMSImZ9W .image-shape .label,#mermaid-svg-DzLOVY3uIMSImZ9W .icon-shape .label{text-align:center;}#mermaid-svg-DzLOVY3uIMSImZ9W .node.clickable{cursor:pointer;}#mermaid-svg-DzLOVY3uIMSImZ9W .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DzLOVY3uIMSImZ9W .arrowheadPath{fill:#333333;}#mermaid-svg-DzLOVY3uIMSImZ9W .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DzLOVY3uIMSImZ9W .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DzLOVY3uIMSImZ9W .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DzLOVY3uIMSImZ9W .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DzLOVY3uIMSImZ9W .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DzLOVY3uIMSImZ9W .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DzLOVY3uIMSImZ9W .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DzLOVY3uIMSImZ9W .cluster text{fill:#333;}#mermaid-svg-DzLOVY3uIMSImZ9W .cluster span{color:#333;}#mermaid-svg-DzLOVY3uIMSImZ9W 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-DzLOVY3uIMSImZ9W .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DzLOVY3uIMSImZ9W rect.text{fill:none;stroke-width:0;}#mermaid-svg-DzLOVY3uIMSImZ9W .icon-shape,#mermaid-svg-DzLOVY3uIMSImZ9W .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DzLOVY3uIMSImZ9W .icon-shape p,#mermaid-svg-DzLOVY3uIMSImZ9W .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DzLOVY3uIMSImZ9W .icon-shape .label rect,#mermaid-svg-DzLOVY3uIMSImZ9W .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DzLOVY3uIMSImZ9W .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DzLOVY3uIMSImZ9W .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DzLOVY3uIMSImZ9W :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-DzLOVY3uIMSImZ9W .stage>*{fill:#dbeafe!important;stroke:#2563eb!important;stroke-width:1px!important;color:#1e3a8a!important;}#mermaid-svg-DzLOVY3uIMSImZ9W .stage span{fill:#dbeafe!important;stroke:#2563eb!important;stroke-width:1px!important;color:#1e3a8a!important;}#mermaid-svg-DzLOVY3uIMSImZ9W .stage tspan{fill:#1e3a8a!important;} 1 · 需求分析
搞清楚用户要什么
2 · 系统设计
确定技术方案和架构
3 · 编码实现
动手写代码
4 · 测试验证
找 Bug,确保质量
5 · 部署上线
交付给用户使用
6 · 运维维护
后续修 Bug、加功能
每个阶段都会产生相应的文档产出物,作为下一阶段的输入。
text
1、需求分析 (Requirement Analysis): 确定客户需求和系统目标。
2、系统设计 (System Design): 将需求转化为技术架构和设计文档。
3、开发与编码 (Development/Coding): 程序员编写源代码。
4、测试 (Testing): 发现并修复缺陷,确保质量。
5、部署 (Deployment): 将软件发布到生产环境供用户使用。
6、维护 (Maintenance): 后期的功能迭代、Bug 修复和性能优化。

2、为什么会出现瀑布模型
在 20 世纪 60-70 年代,软件开发正从"手工作坊式"的个体行为,转向需要多人协作的工程化活动。当时面临的核心问题是:
- 没有章法:程序员想到哪写到哪,项目进度不可控
- 需求混乱:用户说不清要什么,开发者理解偏了也没人发现
- 质量靠人品:没有系统化的测试流程,软件能不能跑全看运气
瀑布模型的出现,本质上是把建筑工程的管理思路搬到了软件领域------就像盖房子必须先画图纸、再打地基、再盖楼、最后装修,顺序不能乱。这个类比让软件项目第一次有了可管理的框架。
3、瀑布模型的优点
3.1、流程清晰,责任明确
每个阶段有明确的输入、输出和责任人:
#mermaid-svg-4U3PffA0GUaazIdO{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-4U3PffA0GUaazIdO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4U3PffA0GUaazIdO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4U3PffA0GUaazIdO .error-icon{fill:#552222;}#mermaid-svg-4U3PffA0GUaazIdO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4U3PffA0GUaazIdO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4U3PffA0GUaazIdO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4U3PffA0GUaazIdO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4U3PffA0GUaazIdO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4U3PffA0GUaazIdO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4U3PffA0GUaazIdO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4U3PffA0GUaazIdO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4U3PffA0GUaazIdO .marker.cross{stroke:#333333;}#mermaid-svg-4U3PffA0GUaazIdO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4U3PffA0GUaazIdO p{margin:0;}#mermaid-svg-4U3PffA0GUaazIdO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4U3PffA0GUaazIdO .cluster-label text{fill:#333;}#mermaid-svg-4U3PffA0GUaazIdO .cluster-label span{color:#333;}#mermaid-svg-4U3PffA0GUaazIdO .cluster-label span p{background-color:transparent;}#mermaid-svg-4U3PffA0GUaazIdO .label text,#mermaid-svg-4U3PffA0GUaazIdO span{fill:#333;color:#333;}#mermaid-svg-4U3PffA0GUaazIdO .node rect,#mermaid-svg-4U3PffA0GUaazIdO .node circle,#mermaid-svg-4U3PffA0GUaazIdO .node ellipse,#mermaid-svg-4U3PffA0GUaazIdO .node polygon,#mermaid-svg-4U3PffA0GUaazIdO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4U3PffA0GUaazIdO .rough-node .label text,#mermaid-svg-4U3PffA0GUaazIdO .node .label text,#mermaid-svg-4U3PffA0GUaazIdO .image-shape .label,#mermaid-svg-4U3PffA0GUaazIdO .icon-shape .label{text-anchor:middle;}#mermaid-svg-4U3PffA0GUaazIdO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4U3PffA0GUaazIdO .rough-node .label,#mermaid-svg-4U3PffA0GUaazIdO .node .label,#mermaid-svg-4U3PffA0GUaazIdO .image-shape .label,#mermaid-svg-4U3PffA0GUaazIdO .icon-shape .label{text-align:center;}#mermaid-svg-4U3PffA0GUaazIdO .node.clickable{cursor:pointer;}#mermaid-svg-4U3PffA0GUaazIdO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4U3PffA0GUaazIdO .arrowheadPath{fill:#333333;}#mermaid-svg-4U3PffA0GUaazIdO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4U3PffA0GUaazIdO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4U3PffA0GUaazIdO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4U3PffA0GUaazIdO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4U3PffA0GUaazIdO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4U3PffA0GUaazIdO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4U3PffA0GUaazIdO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4U3PffA0GUaazIdO .cluster text{fill:#333;}#mermaid-svg-4U3PffA0GUaazIdO .cluster span{color:#333;}#mermaid-svg-4U3PffA0GUaazIdO 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-4U3PffA0GUaazIdO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4U3PffA0GUaazIdO rect.text{fill:none;stroke-width:0;}#mermaid-svg-4U3PffA0GUaazIdO .icon-shape,#mermaid-svg-4U3PffA0GUaazIdO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4U3PffA0GUaazIdO .icon-shape p,#mermaid-svg-4U3PffA0GUaazIdO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4U3PffA0GUaazIdO .icon-shape .label rect,#mermaid-svg-4U3PffA0GUaazIdO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4U3PffA0GUaazIdO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4U3PffA0GUaazIdO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4U3PffA0GUaazIdO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-4U3PffA0GUaazIdO .role>*{fill:#e0e7ff!important;stroke:#4f46e5!important;color:#312e81!important;}#mermaid-svg-4U3PffA0GUaazIdO .role span{fill:#e0e7ff!important;stroke:#4f46e5!important;color:#312e81!important;}#mermaid-svg-4U3PffA0GUaazIdO .role tspan{fill:#312e81!important;}#mermaid-svg-4U3PffA0GUaazIdO .art>*{fill:#f1f5f9!important;stroke:#64748b!important;color:#0f172a!important;}#mermaid-svg-4U3PffA0GUaazIdO .art span{fill:#f1f5f9!important;stroke:#64748b!important;color:#0f172a!important;}#mermaid-svg-4U3PffA0GUaazIdO .art tspan{fill:#0f172a!important;} 产品经理
需求文档
架构师
设计文档
程序员
源代码
测试工程师
测试报告
运维工程师
上线部署
管理者可以清楚地知道项目进展到哪个阶段、谁在做什么。
3.2、文档齐全,可追溯
瀑布模型是"文档驱动"的。项目中会产生大量规范文档:需求规格说明书(Software Requirements Specification,SRS)、系统设计文档(System Design Document,SDD)、测试计划、用户手册等。这对于需要严格审计和合规的行业来说至关重要。
3.3、适合需求稳定的项目
当需求真的不会变(或不能变)时,瀑布模型依然是最高效的选择。典型场景包括:
- 航空航天软件(需求由物理定律决定)
- 军工系统(需求由作战需求决定,变更流程极长)
- 银行核心系统(监管要求明确且固定)
- 医疗设备软件(需通过 FDA/CE 认证,变更成本极高)
- FDA:Food and Drug Administration(美国食品药品监督管理局)
- CE:Conformité Européenne(欧洲统一认证/标志)
4、瀑布模型的问题
4.1、变更成本极高
瀑布模型最大的硬伤在名字本身:瀑布不能倒流。
#mermaid-svg-sGHrnORw1b9an6WC{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-sGHrnORw1b9an6WC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sGHrnORw1b9an6WC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sGHrnORw1b9an6WC .error-icon{fill:#552222;}#mermaid-svg-sGHrnORw1b9an6WC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sGHrnORw1b9an6WC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sGHrnORw1b9an6WC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sGHrnORw1b9an6WC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sGHrnORw1b9an6WC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sGHrnORw1b9an6WC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sGHrnORw1b9an6WC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sGHrnORw1b9an6WC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sGHrnORw1b9an6WC .marker.cross{stroke:#333333;}#mermaid-svg-sGHrnORw1b9an6WC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sGHrnORw1b9an6WC p{margin:0;}#mermaid-svg-sGHrnORw1b9an6WC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sGHrnORw1b9an6WC .cluster-label text{fill:#333;}#mermaid-svg-sGHrnORw1b9an6WC .cluster-label span{color:#333;}#mermaid-svg-sGHrnORw1b9an6WC .cluster-label span p{background-color:transparent;}#mermaid-svg-sGHrnORw1b9an6WC .label text,#mermaid-svg-sGHrnORw1b9an6WC span{fill:#333;color:#333;}#mermaid-svg-sGHrnORw1b9an6WC .node rect,#mermaid-svg-sGHrnORw1b9an6WC .node circle,#mermaid-svg-sGHrnORw1b9an6WC .node ellipse,#mermaid-svg-sGHrnORw1b9an6WC .node polygon,#mermaid-svg-sGHrnORw1b9an6WC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sGHrnORw1b9an6WC .rough-node .label text,#mermaid-svg-sGHrnORw1b9an6WC .node .label text,#mermaid-svg-sGHrnORw1b9an6WC .image-shape .label,#mermaid-svg-sGHrnORw1b9an6WC .icon-shape .label{text-anchor:middle;}#mermaid-svg-sGHrnORw1b9an6WC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sGHrnORw1b9an6WC .rough-node .label,#mermaid-svg-sGHrnORw1b9an6WC .node .label,#mermaid-svg-sGHrnORw1b9an6WC .image-shape .label,#mermaid-svg-sGHrnORw1b9an6WC .icon-shape .label{text-align:center;}#mermaid-svg-sGHrnORw1b9an6WC .node.clickable{cursor:pointer;}#mermaid-svg-sGHrnORw1b9an6WC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sGHrnORw1b9an6WC .arrowheadPath{fill:#333333;}#mermaid-svg-sGHrnORw1b9an6WC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sGHrnORw1b9an6WC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sGHrnORw1b9an6WC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sGHrnORw1b9an6WC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sGHrnORw1b9an6WC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sGHrnORw1b9an6WC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sGHrnORw1b9an6WC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sGHrnORw1b9an6WC .cluster text{fill:#333;}#mermaid-svg-sGHrnORw1b9an6WC .cluster span{color:#333;}#mermaid-svg-sGHrnORw1b9an6WC 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-sGHrnORw1b9an6WC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sGHrnORw1b9an6WC rect.text{fill:none;stroke-width:0;}#mermaid-svg-sGHrnORw1b9an6WC .icon-shape,#mermaid-svg-sGHrnORw1b9an6WC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sGHrnORw1b9an6WC .icon-shape p,#mermaid-svg-sGHrnORw1b9an6WC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sGHrnORw1b9an6WC .icon-shape .label rect,#mermaid-svg-sGHrnORw1b9an6WC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sGHrnORw1b9an6WC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sGHrnORw1b9an6WC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sGHrnORw1b9an6WC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-sGHrnORw1b9an6WC .pain>*{fill:#fee2e2!important;stroke:#dc2626!important;stroke-width:1px!important;color:#7f1d1d!important;}#mermaid-svg-sGHrnORw1b9an6WC .pain span{fill:#fee2e2!important;stroke:#dc2626!important;stroke-width:1px!important;color:#7f1d1d!important;}#mermaid-svg-sGHrnORw1b9an6WC .pain tspan{fill:#7f1d1d!important;} 需求变更
设计重做
代码重写
测试重做
文档重写
研究数据(Boehm, 1981; McConnell, 1996)表明:在需求阶段修复一个问题的成本如果是 1,到了测试阶段修复同样的问题,成本是 10-40 倍。而瀑布模型中,测试被安排在最后阶段------这意味着最严重的 Bug 恰恰是在修复成本最高的时候才被发现。
4.2、反馈周期过长
text
第1个月:需求分析
第2-3个月:系统设计
第4-8个月:编码开发
第9个月:测试
第10个月:给用户看
用户说:"这不是我要的东西。"
10 个月的努力可能瞬间归零。用户只有在最后才能看到可运行的软件,中间没有任何机会纠正方向。
4.3、假设需求可以预先确定
这是瀑布模型最根本的缺陷。现实中:
- 用户往往说不清自己到底要什么
- 市场在变化,竞争对手在迭代
- 技术在演进,原先的设计可能过时
一项对软件项目的研究表明,平均有 20-25% 的需求在项目周期内会发生变化。瀑布模型对此几乎没有应对能力。
5、瀑布模型在今天的定位
尽管在互联网和移动应用开发中,瀑布模型已被敏捷方法大规模取代,但它在特定领域依然有不可替代的价值:
| 适用场景 | 不适用场景 |
|---|---|
| 需求明确且稳定的项目 | 需求频繁变化的互联网产品 |
| 需要严格合规审计的行业 | 创业公司的 MVP 探索 |
| 涉及硬件/固件的一体化开发 | 用户需求尚不清晰的创新项目 |
| 军工、航天、医疗、核电 | 快速迭代的 SaaS 产品 |
6、AI 时代的思考
有趣的是,很多人在使用 AI 编程工具(Claude Code、Cursor 等)时,会不自觉地陷入"AI 版瀑布开发":
#mermaid-svg-NnkCLggmjhSnayaB{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-NnkCLggmjhSnayaB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NnkCLggmjhSnayaB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NnkCLggmjhSnayaB .error-icon{fill:#552222;}#mermaid-svg-NnkCLggmjhSnayaB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NnkCLggmjhSnayaB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NnkCLggmjhSnayaB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NnkCLggmjhSnayaB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NnkCLggmjhSnayaB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NnkCLggmjhSnayaB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NnkCLggmjhSnayaB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NnkCLggmjhSnayaB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NnkCLggmjhSnayaB .marker.cross{stroke:#333333;}#mermaid-svg-NnkCLggmjhSnayaB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NnkCLggmjhSnayaB p{margin:0;}#mermaid-svg-NnkCLggmjhSnayaB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NnkCLggmjhSnayaB .cluster-label text{fill:#333;}#mermaid-svg-NnkCLggmjhSnayaB .cluster-label span{color:#333;}#mermaid-svg-NnkCLggmjhSnayaB .cluster-label span p{background-color:transparent;}#mermaid-svg-NnkCLggmjhSnayaB .label text,#mermaid-svg-NnkCLggmjhSnayaB span{fill:#333;color:#333;}#mermaid-svg-NnkCLggmjhSnayaB .node rect,#mermaid-svg-NnkCLggmjhSnayaB .node circle,#mermaid-svg-NnkCLggmjhSnayaB .node ellipse,#mermaid-svg-NnkCLggmjhSnayaB .node polygon,#mermaid-svg-NnkCLggmjhSnayaB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NnkCLggmjhSnayaB .rough-node .label text,#mermaid-svg-NnkCLggmjhSnayaB .node .label text,#mermaid-svg-NnkCLggmjhSnayaB .image-shape .label,#mermaid-svg-NnkCLggmjhSnayaB .icon-shape .label{text-anchor:middle;}#mermaid-svg-NnkCLggmjhSnayaB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NnkCLggmjhSnayaB .rough-node .label,#mermaid-svg-NnkCLggmjhSnayaB .node .label,#mermaid-svg-NnkCLggmjhSnayaB .image-shape .label,#mermaid-svg-NnkCLggmjhSnayaB .icon-shape .label{text-align:center;}#mermaid-svg-NnkCLggmjhSnayaB .node.clickable{cursor:pointer;}#mermaid-svg-NnkCLggmjhSnayaB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NnkCLggmjhSnayaB .arrowheadPath{fill:#333333;}#mermaid-svg-NnkCLggmjhSnayaB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NnkCLggmjhSnayaB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NnkCLggmjhSnayaB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NnkCLggmjhSnayaB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NnkCLggmjhSnayaB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NnkCLggmjhSnayaB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NnkCLggmjhSnayaB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NnkCLggmjhSnayaB .cluster text{fill:#333;}#mermaid-svg-NnkCLggmjhSnayaB .cluster span{color:#333;}#mermaid-svg-NnkCLggmjhSnayaB 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-NnkCLggmjhSnayaB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NnkCLggmjhSnayaB rect.text{fill:none;stroke-width:0;}#mermaid-svg-NnkCLggmjhSnayaB .icon-shape,#mermaid-svg-NnkCLggmjhSnayaB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NnkCLggmjhSnayaB .icon-shape p,#mermaid-svg-NnkCLggmjhSnayaB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NnkCLggmjhSnayaB .icon-shape .label rect,#mermaid-svg-NnkCLggmjhSnayaB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NnkCLggmjhSnayaB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NnkCLggmjhSnayaB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NnkCLggmjhSnayaB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-NnkCLggmjhSnayaB .ai>*{fill:#fef3c7!important;stroke:#d97706!important;stroke-width:1px!important;color:#78350f!important;}#mermaid-svg-NnkCLggmjhSnayaB .ai span{fill:#fef3c7!important;stroke:#d97706!important;stroke-width:1px!important;color:#78350f!important;}#mermaid-svg-NnkCLggmjhSnayaB .ai tspan{fill:#78350f!important;} 写一个完整的需求文档
一次性丢给 AI
等待 30 分钟
生成 5000 行代码
一次性验收
这种方式的风险和 50 年前的瀑布模型如出一辙:反馈太晚,变更太贵 。在 AI Coding 的时代,我们反而更需要从瀑布模型的教训中学习------保持短反馈循环,小步迭代,持续验证。这恰好引出了本系列的下一篇:V 模型。
7、本篇要点速记
text
瀑布模型 = 顺序执行 + 文档驱动 + 阶段门控
诞生于 1970 年,灵感来自建筑工程管理。
优点 → 流程清晰、文档齐全、适合需求稳定的项目
局限 → 变更成本高、反馈周期长、假设需求不变
一句话:瀑布模型不是错的,只是被用在了错误的地方。
下一篇:V 模型 ------ 让测试不再是事后诸葛亮
