### 软件与软件工程知识点详解
#### 第1章 软件与软件工程
##### 1.1 软件与软件工程定义
**软件**是指一系列按照特定顺序组织的计算机数据和指令,通常分为系统软件和应用软件两大类。
**软件工程**是一种系统化、规范化的软件开发与维护方法,它借鉴了传统工程的原则,旨在提高软件质量、降低开发成本、缩短开发周期。
##### 1.2 软件危机的原因
1. **需求不明确**:需求经常变化,且难以准确捕获。
2. **缺乏有效的管理方法**:项目管理不善导致资源浪费。
3. **技术限制**:技术的发展速度跟不上需求的增长速度。
4. **代码维护困难**:软件规模庞大,修改一处可能导致其他地方出现问题。
##### 1.3 瀑布模型及其特点
**瀑布模型**是一种经典的软件开发过程模型,它将软件生命周期划分为若干个阶段,如需求分析、设计、编码、测试和维护等,每个阶段只有在前一个阶段完成后才能开始。
**特点**:
- **线性顺序**:各个阶段按顺序执行。
- **不可回溯**:一旦进入下一阶段,则无法返回上一阶段进行修改。
- **文档驱动**:每个阶段都需要详细的文档记录。
- **适用于需求明确的项目**:适用于需求较为稳定、明确的项目开发。
##### 1.4 螺旋模型及其特点
**螺旋模型**是一种迭代式的过程模型,它结合了瀑布模型的线性序列特性以及原型模型的迭代特性。
**特点**:
- **风险分析**:每个迭代周期都要进行风险评估。
- **灵活适应需求变化**:允许在项目的任何阶段改变需求。
- **四个基本活动**:制定计划、风险分析、实施工程和客户评估。
- **适用于大型复杂项目**:特别适合于大型复杂项目的开发。
##### 1.5 原型模型及其特点
**原型模型**是一种以快速构建可运行的原型为主要特点的开发方法,通过不断迭代改进原型直至满足用户需求。
**特点**:
- **快速构建**:快速构建初始版本供用户测试。
- **用户反馈**:用户参与整个开发过程,提供反馈。
- **逐步完善**:根据用户反馈逐步完善产品。
- **适用于需求不确定的项目**:适合于需求变化较大或不明确的项目。
#### 第2章 软件项目管理
##### 2.1 自底向上的成本估算法的特点
**自底向上成本估算法**是一种通过详细分析项目组成部分的成本,然后汇总起来得出总成本的方法。
**特点**:
- **详细分析**:需要对项目中每个工作包进行详细分析。
- **精确度高**:由于考虑了项目的所有细节,因此精确度较高。
- **耗时较长**:需要花费大量时间进行详细分析。
- **依赖于历史数据**:对以往类似项目的成本数据依赖性较强。
##### 2.2 成本估算示例
假设某项目总的功能点(FP)估算值为310,基于过去项目的人均月生产率为5.5 FP,项目总成本的估算值为560,000元。
**月均人力成本计算公式**:\[ \text{月均人力成本} = \frac{\text{项目总成本}}{\text{项目总功能点} / (\text{人均月生产率} * \text{月份数})} \]
代入数字:\[ \text{月均人力成本} = \frac{560,000}{310 / (5.5 * \text{月份数})} \]
假设项目预计持续X个月,则:\[ \text{月均人力成本} = \frac{560,000}{\frac{310}{5.5X}} = \frac{560,000 * 5.5X}{310} \]
根据具体情况调整X值进行计算。
##### 2.3 CMM介绍
**CMM(Capability Maturity Model)**能力成熟度模型,是一种用于评估软件开发团队能力和成熟度的模型,共分为五个级别:
- **初始级(Level 1)**:项目管理不稳定,缺乏明确的管理策略。
- **可重复级(Level 2)**:项目管理有了一定的基础,能够重复过去的成功经验。
- **已定义级(Level 3)**:项目管理过程标准化,形成了一套明确的规定。
- **已管理级(Level 4)**:项目管理过程不仅标准化,而且量化管理。
- **优化级(Level 5)**:项目管理过程达到最优状态,能够持续改进。
##### 2.4 McCabe复杂性度量
**McCabe复杂性度量**,也称为环路复杂度,是衡量程序逻辑复杂性的指标之一,主要用于评估程序中的控制结构复杂度。
**计算公式**:\[ V(G) = E - N + 2P \]
其中,E为边的数量,N为节点数量,P为连通图的数量。一般情况下,P=1。
#### 第3章 需求分析基础
##### 3.1 自顶向下,逐步求精
**自顶向下**是从宏观的角度出发,先确定系统的整体结构,再逐步细化至具体细节。
**逐步求精**是在每个层次上不断细化问题,直到可以实现为止。
**特点**:
- **易于理解**:从宏观到微观的分析方法使得需求更易于理解和把握。
- **灵活性强**:可以根据实际情况调整细化程度。
- **有助于问题分解**:将复杂问题分解为多个较小的子问题。
##### 3.2 数据流图与数据字典
**数据流图(DFD)**是一种图形化工具,用于描述系统中数据的流动和处理过程。
**数据字典**是对DFD中的每个数据元素进行详细描述的集合。
以银行计算机储蓄系统为例,可以通过绘制DFD来展示数据流以及数据处理过程,并建立相应的数据字典来详细描述每个数据元素。
##### 3.3 成绩管理系统案例分析
根据题目描述,可以采用结构化方法对这个系统进行分析与设计。
**步骤**:
1. **需求分析**:明确系统的主要功能,包括记录和管理学生的平时成绩和考试成绩等。
2. **顶层数据流图**:从宏观角度描述系统与外部实体之间的数据流关系。
3. **分层数据流图**:进一步细化数据流图,详细描述系统内部的数据处理过程。
4. **数据字典**:对DFD中的数据元素进行详细定义。
**案例说明**:
- **顶层数据流图**:展示系统与外部实体(如学生、教师、教务处等)之间的交互关系。
- **分层数据流图**:细化描述系统内部如何处理成绩数据,例如平时成绩的录入、有效性验证、存储等。
- **数据字典**:定义数据元素,如学生信息、成绩信息、课程信息等。
#### 第4章 软件设计基础
##### 4.1 软件体系结构
**软件体系结构**是指软件的基本结构、组件及组件之间的相互作用方式。
**常见的软件体系结构类型**:
- **客户端/服务器(Client/Server)**
- **浏览器/服务器(Browser/Server)**
- **分布式(Distributed)**
- **微服务(Microservices)**
- **面向服务架构(Service-Oriented Architecture, SOA)**
##### 4.2 “高内聚低耦合”的含义
**高内聚**:模块内部高度相关,紧密协作,执行单一功能。
**低耦合**:模块之间相对独立,相互间依赖性较低。
**实现方法**:
- **模块化设计**:将软件划分成独立的模块,每个模块具有单一的功能。
- **接口设计**:通过清晰的接口定义,减少模块间的直接依赖。
- **抽象化**:通过抽象隐藏不必要的细节,减少模块间的直接耦合。
##### 4.3 结构化程序设计
结构化程序设计强调程序结构的清晰性和模块化。
**流程图**、**N-S图**和**PAD图**都是用来表示程序结构的不同形式。
**流程图**:通过图形符号表示程序的控制流。
**N-S图**:采用矩形框表示程序块,更直观地显示程序结构。
**PAD图(Programmable Array Diagram)**:类似于树状结构,用来表示程序的层次结构。
**McCabe复杂性度量**:通过计算环路复杂度来衡量程序的复杂度。
以上内容覆盖了软件工程的基本概念、常用模型、项目管理技巧以及需求分析和设计的基础知识,为软件开发提供了全面的指导和支持。