软件工程概述
软件工程产生背景:软件开发迫切需要理论和方法指导,软件工程应运而生
软件危机的表现
进度经常延迟
- 进度难以控制
• 软件项目延期比比皆是
• 由于进度问题而取消的软件项目较常见
• 只有一小部分的项目能够按期完成
质量无法保证(低质量的软件系统好似“定时炸弹”)
- 软件存在诸多的错误和缺陷
• 没有按照要求(需求)来开发
• 编写的代码在功能上存在错误
• 实现了功能但是性能达不到要求
• 所开发的软件交互界面用户不喜欢
• 没有正确实现功能
• 等等等等
- 有些软件错误可能是致命的
成本超出预算
- 开发成本高,软件成本高,软硬件投资比发生急剧变化
软件维护困难
- 难以理解读懂程序比较困难,尤其是他人程序
- 不易修改程序非常脆弱,牵一发而动全身
- 容易出错改了以后易引入错误,产生新的问题
- 不易发现有了错误后难以发现,缺陷非常隐蔽
失败风险很大
软件危机的根源
开发手段与实际需求差距过大
- 开发手段:作坊式和手工式的个体编程和创作
- 实际需求:大规模和复杂软件开发要求
对软件这样一类复杂和特殊系统的认识不清:软件是新生事物,对其特点、规律性和复杂性认识不够
没有找到支持软件系统开发的有效方法:基础理论、关键技术、开发过程、支撑工具等
缺乏成功软件开发实践以及相应的开发经验:系统总结、认真分析、充分借鉴、吸取教训
如何解决软件危机
需要寻求新颖有效的方法
- 策略
- 方法
- 理论
- 技术
- 等等
多方共同关注的现实问题
- 用户——软件大户
- 工业界——软件开发商
- 学术届——研究学者等
软件工程基本内涵
思想
解决软件危机,促进软件开发
将系统的、规范的、可量化的方法应用于软件的开发、运行和维护的过程
- 规范化:规范化软件系统的开发,包括语言标准、质量标准、编程标准、方法标准、能力极其改进标准等
- 系统化:提供完整和全面的解决方法,包括目标、原则、过程模型、开发活动、开发方法和技术等
- 可量化:为软件开发和管理提供量化的支持,如工作量、成本、进度、质量等要素的量化
以及上述方法的研究
要素
过程
- 从管理的视角,回答软件开发、运行和维护需要开展哪些工作、按照什么样的步骤和次序来开展工作
- 研究成果
• 过程模型:如瀑布模型、增量模型、原型模型、迭代模型、螺旋模型等等
方法
- 从技术的视角,回答软件开发、运行和维护如何做的问题
• 为软件开发过程中的各项开发和维护活动提供系统性、规范性的技术支持
- 研究成果
• 结构化软件开发方法学、面向对象软件开发方法学、基于构件的软件开发方法学
工具
- 从工具辅助的视角,主要回答如何借助工具来辅助软件开发、运行和维护的问题
• 帮助软件开发人员更为高效地运用软件开发方法学来完成软件开发过程中的各项工作,提高软件开发效率和质量,加快软件交付进度
- 研究成果
• SonarQube、Eclipse、Visual Studio等
- 优点
• 简化开发
• 提升效率
• 提高质量
- 计算机辅助软件工程工具
• 代码编写
• 编辑、编译、分析、查找、代码生成等
• 项目管理
• 工作量和成本估算、制定和跟踪计划、配置和版本管理
• 软件建模
• 需求建模、UML建模、数据建模等
• 软件测试
• 测试用例自动生成、代码测试、缺陷报告等
• 软件运维
• 软件运行,管理和维护
目标
在成本、进度等约束下,指导软件开发和运维,开发出满足用户要求的足够好软件
- 更高效
- 更快速
- 低成本
- 高质量
原则
软件开发要遵循软件工程原则
- 软件开发 = 软件创作 + 软件生产
• 软件创作
• 基于软件开发者的经验和技能,借助于智慧,进行自由创新,如软件设计、编码实现等
• 软件生产
• 基于工程化的手段,遵循约束和规范,开展软件生产,如遵循过程、按照标准、质量保证等
抽象和建模
- 抽象
• 将与相关开发活动所关注的要素提取出来,不关心的要素扔掉,形成与该开发活动相关的软件要素
- 建模
• 基于特定抽象,借助于建模语言(如数据流图、UML等),建立起基于这些抽象的软件模型,进而促进对软件系统的准确理解
模块化
- 将软件系统的功能分解和实现为若干个模块,每个模块具有独立的功能,模块之间通过接口进行调用和访问。
- 模块内部高内聚,模块间松耦合
软件重用
- 开发过程中尽可能利用已有软件资源和资产(如函数库、类库、构件库、开源软件、代码片段等)来实现软件系统
- 开发出可被再次重用软件资源(如函数、类、构件等)
- 有助于提高软件开发效率,降低软件开发成本,满足开发工程约束,得到高质量的软件产品
信息隐藏
- 模块内部信息(如内部的语句、变量等)对外不可见或不可访问,模块间仅仅交换那些为完成系统功能所必需交换的信息(如接口)
- 模块设计时只对外提供可见的接口,不提供内部实现细节。信息隐藏原则可提升模块的独立性,减少错误向外传播,支持模块的并行开发
关注点分离
- 在软件开发过程中,将若干性质不同的关注点分离开来,以便在不同开发活动中针对不同的关注点,随后将这些关注点的开发结果整合起来,形成关于软件系统的完整视图
- 软件系统具有多面性的特点,既有结构特征,如软件的体系结构,也有行为特征
- 使得开发者在每一项开发活动中聚焦于某个关注点,有助于简化开发任务;同时通过整合多个不同视点的开发结果,可获得关于软件系统的更为清晰、系统和深入地认识
分而治之
- 开发人员可对复杂软件系统进行分解,形成一组子系统
• 分解的易于处理,然后通过整合子系统的问题解决得到整个系统的问题解决
- 有助于简化复杂软件系统的开发,降低软件开发复杂性,从而提高软件开发效率,确保复杂软件系统的质量
双向追踪
- 当某个软件制品发生变化时,一方面要追踪这种变化会对那些软件制品产生影响,进而指导相关的开发和维护工作,此为正向追踪;另一方面要追踪产生这种变化的来源,或者说是什么因素导致了该软件制品的变化,明确软件制品发生变化的原因及其合理性,此为反向追踪。
- 有助于确保软件制品间的一致性,发现无意义的变化,并基于变化指导软件的开发和维护,确保软件质量。
工具辅助
- 利用软件工具来辅助软件开发和维护工作是一项行之有效的方法
- 尽可能地借助计算机工具来辅助软件开发和维护,以降低开发者和维护者的工作负担,提高软件开发和维护效率,提升软件开发及软件制品的质量
软件工程发展历程
不同发展阶段的成果
发展的特点
与不同时代软件的特点息息相关,根本问题是要推动软件系统的开发和运维
由实践驱动的学科,在实践中不断探索,在探索中提出新技术新方法,实践先行、“摸着石头过河”的研究策略
几乎每隔十年就有一次飞跃,软件抽象层次越来越高,软件重用粒度越来越大
子主题 4
软件工程教育特点
教育规范
知识体系
课程特点
多学科交叉
- 软件工程越来越多地与相关学科进行交叉,以推动更多领域软件、更为复杂软件系统的研究和实践