软件问题历史
- 1996年6月4日因软件失效在发射40秒后爆炸,原因是惯性参考系统软件的数据转换异常造成的失效。
- 2004年12月20日,美空军第422测试评估大队的一架F-22战斗机因软件问题在起飞过程中失控坠毁。
- 2003年8月14日,美国北部电力丢失,原因是多计算机系统试图同时访问同一资源引起的软件失效
- 2004年9月14日,5 p.m. 美国400架飞机失去联络,原因是空管软件时钟缺陷
- 2005年11月1日,东京证券交易所因为软件升级出现系统故障,导致早间股市“停摆”
- 2002年NIST估计软件问题造成美国年经济损失约600亿美元,占GDP的0.6%
- 2007年5月17日和18日,诺顿杀毒软件导致全部安装了该软件的计算机系统瘫痪
软件危机
- 表现:成本高,软件质量得不到保证,进度难以控制,维护非常困难
- 根本原因
- 逻辑产品
- 复杂性高
- 规模大
- 缺乏有效、系统的原理、原则、方法和工具的指导与辅助
- 软件工程:为克服软件危机而提出的一种概念
- 核心内容:按工程化的原则和方法组织软件开发工作
- 主要任务:通过提供规范化的分析设计方法及工具软件,来避免或减少软件错误的发生,为最终根除软件危机提供强有利的技术保障
- 软件产品没有“质保”,没有“三包”
- 复杂系统的五个共同属性(Grady Booch)
- Hierarchic Structure
- Relative Primitives
- Separation of Concerns
- Common Patterns
- Stable Intermediate Forms
软件工程内容
软件需求 ,软件设计 ,软件建模 ,软件体系结构 ,设计模式 ,软件构造 ,软件测试 ,软件维护 ,软件配置管理 ,软件工程管理 ,软件过程 ,软件工程工具与方法 ,软件质量
软件工程目标
可修改性,有效性,可靠性,可理解性,可维护性,可重用性,可适应性,可移植性,可追踪性,可互相操作性
软件工程原则
- 抽象,信息隐藏,模块化,局部化,一致性,完整性,可验证性
- Davis 提出的软件工程原则
- 质量放在首位
- 高质量的软件是可能的
- 尽早向客户提供产品
- 在编写需求之前确定问题
- 评估可选设计方案
- 使用适当的过程模型
- 在不同阶段使用不同的语言
- 最小化智力差距
- 将技术置于工具之前
- 在使之更快之前,请确保其正确性
- 检查代码
- 好的管理比好的技术更重要
- 人是成功的关键
- 勿盲目跟风
- 承担责任
- Walker Royce的现代软件管理十大原则
- 基于架构优先的方法建立过程。
- 建立一个迭代过程,以通过此过程尽早解决风险。
- 强调基于组件的开发,以减少编码工作量。
- 应该建立变更管理来处理迭代过程。
- 增强迭代开发过程环境(称为双向工程),以通过自动化工具在多个制品上频繁地进行多次变更。
- 使用基于模型和计算机可处理的符号来进行设计。
- 建立质量控制和项目进度评估的客观过程,包括评估所有中间制品。
- 为能够更早地评估中间制品,使用基于演示的方法,将其转换为用户场景的可执行演示。
- 计划增量式发布多个版本,每个版本由一组使用场景组成,并在细节上逐步演化。
- 建立一个可配置的过程,因为没有一个过程适合所有的软件开发。
中间件
- 在操作系统层之上的计算抽象层,提升编程抽象层次
- 屏蔽了底层异构环境
- 三大中间件平台:CORBA, J2EE, .NET
- OMG(Object Management Group)
- 以 UML 为核心颁布技术无关建模标准:MOF, XMI, CWM, MDA
- MDA 思想:分离业务功能分析与设计和实现技术与平台之间紧耦合的关系,从而将技术与平台变化对系统的影响降低到最小程度
- MDA 抽象层次划分
- PIM: Platform-Independent Model,描述系统设计层次
- PSM: Platform-Specific Model
- MDA 软件开发生命周期
历史
- 软件工程:方法学
- 程序设计语言:实现层
- 提高抽象层次角度
- 以机器为中心
- 以应用为中心
- 以企业为中心
- 程序员角色分化
程序设计语言
- First-generation languages (1954-1958)
- FORTRAN I 数学表达式
- ALGOL 58 数学表达式
- Flowmatic 数学表达式
- IPL V 数学表达式
- Second-generation languages (1959-1961)
- FORTRAN II 子程序、单独编译
- ALGOL 60 块结构、数据类型
- COBOL 数据描述、文件处理
- Lisp 列表处理、指针、垃圾收集
- Third-generation languages (1962-1970)
- PL/1 FORTRAN+ALGOL+COBOL
- ALGOL 68: ALGOL 60 严格继承
- Pascal: ALGOL 60 简单继承(71,Wirth,Program=Algorithm+Data Structure)
- Simula 类、数据抽象(OOP 的起源)
- 68年 Dijkstra goto considered harmful
- 断代 (1970-1980)
- C
- FORTRAN 77
- 面向对象 (1980-1990)
- Smalltalk 80(第一个广泛使用的 OOPL)
- C++ (84)
- Ada83
- Eiffel
- C++ 退出垄断(2005):机器性能的提升是编程语言的选择开始转向“人”的因素(好用)
- 使用脚本语言的性能损失对真实世界的程序来讲经常微不足道,因为真实世界的程序往往受I/O事件等待、网络延迟以及缓存列填充等限制,而非CPU的自身效率
- Emergence of frameworks (1990-2000)
- Visual Basic: Windows GUI 开发
- Java
- Python
- J2EE
- .NET
- Visual C#: .NET 架构下 Java 竞争者
- Visual Basic: .NET 架构下 Visual Basic
- 动态脚本语言
- Javascript
- Python
- Ruby
- 函数式编程
- Scala
- Go
- Java 8