瀑布模型 Waterfall
各阶段按线性顺序逐级下落,前一阶段的输出是后一阶段的输入,也叫文档驱动。适合需求明确、稳定的项目。
易错缺点:缺乏灵活性,难以适应需求变化。需求可能变化时,它就是“最不适合”的那个
怎么记真题口径:需求很明确、有类似项目的经验,哪怕规模很大,也选瀑布;替换旧系统、交付期严格,也选瀑布。反过来,题目一说需求会变、需求不明确,瀑布就是最不适合的。
D1 里要死记的内容都在这一页:7 组考点、42 张卡片和表,每组都标了考频。DFD 找错与补流要按步骤推,放在配套的技巧图解里。
给项目情境,选最合适或最不适合的模型
判断时先问四个问题:需求明确吗?风险大吗?要分批交付吗?是面向对象吗?
| 题目里出现 | 选 | 易错点 |
|---|---|---|
| 需求明确、稳定;有同类项目经验;替换旧系统、交付期严格(规模再大也一样) | 瀑布模型 | 需求会变、不明确时,它就是“最不适合”的 |
| 需求不清,要有效地捕获需求,让用户先看到样子 | 原型模型 | 超大规模的系统不宜用原型 |
| 分批交付,核心功能先上,尽快构造出可运行的产品 | 增量模型 | “很容易把需求划分成增量”是错的,怎么划分恰恰是难点 |
| 技术含量高、风险多的大型复杂项目 | 螺旋模型 | 唯一显式做风险分析的模型;“开发成本低”是错的 |
| 测试阶段要和开发阶段一一对应 | V 模型 | 详细设计对单元测试,概要设计对集成测试,需求分析对系统测试 |
| 面向对象、以对象为驱动、各阶段之间无间隙 | 喷泉模型 | “各开发活动之间有明显的边界”是错的 |
| 用例驱动、以架构为中心、迭代并且增量 | 统一过程 RUP | 四个阶段:初始、精化、构建、移交,没有“确认阶段” |
| 想尽快投入使用,边用边改 | 演化模型 | 原型的“演化型”就是这个思路:不断完善成产品 |
各阶段按线性顺序逐级下落,前一阶段的输出是后一阶段的输入,也叫文档驱动。适合需求明确、稳定的项目。
易错缺点:缺乏灵活性,难以适应需求变化。需求可能变化时,它就是“最不适合”的那个
怎么记真题口径:需求很明确、有类似项目的经验,哪怕规模很大,也选瀑布;替换旧系统、交付期严格,也选瀑布。反过来,题目一说需求会变、需求不明确,瀑布就是最不适合的。
先快速做出一个可运行的原型给用户试用,再按反馈修改,用原型把真实需求引出来。
易错抛弃型:澄清需求后丢掉;演化型:不断完善成产品。不适合超大规模系统
怎么记用户自己也说不清想要什么时用原型:先做个样子给他看,看了才知道要什么。所以“有效地捕获需求”选原型;但超大规模的系统不宜用原型。
把软件分成一系列增量构件逐个交付,第一个增量往往是核心产品。能快速构造可运行的产品。
易错首版快、风险低;优先级最高的功能先交付、测试最充分。难点:如何划分增量并不容易
怎么记增量模型是近年考得最多的模型。核心功能最先交付,所以它接受的测试最多。陷阱选项:“很容易把需求划分成增量”“有利于进行好的模块划分”,这恰恰是它的难点。
瀑布 + 原型 + 风险分析。每一圈都经过:制定计划、风险分析、实施工程、客户评估。
补充风险驱动,适合大型、复杂、高风险项目,要求开发人员有丰富的风险评估经验
怎么记题干一出现“风险”,先想螺旋。它是唯一显式做风险分析的模型,所以技术含量高、风险多的大项目选它;“开发成本低”“不适合大型软件”都是错误说法。
瀑布的变种:左边自上而下是开发,右边自下而上是测试,测试与开发阶段一一对应。
补充需求分析 — 系统测试
概要设计 — 集成测试
详细设计 — 单元测试
怎么记V 模型说明测试怎样和分析、设计对应:设计越细,对应的测试粒度越小。详细设计对应单元测试,概要设计对应集成测试。
以用户需求为动力,以对象为驱动,适合面向对象的开发方法。
易错“喷泉”体现两个特性:迭代和无间隙(分析、设计、编码之间没有明显边界)
怎么记看到“面向对象”“对象驱动”“无间隙”就选喷泉。“各开发活动之间存在明显的边界”,正是一道真题里的错误选项。
用例驱动、以架构为中心、迭代并且增量。
四个阶段:初始→精化→构建→移交。
易错精化阶段做需求分析和架构演进;第四阶段叫移交不叫确认;“谁做”用角色表述
怎么记统一过程考三件事:三个特征、四个阶段、精化阶段的里程碑是生命周期架构。有的题说有五个阶段,是在最后多加了一个产生阶段。
先在心里说出答案,再点开核对。
题眼是“可能会发生变化”。瀑布模型最大的缺点就是缺乏灵活性、难以适应变化的需求,所以(29)选瀑布,(30)选难以适应变化的需求。
XP 的价值观和实践 · 四个流派的一句话特征
怎么记右边的东西也有价值,只是敏捷更看重左边。
| 流派 | 记住这一句 | 真题 |
|---|---|---|
| 极限编程 XP | 四个价值观:沟通、简单、反馈、勇气;十二个最佳实践 | 09下·36 10下·18 17下·32 |
| 并列争球法 Scrum | 把每段时间(30 天)一次的迭代叫一个冲刺,按需求的优先级实现 | 16下·16 19下·29 |
| 水晶法 Crystal | 每一个不同的项目都需要一套不同的策略、约定和方法论 | 12下·30 15上·30 |
| 自适应软件开发 ASD | 有一个使命作指导,设立项目目标,但不描述如何达到 | |
| 敏捷统一过程 AUP | 在大型上连续,在小型上迭代 |
XP 由价值观、原则、实践和行为四部分组成。四个价值观:沟通、简单、反馈、勇气。
怎么记极限编程是敏捷方法里考得最多的。四个价值观是沟通、简单、反馈和勇气;“好的计划”“持续集成”都不是价值观。
十二个最佳实践如下,黄色的是真题里考过的:
易错里面没有“精心设计”;系统要尽可能早地交付 = 小型发布
怎么记12 个实践要能认出来。常考两种:给描述问是哪个实践,比如系统要尽可能早交付是小型发布;或者问哪个不属于,比如精心设计,XP 主张的恰恰是简单设计。
结对编程:两人共用一台电脑,一人写一人审,相当于非正式的代码审查,代码质量更高。重构:不改变功能和行为,重新组织、简化设计。
易错结对编程不保证编码速度更快
怎么记结对编程是两个人盯着同一段代码,边写边审查;重构是在不改变功能的前提下,把设计改简单,2009 年上半年就考过重构的定义。
使用迭代的方法,把每段时间(30 天)一次的迭代称为一个冲刺,按需求的优先级来实现产品;多个自组织、自治的小组并行递增地实现。
易错包含产品待办列表、冲刺待办列表和冲刺;不包含“重构”
怎么记看到“冲刺”,就选并列争球法,也就是 Scrum。
认为每一个不同的项目都需要一套不同的策略、约定和方法论。
怎么记水晶法:每个项目都不一样,所以各用一套方法论。2012 年下半年和 2015 年上半年考的是同一句话。
自适应软件开发 ASD:有一个使命作为指导,设立项目的目标,但不描述如何达到。敏捷统一过程 AUP:在大型上连续,在小型上迭代。
怎么记ASD 记“使命”:只定目标不定做法。AUP 记一句话:在大型上连续,在小型上迭代。
先在心里说出答案,再点开核对。
题眼是“每一个不同的项目都需要一套不同的策略”,这是水晶法的原话。XP 记价值观和实践,Scrum 记冲刺,ASD 记使命。
五级阶梯 · “已管理”到底是第几级
易错红框是最大的坑:“已管理”在 CMM 是第 4 级,在 CMMI 阶段式是第 2 级。
怎么记顺序按“项目靠什么做成”来记:靠个人 → 靠项目管理 → 靠组织的标准过程 → 靠数据度量 → 靠持续改进。CMMI 的名字对着英文记:第 2 级 Managed 叫“已管理”,第 4 级 Quantitatively Managed 叫“定量管理”;CMM 的第 2 级是 Repeatable(可重复),第 4 级才是 Managed。
| 级别 | 真题里的说法 | 真题 |
|---|---|---|
| 2 可重复级 | 建立了基本的项目管理过程和实践,能跟踪费用、进度和功能特性 | 09上·29 |
| 3 已定义级 | 组织有了标准软件过程;核心是使用标准开发过程构建系统 | 09上·29 |
| 4 已管理级 | 收集详细的度量,对软件过程和产品有定量的理解与控制;重点关注产品和过程质量 | 09下·29 13下·32 |
| 5 优化级 | 过程的量化反馈和新思想、新技术,促使过程持续改进 |
把已有的几个 CMM 模型结合成集成模型,同时支持阶段式和连续式两种表示。
易错“只支持阶段式”“1 级最高 5 级最低”都是错项
怎么记CMMI 同时支持阶段式和连续式,说它只支持阶段式是错的;CMM 一级最低、五级最高,说反了也是错的。
CL0 未完成、CL1 已执行、CL2 已管理、CL3 已定义、CL4 定量管理、CL5 优化。
补充CL1:可标识的输入转换为输出;CL3:过程的组织级标准化和部署;CL5:用量化(统计学)手段优化过程域
怎么记连续式按过程域评定能力等级,一共六级。考过的就是这几个等级的含义:CL1 把输入转成输出,CL3 关注组织级标准化和部署,CL5 用统计学手段优化。
先在心里说出答案,再点开核对。
对产品和过程有定量的理解和控制,是第四级已管理级,所以重点关注产品和过程质量的是 C。
需求分三类 · 分析阶段交出什么
| 类别 | 一句话 | 真题里的例子 |
|---|---|---|
| 功能需求 | 系统要做什么 | 每个月特定的时间发放员工工资(17下·19) |
| 非功能需求 | 产品必须具备的属性或品质:要做到多好 | 3 秒内对用户请求作出响应;并发用户数、计算精度、可靠性(13上·18) |
| 设计约束 | 对解决方案的限制 | 必须使用某种数据库、某种运行环境 |
易错带具体数字指标的(响应时间、并发数、精度)基本都是非功能需求。
系统必须完成的功能:要做什么事。例:每个月特定的时间发放员工工资。
怎么记功能需求说系统要做什么事,比如每个月特定的时间发放工资。
产品必须具备的属性或品质:性能、可靠性、安全性、响应时间、计算精度、并发用户数……
补充带具体指标的往往是非功能需求:“3 秒内对用户请求作出响应”
怎么记非功能需求说系统要做到多好。判断技巧:带具体指标的,比如三秒内响应、一百个用户同时查询,往往是非功能需求。
对解决方案的限制:必须使用某种技术、某种数据库或运行环境。
补充按层次另分:业务需求、用户需求、系统需求
怎么记设计约束限制你怎么做,比如必须用某种数据库。另一种分法是按层次:业务需求、用户需求、系统需求。
面向数据流,指导思想是自顶向下、逐层分解,基本原则是功能的分解与抽象;特别适合数据处理领域。
易错不适合大规模、特别复杂的项目,难以适应需求变化
怎么记结构化方法特别适合数据处理领域;说它比面向对象更适合大规模、特别复杂的项目,是错的。
分层的数据流图、一本数据字典、一组加工逻辑说明(小说明)、补充材料。
易错结构图、软件体系结构图是设计阶段的产物,不属于分析结果
怎么记分析阶段交四样东西:数据流图、数据字典、加工逻辑说明和补充材料。模块结构图、体系结构图都是设计阶段的。
数据流、数据项、数据存储、基本加工。
易错符号:= 定义为,+ 与,[ | ] 或,{ } 重复,( ) 可选;外部实体不是数据字典条目
怎么记数据字典给数据流图里的每个元素下定义,四类条目是数据流、数据项、数据存储和基本加工。
每个基本加工都要有一个,描述把输入数据流变换为输出数据流的加工规则。
易错不必描述实现加工的具体流程;多个条件组合时用判定表、判定树最清楚
怎么记加工规格说明只写规则,不写实现。“必须描述实现加工的具体流程”就是错的;动作依赖多个条件的组合时,用判定表或判定树。
先在心里说出答案,再点开核对。
需求不清、经常变化、规模又不大,用原型化方法;数据处理领域、需求变化也不大,用结构化方法。
两条 7 级阶梯 · 按描述认类型
耦合看模块之间,越低越好;内聚看模块内部,越高越好。设计目标永远是高内聚、低耦合。
为什么是这个顺序:从上到下,两个模块共享的东西越来越多、越来越“私密”——什么都不传 → 传一个值 → 传一整个结构 → 传控制信号去指挥对方 → 共用一个全局变量 → 共用一大块全局数据 → 直接闯进对方内部。
易错耦合度取决于接口的复杂性、调用方式和传递的信息,与模块里有几个功能无关。
为什么是这个顺序:从上到下,模块里的东西“待在一起的理由”越来越弱——为了同一个功能 → 上一步的输出给下一步 → 用的是同一份数据 → 只是要按某个次序做 → 只是同一时间做 → 只是功能长得像、靠参数挑一个 → 毫无理由,凑在一起。
易错偶然内聚最低:不易理解、不易修改和维护,还会影响模块间的耦合(17上·34)。教程第 10 章写的是“功能、信息、通信……”,第 2 级换成了信息内聚;真题按这一页的“功能、顺序、通信……”出。
先在心里说出答案,再点开核对。
语句之间没有任何联系,是巧合内聚,也就是偶然内聚,(33)选 A。它内聚最低、不易理解、不易维护,还会影响模块间的耦合,所以(34)不正确的是 D。
概要 vs 详细 · 作用范围 · 两个反例
| 说法 | 对错 |
|---|---|
| 模块的作用范围应在其控制范围之内 | 对 |
| 模块的控制范围应在其作用范围之内 | 错:记反了 |
| 模块的大小适中;结构图的深度、宽度、扇入、扇出都适中 | 对 |
| 顶层扇出较大,中层扇出较小,底层扇入较高 | 对 |
| 避免或减少病态连接(从中部进入或访问一个模块);减少高扇出 | 对 |
| 完善模块的功能 | 对 |
| 模块的功能越单纯越好、模块越小越好 | 错:模块太多,接口变复杂 |
| 把相似功能的模块合并 | 错:会形成逻辑内聚 |
怎么记两个反例最常考:模块功能越单纯越好,会让模块太多;把相似功能的模块合并,会形成逻辑内聚。这两种做法都不能改进设计质量(16上·31、17上·32)。
概要设计:划分子系统和模块、确定模块之间的调用关系,做体系结构、接口和数据设计。详细设计:每个模块内部的算法和数据结构。
易错“项目范围”不是设计模型关注的内容
怎么记确定模块划分和调用关系,是概要设计;模块内部用什么数据结构和算法,是详细设计。
数据流图 → 体系结构设计、接口设计;数据字典、E-R 图 → 数据设计;加工规格说明 → 过程设计。
补充接口设计:软件与外部环境、模块之间的交互和调用关系;过程设计 = 数据结构和算法的设计
怎么记接口设计依据数据流图,这一条考过好几次;过程设计主要是对数据结构和算法的设计。
控制范围:模块本身及所有下属模块。作用范围:受该模块内一个判定影响的模块。作用范围应在控制范围之内。
易错超出时把判定上移,或把受影响的模块下移;“将父模块下移”不对
怎么记一个模块的作用范围要在它的控制范围之内,千万别记反成“控制范围在作用范围之内”,那是一道真题的错误选项。
扇出:直接调用的下级模块数;扇入:直接调用它的上级模块数。好的结构:顶层扇出大,中层扇出小,底层扇入高。
补充深度、宽度、扇入、扇出都要适中,尽量减少高扇出
怎么记结构图的深度、宽度、扇入、扇出要适中,好的结构是顶层扇出较大、底层扇入较高。
传入:取得数据交给别人;传出:输出数据;变换:从上级拿数据,加工后返回上级;协调:只调用和协调其他模块。
补充结构图的基本成分:模块、调用、数据
怎么记模块 B 拿到成绩,算出平均分和最高分再返回给模块 A,B 就是变换模块。
数据流分变换流和事务流,一个系统往往两种都有。程序的三种基本控制结构:顺序、选择、重复。
补充N-S 盒图强制结构化;PAD 是二维树形结构;PDL 伪代码可嵌入源程序
怎么记“一个软件系统只有一种数据流类型”是错的;程序的三种基本控制结构是顺序、选择和重复。
先在心里说出答案,再点开核对。
前三项都是好原则;模块的功能越单纯越好,会让模块数量太多、接口变复杂,不能改进设计质量,选 D。
五大类 · 管道过滤器 · 仓库 · C/S 与 B/S · MVC
| 大类 | 包括 | 一句话 |
|---|---|---|
| 数据流风格 | 批处理序列、管道-过滤器 | 数据一站一站往下流 |
| 调用/返回风格 | 主程序-子程序、面向对象、层次结构 | 调用别人,拿回结果 |
| 独立构件风格 | 进程通信、事件驱动(也叫隐式调用) | 构件之间不直接调用,靠消息或事件 |
| 虚拟机风格 | 解释器、基于规则的系统 | 自己造一个运行环境来执行 |
| 仓库风格 | 数据库系统、黑板系统、超文本系统 | 所有构件都围着中央数据读写 |
易错编译器不属于仓库风格(16上·33);“维护只在服务器端”是 B/S 的优点,不是 C/S 的(17上·31)。
优点:构件高内聚、低耦合,支持重用,易维护和扩展,支持并行执行。缺点:容易变成批处理结构,不适合交互式应用,数据转换开销使性能下降。
怎么记管道过滤器像流水线,数据一站一站往下流。“提高性能”“适合交互式应用”都是错的。
其他构件都对中央数据结构读写。包括数据库系统、黑板系统、超文本系统。
易错优点:多方法求解、可更改可维护、可复用的知识源、容错健壮;缺点:测试困难、效率低;编译器不属于仓库风格
怎么记仓库风格测试困难,因为执行顺序不确定、结果难再现。数据库、黑板、超文本都属于它,编译器不属于。
三层 C/S:表示层、功能层、数据层,各层可灵活选平台和语言,并行开发。B/S:客户端只要浏览器,安装、修改和维护都只在服务器端。
易错“维护只在服务器端”是 B/S 的优点,不是 C/S
怎么记一道真题把 B/S 的优点混进了 C/S 的选项:系统的安装、修改和维护只在服务器端,这是 B/S。
模型:业务逻辑和数据;视图:只负责展示;控制器:接收请求,调用模型,选择视图。
易错优点:代码重用、开发效率和可维护性高;不能提高运行效率
怎么记MVC 把系统分成模型、视图和控制器。它的好处是重用和可维护,运行效率并不会因此提高。
先在心里说出答案,再点开核对。
安装、修改和维护都只在服务器端进行,是 B/S 结构的特点,不是 C/S,所以选 D。