课程来源: 学堂在线 -- 清华大学 -- 软件工程
重点掌握概念和知识点:
- 软件的定义及本质特征
- 软件工程发展历程及目前面临的主要挑战
- 软件工程的基本概念及组成要素:过程、方法、工具
- 理解软件项目过程管理的重要性
1.1 软件无处不在
软件已成为一种驱动力,它不仅是商业决策的引擎,也是研究现代科学和解决工程问题的基础,更是推动全球经济创新的关键因素。
应用:生物工程、现代通讯、宇宙探索、商务处理、工业制造等
人们对软件的正确性、可靠性、安全性等可信性质要求越来越高。
如何以经济有效的方法开发高质量的软件是软件工程致力于解决的问题
软件是软件工程的研究对象,也是软件工程的产品形态与客观存在
工程是将理论和知识应用于实践的科学,其目的是经济有效地解决实际问题
软件工程倡导以工程的原理、原则和方法进行软件的开发,用系统的、可控的和有效的方式构建高质量的软件产品
学习目标
- 软件具有哪些本质的特性
- 软件开发面临哪些主要的问题
- 正确理解软件工程中的基本概念和内涵
- 软件开发应遵循哪些工程化的原则
- 业内人士如何看待软件工程
1.2 软件的本质特性
软件的定义
软件 = 程序 + 数据 + 文档
- 程序: 计算机可以接受的一系列指令,运行时可以提供所要求的功能和性能
- 数据: 使得程序能够适当地操作信息的数据结构
- 文档:描述程序的研制过程、方法和使用的图文资料
软件的本质特性
复杂性
- Google搜索引擎建立在遍布全球30多个站点、超过100万台服务器的云计算设施上
- Amazon拥有28个云计算中心,在全球的服务器总量超过150万台
- 阿里云是国内最大的云计算平台, 拥有近百万台服务器,分布在北京、上海、深圳、香港和美国等
一致性
- 软件不能独立存在,需要依附于一定的环境(如硬件、网络以及其他软件)
- 软件必须遵从人为的惯例并适应已有的技术和系统
- 软件需要随接口不同而改变,随时间推移而变化,而这些变化是不同人设计的结果
可变性
案例 微信开发
- 人们总是认为软件是容易修改的,但忽视了修改所带来的副作用
- 不断的修改最终导致软件的退化,从而结束其生命周期
不可见性
- 软件是一种“看不见、摸不着”的逻辑实体,不具有空间的形体特征
- 开发人员可以直接看到程序代码,但是源代码并不是软件本身
- 软件是以机器代码的形式运行,但是开发人员无法看到源代码是如何执行的
软件的本质特性
软件所具有的复杂性、一致性、可变性、不可见性等特性,使得软件开发 过程变得难以控制,开发团队如同在焦油坑中挣扎的巨兽
1.3 软件工程的产生与发展
美国Standish集团的调查报告
软件开发面临的挑战
客户不满意
-
交付的许多功能不是客户需要的
-
交付的日期没有保障
-
客户使用时发现许多Bug
风险与成本问题
- 开发团队专注技术,忽视风险
- 无能力预测成本,导致预算超支
项目过程失控
- 客户需求变化频繁,无力应对
- 无法预见软件的交付质量
- 对流程盲目遵从,忽视客户业务价值
无力管理团队
- 无法评估开发人员能力及工作进度
- 困扰于如何提升团队的能力与效率
探讨软件之道
软件工程一直致力于探索软件开发问题的解决之道
1.4 软件工程的基本概念
工程的含义
工程是将理论和知识应用于实践 的科学,以便经济有效地解决问题
特点
- 大规模的设计与建造
- 复杂问题与目标分解
- 团队协作与过程控制
什么是软件工程
软件工程是将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护, 即工程化应用到软件上
软件工程的目标 —— 创造“足够好”的软件
- 较低的开发成本
- 按时完成开发任务并及时交付
- 实现客户要求的功能
- 具有良好性能、可靠性、可扩展性、可移植性等
- 软件维护费用低
软件工程的基本要素
软件工程过程
软件工程方法
面向服务(HTTP/XML/WSDL/SOAP/UDDI/OWL):在应用表现层次上将软件构件化,即应用 业务过程由服务组成,而服务由构件组装而成
面向构件(J2EE/DCOM/CORBA):寻求比类的粒度更大的且易于复用的构件, 期望实现软件的再工程
面向对象(OOD/UML/OMT):以类为基本程序单元,对象是类的实例化, 对象之间以消息传递为基本手段
面向过程(SASD):以算法作为基本构造单元,强调自顶向下 的功能分解,将功能和数据进行一定程度的分离
软件工程工具
软件开发基本策略
软件复用
利用将已有的软件制品,直接组装或者合理修改形成新的软件系统,从而提高开发效率和产品质量,降低维护成本
- 构造一个新的系统不必从零做起,直接复用已有的构件进行组装
- 构件是经过反复使用验证的,由其组成的新系统具有较高的质量
分而治之
通过对问题进行研究分析,将一个复杂问题分 解成可以理解并能够处理的若干小问题,然后再逐个解决
- 将一个复杂的问题分解成若干个简单的问题,然后逐个解决
- 来源于人们生活与工作的经验,完全适合于技术领域
逐步演进
软件更像一个活着的植物,其生长是一个逐步有序的过程。软件开发应该遵循软件的客观规律,不断进行迭代式增量开发,最终交付符合客户价值的产品 。
- 软件开发是自底向上逐步有序的生长过程
- 小步快跑:每走完一步再调整并为下一步确定方向,直到终点
优化折中
软件工程师应当把优化当成一种责任,不断改进和提升软件质量;但是优化是一个多目标的最优决策,在不可能使所有目标都得到优化时,需要进行折中实现整体最优。
- 优化:优化软件的各个质量特性,如运行速度、资源利用、用户体验
- 折中:通过协调各个质量特性,实现整体质量的最优
软件工程学科发展