软件工程与计算II – 软件工程的发展

02-软件工程的发展

1. 软件工程的三个环境因素

  1. 基础:抽象软件实体和虚拟计算机
  2. 目标:现实的问题
  3. 三个环境因素:
    1. 目标
    2. 正确性基础
    3. 实现基础

1.2. 抽象软件

2. 软件发展历程

  1. 科学研究(主要是军事用途)
  2. 计算理论(lambda演算和图灵机)
  3. 冯诺依曼架构
  4. 软件是硬件的一部分

4. 年代:1950s

4.1. 软件工程和硬件工程是一样的

  1. 第一代编程语言:机器语言,第二代编程语言:汇编语言
  2. 主框架研究和BIOS
  3. 硬件主导的发展过程

4.2. 发展过程

  1. 虚拟计算机
    • 第一台商用计算机(UNIVAC I)
    • 机器为中心
  2. 抽象软件实体
    • 格雷斯·霍珀是哈佛Mark I计算机的第一批程序员之一,该领域的先驱,大约在1952年为计算机编程语言开发了第一个编译器。
    • 20世纪50年代早期计算机的程序员,特别是UNIVAC I和IBM 701,使用机器语言程序,即第一代语言(1GL)。1GL编程很快被类似的机器专用语言(2GL)所取代,这种语言被称为汇编语言或”汇编程序”。

4.3. 机器为中心

  1. 我的第(1950s),我的主管向我展示了通用电RA1103计算机,这个家伙占满了间。他对我说:“听着,我们每要为这台计算机600美元,只需为你2美元,我想你知道该怎么做了” -Boehm 2006

4.4. 软件发展方法

  1. 在这期,的主要集中在硬件上,所以没有出现对软件开发专法与技术的需求,也就没有出现被普遍使用的软件开发与技术。

4.5. 软件发展过程

  1. 美国和加拿大防空半自动化地面环境
  2. 1个MLOC防空系统,实时,365 * 24,用户密集型
  3. 成功让很多难以预估的系统的发展
  4. 硬件主导的瀑布式过程

4.6. 总结

  1. 科学计算
  2. 机器为中心的科学主题
  3. 第一代和第二代编程语言
  4. 软件工程和硬件工程是相似的
  5. 硬件主导的发展过程
  6. 强调回溯和测试
  7. 科学家和硬件工程师

5. 年代:1960s

5.1. 过程

  1. 虚拟计算机
    • 更好的基础设施:操作系统、编译器(函数式)、应用
    • 产品系列:OS-360, CAD/CAM, math/statistics libraries
    • 许多巨大的成功:Apollo, ESS, BofA check processing
    • 信用卡、ATM
  2. 抽象软件实体
    • 在20世纪50年代后期,汇编语言程序设计发展到包括宏指令的使用,随后又发展了”第三代”程序设计语言(3GL),如FORTRAN、LISP和COBOL。
    • ASCII美国信息交换标准码

5.2. 两个重要的诉讼案

  1. 通过诉讼案裁定ENIAC专利不再有效(1973裁决)
    • 使得计算机体系结构从此进共领域
  2. 作为反垄断诉讼的结果,IBM同意分类定价软件
    • 使得软件不再依附于计算机硬件,独在

5.3. 应用为中心

  1. 商业应用
  2. 批处理过程

5.4. 软件不是硬件

  1. 软件与现实世界关系更加密切,对需求的规格化更加困难:[Royce1970]提到”500万美元的硬件设备,30规格说明书就可以 为提供多的细节,500万美元的软件,1500规格说明书 才可以获取相当的控制。”
  2. 软件件容易修改的多,并且不需要昂贵的线复制产品:因为不需要昂贵的线,所以资源是软件开发的最源,是软件开发的主要成本,因素是软件开发中的最素。
  3. 软件没有损耗:软件维护的主要是修改软件,主要成本是修改的成本。为了降低维护成本,要求开发者在开发时就要让软件产品设计的易于修改。
  4. 软件不可见:很难辨别软件进度是否正常,需要开发者更多地使用模型以可视图形的反映软件,也需要开发者使用更深(例如度量)监控软件过程。

5.5. 软件危机

  1. 软件危机
    1. 对软件开发成本和进度的估计常常不准确。开发成本超出预算,实际进度定计划拖延的现象并不罕
    2. 用户对”已完成”系统不满意的现象经常发
    3. 软件产品的质量不可靠。
    4. 软件的可维护程度之低。
    5. 软件通常没有适当的资料。
    6. 软件的成本不断提高。
    7. 软件开发率无法满足对软件的生产要求,软件开发率的提后于硬件的发展。
  2. 这况迫使NATO科学委员会在1968和1969年召开两届碑式的”软件”会议,很多业界领先的研究者和实践者参加了这两届会议。1968年的会议主要分析了软件中的问题,提出了”软件危机”的说法。1969年的会议着重讨论了”软件危机”的解决,指出了”软件”的[Peter1969],用的软件。

5.6. 软件发展方法

  1. 因为缺乏正确科学知识的指导,也没有多少经验原则可以遵循,因此1960s的软件开发在总体上依靠程序员的个是”工艺式”的开发。
  2. 到了1960s后期,因为认识到”工艺式”开发的问题,很多研究者开始从编程入手探索解决软件危机的办法,这些促成了1970s结构化编程的建

5.7. 软件发展过程

  1. 牛仔式编程
  2. 软件工艺
  3. 个人英雄主义

5.8. 问题

  1. 意大利面条,易读性低
  2. 很多的bug
  3. 大项目往往计划和控制很脆弱

5.9. 总结

  1. 商业应用(批处理过程)
  2. 应用为中心商业框架
  3. 第三代编程语言
  4. 软件不是硬件
  5. 软件工艺的提出
  6. 计算机科学系的出现
  7. 软件危机的出现
  8. 软件需求超过软件工程师的供应
  9. 图灵奖(1966)

6. 年代:1970s 结构化方法、瀑布模型和形式化方法

  1. 瀑布模型
  2. 每个阶段做至少两次

6.7. 瀑布模型的问题

  1. 对连续里程碑的过度字面解释
    • 原型设计是在关键设计评审之前进行编码
    • 与用户密集型系统不匹配
  2. 难以审查和维护的重量级文档
    • 7年项目,需求变化318%
    • 已通过但未验证的里程碑
  3. 与COTS、重用、遗留软件不匹配:自下而上与自上而下的流程
  4. 可扩展性、周期时间和过时
    • Months = 5 K S L O C 3 5 * sqrt[3]{KSLOC} 5/span>3KSLOC /span> for sequential development
    • 3000 KSLOC => 5*14.4 = 72 months : 4 computer generations

6.8. 软件与硬件成本代价变换

6.10. 量化方法

  1. 软件生产效率数据:最好程序员可以是最差程序员的26倍
  2. 按阶段和类型划分的软件缺陷
  3. 复杂性度量
  4. 软件质量
  5. 成本和进度估算

6.11. 总结

  1. 软件产品
  2. 商业微型计算机
  3. 结构化编程语言
  4. 结构化方法
  5. 瀑布模型
  6. 形式化模型
  7. 量化方法

7. 年代:1980s:生产力,面向对象,重用,软件过程模型

  1. Web Application 络应用
  2. Intranet 软局域
  3. Software Architecture 软件框架
  4. RUP

8.1. Progress

  1. 虚拟计算机
    • 局域
    • 中间件
  2. 抽象软件实体
    • 软件结构
    • Java
    • ISBSG国际软件基准组织

8.2. 企业为中心

8.10. 开源

  1. 开源
      • 集体代码所有权
      • 免费的软件,数据,计算介质
    • 免费软件
    • Linux
    • Raymond’s “The Cathedral and the Bazaar”
  2. 组件和COTS是它们的未来

8.11. 总结

  1. 企业为中心,避免信息孤岛
  2. 大规模软件系统
  3. Web
  4. 软件结构
  5. 特定领域方法
  6. 产品先重用
  7. 并行驱动、风险驱动过程:RUP
  8. CMMI

9. 年代:00s:互联 、敏捷、混合敏捷和计划驱动

  1. 上图中的部分度量
    1. 人员多少
    2. 企业文化
    3. 需求变更的情况
  2. 越偏向中心,越敏捷

9.5. SE: 从商业到个人

  1. 知识体系
  2. 认可大学教育

9.6. 总结

  1. 大规模 络应用
  2. 大众消费应用
  3. 领域特定软件工程
  4. 敏捷

10. 年代:2010s – Big data & AI

  1. 云:云已经开始落地,并且效果很好
  2. 众包
  3. Facebook,twiter,wechat,tiktok
  4. Big data
  5. AI
  6. 可穿戴式设备

10.1. Barry Bohem’s view

  1. 八大惊喜潮流
    1. 增加SysE和SwE的集成
    2. 用户/价值焦点
    3. 软件关键性和可靠性
    4. 快速,持续变更
    5. 分布,移动性,互操作性,全球化
    6. 开源、重用、遗留集成
    7. 计算量
  2. 两种发展趋势
    • 原子软件
    • 生物和计算机结合

10.2. 软件工程有可能的改进

  1. 软件质量度量不精确
  2. 存储认证可重用组件需要成为主流
  3. 质量控制不稳定
  4. 变更控制也做的不好
  5. 项算也有待提/li>
  6. 软件安全在警戒以下
  7. 软件需要发放执照和职业资格认证的真正职业
  8. 能性需求的新型度量
  9. 遗留软件的维护

10.3. 最近的软件工程概念

10.5. 服务 格

  1. 将商业策略和开发运维结合
  2. 中台设计:将业务和架构结合

10.7. 混沌工程

  1. From the 1950’s
    • 不要忽略科学
    • 三思而后行(避免过早的承诺)
    • 避免不连续的顺序过程
  2. From the 1960’s
    • 跳出框框思考
    • 尊重软件的差异
    • 避免牛仔编程
  3. From the 1970’s
    • 更早处理错误
    • 确定系统布标
    • 避免自上而下的发展还原论
  4. From the 1980’s
    • 提高生产力的途径有很多
    • 对产品有益的东西对工艺有益
    • 对银弹持怀疑态度
  5. From the 1990’s
    • 时间就是金钱,对人很重要
    • 对人来说软件要实用
    • 快速,但是不要急躁
  6. From the 2000’s
    • 如果变化很快,适应性胜过可重复性
    • 考虑并满足所有利益相关者的价值主张
    • 避免爱上你的口 (雅格尼)
  7. For the 2010’s
    • 把手放在手边
    • 有生存策略
    • 要什么都相信
      • 不要完全相信互联

12. 软件工程教育的未来挑战-2050年代的学生生涯

  1. 不断更新课件
  2. 预测未来趋势并为学生做好准备
  3. 将永恒的原则与老化实践分离
  4. 使小型学生项目与大型行业实践相关
  5. 参与研究;将结果纳入课程
  6. 帮助学生学会学习
  7. 为从业者提供终身学习

13. 从1950s—2000s之间的特点(简答)

  1. 1950s:科学计算;以机器为中心进行编程;像生产硬件一样生产软件。
  2. 1960s:业务应用(批量数据处理和事物计算);软件不同于硬件;用软件工艺的方式生产软件。
  3. 1970s:结构化方法;瀑布模型;强调规则和纪律。它们奠定了软件工程的基础,是后续年代软件工程发展的支撑。
  4. 1980s:追求生产力最大化;现代结构化方法/面向对象编程广泛应用;重视过程的作用。
  5. 1990s:企业为中心的大规模软件系统开发;追求快速开发、可变更性和用户价值;web应用出现
  6. 2000s:大规模web应用;大量面向大众的web产品;追求快速开发、可变更性、用户价值和创新。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年2月8日
下一篇 2022年2月8日

相关推荐