软件工程讲义_07
软件工程第7章
过程内聚:构件或操作的组合方式是,允许在调 用前面的构件或操作之后,马上调用后面的构件 或操作,即使两者之间没有数据进行传递。如果 一个模块内处理元素是相关的,而且必须按固定 的次序执行,那么这种内聚就叫做过程内聚。过 程内聚的模块内往往体现为有次序的流程。 通信内聚:指模块内所有处理元素都在同一个数 据结构上的操作。或指各处理元素使用相同的输 入数据或者产生相同的输出数据。
4.模块独立性 模块独立性是指每个模块只完成系统要求的独立 的子功能,并且与其它模块的联系最少,且接口 简单。 “高内聚、低耦合”是两个定性的度量标准。 (1)耦合性 耦合是对不同模块之间相互依赖程度的度量。 紧密耦合是指两个模块之间存在着很强的依赖关 系。 松散耦合是指两个模块之间存在一些较弱的依赖 关系。无耦合是指模块之间根本没有任何连接与 依赖关系。 模块之间联系越紧密,其耦合性越强,其独立性 就越差。模块间的耦合性从低到高可分为以下七 种类型,如图7-3所示:
(1) 控制抽象 计算机语言具备控制抽象的能力。计算机只理解 一些低级的操作,例如将字节从一个位置移动到 另一个位置,对两个字节进行连接。从机器指令 到汇编语言,再到高级语言,使你能在更高的层 次上进行抽象,以便处理问题,并且可以屏蔽不 同机器和指令集间的差异。 面向过程的设计通过清晰的控制流程和部件间的 接口,来实现对复杂的软件进行分解,达到降低 软件复杂度的目的。面向对象的设计同时进行数 据抽象和控制抽象,从而实现使数据和控制融为 一体,构成一个完整的对象。
2.模块化 模块就是指在程序中的数据说明、可执行语句等 程序对象的集合,或者是单独命名和编址的元素。 如高级语言中的过程,函数、子程序等。每个模 块可以完成一个特定的子功能,各个模块可以按 一定方法组装起来成为一个整体。 所谓模块化,就是解决一个复杂问题时,自顶向 下、逐步求精地把软件系统划分成若干模块的过 程。 划分模块并不是越多越好,因为这会增加模块之 间接口的工作量。所以划分模块的层次和数量应 该避免过多或过少 。
软件工程课件(全)
03
识别项目中的关键路径,确保项目按计划进 行
04
及时调整项目计划,应对项目变更和不确定 性
风险管理策略制定
识别项目中的潜在风险, 包括技术风险、市场风险、 资源风险等
制定相应的风险应对策略 和措施,如风险规避、减 轻、转移和接受等
评估风险的概率和影响程 度,制定风险优先级列表
监控风险状态,及时调整 风险管理计划
质量改进
根据质量评估结果,制定相应的改进措施, 如优化性能、增强安全性等。
经验教训总结
对测试过程中遇到的问题进行总结,形成经 验教训,为后续项目提供参考。
06
项目管理与团队协作
项目计划制定与监控
01 制定详细的项目计划,包括项目目标、范围 、时间表、资源需求、成本估算等
02 设立项目里程碑,对项目进度进行阶段性监 控
开发方向。
持续集成和测试
03
迭代增量模型强调持续集成和测试的重要性,以确保每个迭代
周期都能交付高质量的软件产品。
03
需求分析与管理
需求获取与整理
确定需求来源
与客户、利益相关者、业务领 域专家等进行沟通,收集原始
需求。
需求分类
将收集到的需求按照功能、性 能、安全、易用性等方面进行 分类。
需求筛选
去除重复、模糊、不切实际的 需求,确保需求的准确性和可 行性。
处理变更请求
根据实际情况,决定是否接受变更请求,并 制定相应的实施计划。
跟踪和验证变更
对实施的变更进行跟踪和验证,确保变更的 正确性和完整性。
04
系统设计与实现
系统架构设计
分层架构
将系统划分为表示层、业务逻辑层和数据访问层,实现高内聚、 低耦合的设计。
软件工程基础知识讲解共15页文档
2019年全球Symbian手机总量达到一亿部。2019年诺基亚 收购塞班公司,塞班成为诺基亚独占系统。
2009年LG、索尼爱立信等各大厂商宣布退出塞班平台,转 而投入新系统领域。2019年塞班仅剩诺基亚一家支持。
(1)适用性:软件在不同的系统约束条件下,使用户需 求得到满足的难易程度。
(2)有效性:软件系统能最有效的利用计算机的时间和 空间资源。
(3)可修改性:允许对系统进行修改而不增加原系统的 复杂性。它支持软件的调试和维护,是一个难以达到的目 标。
(4)可靠性:能防止因概念、设计和结构等方面的不完 善造成的软件系统失效,具有挽回因操作不当造成软件系 统失效的能力。
10:38:06
9
软件工程
3.2 Symbian系统的历史发展
1980年David Potter成立Psion公司。2019年在爱立信、 诺基亚、摩托罗拉和Psion的共同合作下成立塞班公司。 2019年塞班公司推出Symbian OS v5.x操作系统。2000年 全球第一款Symbian系统手机:爱立信R380正式出售。
从长期效益看,高质量将保证软件开发的全过程更加规范 流畅,大大降低了软件的维护代价,实质上是提高了生产 率,同时可获得很好的信誉。
质量与生产率之间不存在根本的对立,好的软件工程方法 可以同时提高质量与生产率。
10:38:05
7
软件工程
举例:关于开发CAD系统的的软件开发成本及效益分析
10:38:06
1.软件工程的理解
1.1软件工程过程的内容
软件工程全讲义
哈
举例:关于开发CAD系统的软件开发成本及效益分析
尔
滨
工
业
成本-效益(万元)
大 学
60
盈亏平衡点
40 该系统成本
20
该系统节省经费
韩
静
0
萍
12 3 4 5 年
投资回收期
---------成本及效益分析图
2019/11/11
哈
尔
滨
工
2、技术可行性: 对系统的性能、可靠性、可维护性以及生产率
业
等方面的信息进行评价。
2019/11/11
哈
2、 软件工程学
尔
滨
工
业
软件开发方法学
大 学
软件开发技术 软件工具
软件工程环境
软件工程学
韩 静 萍
软件工程管理
软件工程管理学 软件经济学
---- 软件工程学的范畴
2019/11/11
哈 尔
滨
工
业
微软企业文化宗旨部分内容
大
学
Wake up every day with a feeling of passion
尔
滨
工
设某城市招干考试成绩统计系统。
业
考生分三个专业,不同专业考试科目不同:
大
法律专业---考政治、语文、法律
学
行政专业---考政治、语文、行政
财经专业---考政治、语文、财经学
每个考生在报名时登记姓名、地址、年龄和报考专业。报
名后招干办公室根据专业考生专业及地址在市区或郊区来编排
韩
准考证号码和考场。考生参加考试后,输入每个考生的各门课
特点:
工 业
计划 时期
软件工程基础讲解
软件工程基础讲解软件工程是一门研究如何用系统化、规范化、可度量的方法来开发、运行和维护软件的学科。
它涉及到软件开发的整个生命周期,从最初的需求分析到最终的软件退役。
接下来,让我们逐步深入了解软件工程的基础知识。
首先,需求分析是软件工程的第一步。
这就好比盖房子之前要先明确房子的用途、居住人数、风格喜好等。
在软件领域,需求分析就是要了解用户想要什么样的软件,需要实现哪些功能,有哪些性能要求,以及在什么环境下运行等。
如果需求分析不准确或者不完整,就可能导致开发出来的软件不符合用户的期望,浪费大量的时间和资源。
需求明确之后,就进入了软件设计阶段。
软件设计就像是给房子画蓝图,要确定软件的整体架构、模块划分、数据结构、接口设计等。
好的软件设计应该具有高内聚、低耦合的特点,也就是说每个模块内部的功能紧密相关,而模块之间的联系尽量简单,这样便于软件的维护和扩展。
接下来是编码实现阶段。
这是将设计转化为实际代码的过程,就像根据蓝图建造房子。
编码需要遵循一定的规范和标准,使用合适的编程语言和开发工具,保证代码的可读性、可维护性和可扩展性。
同时,要注意代码的质量,避免出现错误和漏洞。
在编码完成后,需要进行严格的测试。
测试就像是对房子进行质量检查,要发现软件中的缺陷和问题。
测试包括单元测试、集成测试、系统测试、验收测试等不同的类型,从不同的角度和层面来保证软件的质量。
只有通过了测试的软件,才能交付给用户使用。
软件维护是软件工程中不可忽视的一个环节。
软件在使用过程中,可能会出现新的需求、发现新的问题,或者需要适应新的环境。
这就需要对软件进行修改、优化和升级,以保证软件的持续可用性和有效性。
在软件工程中,项目管理也起着至关重要的作用。
项目经理要负责制定项目计划、安排资源、控制进度、协调团队成员之间的工作等。
有效的项目管理能够保证软件开发按时、按质量完成,并且控制好成本。
软件开发方法也是软件工程的一个重要方面。
常见的开发方法有瀑布模型、迭代模型、敏捷开发等。
软件工程ppt课件完整版
修改与测试
对软件进行修改,并进行测试以确保 修改的正确性。
版本管理与发布
对修改后的软件进行版本管理,并发 布新版本。
软件演化策略与方法
增量式演化
逐步增加新功能或修改现有功能。
迭代式演化
通过不断迭代改进软件质量。
软件演化策略与方法
组件化演化
将软件拆分为独立组件进行演化。
重构
改进软件内部结构而不改变其外部行为。
处理团队冲突,化解矛盾,促进团队合作
版本控制与文档管理
使用版本控制工具(如Git) 管理项目代码和文档
建立完善的文档管理体系, 包括需求文档、设计文档、 测试文档等
制定版本控制规范,包括 分支管理、代码提交和合 并流程等
定期评审和更新文档,确 保文档与项目实际进展保 持一致
07 软件维护与演化
软件维护类型及流程
版本迁移与数据迁移
将旧版本的数据迁移到新版本,确保数据的 完整性和一致性。
持续集成与持续交付
持续集成
频繁地将代码集成到主干, 并进行自动化测试以快速发 现问题。
持续交付
在持续集成的基础上,将软 件以可发布的状态交付给用 户,以便用户能够快速获得 新功能或修复问题。
自动化测试与部署
监控与反馈
利用自动化工具进行测试和 部署,提高开发效率和质量。
软件工程的发展
软件工程经历了从程序设计、软件 工程方法、软件工程过程到软件工 程学科的逐步成熟过程。
软件工程目标与原则
软件工程的目标
在给定成本、进度的前提下,开发出具有有效性、可靠性、可理解性、可维护 性、可重用性、可适应性、可移植性、可追踪性和可互操作性且满足用户需求 的软件产品。
软件工程的原则
软件工程讲义,软件工程电子书
1.1 软件工程的产生
38/360
2.2 需求分析的任务
– 功能性需求和非功能性需求
• 功能性需求:描述了系统应该做什么,即具备 的功能或服务。(输入、输出和计算等)
• 非功能性需求:描述了系统必须遵守的约束条 件。(响应时间、吞吐量 、可靠性、可移植性、 可扩展性、易用性、安全性、资源要求、可复 用性、技术要求、文化和政策需求、法律需求、 道德要求、隐私要求,等等)
– 粗糙
9/360
1.2 软件工程学
• Definition
– 软件工程是软件开发、运行、维护和引退的 系统方法。
– 因而软件工程是指导计算机软件开发和维护 的工程学科。软件工程采用工程的概念、原 理、技术和方法来开发与维护软件。
– 软件工程的目标是实现软件的优质高产,软 件工程的目的是在规定的时间、规定的开发 费用内,开发出满足用户需求的、高质量的 软件产品。
• Who
– 系统分析师、出资方领导、出资方技术人员、 开发方领导和项目经理
• Where
– 客户现场
32/360
2.1 软件问题定义及可行性研究
• How
33/360
2.1 软件问题定义及可行性研究
2.1.2 可行性研究 • What
– 可行性研究是以相对短的时间和相对低的成 本来确定给定的问题在其约束条件内是否有 解、有几种解以及哪个是最佳解。
软件工程基础知识讲解
软件优化
优化目标
提升软件性能
算法优化
优化算法以提高软 件效率
软件性能优化
通过代码、算法等 手段提高软件性能
软件更新
软件版本更新
定期发布新版本 修复bug 增加新功能
更新策略
增量更新 全量更新 强制更新
定期更新的必要性
提高软件安全性 改进用户体验 跟进技术发展
软件文档管理
软件文档种类
需求文档、设计文档、用户手册等
文档管理工具
JIRA、Confluence、Git等
文档编写规范
格式统一、内容清晰、易于查找
●07
第7章 结语
持续学习的必要性
不断更新知识
学习新技术、新方 法
提升个人竞争力
增加就业机会、提 高薪资水平
适应行业变化
面对技术更新、需 求变化
发展前景展望
未来,随着科技的不断发展,软件工程领域将会迎来更 多的机遇和挑战。人工智能、大数据、云计算等技术的 发展,将为软件工程师提供更广阔的发展空间,同时也
立运行
对象结构
将系统抽象为对象, 对象之间通过消息
传递进行通信
●04
第四章 软件开发
编码与调试
编码是软件开发中至关重要的环节,通过编写代码实现 软件功能。调试技术是在编码过程中检测和修复程序错 误的方法。单元测试与集成测试是确保软件质量的重要
手段。
版本控制与配置管理
版本控制的意义
版本控制可以跟踪 代码变更,并有利
软件项目管理
软件项目管理的目标
项目风险管理
确保项目按时交付、 满足客户需求,并
控制成本
识别项目风险并采 取措施,降低风险
软件工程完整PPT课件
2021/3/9
10
④局部化。要求在一个物理模块内集中逻辑上相互关联 的计算资源,保证模块间具有松散的耦合关系,模块 内部有较强的内聚性,这有助于控制解的复杂性。
⑤确定性。软件开发过程中所有概念的表达应是确定的、 无歧义且规范的。
⑥一致性。包括程序、数据和文档的整个软件系统的各 模块应使用已知的概念,内外部接口应保持一致,系 统规格说明与系统行为应保持一致。
2021/3/9
14
2. 需求分析方法 常见的需求分析方法有:
①结构化分析方法。 ②面向对象的分析方法。
2021/3/9
15
2.2结构化分析方法
(1)关于结构化分析方法 结构化分析方法的实质是着眼于数据流,自顶向下,逐层分解,
建立系统的处理流程,以数据流图和数据字典为主要工具,建 立系统的逻辑模型。 结构化分析的步骤如下:
3. 信息隐蔽 信息隐蔽使得一个模块内包含的信息(过程和数据)
对于不需要这些信息的模块来说,是不能访问 的。
2021/3/9
24
4. 模块独立性 每个模块完成一个相对独立的特定子功能,并且 和其他模块之间的接口很简单。
模块的独立程度可以由两个定性标准来衡量,这 两个标准分别称为耦合性和内聚性。藕合衡量不 同模块彼此间互相依赖(连接)的紧密程度;内 聚衡量一个模块内部各个元素彼此间结合的紧密 程度。
⑦完备性。软件系统不丢失任何重要成分,完全实现系 统所需的功能。
⑧可验证性。开发大型软件系统需要对系统自顶向下, 逐层分解。系统分解应遵循容易检查、测评、评审的 原则,以确保系统的正确性。
2021/3/9
11
1.5软件开发工具与软件开发环境
1. 软件开发工具 软件开发工具是指可以用来帮助开发,测试、分 析、维护其他计算机程序及其文档资料,实现软 件生产过程自动化的一类程序。 软件工具主要包括需求分析工具、设计工具、编 码工具、确认工具、维护工具等。
软件工程讲义
软件工程讲义(师大讲课提纲__Y ang XS)1.软件工程基础(1)为什么要有软件工程(2)软件工程概念(3)软件生命周期(4)软件计划、需求分析(5)软件设计(概要设计、详细设计)(6)程序编码(7)软件测试(8)软件维护(9)软件开发管理技术2.面向对象的软件工程新技术——UML(1)UML简介(2)用例图与需求分析(3)组织结构图(概要设计)(4)类图与顺序图(详细设计)(5)关系型数据库表的设计3.VC++2005/2008程序调试(1)从C、C++到VC++语句精简、递归、结构钵、指针;类、对象;可视化、基础类库(2)C++两个标准:IS0/ANSI标准C++、C++/CLI(Microsoft专为而.net开发) (3)VC++中的类(4)VC++文档类型(5)VC++项目/工程的创建与打开(6)Win32控制台程序的创建与调试(7)MFC程序的创建与调试(8)使用VS2005/2008编辑图像和程序1.软件工程基础程序是为完成一定功能和性能而设计的计算机可执行的指令序列;数据是程序能操作的数字信息;文档是程序开发、维护和使用有关的图文资料。
软件是计算机系统中程序、数据和相关文档的完整集合。
软件分为系统软件、支撑软件和应用软件。
计算机程序的功能越来越强,综合性越来越强,就成了软件。
程序设计阶段、程序系统阶段、软件工程阶段。
(1)为什么要有软件工程开发一个中、大型软件不是一人能做到,需要很多人参与。
如何组织好多人软件开发,需要有一套科学的管理流程,有一套软件开发各阶段工程技术人员都能看懂并且遵守的描述与约束规则。
为使软件达到预期目的,需要软件工程。
为使软件维护性好、可升级,需要软件工程。
(2)软件工程的概念Boehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。
IEEE:软件工程是开发、运行、维护和修复软件的系统方法。
Fritz Bauer:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。
软件工程讲义
软件工程讲义在当今信息时代,软件产业已经成为了世界经济发展的重要组成部分。
软件工程作为软件产业的基石,扮演着不可忽视的角色。
本文将以软件工程讲义的形式,系统介绍软件工程的基本概念、原理和方法,助力读者全面理解和掌握软件工程的知识体系。
第一章:软件工程概述1.1 软件工程的定义和意义1.2 软件生命周期1.3 软件工程的基本原则第二章:软件开发过程2.1 瀑布模型2.2 快速原型模型2.3 敏捷开发模型2.4 喷泉模型第三章:需求工程3.1 需求获取3.2 需求分析与规约3.3 需求验证和确认第四章:设计工程4.1 结构化设计4.2 面向对象设计4.3 软件体系结构设计第五章:编码与测试5.1 编码规范5.2 测试策略与方法5.3 软件质量保证与评估第六章:软件项目管理6.1 项目计划与组织6.2 软件配置管理6.3 软件项目风险管理第七章:软件工程的新兴技术7.1 云计算与软件工程7.2 大数据与软件工程7.3 物联网与软件工程结语软件工程是软件产业持续发展的保障,掌握软件工程的基本原理和方法对于从事软件开发和软件项目管理的人员来说至关重要。
通过本讲义的学习,读者将了解软件工程的核心概念、开发过程和各个阶段的具体内容。
同时,本讲义也对软件工程的新兴技术进行了简要介绍,帮助读者掌握行业的最新动态。
期望读者能够通过学习软件工程,提升软件开发和管理的能力,为软件产业的发展做出更大的贡献。
总结起来,软件工程讲义涵盖了软件工程的概述、软件开发过程、需求工程、设计工程、编码与测试、软件项目管理以及软件工程的新兴技术等内容。
通过细致而系统的学习,读者将逐步掌握软件工程的知识体系,为未来在软件产业中的发展打下坚实的基础。
软件工程基础知识详细讲解
软件工程基础知识详细讲解软件工程是一门涵盖软件开发全过程的学科,它包括了软件需求分析、软件设计、软件开发、软件测试、软件维护等诸多环节。
在现代社会中,软件的开发和应用已经成为了各个行业的重要组成部分。
为了能够具备基本的软件开发能力,我们有必要了解软件工程的基础知识。
一、软件需求分析软件需求分析是软件开发过程中第一个关键环节,它的主要任务是确定用户的需求,并将其转化为易于理解的需求规格说明。
在进行需求分析之前,我们需要与用户进行充分的沟通,了解他们的需求和期望。
需求分析的结果将指导后续的软件设计和开发工作。
在软件需求分析中,我们需要做到以下几点:1. 确定需求的背景和范围。
2. 收集用户需求,并进行详细的记录和整理。
3. 对需求进行分类和优先级排序。
4. 确定需求的可行性和实现难度。
5. 编写需求规格说明文档,明确描述软件功能和性能。
二、软件设计软件设计是软件工程中的核心环节,它的目标是根据需求规格说明,设计出满足用户需求的软件系统。
软件设计需要考虑系统的结构、功能、性能、可维护性等方面。
在进行软件设计时,我们应该采用模块化和层次化的方式,将整个系统分解为多个独立的模块,并确定模块之间的接口和关系。
软件设计的主要内容包括:1. 构建系统的整体结构和模块划分。
2. 定义数据结构和数据库设计。
3. 设计系统的具体功能和算法。
4. 确定软件界面和用户交互方式。
5. 进行系统的性能评估和优化。
三、软件开发软件开发是根据软件设计的要求,实现软件功能的过程。
在进行软件开发时,我们可以使用不同的编程语言和开发工具。
常见的开发方法包括结构化开发、面向对象开发和敏捷开发等。
软件开发的步骤包括:1. 编写程序代码,并进行模块测试。
2. 进行集成测试,测试不同模块之间的接口和交互。
3. 进行系统测试,验证整个软件系统的功能和性能。
4. 完善软件的用户文档和操作手册。
四、软件测试软件测试是确保软件质量的重要环节。
通过对软件系统进行全面的测试,可以发现并修复潜在的错误和缺陷。
软件工程讲义
软件工程第1章软件工程技术发展思索 (2)1.1软件工程技术发展历程 (2)1.2软件与软件特征 (3)1.3软件工程的主要研究内容 (3)1.4软件技术的发展趋势 (7)第2章传统的软件工程过程 (8)2.1什么是软件生命周期 (8)2.2软件生命周期的六个阶段 (9)2.3软件生命周期的模型 (10)第3章软件工程之面向对象技术概述 (12)第4章面向对象软件工程方法学实践 (14)4.1是“设计主导”还是“程序主导” (14)4.2面向对象方法与结构化方法比较 (17)4.3方法学是思路不是定律 (18)第5章中间件技术 (19)第6章JA V A EE 技术软件工程专题 (21)6.1企业级J A V A (21)6.2J2EE简介 (22)6.2.1J2EE的概念 (23)6.2.2J2EE 的四层模型 (24)6.2.3J2EE 的结构 (26)6.3J A V A EE5 (28)6.4J2EE探险者系列 (29)6.5J2EE最佳实践 (30)6.6J2EE与SOA (31)6.7J2EE与W EB 2.0 (31)6.8S TRUTS VS S PRING 两种MVC框架比较 (33)第7章面向方面编程AOP (35)7.1引言 (35)7.2什么是方面 (36)7.3AOP:利与弊 (37)7.4S PRING AOP:S PRING之面向方面编程 (37)第8章基于组件的软件工程-软件开发新挑战 (40)8.1软件开发面临的挑战 (40)8.2基于组件的开发中有几个危及其成功的不利因素 (40)8.3基于组件的软件工程 (41)8.4组件规范 (41)8.5基于组件系统开发生命周期 (42)8.6软件体系和基于组件的开发 (43)8.7UML和基于组件的系统模型 (44)8.8CORBA与DCOM技术 (44)8.8.1 分布式对象技术 (44)8.8.2 CORBA的设计模式 (46)8.8.3 DCOM技术 (50)8.8.4 CORBA与DCOM的主要异同 (53)8.9基于组件软件工程的未来 (55)第9章软件测试新技术 (56)9.1正交试验设计 (56)9.2均匀试验设计 (57)9.3成对组合覆盖 (57)9.4软件测试的有效方法—确定软件测试技术 (58)9.6软件测试自动化框架 (61)第10软件工程新视角 (63)10.1业发展:SOA与云计算相结合 (63)10.2A GILE S OFTWARE D EVELOPMENT(敏捷软件开发) (63)10.3极限编程 (65)10.4可信软件 (71)第1章软件工程技术发展思索1.1 软件工程技术发展历程30多年来,软件工程的研究和实践取得了长足的进步,其中一些具有里程碑意义的进展包括:• 20世纪60年代末~70年代中期,在一系列高级语言应用的基础上,出现了结构化程序设计技术,并开发了一些支持软件开发的工具.• 20世纪70年代中期~80年代,计算机辅助软件工程(CASE)成为研究热点,并开发了一些对软件技术发展具有深远影响的软件工程环境.• 20世纪80年代中期~90年代,出现了面向对象语言和方法,并成为主流的软件开发技术;开展软件过程及软件过程改善的研究;注重软件复用和软件构件技术的研究与实践.软件是客观事物的一种反映,客观世界的不断变化促使软件技术的不断发展,这种事物发展规律促使软件工程的产生和发展.我们仅从解决软硬件的异构性和各种软件之间的异构性角度,就可窥见软件技术发展的一种途径.如,为屏蔽计算机硬件之间的异构性发展了操作系统,为屏蔽操作系统之间和编程语言之间的异构性出现了支撑软件和中间件,为屏蔽不同中间件之间的异构性发展了Web Services技术等等;随着解决问题的不断深入,易用性和适应性要求的不断提升,以及软件技术的不断发展,还会出现更新、更复杂的异构问题,它的解决会促进软件技术的不断发展.从学科角度来看,要不断提炼所要解决问题的概念,建立相应的模型,并寻找处理方法,从而解决这些问题的概念模型和处理问题逻辑间的映射问题,如图1所示.1.2 软件与软件特征软件是对客观世界中问题空间与解空间的具体描述,是客观事物的一种反映,是知识的提炼和“固化”.客观世界是不断变化的,因此,构造性和演化性是软件的本质特征.如何使软件模型具有更强的表达能力、更符合人类的思维模式,即如何提升计算环境的抽象层次,在一定意义上来讲,这紧紧围绕了软件的本质特征——构造性和演化性.在高级语言出现以前,汇编语言(机器语言)是编程的工具,表达软件模型的基本概念(或语言构造)是指令,表达模型处理逻辑的主要概念(机制)是顺序和转移.显然,这一抽象层次是比较低的.高级语言的出现,例如FORTRAN语言、PASCAL语言、C语言等,使用了变量、标识符、表达式等概念作为语言的基本构造,并使用3种基本控制结构来表达软件模型的计算逻辑,因此软件开发人员可以在一个更高的抽象层次上进行程序设计.随后出现了一系列开发范型和结构化程序设计技术,实现了模块化的数据抽象和过程抽象,提高了人们表达客观世界的抽象层次,并使开发的软件具有一定的构造性和演化性.近20年来,面向对象程序设计语言的诞生并逐步流行,为人们提供了一种以对象为基本计算单元,以消息传递为基本交互手段来表达的软件模型.面向对象方法的实质是以拟人化的观点来看待客观世界,即客观世界是由一系列对象构成,这些对象之间的交互形成了客观世界中各式各样的系统[1].面向对象方法中的概念和处理逻辑更接近人们解决计算问题的思维模式,使开发的软件具有更好的构造性和演化性.目前,人们更加关注软件复用问题,构建比对象粒度更大、更易于复用的基本单元——构件,并研究以构件复用为基础的软件构造方法,更好地凸现软件的构造性和演化特性.易于复用的软件,一定是具有很好构造性和演化性的软件.1.3 软件工程的主要研究内容从某种角度来说,软件开发的本质就是要实现“高层概念”到“低层概念”的映射,实现“高层处理逻辑”到“低层处理逻辑”的映射.对于大型软件系统的开发,这一映射是相当复杂的,涉及到有关人员、使用的技术、采取的途径以及成本和进度的约束,因此,我们可以把软件工程定义为:软件工程(software engineering)是应用计算机科学理论和技术以及工程管理原则和方法,按照预算和进度,实现满足用户要求的软件产品的定义、开发、发布和维护的工程或以之为研究对象的学科,软件工程与其他工程一样要有自己的目标、活动和原则,软件工程框架可以概括为图2所示的内容.软件工程的基本目标是生产具有正确性、可用性及开销合宜(合算性)的产品.正确性意指软件产品达到预期功能的程度;可用性意指软件基本结构、实现及文档达到用户可用的程度;开销合宜意指软件开发、运行的整个开销满足用户的需求.以上目标的实现不论在理论上还是在实践中均存在很多问题有待解决,制约了对过程、过程模型及工程方法的选取.软件工程活动是“生产一个最终满足用户需求且达到工程目标的软件产品所需要的步骤”,主要包括需求、设计、实现、确认以及支持等活动.需求活动是在一个抽象层上建立系统模型的活动,该活动的主要产品是需求规约,是软件开发人员和客户之间契约的基础,是设计的基本输入.设计活动定义实现需求规约所需的结构,该活动的主要产品包括软件体系结构、详细的处理算法等.实现活动是设计规约到代码转换的活动.验证/确认是一项评估活动,贯穿于整个开发过程,包括动态分析和静态分析.主要技术有模型评审、代码“走查”以及程序测试等.维护活动是软件发布之后所进行的修改,包括对发现错误的修正、对环境变化所进行的必要调整等.围绕工程设计、工程支持以及工程管理,提出以下软件工程基本原则:第1条原则是选取适宜的开发风范.以保证软件开发的可持续性,并使最终的软件产品满足客户的要求.第2条原则是采用合适的设计方法.支持模块化、信息隐蔽、局部化、一致性、适应性、构造性、集成组装性等问题的解决和实现,以达到软件工程的目标.第3条原则是提供高质量的工程支持.提供必要的工程支持,例如配置管理、质量保证等工具和环境,以保证按期交付高质量的软件产品.第4条原则是有效的软件工程管理.仅当对软件过程实施有效管理时,才能实现有效的软件工程.由以上软件工程的概念和框架可以看出,软件设计的主要目标就是要实现好的结构,使开发的软件具有良好的构造性和演化性.软件工程学科所研究的内容主要包括:软件开发范型、软件设计方法、工程支持技术和工程管理技术.其中,软件开发范型涉及软件工程的“方向”问题,研究正确的求解软件的计算逻辑;软件设计方法涉及软件工程的“途径”问题,研究“高层概念模型和处理逻辑”到“低层概念模型和处理逻辑”的映射;工程支持技术和过程管理技术涉及工程过程质量和产品质量问题,研究管理学理论在软件工程中的应用.如上所述,软件开发就是实施了一个从“高层概念模型”到“低层概念模型”的映射,从“高层处理逻辑”到“低层处理逻辑”的映射,而且在这一映射中还涉及到人员、技术、成本、进度等要素,那么就必须研究映射模式即软件生产模式问题.分析传统产业的发展,其基本模式均是符合标准的零部件(构件)生产以及基于标准构件的产品生产(组装),其中,构件是核心和基础,“复用”是必须的手段.实践表明,这种模式是软件开发工程化、软件生产工业化的必由之路[4].因此,软件产业的发展并形成规模经济,标准构件的生产和构件的复用是关键因素.实现软件复用的关键因素(技术和非技术因素),如图3所示,主要包括:软件构件技术(software component technology)、领域工程(domain engineering)、软件构架(software architecture)、软件再工程(software reengineering)、开放系统(open system)、软件过程(software process)、CASE技术等,以及各种非技术因素,且各种因素是相互联系、相互影响的.近年来人们认识到,要提高软件开发效率,提高软件产品质量,必须改变手工作坊式的开发方法,采取工程化的开发方法和工业化的生产技术.青鸟工程“七五”期间,已提出了软件生产线的概念和思想[6],其中将软件的生产过程分成3类不同的生产车间,即应用构架生产车间、构件生产车间和基于构件、构架复用的应用集成组装车间.软件生产线的概念模式如图4所示.由上述软件生产线概念模式图中可以看出,在软件生产线中,软件开发人员被划分为3类:构件生产者、构件库管理者和构件复用者.这3种角色所需完成的任务是不同的,构件复用者负责进行基于构件的软件开发,包括构件查询、构件理解、适应性修改、构件组装以及系统演化等.图5给出了与上述概念图相对应的软件生产线——生产过程模型.从图4和图5中可以看出,软件生产线以软件构件/构架技术为核心,其中的主要活动体现在传统的领域工程和应用工程中,但赋予了它们新的内容,并且通过构件管理、再工程等环节将它们有机地衔接起来.另外,软件生产线中的每个活动皆有相应的方法和工具与之对应,并结合项目管理、组织管理等管理问题,形成完整的软件生产流程.1.4 软件技术的发展趋势Internet无疑是20世纪末伟大的技术进展之一,为我们提供了一种全球范围的信息基础设施.这个不断延伸的网络基础设施,形成了一个资源丰富的计算平台,构成了人类社会的信息化、数字化基础,成为我们学习、生活和工作的必备环境.如何在未来Internet平台上进一步进行资源整合,形成巨型的、高效的、可信的和统一的虚拟环境,使所有资源能够高效、可信地为所有用户服务,成为软件技术的研究热点.Internet平台具有如下基本特征:无统一控制的“真”分布性;节点的高度自治性;节点链接的开放性和动态性;人、设备和软件的多重异构性;实体行为的不可预测性;运行环境的潜在不安全性;使用方式的个性化和灵活性;网络连接环境的多样性等.因此,Internet平台和环境的出现,对软件形态、技术发展、理论研究提出新的问题,也提供了新的契机.传统软件的开发基于封闭的静态平台,是自顶向下、逐步分解的过程,因此传统软件的开发,基本都是首先确定系统的范围(即Scoping),然后实施分而治之的策略,整个开发过程处于有序控制之下.而未来软件系统的开发所基于的平台是一个有丰富基础软件资源但同时又是开放、动态和多变的框架,开发活动呈现为通过基础软件资源组合为基本系统,然后经历由“无序”到“有序”的往复循环过程,是动态目标渐趋稳态.未来软件基本模型由于所处平台的特性和开放应用的需求而变得比任何传统的计算模型都更为复杂,软件生命周期由于“无序”到“有序”的循环而呈现出不同于传统生命周期概念的“大生命周期概念”,程序正确性由于目标的多样化而表现为传统正确性描述的一个偏序集,软件体系结构侧重点从基于实体的结构分解转变为基于协同的实体聚合,软件生产过程和环境的变化导致基于Internet的面向用户的虚拟工厂的形成.由于软件系统所基于的计算机硬件平台正经历从集中封闭的计算平台向开放的Internet平台的转变,软件系统作为计算机系统的核心,随着其运行环境的演变也经历了一系列的变革.目前,面向网络的计算环境正由Client/Server发展为Client/Cluster,并正朝着Client/Network和Client/Virtual Environment的方向发展.那么,未来的基于Internet 平台的软件系统又将会呈现出一个什么形态呢?从技术的角度来看,以软件构件等技术支持的软件实体将以开放、自主的方式存在于Internet的各个节点之上,任何一个软件实体可在开放的环境下通过某种方式加以发布,并以各种协同方式与其他软件实体进行跨网络的互连、互通、协作和联盟,从而形成一种与当前的信息Web类似的Software Web. Software Web不再仅仅是信息的提供者,它还是各种服务(功能)的提供者.由于网络环境的开放与动态性,以及用户使用方式的个性化要求,从而决定了这样一种Software Web,它应能感知外部网络环境的动态变化,并随着这种变化按照功能指标、性能指标和可信性指标等进行静态的调整和动态的演化,以使系统具有尽可能高的用户信赖度.我们将具有这种新形态的软件称为网构软件(internetware).网构软件是在Internet开放、动态和多变环境下软件系统基本形形态的独有的基本特征[1]:(1) 自主性:是指网构软件系统中的软件实体具有相对独立性、主动性和自适应性.自主性使其区别于传统软件系统中软件实体的依赖性和被动性;(2) 协同性:是指网构软件系统中软件实体之间可按多种静态连接和动态合作方式在开放的网络环境下加以互连、互通、协作和联盟.协同性使其区别于传统软件系统在封闭集中环境下单一静态的连接模式;(3) 反应性:是指网构软件具有感知外部运行和使用环境并对系统演化提供有用信息的能力.反应性使网构软件系统具备了适应Internet开放、动态和多变环境的感知能力;(4) 演化性:是指网构软件结构可以根据应用需求和网络环境变化而发生动态演化,主要表现在其实体元素数目的可变性、结构关系的可调节性和结构形态的动态可配置性上;演化性使网构软件系统具备了适应Internet开放、动态和多变环境的应变能力;(5) 多态性:是指网构软件系统的效果体现出相容的多目标性.它可以根据某些基本协同原则,在动态变化的网络环境下,满足多种相容的目标形态.多态性使网构软件系统在网络环境下具备了一定的柔性和满足个性化需求的能力.综上所述,Internet及其上应用的快速发展与普及,使计算机软件所面临的环境开始从静态封闭逐步走向开放、动态和多变.软件系统为了适应这样一种发展趋势,将会逐步呈现出柔性、多目标、连续反应式的网构软件系统的形态.面对这种新型的软件形态,传统的软件理论、方法、技术和平台面临了一系列挑战.从宏观上看,这种挑战为我们研究软件理论、方法和技术提供了难得的机遇,使我们有可能建立一套适合于Internet开放、动态和多变环境的新型软件理论、方法和技术体系.从微观的角度来看,Internet的发展将使系统软件和支撑平台的研究重点开始从操作系统等转向新型中间件平台,而网构软件的理论、方法和技术的突破必将导致在建立新型中间件平台创新技术方面的突破.归结起来,网构软件理论、方法、技术和平台的主要突破点在于实现如下转变,即,从传统软件结构到网构软件结构的转变,从系统目标的确定性到多重不确定性的转变,从实体单元的被动性到主动自主性的转变,从协同方式的单一性到灵活多变性的转变,从系统演化的静态性到系统演化的动态性的转变,从基于实体的结构分解到基于协同的实体聚合的转变,从经验驱动的软件手工开发模式到知识驱动的软件自动生成模式的转变.建立这样一种新型的理论、方法、技术和平台体系具有两个方面的重要性,一方面,从计算机软件技术发展的角度,这种新型的理论、方法和技术将成为面向Internet计算环境的一套先进的软件工程方法学体系,为21世纪计算机软件的发展构造理论基础;另一方面,这种基于Internet计算环境上软件的核心理论、方法和技术,必将为我国在未来5~10年建立面向Internet的软件产业打下坚实的基础,为我国软件产业的跨越式发展提供核心技术的支持.当前的软件技术发展遵循软硬结合、应用与系统结合的发展规律.“软”是指件,“硬”是指微电子,要发展面向应用,实现一体化;面向个人,体现个性化的系统和产品.软件技术的总体发展趋势可归结为:软件平台网络化、方法对象化、系统构件化、产品家族化、开发工程化、过程规范化、生产规模化、竞争国际化.第2章传统的软件工程过程2.1 什么是软件生命周期软件生命周期又称为软件生存周期或系统开发生命周期,是软件的产生直到报废的生命周期,周期内有问题定义、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级到废弃等阶段,这种按时间分程的思想方法是软件工程中的一种思想原则,即按部就班、逐步推进,每个阶段都要有定义、工作、审查、形成文档以供交流或备查,以提高软件的质量。