软件工程软件及其特点
软件
软件的概念
软件(Software)是指在计算机系统的支持下,能够完成特定功能与性能的程序(Program)、数据(Data)和相关文档(Document)
软件的特点
表现形式
开发范式
需求变化
复杂性
系统缺陷
软件的组成
从开发者角度看:
- 可执行部分
• 程序
- 不可执行部分
• 数据
• 文档
生命周期
软件从提出开发开始到最终灭亡所经历的时期
不同阶段具有不同的特征
需求分析->软件设计->编码实现->软件测试->部署运行->使用维护
- 需求分析:软件需求是什么
- 软件设计:如何造出软件
- 编码实现:编写程序代码
- 软件测试:软件是否缺陷
- 部署运行:部署软件运行
分类
应用软件
- 特定应用领域的专用软件
• 提供更为便捷、快速、高效的服务
系统软件
- 为应用软件的运行提供基础设施和服务
• 作为应用软件的运行环境
支撑软件
- 辅助软件开发和运维
• 提高软件开发效率和质量
开源软件
开源软件实践
何为闭源软件
- 软件代码不对用户开放的一类软件,购买软件时只提供可运行软件或服务,没有提供源代码
- 无法掌握软件内部实现情况(如是否存在安全漏洞和恶意代码),也无法对软件进行修改和完善,极大影响了开发者的创新自由
开源软件
- 一种源代码可以自由获取和传播的计算机软件,其拥有者通过开源许可证赋予被许可人对软件进行使用、修改和传播
托管平台和社区
托管服务
- 创建软件仓库
- 支持协同开发
- 软件质量保证
代表性托管平台
- Github
- SourceForge
- Gitee
开源许可证
声明获得开源代码后拥有的权利,界定对别人的开源作品进行何种操作、何种操作是被禁止的,规范开源软件的使用要求和约束
- 宽松式开源许可证
- Copyleft式开源许可证
软件质量
软件质量是指软件满足给定需求的程度,他是产品的生命线
软件质量要素
正确性
- 软件满足规格说明和用户要求的程度,即在预定环境下能正确地完成预期功能和非功能需求的程度。
可靠性
- 在规定条件下、限定时间范围内,软件系统完成预期功能、不引起系统故障的能力。
健壮性
- 在计算环境发生故障、输入无效数据或操作错误等意外情况下,软件仍能做出适当响应的程度。
有效性
- 软件利用计算资源和存储资源以实现其功能的能力。
安全性
- 包括系统安全(Safety)和信息安全(Security),系统安全是指软件能及时有效避免给人员、设施、环境、经济等造成损害,信息安全是指软件能有效防控各类的非法获取、传播和使用
可维护性
- 是否易于对其进行修改以更正错误、增强功能、适应新运行环境
可以移植性
- 把软件从一种运行环境转移到另一种运行环境下运行的难易程度
可重用性
- 软件模块、构件、设计方案等在其他软件开发中被再次使用程度
可理解性
- 软件开发者或用户理解该软件系统的容易程度
可信性
- 采取有效措施确认软件满足人们的要求和期望
持续性
- 面对各种突发异常事件,仍能提供令人满意的服务的能力
可用性
- 使用和操作软件系统难以程度
互操作性
- 软件系统与其他的系统进行交换信息、协同工作的能力
可信软件的基本要求
安全性
- 以抗击攻击,保护业务和数据的机密性、完整性和可用性
韧性
- (Resilience)以确保系统受攻击时仍能保持良好的运行状态,具有快速恢复的能力
隐私性
- (Privacy)以保护用户的数据及其隐私
可靠性和可用性
- 以确保软件产品长期无故障运行,具备快速恢复和自我管理的能力,提供可预期的、一致的服务。
软件特征的变化
地位
深入到社会、经济、生活的方方面面,无处不在
作为一种创新的工具,深刻地改变各个行业和领域,创新问题解决模式和方式,影响人们日常学习、生活和工作
软件是实现行业和领域进行信息化融合和改造,实现创新性发展的使能技术和重要利器
软件已经成为人类社会的关键性基础设施
运行环境
从前端的PC终端、可穿戴设备、智能手机到后端的云中心、高性能计算中心
从孤立、独立、局域和可控的计算环境到分布、开放、动态、难控、无处不在计算环境
形态
不是单一系统,而是系统之系统
不仅是社会技术系统,还是一种生态系统
不是同构系统,而是异构、多样的系统联盟
不在封闭环境,而在开放环境中
不是封闭系统,而是动态适应系统
复杂性
软件形态-社会技术系统
- 由人、社会组织、物理设备、过程等要素共同组成和相互作用的人机物共生系统
- 软件系统无法单独存在,需与物理、社会系统交互作用
软件形态-系统子系统
- 由一组面向任务、服务于不同对象的子系统构成
- 每个子系统可独立运作并能提供相对独立功能
- 整个系统通过各独立系统间交互来实现全局任务
软件形态-分布式异构系统
- 拥有大量形式多样、地理或者逻辑上是分布的,分散部署在互联网上的软件实体
- 软件实体的分布性是必须的,因为越来越多的应用本身就是分布的,软件实体的分布性有助于提高软件系统的可靠性和安全性
- 构成软件系统的软件实体通常是异构的,异构性是一种必然
软件形态-动态演化系统
- 系统的边界和需求的不确定性和持续演变性
- 动态开放的特点
• 软件系统需要根据外部环境的变化而不断地调整自身,包括系统的体系结构和交互协作等等,而表现出持续演化的特点
- 系统的运维和系统的运行需要交织在一起
软件形态-系统联盟
- 大规模复杂信息技术系统是由大量相对独立、自我控制和管理的系统组装而成—系统联盟
软件形态-生态系统
- “运行”生态
• 软件的运行需要依靠“生态”的支撑
• 从计算和物理设备、社会系统到OS和运行环境
- “演化”生态
• 软件的演化基于特定的“生态”支撑
• 从最初的“源头”到最新“版本”
- “人员”生态
• 涉及到大量、开放的介入人员
• 使用者、开发者、运维者等