当前课程知识点:软件工程 > 第1章 初识软件工程 > 1.2 软件的本质特性 > 讲授视频
现在的世界正在进入一个
“软件无处不在”的时代
我们每天的生活
时刻都离不开这样那样的软件
那么什么是软件呢
这是一个大学生开发的微信应用
在这个应用中
学生可以查看演出的相关信息
订票并且选择座位
最后系统会自动生成一个
带有二维码的电子票
在用户来看
这个软件就是一系列
实现各种功能的图形化界面
但是在计算机内部
是如何执行的呢
首先 计算机内部
实际运行着一些程序代码
这些代码负责
向计算机发出动作指令
实现查看活动 订票选座
以及生成电子票等不同的功能
其次
在计算机运行这些程序的过程中
还需要操作诸如学生 活动
和电子票等数据
另外
为了后续的维护和开发
以及方便用户使用
可能还需要一些描述技术
实现细节的开发文档
和系统使用的用户文档
可以说
软件是由程序
数据和文档构成的
其中程序是
计算机可以接受的一系列指令
运行的时候
可以提供所要求的功能和性能
数据是使程序
能够适当地操作信息的
一些数据结构
文档则是描述程序的研制过程
方法和使用的图文资料
现在思考一个问题
程序 数据和文档
是否代表了软件的真正含义呢
我们从前面的微信应用可以看出
软件的行为
只有通过运行才能呈现出来
也就是说
在程序运行的过程中
才能观察到软件的功能和性能
而软件提供的信息和服务
又融合了买票
这个业务的领域知识
从这个方面来看
软件更像是嵌入式的数字化知识
那么这种知识载体的特征
会对软件开发带来什么影响呢
飞机和软件都是人类的创造物
飞机是有形的物体
一架大型客机
由数百万个单独的部件组成
需要上千人组装
但是通常
都能够按时按预算交付使用
软件是人类思维的创造物
微软于1989年11月
发布的Word1.0版本
这个软件大概有
25万行的源代码
但是开发软件
却花费了整整55个人年
一再地推迟交付
比原计划晚了4年
直观上来看
建造大型的飞机
似乎要比开发一个
简单地Word软件要复杂得多
但实际情况却大相径庭
我们不禁要问
开发软件和建造客机
到底有什么本质性的区别
Fred Brooks教授
是软件工程领域
非常有影响力的人物
他曾经担任
IBM OS360系统的项目经理
由于在计算机体系结构
操作系统和软件工程方面的
杰出贡献
于1999年获得了图灵奖
Brooks教授在1987年
发表了一篇题为
“没有银弹”的文章
在这篇文章中指出
软件具有复杂性 一致性 可变性
和不可见性等固有的内在特性
这是造成软件
开发困难的根本原因
软件是人类思维
和智能的一种延伸
它比任何以往人类的创造物
都要复杂得多
这是一个Linux内核的
复杂网络图
它的节点代表函数
它的边代表函数的调用
但是这个图形
也仅仅表示的是
函数之间的静态调用
而在动态运行过程中
系统会呈现出更为复杂的状态
很难用图形进行描述
今天
我们已经进入云计算时代
在互联网的集群环境下
系统规模更大更复杂
像Google的搜索引擎
亚马逊的云计算中心
以及阿里云等
其规模都超过了百万台服务器
可以这样说
软件是人类创造的最复杂的物体
这种复杂性
会给软件开发管理和质量保证
带来很多困难
软件开发的另一个特点
是人为设计带来的复杂性
软件必须遵从人为的惯例
并适应已有的技术和系统
随着接口的不同而改变
但是这些变化
都是人为设计的结果
可以用 随心所欲 毫无规则来形容
就拿刚才的微信应用来说
用户使用不同的终端
发出服务请求
微信服务器接收请求
并把它们转发给主服务器
主服务器
处理响应要求很高的抢票请求
把其他的请求
转发给辅助服务器
当然在整个的过程里
系统还有可能和一些身份认证等
其他系统进行交互
从这个应用来看
它需要通过与微信系统
身份验证系统等打交道
因此
就必须遵从这些系统定义的接口
而这些接口
都是软件工程师人为设计的
任何接口的变化
都会带来微信应用的修改
所以说
要保持与其他系统的接口一致性
也会造成软件设计的复杂性
我们经常听到这样一句话
这个世界在变
唯一不变的是一直在变
我们通过微信的演化历史
来看一下软件的可变性
微信开发
是在2010年11月正式立项
2011年1月和3月
分别发布了1.0和1.2版本
实现文字短信和图片分享功能
但是当时市场反应冷淡
2011年5月
推出语音通信功能
发布了2.0版本
微信开始快速地流行和传播
2011年10月
提供了“查看附近人”的功能
这个功能
也成为微信用户增长的
一个爆发点
2012年4月
微信发布4.0版本
先后推出了“朋友圈”
视频通话以及微信公众平台
开始建立手机上的熟人社交圈
2013年8月以后
微信5.0及其后续版本
提供了如支付 表情 游戏等
一系列贴近用户生活的服务
并且专门开辟了服务号
打造了一种更具体验效果的
移动互联网的生活方式
这些事例告诉我们
软件只要是使用
就会一直在变
而这个改变是随需而变
相对于建筑和飞机等
工程制品来说
软件的变更似乎更加频繁
这也许是因为建筑和飞机
修改成本太高所致
人们总是以为软件很容易修改
但是却忽视了修改带来的副作用
理想的情况下
随着软件的使用
其故障率会逐渐降低
逐渐达到一个稳定地质量
但是软件在不断变化的
每一次的修改
都会造成故障率的升高
同时也可能给软件的结构
带来破坏
不断的修改
最终可能导致软件发生退化
从而结束其生命周期
尽管如此
成功的软件都是会发生演化的
没有任何变化的软件
一定是没有用的
虽然软件的可变性
给开发带来了很多难题
但是
也给软件本身带来了生命力
所以
我们要用积极地态度
和有效地方法
来控制变更
使软件在演化过程中保证高质量
软件还有一个特性
就是“看不见”“摸不着”
像建筑 飞机这些有形的物体
我们可以用平面的图形
抽象出其结构形态
但是软件是逻辑的
没有空间的形体特征
因此缺少合适的几何表达方式
开发人员
在接收到用户需求的时候
整个开发的过程
只能看到源代码
而代码并不是软件本身
因此在开发完成之前
很难看到软件是如何执行的
这种不可见性
不仅限制了软件的设计过程
同时严重地阻碍了
相互之间的人与人的交流
从而对开发过程的管理
造成很大困难
Brooks教授
在著名的《人月神话》一书中
把软件人员形容成
“皇帝的新衣”故事里的裁缝
开发人员一直在编织
却看不到编织的织物
最后也许是编织出来
一堆无用的废物
或者什么也没有做出来
通过前面的分析我们可以看到
复杂性 一致性 可变性
和不可见性
是软件的本质特性
这些特性使软件开发的过程
变得难以控制
开发团队
如同在焦油坑里挣扎的巨兽
挣扎得越猛烈
焦油纠缠得越紧
最后有可能沉没到坑底
因此
我们需要寻找解决问题的
有效方法
从而保证软件开发过程的
高效 有序和可控
-1.1 软件无处不在
--讲课视频
-1.2 软件的本质特性
--讲授视频
-1.3 软件工程的产生与发展
--讲授视频
-1.4 软件工程的基本概念
--讲授视频
-1.5 软件质量实现
--讲授视频
-1.6 业界人士谈软件工程
-测验题--作业
-讨论题
--讨论题
-作业题
--第一张 作业题
-2.1 编程过程与规范
--讲课视频
-2.2 良好的编程实践
--讲课视频
-2.3 Python集成开发环境
--讲课视频
-2.4 代码静态检查
--讲课视频
-2.5 代码性能分析
--讲课视频
-2.6 结对编程实践
--讲课视频
-2.7 刘贺谈软件工程
--讲课视频
--讨论
-测验题--作业
-作业题
--第二章 作业题
-3.1 单元测试概述
--讲课视频
-3.2 黑盒测试方法
--黑盒测试方法
-3.3 白盒测试方法
--基本概念
--代码覆盖标准
--基本路径测试
-3.4 单元测试工具
--单元测试工具
--html
-测验题--作业
-作业题
--第三章 作业题
--作业题附件
-4.1 软件过程
--讲课视频
-4.2 软件过程模型
--讲课视频
-4.3 敏捷开发过程
--讲课视频
-4.4 微软公司开发过程
--邹欣经理自我介绍
--微软开发过程之一
--微软开发过程之二
-测验题--作业
-5.1 团队组织与管理
--讲课视频
-5.2 项目沟通管理
--讲课视频
-5.3 软件项目计划
--讲课视频
-5.4 软件项目估算
--讲课视频
-测验题--作业
-讨论题
--讨论
-6.1 敏捷开发之Scrum
-- 敏捷开发之Scrum
--html
-6.2 用户故事与估算
--讲课视频
-6.3 团队协作工具Tower
-6.4 配置管理
--讲课视频
-6.5 配置管理工具Git
--讲课视频
-测验题--作业
-作业题--作业
-7.1 需求工程师
--讲课视频
-7.2 需求定义
--讲课视频
-7.3 需求的类型
--讲课视频
--讲课视频(2)
-7.4 需求工程过程
--讲课视频
-7.5 需求的主要来源
--讲课视频
-7.6 需求获取技术
--讲课视频
--讲课视频二
--讲课视频三
-7.7 撰写需求文档
--讲课视频
-测验题--作业
-讨论题
--讨论
-8.1 用例建模概念
--讲课视频
-8.2 用例建模过程
--讲课视频
-8.3 用例建模精讲
--讲课视频
-8.4 建模工具介绍
--讲课视频
-8.5 微信抢票应用案例
--讲课视频
-测验题--作业
-讨论题
--讨论
-9.1 面向对象分析
--讲课视频
-9.2 CRC卡片分拣法
--讲课视频-1
--讲课视频-2
-9.3 面向对象设计
--讲课视频-1
--讲课视频-2
-9.4 类图建模
--讲课视频-1
--讲课视频-2
-第9章 面向对象分析与设计--测验题
-讨论题
--讨论
-10.1 顺序图概念
--讲课视频
-10.2 顺序图建模
--讲课视频
-10.3 顺序图风格
--讲义视频
-10.4 状态建模
--讲课视频
-10.5 状态图
--讲课视频
-10.6 状态图精讲
--讲义视频
-测验题--作业
-讨论题
--讨论
-11.1 软件体系结构概念
--讲授视频
-11.2 软件设计原则
--讲授视频
-11.3 软件体系结构风格(一)
--讲授视频
-11.4 软件体系结构风格(二)
--讲授视频
-11.5 软件体系结构风格(三)
--讲授视频
-11.6 软件设计过程
--讲授视频
-11.7 Web系统架构设计
--讲授视频
-11.8 数据库选择策略
--讲授视频
-测验题--作业
-作业题
--html
--html
--html
-作业题--作业
-12.1 交互设计概述
--讲授视频
-12.2 交互设计目标
--讲授视频
-12.3 GUI设计原则
--讲课视频
-12.4 KLM效率模型
--Video
-12.5 Fitts定律
--讲授视频
-12.6 交互设计过程
--讲授视频
-测验题--作业
-13.1 软件测试概念
--讲课视频
-13.2 软件测试类型
--讲课视频
-13.3 软件功能测试
--讲课视频
-13.4 软件性能测试
--讲课视频
-测验题--作业
-14.1 软件部署与交付
--讲课视频
-14.2 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)