1.1 软件
(1)什么是软件?
软件一般认为由三部分组成:
• 程序:在运行时,能提供所希望的功能和性能的指令集。
• 数据结构:使程序能够正确运行的数据结构
• 文档:描述程序研制过程、方法及使用的文档
(2)软件的特点
– 抽象性:逻辑实体,可记录,但看不到
– 可复制性:与开发成本相比,复制成本很低
– 无折旧
– 受硬件制约
– 未完全摆脱手工工艺
– 开发费用高
1.2 软件危机
(1)计算机软件发展的三个时期
1.计算机软件发展的三个时期
• 早期时代( 60 年代中期之前)程序设计阶段:硬件通用,软件专用;程序规模小,编写者和使用者为同一人(同组人)。
• 第二代( 60 年代中期 -70 年代中期)程序系统阶段:出现“软件作坊”、产品软件;“个体化”开发方法。
• 第三代( 70 年代中期之后)软件工程阶段:软件开发成为一门新兴的工程学科——软件工程。
2.计算机软件发展的三个时期及特点
程序设计 | 程序系统 | 软件工程 | |
软件的范畴 | 程序 | 程序及说明书 | 产品软件(项目软件) |
主要程序设计语言 | 汇编及机器语言 | 高级语言 | 高级语言系统、程序设计语言 |
软件工作范围 | 程序编写 | 包括设计和测试 | 软件生存期 |
需求者 | 程序设计者本人 | 少数用户 | 市场用户 |
维护者责任 | 程序设计者 | 开发小组 | 专职维护人员 |
硬件特征 | 价高 、 存储小 、 可 靠性差 | 降价;速度、容量 、 可靠性明显提高 | 向超高速、大容量、微型化发展 |
软件特征 | 完全不受重视 | 软件技术的发展不满足需要,出现软件危机 | 开发技术有进步,但未获得突破性进展,软件危机未完全摆脱 |
(2)什么是软件危机
软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。主要是两个
问题:1. 如何开发软件,怎样满足对软件的日益增长的需求。2. 如何维护数量不断膨胀的已有软件。
(3)软件危机的主要表现
1. 对软件开发成本和进度的估计不准确
2. 用户不满意
3. 软件质量不高、可靠性差
4. 软件常常不可维护、错误难以改正。
5. 缺乏适当的文档资料
6. 软件成本占系统总成本的比例逐年上升
7. 软件开发速度跟不上计算机发展速度
(4)产生软件危机的原因
1. 与软件本身的特点有关。软件不同于硬件,它是计算机系统的逻辑部件而不是物理部件。在写出程序代码并在计算机运行之前,软件开发过程的进展情况较难衡量,软件开发的质量也较难评价。因此,管理和控制软件开发过程相当困难。
2. 软件不易于维护。软件维护通常意味着改正或修改原来的设计,客观上使软件较难维护,且软件不同于一般程序,它的规模大,不易于维护。
3. 在软件开发过程中,或多或少地采用了错误的方法和技术。
4. 对用户需求没有完整准确的认识,就匆忙着手编写程序。
(5)解决软件危机的途径
1. 技术措施:使用更好的软件开发方法和开发工具
2. 组织管理措施:软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。
1.3 软件工程
(1)什么是软件工程
– 软件工程是指导计算机软件开发和维护的工程学科。它采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。
– 软件工程是一门涉及软件计划、需求分析、设计、编码、测试和维护的原理、方法及工具的研究和应用的学科。
(2)软件工程的基本原理
– 1968 年在联邦德国召开的国际会议上正式“软件工程”术语。
– 目前有 100 多条关于软件工程的准则,其中最出名的是著名软件工程专家 B.W.Boehm在 1983 年提出的 7 条基本原理。
1. 用分阶段的生命周期计划严格管理
– 经统计表明,不成功的软件项目中有一半左右是由于计划不周造成的。
– Boehm 认为,在软件的整个生命周期中应制定并严格执行六类计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划。
2. 坚持进行阶段评审
– 大部分错误是在编码之前造成的
– 错误发现与改正得越晚,所需付出的代价越高。
因此,在每个阶段都进行严格的评审,以便尽早发现在软件开发过程的错误。
3. 实行严格的产品控制
– 在软件开发过程中不要随意改变需求,因为改变某项需求往往需要付出较高的代价,但在实践中用户往往会提出需求变更,因此需要采取科学的产品控制技术。
– 目前主要实行基准配置管理:基准配置是指经过阶段评审后的软件配置成分,如各个阶段产生的文档或程序代码。
– 对涉及基准配置的修改,必须经过严格的评审,通过后才能实施修改。
4. 采用现代程序设计技术
– 实践表明:采用先进的技术既可提高软件开发的效率,又可提高软件维护的效率。
– 80 年代及之前:结构化分析、设计技术。
– 90 年代:面向对象分析、设计技术。
5. 结果应能清楚地审查
– 软件产品是看不见、摸不着的逻辑产品,开发过程难以评价和管理。
– 根据软件开发项目的总目标及完成期限,规定开发组织的责任和产品标准,使所得的结果能够清楚地审查。
6. 开发小组的人员应该少而精
– 开发小组人员的素质和数量是影响软件产品质量和开发效率的重要因素。
– 开发小组人员数目的增加,使相互交流复杂、费用增加。
7. 承认不断改进软件工程实践的必要性
– 遵循前6条基本原理,就能够按照当代软件工程基本原理实现软件的工程化生产,但不能保证赶上时代前进的步伐。
– 积极主动采纳新的软件技术,且不断总结经验
(3)软件工程的传统途径
软件工程的传统途径是“生命周期法”,强调“结构化分析、结构化设计”。
1. “生命周期法”的起源
人类解决复杂问题时普遍采用的一个策略是“各个击破”,也就是对问题进行分解,然后再分别解决各个子问题的策略。
软件工程采用的“生命周期法”,就是从时间角度对软件开发和维护的复杂问题进行分解,把软件生存的漫长周期依次划分为若干个阶段,每个阶段有相对独立的任务,然后再逐步完成每个阶段的任务。
2. 生命周期划分的原则
各阶段的任务彼此间尽可能相对独立,同一个阶段各项任务的性质尽可能相同,从而降低每个阶段任务的复杂性,简化不同阶段之间的联系,有利于软件开发过程的组织管理。
3. 生命周期的划分
软件生命周期一般分为:软件定义(问题定义、可行性研究、需求分析)、软件开发(总体设计、详细设计、编码和单元测试、综合测试)、软件维护等三个时期。
生命周期法各阶段的工作小结
4. “生命周期法”的特点
1.4 软件开发过程模型
1.5 软件开发方法