02-软件工程的发展
1. 软件工程的三个环境因素
- 基础:抽象软件实体和虚拟计算机
- 目标:现实的问题
- 三个环境因素:
- 目标
- 正确性基础
- 实现基础
1.2. 抽象软件
2. 软件发展历程
- 科学研究(主要是军事用途)
- 计算理论(lambda演算和图灵机)
- 冯诺依曼架构
- 软件是硬件的一部分
4. 年代:1950s
4.1. 软件工程和硬件工程是一样的
- 第一代编程语言:机器语言,第二代编程语言:汇编语言
- 主框架研究和BIOS
- 硬件主导的发展过程
4.2. 发展过程
- 虚拟计算机
- 第一台商用计算机(UNIVAC I)
- 机器为中心
- 抽象软件实体
- 格雷斯·霍珀是哈佛Mark I计算机的第一批程序员之一,该领域的先驱,大约在1952年为计算机编程语言开发了第一个编译器。
- 20世纪50年代早期计算机的程序员,特别是UNIVAC I和IBM 701,使用机器语言程序,即第一代语言(1GL)。1GL编程很快被类似的机器专用语言(2GL)所取代,这种语言被称为汇编语言或”汇编程序”。
4.3. 机器为中心
- 我的第(1950s),我的主管向我展示了通用电RA1103计算机,这个家伙占满了间。他对我说:“听着,我们每要为这台计算机600美元,只需为你2美元,我想你知道该怎么做了” -Boehm 2006
4.4. 软件发展方法
- 在这期,的主要集中在硬件上,所以没有出现对软件开发专法与技术的需求,也就没有出现被普遍使用的软件开发与技术。
4.5. 软件发展过程
- 美国和加拿大防空半自动化地面环境
- 1个MLOC防空系统,实时,365 * 24,用户密集型
- 成功让很多难以预估的系统的发展
- 硬件主导的瀑布式过程
4.6. 总结
- 科学计算
- 机器为中心的科学主题
- 第一代和第二代编程语言
- 软件工程和硬件工程是相似的
- 硬件主导的发展过程
- 强调回溯和测试
- 科学家和硬件工程师
5. 年代:1960s
5.1. 过程
- 虚拟计算机
- 更好的基础设施:操作系统、编译器(函数式)、应用
- 产品系列:OS-360, CAD/CAM, math/statistics libraries
- 许多巨大的成功:Apollo, ESS, BofA check processing
- 信用卡、ATM
- 抽象软件实体
- 在20世纪50年代后期,汇编语言程序设计发展到包括宏指令的使用,随后又发展了”第三代”程序设计语言(3GL),如FORTRAN、LISP和COBOL。
- ASCII美国信息交换标准码
5.2. 两个重要的诉讼案
- 通过诉讼案裁定ENIAC专利不再有效(1973裁决)
- 使得计算机体系结构从此进共领域
- 作为反垄断诉讼的结果,IBM同意分类定价软件
- 使得软件不再依附于计算机硬件,独在
5.3. 应用为中心
- 商业应用
- 批处理过程
5.4. 软件不是硬件
- 软件与现实世界关系更加密切,对需求的规格化更加困难:[Royce1970]提到”500万美元的硬件设备,30规格说明书就可以 为提供多的细节,500万美元的软件,1500规格说明书 才可以获取相当的控制。”
- 软件件容易修改的多,并且不需要昂贵的线复制产品:因为不需要昂贵的线,所以资源是软件开发的最源,是软件开发的主要成本,因素是软件开发中的最素。
- 软件没有损耗:软件维护的主要是修改软件,主要成本是修改的成本。为了降低维护成本,要求开发者在开发时就要让软件产品设计的易于修改。
- 软件不可见:很难辨别软件进度是否正常,需要开发者更多地使用模型以可视图形的反映软件,也需要开发者使用更深(例如度量)监控软件过程。
5.5. 软件危机
- 软件危机
- 对软件开发成本和进度的估计常常不准确。开发成本超出预算,实际进度定计划拖延的现象并不罕
- 用户对”已完成”系统不满意的现象经常发
- 软件产品的质量不可靠。
- 软件的可维护程度之低。
- 软件通常没有适当的资料。
- 软件的成本不断提高。
- 软件开发率无法满足对软件的生产要求,软件开发率的提后于硬件的发展。
- 这况迫使NATO科学委员会在1968和1969年召开两届碑式的”软件”会议,很多业界领先的研究者和实践者参加了这两届会议。1968年的会议主要分析了软件中的问题,提出了”软件危机”的说法。1969年的会议着重讨论了”软件危机”的解决,指出了”软件”的[Peter1969],用的软件。
5.6. 软件发展方法
- 因为缺乏正确科学知识的指导,也没有多少经验原则可以遵循,因此1960s的软件开发在总体上依靠程序员的个是”工艺式”的开发。
- 到了1960s后期,因为认识到”工艺式”开发的问题,很多研究者开始从编程入手探索解决软件危机的办法,这些促成了1970s结构化编程的建
5.7. 软件发展过程
- 牛仔式编程
- 软件工艺
- 个人英雄主义
5.8. 问题
- 意大利面条,易读性低
- 很多的bug
- 大项目往往计划和控制很脆弱
5.9. 总结
- 商业应用(批处理过程)
- 应用为中心商业框架
- 第三代编程语言
- 软件不是硬件
- 软件工艺的提出
- 计算机科学系的出现
- 软件危机的出现
- 软件需求超过软件工程师的供应
- 图灵奖(1966)
6. 年代:1970s 结构化方法、瀑布模型和形式化方法
- 瀑布模型
- 每个阶段做至少两次
6.7. 瀑布模型的问题
- 对连续里程碑的过度字面解释
- 原型设计是在关键设计评审之前进行编码
- 与用户密集型系统不匹配
- 难以审查和维护的重量级文档
- 7年项目,需求变化318%
- 已通过但未验证的里程碑
- 与COTS、重用、遗留软件不匹配:自下而上与自上而下的流程
- 可扩展性、周期时间和过时
- 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. 量化方法
- 软件生产效率数据:最好程序员可以是最差程序员的26倍
- 按阶段和类型划分的软件缺陷
- 复杂性度量
- 软件质量
- 成本和进度估算
6.11. 总结
- 软件产品
- 商业微型计算机
- 结构化编程语言
- 结构化方法
- 瀑布模型
- 形式化模型
- 量化方法
7. 年代:1980s:生产力,面向对象,重用,软件过程模型
- Web Application 络应用
- Intranet 软局域
- Software Architecture 软件框架
- RUP
8.1. Progress
- 虚拟计算机
- 局域
- 中间件
- 抽象软件实体
- 软件结构
- Java
- ISBSG国际软件基准组织
8.2. 企业为中心
8.10. 开源
- 开源
- 集体代码所有权
- 免费的软件,数据,计算介质
- 免费软件
- Linux
- Raymond’s “The Cathedral and the Bazaar”
- 组件和COTS是它们的未来
8.11. 总结
- 企业为中心,避免信息孤岛
- 大规模软件系统
- Web
- 软件结构
- 特定领域方法
- 产品先重用
- 并行驱动、风险驱动过程:RUP
- CMMI
9. 年代:00s:互联 、敏捷、混合敏捷和计划驱动
- 上图中的部分度量
- 人员多少
- 企业文化
- 需求变更的情况
- 越偏向中心,越敏捷
9.5. SE: 从商业到个人
- 知识体系
- 认可大学教育
9.6. 总结
- 大规模 络应用
- 大众消费应用
- 领域特定软件工程
- 敏捷
10. 年代:2010s – Big data & AI
- 云:云已经开始落地,并且效果很好
- 众包
- Facebook,twiter,wechat,tiktok
- Big data
- AI
- 可穿戴式设备
10.1. Barry Bohem’s view
- 八大惊喜潮流
- 增加SysE和SwE的集成
- 用户/价值焦点
- 软件关键性和可靠性
- 快速,持续变更
- 分布,移动性,互操作性,全球化
- 开源、重用、遗留集成
- 计算量
- 两种发展趋势
- 原子软件
- 生物和计算机结合
10.2. 软件工程有可能的改进
- 软件质量度量不精确
- 存储认证可重用组件需要成为主流
- 质量控制不稳定
- 变更控制也做的不好
- 项算也有待提/li>
- 软件安全在警戒以下
- 软件需要发放执照和职业资格认证的真正职业
- 能性需求的新型度量
- 遗留软件的维护
10.3. 最近的软件工程概念
10.5. 服务 格
- 将商业策略和开发运维结合
- 中台设计:将业务和架构结合
10.7. 混沌工程
- From the 1950’s
- 不要忽略科学
- 三思而后行(避免过早的承诺)
- 避免不连续的顺序过程
- From the 1960’s
- 跳出框框思考
- 尊重软件的差异
- 避免牛仔编程
- From the 1970’s
- 更早处理错误
- 确定系统布标
- 避免自上而下的发展还原论
- From the 1980’s
- 提高生产力的途径有很多
- 对产品有益的东西对工艺有益
- 对银弹持怀疑态度
- From the 1990’s
- 时间就是金钱,对人很重要
- 对人来说软件要实用
- 快速,但是不要急躁
- From the 2000’s
- 如果变化很快,适应性胜过可重复性
- 考虑并满足所有利益相关者的价值主张
- 避免爱上你的口 (雅格尼)
- For the 2010’s
- 把手放在手边
- 有生存策略
- 要什么都相信
- 不要完全相信互联
12. 软件工程教育的未来挑战-2050年代的学生生涯
- 不断更新课件
- 预测未来趋势并为学生做好准备
- 将永恒的原则与老化实践分离
- 使小型学生项目与大型行业实践相关
- 参与研究;将结果纳入课程
- 帮助学生学会学习
- 为从业者提供终身学习
13. 从1950s—2000s之间的特点(简答)
- 1950s:科学计算;以机器为中心进行编程;像生产硬件一样生产软件。
- 1960s:业务应用(批量数据处理和事物计算);软件不同于硬件;用软件工艺的方式生产软件。
- 1970s:结构化方法;瀑布模型;强调规则和纪律。它们奠定了软件工程的基础,是后续年代软件工程发展的支撑。
- 1980s:追求生产力最大化;现代结构化方法/面向对象编程广泛应用;重视过程的作用。
- 1990s:企业为中心的大规模软件系统开发;追求快速开发、可变更性和用户价值;web应用出现
- 2000s:大规模web应用;大量面向大众的web产品;追求快速开发、可变更性、用户价值和创新。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!