本文主要是学习完高级软件工程课程后的一些总结与理解,主要聚焦于软件危机的历史、概念以及解决方法等方面进行阐述。

软件危机是早期计算机科学中的一个术语,指的是软件开发和维护过程中的一些严重问题,这些问题可能导致软件产品的寿命缩短或过早死亡。软件开发是一项非常困难和危险的活动。由于高故障率,存在所谓的“软件危机”。软件危机的根源是复杂性、期望和变化。该术语用于描述计算机性能快速增长的影响以及可以解决的问题的复杂性。本质上,它指的是编写准确、可理解和可验证的计算机程序的困难。

20世纪60年代,计算机科学界经历了一场软件危机,当时工程师们无法构建他们所需要的软件。对软件的需求在上升,但软件和开发人员的能力是有限的。开发人员无法跟上要求他们工作的项目的复杂性。1968年和1969年的北约软件工程会议帮助解决了一些问题,并开始了寻找解决方案(软件)的过程。

1972年,艾兹赫尔·戴克斯特拉于计算机协会图灵奖的演讲:

软件危机的主要原因,把它很不客气地说:在没有机器的时候,编程根本不是问题;当我们有了计算机,编程开始变成问题;而现在我们有巨大的计算机,编程就成为了一个同样巨大的问题。

艾兹赫尔·戴克斯特拉,《Communications of the ACM》

10年后到1986年,Brooks发表了一篇著名的论文“没有银弹(No Silver Bullet: Essence and Accidents of Software Engineering)”,断言“在10年内无法找到解决软件危机的杀手锏(银弹)。这文章激起许多软件工程专家的辩论﹐而没有银弹(No Silver Bullet)也成为脍炙人口的名词。Brooks认为软件工程专家们所找到的各种方法都是舍本逐末,它们解决不了软件中的根本困难,即软件概念结构(conceptual structure)的复杂性,无法达成软件概念的完整性和一致性,自然无法从根本上解决软件危机带来的困境。

软件危机使人们认识到中大型软件系统与小型软件有着本质性差异: 大型软件系统开发周期长、费用昂贵、软件质量难以保证、生产率低,它们的复杂性已远超出人脑能直接控制的程度 ,大型软件系统不能沿袭工作室的开发方式,就像制造小木船的方法不能生产航空母舰一样。

虽然我们无法从根本上解决软件危机,但是我们应当通过软件工程不断改进和优化软件开发过程来延缓危机。

如今,我们利用软件开发模型对软件生命周期进行建模,大致有如下几种:

瀑布模型

定义了软件开发的每个阶段,并明确了文档(需求规范、总体设计、详细设计等)应在每个阶段交付,因为不鼓励恢复到流程的前一阶段,所以不太灵活。

带原型的瀑布模型

显然瀑布模型会将整个软件开发过程中的众多风险积累到最后才能暴露出来,为了尽早暴露风险和控制风险,在瀑布模型的基础上增加一个原型化(prototyping)阶段,可以有效将风险前移,改善整个项目的技术和管理上的可控性。

V模型

V模型也是在瀑布模型基础上发展出来的,我们发现单元测试、集成测试和系统测试是为了在不同层面验证设计,而交付测试则是确认需求是否得到满足。也就是瀑布模型中前后两端的过程活动具有内在的紧密联系,如果将模块化设计的思想拿到软件开发过程活动的组织中来,可以发现通过将瀑布模型前后两端的过程活动结合起来,可以提高过程活动的内聚度,从而改善软件开发效率。

分阶段增量和迭代

分阶段开发可以让客户在没有开发完成之前就可以使用部分功能,也就是每次可以交付系统的一小部分,从而缩短开发迭代的周期。如图所示,分阶段开发还可以让产品系统和开发系统并行进行。

螺旋模型

结合了瀑布和迭代,强调了迭代风险分析,每次绕螺旋的行程都经过四个基本象限:确定迭代的目标、备选方案和约束;评估备选方案,识别和解决风险;开发和验证迭代中的可交付成果;计划下一次迭代。

除此以外,结构化程序设计、面向对象分析和设计、模块化方法、设计模式、软件架构等一系列技术都能在一定程度上缓解了软件危机的表现,这些技术本质上都是通过对软件本身的抽象来有效管控软件的复杂性。

参考资料:代码中的软件工程 https://gitee.com/mengning997/se

高级软件工程——聚焦软件危机相关推荐

  1. 东软 软件工程1 软件危机 软件工程 软件生命周期

    软件危机 软件危机产生的原因 消除软件危机的途径: 软件工程历史 软件工程的概念 软件工程项目的基本目标 软件工程的基本原理 软件生命周期 软件工程的中的软件生命周期

  2. 什么是软件工程?他有那些本质特征?怎样用软件工程消除软件危机?

    本文通过自我学习总结而来,如有错误请各位大神斧正 1:软件工程的定义 软件工程是从管理和技术两方面研究如何更好地开发和维护计算机软件地一门新兴学科.采用工程地概念,原理,技术和方法来开发与维护软件,把 ...

  3. 如何用软件工程消灭软件危机?

    采用工程的概念.原理.技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发处高质量的软件并有效地维护它

  4. 【软件工程】软件与软件危机

    软件与软件危机 一.软件发展历史: 四个时代: **- 程序设计的原始时代(20世纪50年代)** **- 基本软件时代(20世纪50年代末-60年代末)** **- 程序设计的方法时代(20世纪60 ...

  5. 软件工程——三次软件危机的表现及起因

    软件危机:落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象. 第一次软件危机 (60年代~70年代) 20 世纪60年代以前,计算机刚刚投入实际 ...

  6. 软件工程 1:软件危机

    软件工程第一课摘要 文章目录 软件工程第一课摘要 软件工程 面向对象与面向过程 软件危机 中间层抽象与具象化类比 软件工程 编程是个非常适合自学成才的项目,我就是自学的. 很多人和我一样不是科班出身, ...

  7. 软件工程--软件危机-生命周期-软件过程

    文章目录 软件危机 问题 现象 危机产生的原因 途径 软件 定义 特点 软件工程方法学 软件生命周期(过程模型) 软件定义时期 软件开发时期 运行维护 软件过程 理想瀑布模型 实际瀑布模型 快速原型模 ...

  8. (软件工程复习核心重点)第一章软件工程概论-第一节:软件和软件危机

    文章目录 一:软件的概念.特点与发展 (1)软件发展的三个阶段 (2)软件的概念 (3)软件的特点 二:软件危机 (1)软件危机的概念 (2)软件危机的表现 (3)软件危机产生的原因 A:主观原因 B ...

  9. 什么是软件危机?软件危机的主要表现是什么?什么是软件?什么是软件工程?什么是软件过程?软件过程与软件工程方法学有何关系?​​​​​​​什么是软件开发方法?软件开发方法主要有哪些?

    软件危机:在软件的开发和维护过程中所遇到的一系列严重问题. 软件危机主要包含两方面的问题: 1.如何开发软件,以满足对软件日益增长的需求 2.如何维护数量不断膨胀的已有软件. 软件危机的消除途径: 软 ...

最新文章

  1. Xtrabackup备份、还原、恢复Mysql操作大全
  2. (chap6 Http首部) 请求首部字段 RefererTE User-Agent
  3. 【SQL编程】MySQL 5.7.28 版本使用 SQL 直接解析 JSON 字符串(判断是否是合法JSON类型+文本深度+文本长度+值类型+keys获取+值获取+不同深度数据获取)
  4. PPP Over Frame Relay配置
  5. C#利用Microsoft.Office.Interop.Excel导出数据到Excel
  6. Java™ 教程(常见问题及其解决方案)
  7. CentOS依赖包查找工具(https://centos.pkgs.org)
  8. c++读取文本文件里的指定位置的字符_(12)文本文件操作参考
  9. 下行文格式图片_写信封的正确格式图片 看完这些你就懂了
  10. 【测试开发】Pytest—Html测试报告定制及封装
  11. Keras 简介与优势
  12. SuperMap iDesktop 8C 空间分析
  13. Docker Linux下安装配置及启动
  14. 解决input输入框与select下拉框水平不对齐
  15. WPS Office 2019 版本 excel透视图创建及删除
  16. android hook 第三方app_不需要Root即可Hook别人APP的方法
  17. 多线程同时写socket是否需要加锁(转)
  18. 关闭widnows2003 IE增强的安全配置
  19. D - For Gamers. By Gamers.
  20. Android 深入理解Android中的自定义属性

热门文章

  1. Java并发编程的艺术
  2. iOS stringWithFormat 和 initWithFormat 有何不同?
  3. copyfile java_java – 使用FileUtils.copyFile复制文件
  4. 用备忘录写下想法 帮自己记录灵感
  5. ios 工程代码整理
  6. 支付宝APP支付,提示代码 ALIN10070
  7. 打靶归来 - 详解upload-labs靶场(下)
  8. 加密(对称、非对称),签名(算法),指纹和指纹算法,认证证书CA
  9. 永远不要嘲笑那些跪着赚钱的人
  10. Metasploit MS08-067 漏洞利用演示