当前位置: 首页 > news >正文

《软件工程》-第 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 软件生存周期

定义:软件从需求分析到退役的整个过程,通常包括以下阶段:

  1. 需求分析:确定用户功能与非功能需求(如性能、安全性)。
  2. 设计阶段:分为架构设计(如 MVC 模式)和详细设计(如类图、流程图)。
  3. 开发阶段:编码实现功能(参考 1.1.1 案例)。
  4. 测试阶段:单元测试、集成测试、系统测试(如计算器的边界值测试)。
  5. 部署与维护:发布上线并持续优化(如修复 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 软件工程的发展

阶段演进

  1. 程序设计时代(1940-1960):机器语言编程,无系统化方法。
  2. 软件危机时代(1960-1980):需求膨胀导致进度延期、成本超支(如 IBM OS/360 项目)。
  3. 软件工程时代(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. 需求捕获与分析
  2. 系统设计(架构 + 详细设计)
  3. 构件开发与测试
  4. 系统集成与验收

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 基于计算机的系统的研制

步骤

  1. 系统需求分析(如智能门锁需支持指纹识别、密码开锁)
  2. 软硬件划分(指纹模块为硬件,加密算法为软件)
  3. 集成测试(验证硬件与软件协同工作)

总结

    本文通过理论解析与代码案例结合的方式,系统介绍了软件工程的核心概念、过程模型及实践方法。读者可通过运行文中代码(如计算器程序、TDD 测试)加深理解,并结合 流程图梳理开发流程。后续章节将深入探讨需求分析、软件设计等专题,敬请关注!

http://www.xdnf.cn/news/651403.html

相关文章:

  • Python 网络编程入门
  • 【人工智能-agent】--使用python调用dify工作流
  • Win10/Win11终极C盘清理指南
  • 深入剖析Java中的伪共享:原理、检测与解决方案
  • RT-Thread源码阅读(3)——内核对象管理
  • ES6基础
  • 考研408《计算机组成原理》复习笔记,第二章(3)数值数据的运算(浮点数计算篇)
  • 新一代WebP2P视频物联技术:EasyRTC嵌入式音视频通信SDK助力音视频实时通信场景应用
  • 基于SpringBoot+RabbitMQ完成应用通信
  • 编程日志5.19
  • 一根网线可以有两个ip地址吗?怎么实现
  • 洛谷-P1957 口算练习题
  • 基于大模型的胃肠道功能紊乱手术全程预测与干预方案研究
  • Elasticsearch 分片驱逐(Shard Exclusion)方式简析:`_name`、`_ip`、`_host`
  • 图论 判断是否有环
  • (自用)Java学习-5.13(Redis,OSS)
  • 第三十七天打卡
  • 【EdgeYOLO】《EdgeYOLO: An Edge-Real-Time Object Detector》
  • 分布式爬虫架构设计
  • Python 实现简单OCR文本识别
  • HTML应用指南:利用GET请求获取全国捞王锅物料理门店位置信息
  • cannot access ‘/etc/mysql/debian.cnf‘: No such file or directory
  • 解决 iTerm2 中 nvm 不生效的问题(Mac 环境)
  • “安康杯”安全生产知识竞赛活动流程方案
  • 课上实验111111
  • 4、docker compose
  • 汽配快车道:助力汽车零部件行业的产业重构与数字化出海
  • 关于OT IIOT系统远程访问的零信任安全
  • 从“黑箱”到透明化:MES如何重构生产执行全流程?
  • NV211NV212美光科技颗粒NV219NV220