考试
课程名称 | 课程性质 | 考试方式 | 课程承担学院 | 负责老师 | 考试班级 | 考试时间 | 考试地点 |
---|---|---|---|---|---|---|---|
软件工程 | 选修 | 闭卷考试 | 网络空间安全学院 | 李斌勇 | 信安181,信安182,信安183,信安184,信安185,信安186;信安(实验)181 | 2021年1月7日 (十七周周四) 18:30-20:30 | H1309 H1307 H1308 |
什么是软件 ○
程序不等同于软件。
软件是:
- (1)指令的集合(计算机程序),通过执行这些指令来满足预期的特征、功能和性能需求;
- (2)数据结构,使得程序可以合理的利用信息;
- (3)文档描述,用来描述程序操作和使用。
软件的特点:
- 软件是逻辑产品,不同于物理产品,软件更新复杂,硬件简单替换。
- 硬件会磨损(浴缸曲线),软件不会(失效曲线)。
- 软件本身复杂,设计开发复杂,如人员要求高,成本、进度难控制,风险大、维护困难等。
- 采用构件的构造模式发展,然而大多数软件仍是根据实际的顾客需求定制的。
1.1 软件危机 ★
1.1.1 软件危机的介绍 P1-2
软件危机(Software Crisis)是指计算机软件的开发和维护过程中所遇到的一系列严重问题。
软件危机的表现:
- 对软件开发成本和进度的估算很不准确, 甚至严重拖期和超出预算;
- 无法满足用户需求,导致用户很不满意;
- 质量很不可靠, 经常失效;
- 难以更改、调试和增强;
- 没有适当的文档;
- 软件成本比重上升;
- 软件开发生产率跟不上计算机应用迅速深入的趋势。
1.1.2 产生软件危机的原因 P3-4
客观上: 软件产品开发的复杂度和难度随软件规模呈指数级别增长。
- 随着软件规模的急速增长, 软件的开发方法已经不适用了。
主观上:软件开发人员缺乏工程性的、系统性的方法论。
- 程序员具有编程的能力, 但对软件开发这一过程性较强的任务却缺乏足够的工程化思维;
- 对软件开发的一些认识的误区:软件神话(Software myths);
- 没有将“软件产品研发”与“程序编码”区分清楚;
- 忽视需求分析、轻视软件维护。
1.1.3 消除软件危机的途径 P4-5
- 首先应该对计算机软件有一个正确的认识。
- 必须充分认识到软件开发不是个体劳动,而是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。
- 使用在实践中总结出来的开发软件的成功的技术和方法。
- 应该开发和使用功耗的软件工具。
总之,要从技术和管理两方面,既要有技术措施(方法和工具),又要有必要的组织管理措施。
软件工程:克服软件危机的努力。
- (1)从管理的角度:软件开发过程的研究、文档的标准化以及人们的交流方式等。
- (2)软件开发技术、方法的研究:如结构化软件开发方法,面向对象的开发。
1.2 软件工程 ○
1.2.1 软件工程的介绍
工程:以某组设想的目标为依据,应用有关的科学知识和技术手段,通过一群人的有组织活动将某个(或某些)现有实体(自然的或人造的)转化为具有预期使用价值的人造产品过程。
软件工程早期定义:软件工程是建立和使用一套合理的工程原则,以便经济地获得可靠的、可以在实际机器上高效运行的软件。
软件工程的IEEE定义:
- (1)将系统化的、规范的、可量化的方法应用于软件的开发、运行和维护,即将工程化方法应用于软件。
- (2)在(1)中所述方法的研究。
软件工程的特点:
- 软件工程关注于大型程序的构造
- 软件工程的中心课题是控制复杂性
- 软件经常变化
- 开发软件的效率非常重要
- 和谐地合作是开发软件的关键
- 软件必须有效地支持它的用户
- 在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品
1.2.2 软件工程的基本原理
- 用分阶段的生命周期计划严格管理
- 坚持进行阶段评审
- 实行严格的产品控制
- 采用现代程序设计技术
- 结果应能清楚地审查
- 开发小组的人员应该少而精
- 承认不断改进软件工程实践的必要性
1.2.3 软件工程方法学
通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学(methodology),也称为范型(paradigm)。
1.3 软件生命周期 ★
★ 软件生命周期包含哪几个阶段?
- 1 问题定义
- 2 可行性研究
- 3 需求分析
- 4 总体设计
- 5 详细设计
- 6 编码和单元测试
- 7 综合测试
- 8 软件维护
★ 不同阶段与不同文档的对应关系是什么?
★ 不同阶段所涉及的图形建模工具是什么?
下图待补充:
阶段 | 文档 | 图形建模工具 |
---|---|---|
问题定义 | / | / |
可行性研究 | / | 系统流程图、数据流图、数据字典 |
需求分析 | / | 实体-联系图(ER图)、状态转化图、层次方框图、Warnier图、IPO图 |
总体设计 | 概要设计说明书 | 层次图、HIPO图、结构图 |
详细设计 | 详细设计说明书 | 程序流程图、盒图(N-S图)、PAD图、判定表、判定树、过程设计语言(PDL)(伪码)、Jackson图、流图 |
编码和单元测试 | / | / |
综合测试 | 测试计划、测试分析报告 | / |
软件维护 | 软件维护手册、软件问题报告、软件修改报告 | / |
1.4 软件过程 ▽
软件过程是指软件生命周期所涉及的一系列相关过程,是为一个为建造高质量软件所需完成的任务框架,且规定了完成各项任务的工作步骤。
软件过程是各个环节的粘合剂,串联。
软件工程实践的精髓:
建议: 1.理解问题(沟通分析)。 2.解决方案(建模和软件设计)。 3.实施计划 (代码生成)。 4.检查结果的准确性(测试和质量保证)。
几类经典软件过程模型:
1 瀑布模型(Waterfall Model)
传统(理想)瀑布模型
传统瀑布模型的特点
- 提供了软件过程模型的基本框架(模板)。
- 强调了每一阶段活动的严格顺序。
- 质量保证观点:以经过评审确认了的阶段工作产品(文档)驱动下一阶段的工作,便于管理。
- 是一种整体开发模型,程序的物理实现集中在开发阶段的后期,用户在最后才能看到自己的产品。
实际的瀑布模型
瀑布模型的优缺点
瀑布模型适合于用户需求明确、完整、无重大变化的软件项目开发。瀑布模型的成功在很大程度上是由于它基本上是一种文档驱动的模型。
“瀑布模型是由文档驱动的”这个事实也是它的一个主要缺点:
- 实际项目并不一定按照该模型给出的顺序进行;
- 用户常常难以清楚地给出所有需求;
- 用户必须有耐心,等到系统开发完成。
2 快速原型模型 (Rapid Prototype Model)
在用户不能给出完整、准确的需求说明,或者开发者不能确定算法的有效性、操作系统的适应性或人机交互的形式等许多情况下,可以根据用户的一组基本需求,快速建造一个原型(可运行的软件),然后进行评估,进一步精化、调整原型,使其满足用户的要求,也使开发者对将要做的事情有更好的理解。
原型模型存在的问题
⑴ 为了使原型尽快的工作,没有考虑软件的总体质量和长期的可维护性。
⑵ 为了演示,可能采用不合适的操作系统、编程语言、效率低的算法,这些不理想的选择成了系统的组成部分。
⑶ 开发过程不便于管理。
有效的使用原型模式
建造原型仅是为了定义需求,之后就被抛弃(或被部分抛弃),实际的软件在充分考虑了质量和可维护性之后才被开发。
3 增量模型 (Incremental Model)
是一种渐进地开发逐步完善的软件版本的模型。
反复的应用瀑布模型的基本成分和原型模型的迭代特征,每一个线型过程产生一个“增量”的发布或提交,该增量均是一个可运行的产品。
早期的版本实现用户的基本需求,并提供给用户评估的平台。
增量模型的优点
- 在较短时间内向用户提交可完成部分工作的产品,并分批、逐步地向用户提交产品。从第一个构件交付之日起,用户就能做一些有用的工作。
- 整个软件产品被分解成许多个增量构件,开发人员可以一个构件一个构件地逐步开发。
- 逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品,从而减少一个全新的软件可能给客户组织带来的冲击。
- 采用增量模型比采用瀑布模型和快速原型模型需要更精心的设计,但在设计阶段多付出的劳动将在维护阶段获得回报。
增量模型的困难
- 在把每个新的增量构件集成到现有软件体系结构中时,必须不破坏原来已经开发出的产品。此外,必须把软件的体系结构设计得便于按这种方式进行扩充,向现有产品中加入新构件的过程必须简单、方便,也就是说,软件体系结构必须是开放的。
- 开发人员既要把软件系统看作整体。又要看成可独立的构件,相互矛盾。
- 多个构件并行开发,具有无法集成的风险。
4 螺旋模型 (Spiral Model)
- 软件风险是任何软件开发项目中都普遍存在的实际问题,项目越大,软件越复杂,承担该项目所冒的风险也越大。
- 对于复杂的大型软件,开发一个原型往往达不到要求。螺旋模型将瀑布模型和增量模型结合起来,加入了风险分析。在该模型中,软件开发是一系列的增量发布,早期的迭代中,发布的增量可能是一个纸上的模型或原型,在以后的迭代中,逐步产生系统更加完善的版本。
- 螺旋模型的基本思想是降低风险。
螺旋模型的优点
- 对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件开发的一个重要目标
- 减少了过多测试或测试不足
- 维护和开发之间并没有本质区别
螺旋模型的特点
- 风险驱动,需要相当丰富的风险评估经验和专门知识,否则风险更大
- 主要适用于内部开发的大规模软件项目,随着过程的进展演化,开发者和用户能够更好的识别和对待每一个演化级别上的风险
- 随着迭代次数的增加,工作量加大,软件开发成本增加
5 面向对象模型:喷泉模型(Fountain Model)
喷泉模型
特点:主要用于支持面向对象开发过程,体现了软件创建所固有的迭代和无间隙的特征。
可重用部件组装模型 (构件集成模型) (Component Integration Model)
构件(components)也称为组件,是一段实现一系列有确定接口的程序体,具有自己的功能和逻辑,能同其他构件集成起来协调工作。
该模型支持软件重用(Reusability) ,对缩短软件开发周期、降低项目成本有重要的现实意义。同时,建造符合某应用领域体系结构标准的构件,可以用来搭建分布式的、跨越不同操作平台(集成化软件开发环境(ISEE))的软件,扩展了软件的应用前景,促进了软件标准化、商品化的发展。
因此,在此基础上专家们又提出了“基于构件的软件工程”(CBSE)。
构件集成模型如下图所示:
软件体系结构被建立后,必须用构件去充实,这些构件可从复用库中获得,或者根据专门需要而开发。整个过程可以演化地进行,面向对象方法给予技术上的支持。
Sommerville提出基于构件/组件开发有两种思路:
- 完成高层设计,对设计中的组件给出描述,以便找出可复用的组件,这些组件可在体系结构层次上加入或更详细的设计层次上加入。
- 先根据需求搜寻可复用组件,再将设计建立在获得的组件基础上。
这两种思路可结合起来。
构件技术主要有三种流行标准:
OMG的CORBA:
对象管理组织发布的公用对象请求代理体系结构(Common Object Request Broker Architecture)。通过一个对象请求代理(ORB)提供一系列服务,使得一个构件和其他构件通信,而不管它们在系统中的位置,实现了远程对象通过接口进行通信的机制。
为了解决CORBA对象引用不透明、缺少多重接口、系统过于复杂等问题,专家们又开发了新一代面向对象中间件平台 ICE ( Internet Communications Engine—互联网通信引擎)。使构建分布式应用系统更容易、性能和伸缩性更好。
微软的COM / DCOM:
微软开发了构件对象模型(Component Object Model),它提供了运行于windows之上的单个应用系统使用不同厂商生产的构件的规约。基于分布式环境下的COM称为DCOM (Distribute COM)。
SUN的 EJB ( Enterprise JavaBean ):
随着Java在企业级应用的地位日趋重要,Sun提出了一个统一的企业级Java平台—J2EE(Java 2 Enterprise Edition)。在J2EE中,EJB负责最核心的业务处理。它为服务器端的应用程序提供了一种与厂商无关的Java接口,让任何符合EJB规范的构件都可以运行在每一台这样的服务器上。
6 Rational统一软件开发过程 (RUP)
是由Rational公司的Booch、Jacobson、 Rumbaugh提出的软件过程模型,也称RUP(Rational Unified Process)。RUP重复一系列周期,每个周期由一个交付给用户的产品结束。
每个周期划分为初始、细化、构造和移交四个阶段,每个阶段围绕着五个核心工作流(需求、分析、设计、实现、测试)分别迭代。
模型见下图:
初始阶段:进行问题定义,确定目标,评估其可行性,降低关键风险。
细化阶段:制定项目计划、配置各类资源、建立系统架构(包括各类视图)。
构造阶段:开发整个产品,并确保产品可移交给用户。
移交阶段:产品发布、安装、用户培训。
在每个阶段的每次迭代的最后,用例模型、分析模型、设计模型、实现模型都会增量,每个阶段结束的里程碑处,管理层做出是否继续、进度、预算、是否给下一阶段提供资助等决定。
不同阶段工作流的侧重点不同,前两阶段大部分工作集中在需求、分析和架构设计上;在构造阶段,重点转移到详细设计、实现和测试上。
7 敏捷 (灵活, AGILE) 过程与极限编程
极限编程是敏捷过程中最有名的一个, 适于小型项目。
极限编程(XP,eXtreme Programming)对于传统的软件工程中看来是“极端的”实践.
8 微软过程
专业重点词汇 ○
- 软件工程(Software Engineering)
- 软件过程(Software Process)
- 软件需求(Software Requirements)
- 软件设计(Software Design)
- 软件构建(Software Construction)
- 软件测试(Software Test)
- 软件质量(Software Quality)
- 软件危机(Software Crisis)
- System software
- Application software
- Embedded software
- Legacy software
- Ubiquitous computing
- Open source
- Distributed computing
- Communication
- Planning
- Modeling
- Construction
- Deployment
重点
软件危机
软件生命周期(软件生命周期包含哪几个阶段?不同阶段与不同文档的对应关系是什么?不同阶段所涉及的图形建模工具是什么?)
几类经典软件工程模型