《软件工程》-第 1 章 软件与软件工程
1.1 软件的概念
1.1.1 软件与软件的组成
软件定义:软件是程序、数据及相关文档的集合,是计算机系统的逻辑部分。
组成结构:
- 程序:用特定编程语言编写的代码集合(如 Java、Python)。
- 数据:程序处理的信息载体(如数据库表、配置文件)。
- 文档:开发、使用和维护的说明(如需求规格说明书、用户手册)。
案例代码:简单计算器程序(Python)
# 计算器程序:实现加减乘除功能
class Calculator:def add(self, a, b):"""加法运算"""return a + bdef subtract(self, a, b):"""减法运算"""return a - bdef multiply(self, a, b):"""乘法运算"""return a * bdef divide(self, a, b):"""除法运算(处理除零异常)"""if b == 0:raise ValueError("除数不能为零")return a / b# 示例用法
if __name__ == "__main__":calc = Calculator()print(f"5 + 3 = {calc.add(5, 3)}") # 输出:8print(f"5 - 3 = {calc.subtract(5, 3)}") # 输出:2
1.1.2 软件生存周期
定义:软件从需求分析到退役的整个过程,通常包括以下阶段:
- 需求分析:确定用户功能与非功能需求(如性能、安全性)。
- 设计阶段:分为架构设计(如 MVC 模式)和详细设计(如类图、流程图)。
- 开发阶段:编码实现功能(参考 1.1.1 案例)。
- 测试阶段:单元测试、集成测试、系统测试(如计算器的边界值测试)。
- 部署与维护:发布上线并持续优化(如修复 bug、功能扩展)。
流程图:软件生存周期模型
1.1.3 软件的特点
特点 | 说明 |
---|---|
逻辑实体 | 无形,依赖硬件运行(区别于物理产品)。 |
复杂性高 | 涉及算法、数据结构、用户需求等多维度复杂度(如操作系统内核)。 |
易修改性 | 通过版本控制工具(如 Git)支持迭代开发(见 1.6.1 软件工具)。 |
成本集中于开发 | 开发成本高,复制成本极低(如 App Store 应用分发)。 |
1.1.4 几类常用的软件
- 系统软件:管理硬件资源(如 Windows、Linux 操作系统)。
- 应用软件:解决特定领域问题(如微信、Photoshop)。
- 中间件:连接不同系统(如 Tomcat 服务器、消息队列 RabbitMQ)。
1.1.5 软件的质量
核心指标:
- 功能性:满足需求的程度(如计算器能否正确计算)。
- 可靠性:无故障运行时间(如电商系统在大促期间的稳定性)。
- 易用性:用户学习成本(如界面是否友好)。
- 可维护性:修改代码的难易度(依赖代码注释、设计模式)。
1.1.6 软件的安全与保护
常见措施:
- 代码审计:使用 SonarQube 扫描漏洞(如 SQL 注入、越权访问)。
- 数据加密:对敏感信息加密存储(如用户密码用 BCrypt 哈希)。
- 知识产权保护:通过软件著作权登记、开源协议(如 MIT、GPL)约束使用。
1.2 软件工程的概念
1.2.1 软件工程的定义
IEEE 定义:应用系统的、规范的、可量化的方法来开发、运行和维护软件。
1.2.2 软件工程的发展
阶段演进:
- 程序设计时代(1940-1960):机器语言编程,无系统化方法。
- 软件危机时代(1960-1980):需求膨胀导致进度延期、成本超支(如 IBM OS/360 项目)。
- 软件工程时代(1980 至今):引入瀑布模型、面向对象方法、敏捷开发等。
1.2.3 软件工程的目标和原则
目标:在预算内按时交付高质量软件。
原则:
- 模块化:将系统拆分为独立模块(如计算器的加减乘除功能分离)。
- 信息隐藏:封装内部实现细节(如类的私有属性)。
- 增量开发:分阶段实现功能(如先开发计算器的加减功能,再迭代乘除)。
1.2.4 软件开发的主要方法
方法 | 核心思想 |
---|---|
结构化方法 | 自顶向下、逐步求精(如数据流图 DFD 建模)。 |
面向对象方法 | 以对象为核心,封装数据与行为(如计算器类 Calculator)。 |
敏捷开发 | 快速迭代、响应变化(见 1.4 节详细解析)。 |
1.3 软件过程模型
1.3.1 瀑布模型
特点:阶段顺序执行,适用于需求明确的项目(如政府定制软件)。
流程图
1.3.2 增量过程模型
特点:分批次交付功能(如第一阶段实现计算器基本运算,第二阶段增加历史记录功能)。
1.3.3 原型建造模型
案例:用 Axure 快速设计计算器界面原型,收集用户反馈后再开发。
1.3.4 螺旋模型
核心:引入风险评估,适用于高风险项目(如航天软件)。
1.3.5 基于构件的过程模型
实践:使用 Spring 框架的 Bean 组件快速搭建企业级应用。
1.3.6 通用软件过程模型
模板:
- 需求捕获与分析
- 系统设计(架构 + 详细设计)
- 构件开发与测试
- 系统集成与验收
1.4 敏捷软件开发原则和应用
1.4.1 敏捷软件开发原则
核心价值观(《敏捷宣言》):
- 个体和互动 > 流程和工具
- 可工作的软件 > 详尽的文档
- 客户合作 > 合同谈判
- 响应变化 > 遵循计划
1.4.2 敏捷工程过程的极限编程(XP)
实践方法:
- 结对编程:两人共同开发一段代码(如一人编写计算器测试用例,一人实现功能)。
- 测试驱动开发(TDD):先写测试代码,再实现功能。
TDD 案例:计算器除法测试(Python unittest)
import unittest
from calculator import Calculator # 导入1.1.1中的计算器类class TestCalculator(unittest.TestCase):def setUp(self):self.calc = Calculator()def test_divide_normal(self):"""测试正常除法"""self.assertEqual(self.calc.divide(6, 3), 2)def test_divide_by_zero(self):"""测试除零异常"""with self.assertRaises(ValueError):self.calc.divide(5, 0)if __name__ == "__main__":unittest.main()
1.4.3 敏捷软件开发过程的应用
工具链:
- Jira:任务管理与跟踪
- Confluence:团队协作文档
- Jenkins:持续集成 / 部署(CI/CD)
1.5 软件工程人的因素
1.5.1 软件工程教育
核心课程:
- 数据结构与算法
- 操作系统
- 数据库系统
- 软件工程导论
1.5.2 软件工程学科
知识领域(SWEBOK 指南):
- 软件需求
- 软件设计
- 软件构造
- 软件测试
- 软件维护
1.6 软件工程开发过程中的职业
1.6.1 软件工具
常用工具:
- 开发工具:IDEA、VS Code
- 版本控制:Git、GitHub
- 测试工具:Postman、Selenium
1.6.2 软件开发环境
集成环境(IDE):
- PyCharm:Python 开发
- Android Studio:安卓应用开发
- Visual Studio:C#/.NET 开发
1.7 基于计算机的系统
1.7.1 基于计算机的系统的概念
定义:由硬件、软件、人员、数据等要素组成的综合系统(如智能手表系统)。
1.7.2 基于计算机的系统的功能组件
组件 | 示例 |
---|---|
硬件 | CPU、内存、传感器(如手机陀螺仪) |
软件 | 操作系统、应用程序(如 iOS 系统、微信 App) |
人员 | 用户、开发人员、维护人员 |
数据 | 用户信息、日志数据(如电商订单数据) |
1.7.3 典型的基于计算机的系统
- 嵌入式系统:智能家电、车载系统
- 信息系统:企业 ERP、银行核心系统
- 网络系统:云计算平台、物联网(IoT)
1.7.4 基于计算机的系统的研制
步骤:
- 系统需求分析(如智能门锁需支持指纹识别、密码开锁)
- 软硬件划分(指纹模块为硬件,加密算法为软件)
- 集成测试(验证硬件与软件协同工作)
总结
本文通过理论解析与代码案例结合的方式,系统介绍了软件工程的核心概念、过程模型及实践方法。读者可通过运行文中代码(如计算器程序、TDD 测试)加深理解,并结合 流程图梳理开发流程。后续章节将深入探讨需求分析、软件设计等专题,敬请关注!