软件工程概述

从工程学的角度人事软件在大型系统中的设计和应用,让软件工程师具有从事工程实践所需的专业能力。

  • 需求定义和分析
  • 权衡和选择技术方案
  • 使用 UML 建模
  • 开发 高质量 的软件
  • 运用软件工程工具
  • 团队协作开发
  • 谈判与沟通
  • 为什么要学软件工程?

对软件开发的认识:程序 -> 系统

对程序员的认识:程序员 -> 软件工程师

软件工程的产生与发展

软件无处不在,为我们生活创造了无限的精彩。在当今的信息时代,世界变得更加 “智辉”,万事万物间感知化、互联化和智能化的成都不断加深。 软件工程为这一切做出了巨大的贡献,随着该学科的成熟与发展,其未来的贡献将不可限量。 在软件工程早期是一门课,连专业方向也算不上,经过软件的日益发展,现在成为了一门独立的学科。 软件工程的未来,还会发展的更快,未来会想着万物互联、感知、智能的方向发展。

软件的发展历史

1949 ~ 1959

  • 独立变成服务

代表:CSC

特点:为单个客户提供定制软件,包扩技术咨询、软件编程、和维护;软件的销售是一次性的。

这个时期的软件都是跟着硬件搭配的,比如我买个机器,它要干活,他就要相应的软件来搭配,比如我们的机器要一个科学计算的功能,我们就要找人定制一个科学计算的软件。希望做其他的,我们就定制其他的软件。

1959 ~ 1969

  • 软件产品

代表:Informatics

特点:保护知识产权以许可证的方式销售软件

有一群人也就是做这个定制化软件的服务,这个定制化(外包)的公司在为多个公司服务的过程中就发现,多家公司有类似的功能,所以他们把同样的功能,抽离出来做成一个面向收费的项目。

1969 ~ 1981

  • 企业级解决方案

代表:Oracle

特点:面向领域,以企业解决方案供应商面目出现

1981 ~ 1991

  • 面向大众的套件

代表:Microsoft

特点:基于个人计算服务大众市场

Microsoft 做出来 PC 机后,就有了个人使用 PC 机。这样 Microsoft 创出来了一个面向个人的商业模式。

1994 ~ 至今

  • 网络增值服务

代表:Google

特征:想端用户收小头,想寄生在服务上的广告收大头。

国内有一个杀毒软件 360 也是类似的商业模式。

这个发展阶段,软件可以少收费,或者不收费。对于使用者来说是一个很大的便捷,有一个更好的服务。

软件开发面临的挑战

软件创新最大的障碍:复杂性

  • 复杂的基础架构
  • 缺乏使用的开发流程
  • 存在众多的应用程序
  • 每年扩展现存在系统并开发新的系统
  • 软件生产环境本身的复杂性

例如以下四点:

1、客户不满意

  1. 交付的许多功能不是客户需要的。

  2. 交付的日期没有保障。

  3. 软件中有很多的 BUG。

2、风险与成本问题

  1. 开发团队专注技术,忽略风险
  2. 无能力预测成本,导致预算超支

3、项目过程失控

  1. 客户的需求变化频繁,无力应对

  2. 无法预见软件交付质量

  3. 对流程管理盲目遵从,忽略客户业务价值

4、无力管理团队

  1. 无法评估开发人员能力及工作进度

  2. 困扰于如何提成团队的能力与效率

软件发展很快,但是软件能够按时完成无大问题的 交付的特别少。

举例1:ARIANE 5 火箭

1996 年 6 月 4 日,ARIANE 5 火箭在发射 37 秒之后偏离轨道发生爆炸,当时火箭上载有 5 亿美元的通讯卫星

原因:

  • 程序中视图将 64 位浮点数转化为 16 位整数导致溢出。

  • 没有很好的异常处理。

  • 备份通过复制而成

举例3:12306 网络购票系统

12306 网络购票系统历时两年研发成功,耗资 3 亿元人民币,于 2011 年 6 月 12 日投入使用。

2012 年春运启动,1 月 9 日网站点击量超过 14 亿,出现网络奔溃、登录缓慢、无法支付、扣钱不出票等严重问题。

软件的本质特征

一个值得思考的问题

为什么一个看似简单的东西,却很有可能变成一个落后进度、超出预算、存在大量缺陷的怪物?

软件具有复杂度、一致性、可变性和不可变性等内在特征,这是造成软件开发困难的根本原因。— 《人月神话》

软件的特征是无法消除的,只有通过工程化的手段来减轻。

软件的本质特征:复杂性

软件是由人的思想,转化为计算机的软件导致一定的复杂性。

软件的本质特征:演化性

不断的迭代更新,引入了其他很多功能,导致软件很庞大。由于上游的更改,导致下游软件也要更改以兼容不同的上游。

软件的本质特征:不可见性

软件开发问题的解决途径

软件工程诞生:1968 年 西大洋公约组织 (NATO)召开国际会议,提出 软件工程 概念和术语。

1956 ~ 1967

史前时代

  • 软件开发没有方法可循
  • 软件设计是在开发人员头脑中完成的隐藏过程
  • 60 年代中期的软件危机

1968 ~ 1982

瀑布过程模型

  • 1968 年提出 软件工程
  • 结构化开发方法
  • 瀑布式开发生命周期成为典型

1983 ~ 1995

  • 面向对象开发方法
  • 软件过程改进运动
  • CMM / ISO9000 / SPICE 等质量标准体系

1991 ~ 至今

  • 敏捷开发方法流行
  • 更精密的团队协作
  • 有效应对需求变化
  • 快速交付高质量软件
  • 迭代和增量开发过程

软件工程

系统的特征

  • 系统是互相联系的一组元素的集合
  • 系统是具有特定功能的有机整体
  • 系统是有边界的
  • 系统需要与其他系统交互
  • 一个系统可能存在另一个系统
  • 系统是逐渐演变而成的

什么是软件工程

软件工程是 1. 将系统性的、规范化的、可定量的方法应用与软件的开发、运行和维护,及工程化应用到软件里面。2. 对 1 的研究。

工程 我们需要把复杂的东西简化。

软件工程是一项建模活动,通过抽象找到事务的重要特征而忽略非本质的细节,从不同侧面简历系统模型,有效简化和处理复杂性。

软件工程是一项解决问题的工程活动,它不仅限于算法设计,还要通过试验,设计复用,系统评估等手段找到一个客户可接受的方案。

软件工程是一项受软件工程原理知道的活动,软件工程师需要捕捉和理解一个系统的基本原理模型,并根据标准提出合理的开发决策。

大致总结就是

软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。

软件工程的目标

软件工程的目标是:在给定成本、进度的前提下,开发出具有适用性、有效性、可修改性、可靠性、可理解性、可维护性、可重用性、可移植性、可追踪性、可互操作性和满足用户需求的软件产品。追求这些目标有助于提高软件产品的质量和开发效率,减少维护的困难。

(1)适用性:软件在不同的系统约束条件下,使用户需求得到满足的难易程度。

(2)有效性:软件系统能最有效的利用计算机的时间和空间资源。各种软件无不把系统的时/空开销作为衡量软件质量的一项重要技术指标。很多场合,在追求时间有效性和空间有效性时会发生矛盾,这时不得不牺牲时间有效性换取空间有效性或牺牲空间有效性换取时间有效性。时/空折衷是经常采用的技巧。

(3)可修改性:允许对系统进行修改而不增加原系统的复杂性。它支持软件的调试和维护,是一个难以达到的目标。

(4)可靠性:能防止因概念、设计和结构等方面的不完善造成的软件系统失效,具有挽回因操作不当造成软件系统失效的能力。

(5)可理解性:系统具有清晰的结构,能直接反映问题的需求。可理解性有助于控制系统软件复杂性,并支持软件的维护、移植或重用。

(6)可维护性:软件交付使用后,能够对它进行修改,以改正潜伏的错误,改进性能和其它属性,使软件产品适应环境的变化等。软件维护费用在软件开发费用中占有很大的比重。可维护性是软件工程中一项十分重要的目标。

(7)可重用性:把概念或功能相对独立的一个或一组相关模块定义为一个软部件。可组装在系统的任何位置,降低工作量。

(8)可移植性:软件从一个计算机系统或环境搬到另一个计算机系统或环境的难易程度。

(9)可追踪性:根据软件需求对软件设计、程序进行正向追踪,或根据软件设计、程序对软件需求的逆向追踪的能力。

(10)可互操作性:多个软件元素相互通信并协同完成任务的能力

总结

软件工程的最根本意义其实就是,做一个可维护,可迭代,性能好,有价值,有远见,不超时的系统(软件)。