软考的选择题里,软件开发模型几乎每套题都会碰到。常见两种问法:给一段项目描述,问最适合哪个模型;或给出一个模型的特点,判断哪句描述错了 1。这两种题看着是记忆题,其实问的是同一件事:这个模型在补前面哪个漏洞。
先看分歧出在哪
所有过程模型都在回答同一件事:什么时候把不确定的东西定下来。
瀑布模型的回答最干脆:开工前。它把软件生命周期排成需求分析、设计、编码、测试、运行维护几个首尾相接的阶段,以文档作为驱动,靠阶段评审控制进度 2。好处是容易理解、管理成本低;代价是需求错了越往后改越贵,用户要等到验收才第一次见到东西。
后面的模型都在拆瀑布的两个前提:需求可以一次问清,交付可以放在最后。但要注意,它们不是一代替掉一代。Boehm 提出螺旋模型时指出,瀑布模型本身已经在需求分析旁挂了一个“build it twice”的原型步骤,只是把反馈回路限制在相邻阶段之间 3。所以原型不是凭空发明的新东西,V 模型也自称是瀑布的变体,螺旋更是把别的模型当成自己的特例。软考让你选的是最贴切的那个,不是最新的那个。
五个补丁各自补什么
原型:补“需求说不出来”。 用户常说的是“我说不清,但看到就知道了”。那就先快速做个样品给他看,几轮反馈下来需求逐渐清楚。教材把原型分为抛弃型和演化型:前者用来问清需求,问完就扔;后者一路演化成最终产品。它适合需求不清、规模不大的系统 2。所以真题里“适用于大规模的软件开发”常被拿来当错误项。
增量:补“交付太远”。 把需求切成若干增量,第一个增量通常是核心功能,每个增量都要发布一个可操作的产品 2。需求不必一次定全,风险被摊到几次交付上。代价是变更如果没提前规划,后续增量会不稳定,配置和进度管理也会变复杂。
V 模型:补“测试太晚”。 它还是瀑布的形状,只是把右侧竖起来,让每个开发阶段绑定一个测试级别:
| 左侧开发阶段 | 右侧测试级别 |
|---|---|
| 需求分析 | 验收测试 |
| 概要设计 | 系统测试 |
| 详细设计 | 集成测试 |
| 编码 | 单元测试 |
关键不在“先测试”,而在每层测试依据左边哪份文档、测试计划提前到对应开发阶段去写 5。它治的是“需求写错了要到验收才发现”,但测试执行仍然集中在后半段。
螺旋:补“没人专门算风险”。 一圈四步:制定计划、风险分析、实施工程、客户评估。软考的标准表述是“结合了瀑布模型和演化模型的优点,并增加了这两种模型忽略的风险分析” 12。Boehm 原文讲得更彻底:每圈先列清目标、可选方案和约束,评估后看剩下最大的风险是什么,再决定这一圈用原型、仿真还是走瀑布那套规格说明——风险决定这一圈用哪个模型,所以螺旋能容纳别的模型 3。代价是需要有风险评估经验的人,圈数一多,成本和工期都上去。
敏捷:补“流程本身太重”。 它承认需求定不死,于是把周期压短,每轮交一个能工作的软件,靠客户持续参与吸收变化。考试要的是那四条价值观:个体和交互胜过过程和工具,可工作的软件胜过大量文档,客户合作胜过合同谈判,响应变化胜过遵循计划 4。适配条件是小团队、需求变化频繁。
最容易混的四组
原型与增量。 都是“一轮一轮地做”,区别在于这一轮交出去的是什么:原型交的是给人看、用来问需求的样品,可以扔掉;增量交的是能上线使用的版本。题干说需求模糊、要让用户确认,选原型;说分批上线、核心功能先做,选增量。
增量与演化。 增量是同一套需求分块上线;演化是产品本身一轮轮变完整,方向由实际运营经验决定。教材把原型模型和螺旋模型都归在演化模型名下 24——它们是演化的两种实现方式,看到“演化”先想到这两个子类。
原型与螺旋。 都迭代,但螺旋每一圈固定含风险分析,而且圈是从整体概念往细节深处转的(Boehm 把径向定义为已花的累计成本)。判断看题干强调什么:强调风险、大型、每轮要评估要不要继续,选螺旋;只强调需求不清、规模不大,选原型。拿螺旋做几十人天的小工具是标准错答,风险评估的开销比要防的风险还大。
敏捷与增量。 敏捷靠迭代加增量落地,但增量只是它的手段。判断敏捷要看价值观的痕迹:小团队、响应变化、可工作的软件优于文档。题干只讲分批交付、对人和变化只字未提,就别往敏捷上靠。
一个“看着该选原型,其实该选螺旋”的场景
某医院要上一套新系统,还要对接一批新采购的自助设备,院方说不清具体要什么,只说“你先做个样子给我们看”。
按“需求模糊选原型”的套路,答案该是原型。但这道题还埋了第二个条件:系统庞大,而且面对没做过的新硬件接口。原型能问清界面和流程,问不清接口延迟、并发时设备掉线这类技术风险——那恰恰是最可能出问题的地方。螺旋的做法是把最大风险排在第一圈:先用原型或仿真把接口性能验证掉,再决定后面按瀑布的规格说明走,还是继续演化 3。所以更贴切的是螺旋,原型只是它第一圈里的零件。
反过来,如果只是给内部写个小工具,同样“需求说不清”,选螺旋就是过度设计。所以这类题不能只背关键词,规模和技术成熟度会改变答案。
落到答题上,只问两个问题
第一个:题干里“不确定的”到底是什么?需求说不清是原型,交付太远是增量,技术风险或范围风险高是螺旋,测试与设计脱节是 V 模型,流程太重、变化进不来是敏捷。
第二个:题干描述的那一轮循环,产出的是什么?样品、可用版本、一份下一圈的决策、一层测试计划,还是每轮的可交付软件。产出对上了,模型就对上了。
真实项目里这些模型常混着用,但软考让你选一个,题干一定埋了信号词,而信号词背后的东西就是那个漏洞。