期末复习

专题(二):软件工程

2026 年 06 月 18 日 约 3374 字 · 9 分钟 期末复习

软件工程与软件开发方法

软件工程概论

软件定义及特点

  1. 软件的定义:计算机程序、规程以及可能的相关文档和数据的总称。

    • 程序:运行时能提供期望功能和性能的指令序列。

    • 数据结构:使程序能恰当处理信息的数据结构定义。

    • 文档:描述程序操作和使用的各类手册与设计指南。

  2. 软件的分类

    • 系统软件:如操作系统、编译器,提供运行环境。

    • 应用软件:解决特定业务或个人需求(如 ERP、移动 App)。

    • 中间件:位于系统软件与应用软件之间,起连接和协调作用(如消息队列、连接池)。

  3. 软件的八大特点

    • 抽象性:逻辑实体,不可见,需借助模型、图表表达。

    • 设计开发而非传统制造:核心是设计质量,重用与复制成本几乎为零。

    • 不会磨损但会退化:由于环境变更或维护修改引入新错,导致系统演化退化。

    • 高成本与高风险:属于高智力密集型投入,技术与需求失误风险大。

    • 复杂性:现代软件包含数百万行代码及众多并发、接口逻辑,难以穷尽验证。

    • 易于复制但难于维护:修改的影响难以评估,维护成本通常远超开发成本。

    • 依赖运行环境:高度依赖软硬件生态,需具备良好的可移植性。

    • 持续演化:遵循莱曼定律(Lehman’s Laws),系统必须持续调整,否则逐渐失效。

软件发展阶段与软件危机

  1. 软件发展的四个阶段

    • 程序设计时代(1946-1950中):手工作坊模式,依附硬件,无文档,无重用性。

    • 软件作坊时代(1950中-1960末):项目形式出现,缺乏规范管理,“软件危机”爆发。1968 年正式提出“软件工程”概念。

    • 软件工程时代(1970-1980):学科确立,结构化方法与生命周期模型(如瀑布模型)广泛应用,强调文档规范。

    • 现代软件工程时代(1990至今):面向对象技术成熟,敏捷开发、DevOps、微服务及云计算融入,追求快速交付与高质量的平衡。

  2. 软件危机(Software Crisis)

    • 核心定义:在软件开发和维护过程中所面临的一系列普遍存在的严重进度、成本和质量失控的问题。

    • 主要表现:进度与成本失控、产品质量低劣、维护极其困难、可移植性差、文档缺失或不规范。

    • 产生原因:软件本身的抽象与高度复杂性;开发方式落后(依赖个人技艺);需求不明确且频繁变化;缺乏有效的工程管理方法。

软件工程的产生和定义

  1. 根本举措:确立软件工程学科,引入工程化方法,将软件开发从依赖个人技艺的“艺术创作”转变为系统化、规范化、可量化的“工程建造”。

  2. 工程思想的核心特征

    • 目的性:以解决实际问题、创造社会价值为终极评判标准。

    • 系统性:强调用例、接口、整体性能的系统观念,避免局部最优。

    • 权衡性:在资源、技术、法律等多重约束下寻找折中(足够好)的解决方案

    • 实践性:一切理论和模型最终都要接受可运行、可验证的实物检验。

    • 过程性:遵循规范化的通用流程(分析-设计-实现-测试-维护)。

  3. 软件工程定义:将系统化的、规范的、可量化的方法应用于软件的开发、运行和维护,即将工程化方法应用于软件;以及对上述方法的研究。

  4. 布鲁克斯“没有银弹”理论(No Silver Bullet)

    • 软件开发的根本困难在于其本质性工作(Conceptual Essence)——即构造复杂的概念抽象本身;而语法、编译等属于附属性工作(Accidental Overhand)

    • 结论:在可预见的时期内,没有任何单一的技术或管理手段,能独立带来软件生产率或可靠性数量级上的跃升。进步来自系统性、持续性的积累和优化。

软件生命周期 (SDLC)

软件生命周期定义

指从软件项目的概念提出,到最终停止使用的全过程。它提供了一个结构化的框架,通过按部就班、逐步推进的方式,确保每个阶段均有定义、工作、审查和文档。

核心阶段划分

  1. 定义及规划阶段(规划):评估“值不值得做”。进行可行性研究(技术、经济、操作、法律),输出《项目开发计划》、《可行性研究报告》。

  2. 需求分析阶段(分析):确定“系统必须做什么”。进行需求获取与建模(用例图、数据流图等),输出核心文档 《软件需求规格说明书》(SRS)

  3. 设计阶段(设计):确定“系统应该怎么做”。

    • 架构设计(概要设计):技术选型、模块结构、接口与部署方案。

    • 详细设计:数据库结构、用户界面、算法逻辑。

  4. 编码阶段:将设计图纸转化为程序代码。编写代码并进行单元测试与代码审查,输出源代码。

  5. 测试阶段:全面验证质量。进行集成测试(接口交互)、系统测试(功能、性能、安全等)和用户验收测试(UAT)

  6. 运行与维护阶段:保障系统长期稳定。包含纠正性维护(修错)、适应性维护(换环境)、完善性维护(加功能)和预防性维护(重构优化)。系统不再适用时进行退役销毁。

主要软件开发过程模型

瀑布模型 (Waterfall Model) —— 1970

  • 核心思想:生命周期划分明确,严格顺序执行,阶段间强文档驱动,前一阶段完成并评审后方可进入下一阶段。

  • 适用场景:需求明确、技术成熟、变更控制极其严格的项目。

原型模型 (Prototyping Model)

  • 核心思想:针对需求模糊的问题,快速构建一个可运行的初始原型,通过用户实际操作的反馈来澄清和提炼真实需求,进行迭代修正。

  • 适用场景:需求极不明确、交互复杂、用户参与度高的项目。

增量模型 (Incremental Model)

  • 核心思想:将系统划分为多个可独立交付的增量模块。每个增量单独经历完整的生命周期,按优先级逐块开发并交付,允许用户早期获得部分核心价值。

  • 适用场景:大型复杂系统、产品线开发、有明确早期交付压力和核心功能划分的项目。

螺旋模型 (Spiral Model) —— 1988

  • 核心思想:结合瀑布、原型与增量思维,将开发过程视为一个不断循环的螺旋。每一圈均包含:目标设定、风险分析(显式核心活动)、开发与验证、下一轮计划。

  • 适用场景:大型、复杂、技术创新且高风险的项目。

V 模型 (V-Model)

  • 核心思想:瀑布模型的变体,严格将开发阶段与对应的测试/验证阶段形成 V 字形对齐追溯关系(单元测试对齐编码、集成测试对齐详细设计、系统测试对齐概要设计、验收测试对齐需求分析)。

  • 适用场景:对质量和安全性要求极高的系统(如医疗电子、汽车控制等安全关键系统)。

统一过程 (RUP) —— 1990年代末

  • 核心思想:面向对象开发方法的总结。将全生命周期划分为初始、细化、构建、移交四个阶段。核心原则为:用例驱动、以架构为中心、迭代增量开发

  • 适用场景:大型面向对象开发、企业级商业系统。

敏捷开发 (Agile Development) —— 2001

  • 核心思想:对重型过程的反思,遵循《敏捷宣言》四大价值观和十二条原则。提倡迭代协作与自组织。包含 Scrum(冲刺与自组织)、XP(测试驱动开发/结对编程工程实践)和 Kanban(可视化流限制 WIP)等具体方法。

  • 适用场景:互联网产品、创业项目、市场需求变更频繁的数字化应用。

模型对比与选择矩阵

模型核心特征优势局限适用场景
瀑布模型严格顺序、线性、文档驱动结构清晰、阶段明确、易于规范化管理缺乏灵活性,用户反馈滞后,后期返工代价极高需求确定、技术成熟稳定、变更控制严的项目
原型模型快速构建演化、高频反馈能有效明确模糊需求,减少沟通理解偏差管理不当易陷入无限期修改,原型易被误指为成品需求模糊、人机交互复杂的系统设计
增量模型模块分块交付、逐步向外完善用户可尽早投入实用,降低一次性交付风险极度依赖强大的软件整体架构设计能力,集成难度大大型系统、核心价值需提前释放的项目
螺旋模型螺旋式循环、风险驱动显式的风险管理前置,可根据风险灵活裁剪模型风险评估成本高,对管理人员经验与能力要求极苛刻投资庞大、高度复杂的创新性高风险项目
V 模型阶段水平映射、开发测试对称测试活动同步规划,具有极强的可追溯性与 V&V与瀑布类似,依然属于刚性结构,难以应对中途变更质量保证要求极其严苛的安全关键系统
RUP阶段划分、用例驱动、架构中心提供了面向对象完整的规范框架,构件可复用框架过于庞大,实施成本高,不适于中小型项目复杂的大型商业系统与分布式软件工程
敏捷开发短周期迭代、跨职能自组织响应变化极快,沟通效率高,持续交付可用增量对团队自律性要求过高,文档少不利于长期维护交接需求频繁变动的互联网产品及创业孵化项目

📌 系统分析员决策提示

实际工程中没有唯一完美的模型。通常需要根据项目规模、需求确定性、技术风险、团队经验和用户参与度进行混合模型裁剪(例如:在增量模型的整体框架下,利用原型法确定具体模块需求,并在编码阶段导入敏捷的持续集成实践)。