当前课程知识点:软件工程与软件自动化 > 第一章 软件工程基础 > 1.1 软件工程的前生今世 > 授课视频
嗨,大家好,下面我们一起来讨论软件工程的基础
这部分内容我们相当于一个回顾
但是我们希望从不同的侧面
不同的视角来看待软件的基本内容
说到软件工程,我们首先来回顾软件工程的前生今世
在几乎所有的软件工程书籍当中
都会提到一个词叫软件危机
软件危机这个概念是软件工程得以发展的一个引子,一个原因
首先我们来看软件开发
注意,之前不叫软件危机,叫软件开发,或叫软件开发活动
在早期手工作坊式的,一个程序员
当然机器也比较差,语言也少
他个人做一些工作
我们称之手工作坊式
第二个阶段,这个工作量也大
难度也越来越大,我们这些手工作坊者联合起来
构成一些团队,合作生产软件
在1968年软件危机出现之后
实际上我们就出现了软件工程的概念
也就是说我们要把我们的软件开发活动工程化
在整个软件工程发展的这个阶段当中
大家可以发现,出现软件危机
这个危机的出现是因为
我们整个开发的这个三角形
大家注意这个三角形,非常重要
质量,软件开发的结果就是软件的质量满足不了用户的需求
越来越差,规模也越来越大,也越来越难以控制
进度,软件开发规模大了之后
人员多了之后,我们难以控制
总是出现延期,不能按期交付
进度失控。第三个就是成本
这个预算根本不够用
软件开发活动就像一个个黑洞
把客户的钱大量的吸进去
正是由于质量,进度和成本
这三个关键要素出现了这种非常严重的问题
人们被迫的,注意,我们软件工程的出现是由于
人们不得不做这些事情。做什么事情呢?
来研究在软件生产过程当中的技术手段和管理手段
我们特意强调技术和管理是软件工程必须关注的两个方面
同等重要
一般情况下,搞技术的同学比较关注技术
与管理没关系,我干活就完了,管理是经理的事
是老板的事,与我有什么关系呢!
这是我们整个软件工程的过程当中,我们要重点强调的这个思维
我们来看一下,软件工程它的一个基本思路
我们可以说软件工程它本身是一个新兴的行业
它要想工程化,它必须借鉴这种传统的工程
传统工程里面最经典的土木,土木工程
是我们软件工程中重点学习的一个对象
比如说我们后要提到的典型的设计模式
就是从人家建筑行业学过来的
它借鉴传统工程的原则,方法
来提高我们软件产品的开发质量
来降低我们的软件开发成本
这是我们整个软件工程,我们使用了
计算机本身的知识,数学的和管理学的
注意,这里我们列出了计算机、数学和管理
这是早期,我们可以说早期软件工程重点使用的知识
现在我们跨界这么严重,是吧
我们计算机软件工程的发展
所使用的这种知识远远超过这三种
在软件工程当中
我们必须要关注它的三个要素
质量毫无疑问是软件开发的一个终极目标
我们开发的产品必须满足用户的质量要求
在整个开发过程中,首先
我们要关注方法,方法就是应该这么做
第一步是什么,第二步是什么,第三步是什么
方法吗,告诉你怎么做,才能做的好
这个方法论的问题是整个软件工程的一个比较核心的内容
第二个内容就是要过程,我们知道方法了
我们要开发一个软件,下面我们开始做
做的过程当中发现人越来越多
事情越来越多,很混乱,失控了
怎么才能让整个开发的过程忙而不乱,井然有序的推进
取决于我们对整个软件开发过程的一个理解和掌控
第三个就是工具,工欲善其事必先利其器
所以我们对工具的使用就变得非常重要了
软件工程呢,我们知道,计算机科学技术,0812
这是我们国家对计算机科学技术的一个一级学科编号
它下面二级学科,早期我们说计算机的二级学科只有三个
系统结构,软件与理论和计算机应用
后来呢,国家又增设了网络信息安全
在早期的时候呢,我们软件工程方面的研究
我们都归类到软件与理论
又在软件与理论这个二级学科当中开展对软件工程的的研究
后来呢,软件工程在2011年2月荣升为一级学科
获得了它的一个一级学科编号0835
在它的一级学科下又出现了
软件工程理论与方法,工程技术
软件服务工程和领域软件工程
国家从这个层面上来提升了我们软件工程的地位
迎来了我们软件工程的进一步发展
软件工程有哪些知识体系呢?我们来看一看
SWEBOK,也就是它的一个知识体系
这个知识体系初步把软件工程的主体分10个领域
这10个领域呢,大家可以看到
前面这些好像与我们软件开发活动的几个阶段相关
后面是一些管理的领域
还有一些质量,工程工具和方法
进一步的,我们把这10个领域进一步的扩展,我们可以
从管理,设计,面向对象,面向过程
以及各种语言的编码各种测试等等
都可以涉及到,所以说软件工程本身是一个非常庞大的体系
软件工程本身是源于计算机技术,数学和管理
前面我们提到过,后来除了这种主要的知识体系的发展之外
还涉及到了其他的领域,就是跨界
涉及到了比如说心理学,经济学,人机工程等等
我们可以看到,软件工程与数学,管理,心理,经济都有关系
具体这些学科研究哪些内容
大家感兴趣的可以下去自行查找
这里我们讲软件工程随着它的快速发展,做了很多跨界方面的研究
我们这门课要重点讨论的内容是软件自动化
自动化呢,我们来看一下这样一个层次
首先呢,我们软件工程要解决的问题
就是要干什么
首先我要对干的东西进行一个描述
这个描述我们强调的是非形式化
就不是用数学语言表达的,而是我们用自然语言
很随意的说出来的或者是写出来的
那么我们把我们的问题说清楚了,下面呢
开发人员,要求你对功能进行一个描述
就是对应到我们软件工程里面的需求分析,设计,编码和测试
这是我们软件工程当中的主要活动
我们的自动化呢,分成三级
第一级就是,我们从设计这种形式化描述
注意这个地方我们强调说,我们在设计阶段的描述
我们要用形式化语言来描述
这种形式化的语言它没有歧义,很精确
能够被机器工具所理解和执行
我们把这种自动化,也就是从设计阶段形式化的描述
到自动编码到自动测试,我们称之为低级自动化
如果我们的自动化程度进一步的提高
我们可以把功能描述这一部分也囊括进来,形成一个中级自动化
进一步,我们追求的高级自动化是什么呢
就是包括我们问题的非形式描述
我们都可以来进行自动化操作
举一个简单的例子,比如说
在将来的某一天,客户需要一套软件系统
他就不需要叫软件公司了
他直接对他的电脑说,我需要开发一套什么系统
它的功能是ABCDEF
性能要求是什么,话音刚落
电脑啪的吐出一张光盘,到时候连光盘都没有了
自动的生成一套软件,就能够满足他的要求
就是说从它的非形式描述到最终的产品全部自动化
当然这里面有一点科幻的意味在里面
但我们相信随着我们科学技术的发展
这一天很快就会到来
我们来看一看在软件的开发过程当中
软件开发的主要几个活动:分析,设计,编码和测试
这是我们在软件开发活动当中主要的4个阶段
或者4个活动
传统的来讲呢,我们分析需要花20%的人力和资金
设计呢,15%,编码是20%
测试很重要,要保证产品质量
我们要用大量的人来进行测试
我们一般的软件开发,编码人员和测试人员的比例在1:2或1:1.5
就可以看得出来人们对测试的重视
这是我们传统的,目前我们随着工具的使用
随着我们管理技术的提高
我们对分析更加重视,分析如果分析的好,设计可以快速完成
编码是30%,测试是25%
我们使用很多自动化的测试工具
就可以帮助我们测,所以我们测试的量就降下来了
但是我们目前自动编码技术,就是编码阶段的自动化技术还不是很成熟
所以说在编码阶段我们并不能有很大的提高
将来呢
将来的目标比例是什么呢,就是说测试,最后阶段,我降到15%了
分析45,就是在分析阶段我很详细的用形式化的
我们现在可能这种语言还没有非常的成熟
将来成熟之后,我们分析的时候,要用这种形式化的语言
把用户的需求给表达清楚
设计是40%。大家发现没发现这张饼和另外两张饼的区别在哪里
对,编码没有了。编码哪去了呢?
当我们用这种形式化的规则描述语言把用户所需要的系统表达清楚之后
我们用自动化的工具会自动产生代码
自动化测试一部分,剩下的测试自动化无法完成
需要我们人工进行测试
这是我们将来理想的比例
软件工程从发展的角度来看,将来路在何方呢
我们看到的这个片段,有同学说好像是伪代码
它呢,实际上是一种规格描述语言
你说伪代码也可以。那么它是干什么的呢
它是一种形式化的语言
它用于描述我们这个系统要干什么
就是解决做什么的问题,做什么不是用自然语言来说的
而是使用一种形式化的语言来说,更精准,没有歧义
第二个软件工程的发展方向就是工程化
工程化的目标是总结软件开发过程当中出现的规律
解决的是怎么做的问题:形式化
科学家们继续研究,尤其是数学家
他要研究我怎么能够把这种自然的,这种有歧义的描述,这种需求
把它用一个精准的形式化语言来表达
更多是一种数学方面的发展。工程化要解决的是
人越来越多,模块越来越多
我们怎么才能够保证进度,保证产品的质量
同时成本得以控制。总结一下
软件危机促进了软件自动化的发展
这里面提到软件危机导致软件工程的出现
软件工程进一步的发展,必须让软件自动化来帮忙
软件自动化的目标是解决软件问题,这就回到最根本的一个点上
软件的根本问题是什么?质量,成本和进度
好,这个小结就到这,下次再见
-1.1 软件工程的前生今世
--开篇阅读
--授课视频
-第一章 软件工程基础--1.1 软件工程的前生今世
-1.2 万变不离其宗
--授课视频1/3
--授课视频2/3
--授课视频3/3
-第一章 软件工程基础--1.2 万变不离其宗
-1.3 唯一不变的是变化
--授课视频1/3
--授课视频2/3
--授课视频3/3
--外部链接
-第一章 软件工程基础--1.3 唯一不变的是变化
-1.4 亡羊补牢为时不晚
--授课视频1/2
--授课视频2/2
-第一章 软件工程基础--1.4 亡羊补牢为时不晚
-扩展阅读与话题讨论
--扩展阅读
--话题讨论
-2.1 方法论来源于恐惧
--授课视频
-第二章 敏捷开发--2.1 方法论来源于恐惧
-2.2 敏捷是什么
--授课视频
-第二章 敏捷开发--2.2 敏捷是什么
-2.3 典型敏捷开发方法
--XP敏捷开发方法
-第二章 敏捷开发--2.3 典型敏捷开发方法
-2.4 敏捷不是万能药
--授课视频
-第二章 敏捷开发--2.4 敏捷不是万能药
-专家谈敏捷
-扩展阅读与话题讨论
--外部链接
--话题讨论
-3.1 面向对象核心概念和基本特性
-第三章 OO与UML--3.1 面向对象核心概念和基本特性
-3.2 面向对象设计基本原则
-第三章 OO与UML--3.2 面向对象设计基本原则
-3.3 通用职责分配模式(GRASP)
--通用职责分配模式
-3.3 通用职责分配模式(GRASP)--作业
-3.4 从重构到模式
--模式和设计模式
-第三章 OO与UML--3.4 从重构到模式
-3.5 使用UML设计面向对象系统
--UML综述
-第三章 OO与UML--3.5 使用UML设计面向对象系统
-3.6 主要UML模型图绘制技巧
--UML用例图
--UML类图
-第三章 OO与UML--3.6 主要UML模型图绘制技巧
-扩展阅读与话题讨论
--设计模式有毒么?
--话题讨论
-4.1 案例简介
--书籍参考
--案例说明
-4.2 对象模型之一
--授课视频1/2
--授课视频2/2
-第四章 对象模型分析--4.2 对象模型之一
-4.3 对象模型之二
--授课视频1/2
--授课视频2/2
-第四章 对象模型分析--4.3 对象模型之二
-4.4 对象模型之交互
--授课视频
-第四章 对象模型分析--4.4 对象模型之交互
-扩展阅读与话题讨论
--图书推荐
--话题讨论
-5.1 软件自动化概述
--软件自动化概述
-第五章 软件自动化技术--5.1 软件自动化概述
-5.2 典型自动化方法和工具
-第五章 软件自动化技术--5.2 典型自动化方法和工具
-5.3 文档自动化
--文档自动化视频
-第五章 软件自动化技术--5.3 文档自动化
-5.4 测试自动化
--测试自动化视频
-第五章 软件自动化技术--5.4 测试自动化
-专家访谈
-扩展阅读与话题讨论
--话题讨论
-6.1 持续集成
-第六章 CI/CD与DevOps--6.1 持续集成
-6.2 持续交付和部署
-第六章 CI/CD与DevOps--6.2 持续交付和部署
-6.3 DevOps
-第六章 CI/CD与DevOps--6.3 DevOps
-专家访谈
-扩展阅读与话题讨论
--DevOps专题
--话题讨论
-7.1 质量和质量保证
--授课视频
-第七章 软件质量保证--7.1 质量和质量保证
-7.2 软件质量模型
--授课视频
-第七章 软件质量保证--7.2 软件质量模型
-7.3 SQA组织与职责
--授课视频
-第七章 软件质量保证--7.3 SQA组织与职责
-7.4 全面软件质量管理
--授课视频
-第七章 软件质量保证--7.4 全面软件质量管理
-专家访谈
--专家访谈
-扩展阅读与话题讨论
--外部链接
--话题讨论
-8.1 软件过程综述
--授课视频
-第八章 软件过程改进--8.1 软件过程综述
-8.2 软件过程改进
--授课视频
-第八章 软件过程改进--8.2 软件过程改进
-8.3 能力成熟度模型
--授课视频
-第八章 软件过程改进--8.3 能力成熟度模型
-8.4 过程改进标准框架
--授课视频
-第八章 软件过程改进--8.4 过程改进标准框架
-扩展阅读与话题讨论
--话题讨论
-9.1软件复用综述
--授课视频
-第九章 软件复用--9.1软件复用综述
-9.2 软件构件技术
--授课视频
-第九章 软件复用--9.2 软件构件技术
-9.3 软件复用实施
--授课视频
-第九章 软件复用--9.3 软件复用实施
-9.4 微服务架构
--授课视频
-第九章 软件复用--9.4 微服务架构
-扩展阅读与话题讨论
--微服务扩展
--话题讨论
-文档提交处--文档提交