概论
一、软件与软件危机
1.1 软件的定义与特性
- 定义:软件是程序、数据及相关文档的完整集合。IEEE进一步定义为“计算机程序、方法、规则、相关文档资料以及在计算机上运行时必需的数据”。
- 三要素:程序(可执行指令序列)、数据(支持程序处理的结构化信息)、文档(开发与维护的图文资料)。
- 特性:逻辑实体(无物理形态)、无磨损性(长期使用不老化)、高维护成本(需持续迭代)、规模复杂性(随需求增长指数级上升)。
1.2 软件危机的表现与成因
- 七大典型表现:
- 成本与进度估算严重偏差;
- 客户需求频繁变更或无法满足;
- 软件质量不可靠;
- 维护困难甚至不可维护;
- 文档缺失或不合规范;
- 软件成本占比逐年攀升;
- 开发效率无法匹配需求增速。
- 核心原因:
- 客观因素:软件规模庞大、复杂性高、需求易变;
- 主观因素:忽视需求分析与文档、轻视测试与维护、开发方法落后。
- 典型案例:IBM OS/360因文档管理失误导致调试时间增加一年,美国银行信托软件超预算3倍仍未完成。
1.3 软件危机的解决途径
- 工程化方法:引入分阶段生命周期管理,强调团队协作与规范流程;
- 技术革新:采用结构化设计、面向对象方法及自动化工具(如需求分析工具、测试框架);
- 管理优化:建立严格的阶段评审机制,实行产品版本控制。
二、软件工程的基本概念
2.1 软件工程的定义
- NATO定义:为经济地获得可靠且高效运行的软件,建立和使用完善的工程原理。
- IEEE定义:
- 将系统化、规范的方法应用于软件开发全流程;
- 研究上述方法的学科。
2.2 软件工程的本质特征
- 大型程序开发:关注微/小/中/大/甚/极规模的软件系统;
- 复杂性控制:通过模块化、抽象化降低系统复杂度;
- 需求管理:应对需求不确定性与易变性,强调敏捷响应;
- 工具与方法:依赖高效工具链(如IDE、项目管理平台)提升开发效率;
- 团队协作:跨职能团队需高效沟通与协作(如Scrum每日站会)。
2.3 软件工程的基本原理
- 生命周期管理:分阶段(定义、开发、维护)严格控制进度;
- 阶段评审:每阶段结束需通过质量审查(如需求评审、设计评审);
- 产品控制:采用版本控制系统(如Git)管理代码变更;
- 现代技术应用:引入设计模式、测试驱动开发(TDD)等先进方法;
- 结果可审查:确保每个阶段输出可验证(如单元测试覆盖率达标)。
三、软件生命周期与开发模型
3.1 软件生命周期
- 三时期八阶段:
- 软件定义:问题定义(明确目标)→可行性研究(技术/经济/社会评估)→需求分析(功能/性能规格);
- 软件开发:总体设计(架构规划)→详细设计(模块细化)→编码与单元测试(实现与单模块验证)→综合测试(集成与系统测试);
- 软件维护:纠错性维护(修复缺陷)、适应性维护(环境变更)、完善性维护(功能增强)、预防性维护(优化架构)。
3.2 软件开发模型
3.2.1 瀑布模型
- 特点:线性顺序执行,阶段间严格依赖(需求→设计→编码→测试→维护);
- 适用场景:需求明确、技术成熟的传统项目(如政府系统);
- 局限性:灵活性差,需求变更成本高。
3.2.2 敏捷开发
- 核心原则:个体交互>流程工具,可工作软件>详尽文档,客户合作>合同谈判,响应变化>遵循计划;
- 典型方法:Scrum(短周期迭代)、极限编程(XP,强调测试驱动与结对编程);
- 适用场景:需求频繁变更的互联网产品(如电商平台)。
3.2.3 螺旋模型
- 特点:风险驱动,每轮迭代包含计划、风险分析、实施、评审四阶段;
- 适用场景:高风险项目(如航空航天软件)。
3.2.4 增量模型
- 特点:分批次交付功能模块,逐步完善系统;
- 适用场景:模块化清晰、可分阶段发布的系统(如企业ERP)。
四、软件工程方法学
4.1 方法学三要素
- 方法:结构化分析与设计、面向对象方法等;
- 工具:UML建模工具(如Rational Rose)、项目管理工具(如Jira);
- 过程:定义开发活动的流程与规范(如RUP统一过程)。
4.2 传统方法学 vs 面向对象方法学
- 传统方法学:以功能分解为核心,适合稳定需求场景(如银行核心系统);
- 面向对象方法学:以对象为中心,强调封装、继承、多态,提高可维护性与复用性(如大型游戏开发)。
五、学科发展与趋势
5.1 发展历程
- 萌芽期(1940s-1960s):程序设计个体化,缺乏规范;
- 危机期(1960s-1970s):软件规模膨胀,引发“软件危机”,软件工程概念诞生;
- 工程化期(1970s-1990s):结构化方法与工具普及,开发效率提升;
- 现代化期(2000s至今):敏捷开发、DevOps兴起,强调持续交付与用户体验。
5.2 未来趋势
- 智能化:AI辅助代码生成(如GitHub Copilot)、自动化测试;
- 云原生:微服务架构、容器化部署(如Docker+Kubernetes);
- 安全前置:开发全流程嵌入安全测试(如SAST/DAST工具)。
总结
第一章系统阐述了软件工程的核心概念,从软件危机的根源到工程化解决方案,再到生命周期与开发模型的实践,为后续学习奠定了基础。理解这些内容,有助于在实际项目中选择合适的开发策略,平衡效率、质量与成本的关系。