《大道至简—软件工程实践者的思想》 --- 周爱民 在大学时代、在课桌上令人昏昏欲睡的《软件工程》才是软件开发中的髓质与灵魂 选择什么语言、如何重构、有没有或应不应该采用某种模式,都是软件开发的细微末节 我们常常陷于行动而没有思想,思想与行为脱节。常常知道做什么,但不知道为什么要这样做
“停下来,思考才是进步的本质!”
主题
软件工程的定义 软件工程的研究内容 软件工程的基本原理 软件工程的作用 软件开发的4种常用方法 软件工程的5个面向理论 软件的支持过程 软件的管理过程 软件生存周期及开发模型
Roger S.Pressman 软件过程改善和软件工程技术方面国际知名的权威。 30多年来,他作为软件工程师、管理人员、教授、作者及咨询顾问始终投身于软件工程领域。
计算机工程的定义
计算机由硬件和软件组成 计算机工程由硬件工程和软件工程组成 硬件工程:研究硬件生产和硬件管理的工程学科,包括计算机及网络硬件的分析、设计、生产、采购、验收、安装、培训、维护等。 软件工程:研究软件生产和软件管理的工程学科,包括市场调研、正式立项、项目策划、需求分析、概要设计、详细设计、编程、测试、试运行、产品发布、用户培训、产品复制、销售、实施、系统维护、版本升级等。 系统集成工程:有时也称网络工程,介于硬件工程和软件工程之间的系统工程(如:规划设计安装一个校园网)
程序与软件定义
程序的定义 面向过程的程序=算法 数据结构 面向对象的程序=对象 消息 面向构件的程序=构件 构架 软件的定义 软件=程序 数据 文档
“人生就是一段程序,这段程序是用特殊代码写成的,只是算法极其复杂而已。”
软件≠程序
越早开始写代码的人,就是越迟完成代码的人!
软件工程的定义
1993年,权威组织IEEE对软件工程定义为:软件工程是将系统化的、严格约束的、可量化的方法,应用于软件开发、运行和维护中去。 2001年,Roger S.Pressman 对软件工程的定义是:软件工程是一个过程、一组方法和一系列工具。 现在的定义,软件工程是研究软件开发和软件管理的一门工程科学。
软件工程的定义是与时俱进的
软件工程研究的内容
软件工程三要素:方法、工具、过程
软件工程的8个基本原理
用分阶段的生命周期计划,严格管理软件开发。 坚持进行阶段评审。 实行严格的产品版本控制。 采用现代程序设计技术。 结果应能清楚地审查。文档要有严格要求。 开发小组的成员要少而精。 要不断地改进软件工程实践的经验和技术。 牢记二八定律
软件工程中的二八定律
对软件项目进度和工作量的估计:一般人主观上认为已经完成了80%,但实际上只完成了20% 对程序中存在问题的估计:80%的问题存在于20%的程序之中 对模块功能的估计:20%的模块,实现了80%的功能 对人力资源的估计:20%的人,解决了软件中80%的问题 对投入资金的估计:企业信息系统中80%的问题,可以用20%的资金来解决。
这条原理特别重要,项目经理与高层经理,要特别牢记!
软件工程的作用
从软件项目团队来讲,解决在规定的时间内,按照规定的成本,完成预期质量目标(软件的功能、性能和接口达到需求报告标准)的软件。 从软件企业本身来讲,解决持续地规范软件开发过程和软件管理过程,不断地优化软件组织的个人素质和集体素质,从而逐渐增强软件企业的市场竞争实力。 从软件发展进程来讲,克服软件危机,控制软件进度,节约开发成本,提高软件质量。 从院校来讲,以前它只是作为一门课或一本书。现在它成为一个学科,一个体系,一个计算机学位,即软件工程硕士学位和软件工程博士学位。
软件工程中的4个开发方法
面向过程的方法 面向对象的方法 面向数据的方法 形式化方法(*)
面向过程的方法
内容:面向过程需求分析、面向过程设计、面向过程编程、面向过程测试、面向过程维护、面向过程管理。面向过程的方法,又称为面向功能的方法,或称为结构化方法。 特点:程序的执行过程,不由用户控制,完全由程序员控制。 优点:简单实用。 缺点:企图用有穷的方法(枚举法)来描述无穷的(随机的)信息世界,所以不能完全描述信息世界;维护困难。
面向对象的方法
内容:面向对象需求分析、面向对象设计、面向对象编程、面向对象测试、面向对象维护、面向对象管理。在分析、设计、实现中用到“对象、类、继承、消息通信”这四个基本概念,就是面向对象的方法。今天用UML来开发软件,就是面向对象的方法。 特点: (1).程序的执行过程,不由程序员控制,完全由用户控制。 (2).分析设计时面向类,编程时面向对象。 优点:用无穷的方法来描述无穷的(随机的)信息世界,所以能完全描述信息世界;易于维护。 缺点:较难掌握 。
面向数据的方法
内容:是建设信息系统数据库和数据仓库的基本方法。 1) 数据位于信息系统的中心。 2) 由元数据构成的数据模型是稳定的。 3) 对元数据的处理方法是可变的。 4) 企业信息系统的核心是数据模型。 5) 系统的实现方法主要是面向对象。 6) 用户始终参与信息系统的开发。 特点:程序的执行过程,有时由程序员控制,有时由用户控制 。 优点:适合数据层设计与实现。 缺点:实现窗口界面较困难。
形式化方法
软件工程的形式化方法是建立在严格数学基础上、以逻辑推理为出发点、并且具有精确数学语义的开发方法。 作为一种以数学逻辑为基础的方法,形式化方法以其严密性越来越受到众多领域的重视,尤其是在安全性和可靠性作为关键问题的系统,如核电站、航空航天、铁路运输系统中得到了较为广泛的应用。但是对于形式化方法在工业领域的实际应用问题,在软件工程界,尤其是在系统开发人员当中,还存在着相当多的疑问。 软件工程中的形式化方法是软件工程研究的领域之一,其内容包括:有限状态机、State charts、Petri网、通信顺序进程、通信系统演算、一阶逻辑、程序正确性证明、净室软件工程、时态逻辑、模型检验、Z形式规约语言、B语言和方法、VDM系统、Larch等。
四种开发方法的比较
软件工程中的5个面向原则
面向流程分析。 面向数据设计 面向对象实现 面向功能测试 面向过程管理
面向流程分析
面向流程分析,就是面向流程需求分析。 在需求分析时,系统分析员要面向业务流、资金流、信息流进行分析。只有将这“三个流”分析透了,才建立好系统的业务模型和功能模型。因为计算机网络在本质上只认识数据及数据流(严格地讲,它只认识二进制数和二进制数据的流动),而且这“三个流”,可以用“数据流”这一个流程来代替,或者说“三个流”是“数据流”在三个不同方向的投影。
面向数据的设计
面向数据设计,就是面向元数据进行概要设计。 在系统设计时,系统设计师要采用面向数据的方法进行概要设计。面向数据就是面向“元数据”(Metadata)。概要设计的主要任务是建立系统的数据模型,包括概念数据模型CDM和物理数据模型PDM,以及体现业务规则的存储过程和触发器,然后以数据模型为支撑,去实现系统的业务模型和功能模型(包括性能模型和接口模型)。为此,要对元数据进行分析,只有将元数据分析透了,才能建立好由元数据所构成的数据模型。 这里讲的面向数据设计,主要表现在数据库服务器上的关系数据库设计。
面向对象的实现
面向对象实现,就是面向对象进行详细设计和编程实现。 在两层结构(C/S)的客户层上,在三层结构(B/A/S)的表示层和业务逻辑层上,进行详细设计和编程实现时,要采用面向对象的方法。当然,在数据服务层上的设计和编程实现,仍然要采用面向数据的方法,因为主要是设计和编写存储过程,它们是面向数据的,不是面向对象的。详细设计和编程实现,实质上是用构件加上程序来实现系统的业务模型和功能模型。只有对系统的三个模型思想(业务模型、功能模型、数据模型)吃透了,才能设计和编写出合格的程序。 面向对象实现,实质上是面向类实现,因为实例化的类称为对象。
面向功能的测试
面向功能测试,就是面向功能进行单元测试、集成测试、Alpha测试和Beta测试(或系统测试和验收测试)。 在进行测试时,测试人员要采用面向功能的方法。这里讲的功能,包括系统的功能、性能和接口三部分内容。面向功能测试的方法就是黑盒子测试方法,随着第四代程序设计语言和构件技术的发展,该测试方法会越来越广泛。今后采用白盒子测试方法(面向程序执行路径测试)的人,只有从事软件构件生产和核心代码编程的极少数人员。
面向过程的管理
面向过程管理,就是面向过程对软件生命周期各个阶段进行管理和控制。 因为软件产品质量的提高与改进,完全取决于软件企业生产过程的改善。无论是CMM/CMMI、ISO9000、微软企业文化,都是站在软件生命周期过程的观念上去提高软件企业的素质。 那种认为“只要有几个优秀的程序员就能办好软件企业,就能生产出高质量的软件产品”的观点,在上世纪80年代理直气壮,在90年代还能解决温饱问题,在本世纪就站不住脚了,混不下去了,因为他们是手工作坊式的开发方法,忽视了软件中的面向过程管理。
软件的支持过程
软件工程中的过程,是指软件生命周期(Life Cycle)中的时间序列。过程作为一个时间序列,它自然有起始点和终止点。 例如,可以将一个软件的生命周期划分为市场调研、立项、策划、需求分析、概要设计、详细设计、编程、单元测试、集成测试、运行、维护这几个过程,前一过程的终止点就是后一过程的起始点。 过程与阶段(Phase)相对应,阶段与里程碑(Milestone)相对应。某些重要的里程碑的产出物又称为基线(baseline)。
软件的支持过程
软件工程的支持过程,由支持软件生命周期各个阶段的生产工具所组成。 生产工具如需求分析工具、设计工具、实现工具、测试工具、维护工具、配置工具,开发环境。 支持过程是通过支持工具来实现的。每一种支持工具都是当前软件界的热点之一,但它不是软件工程的重点内容。
软件工程常用支持工具
系统分析设计与建模工具 IBM Rational Rose Microsoft Visual Studio Team System Microsoft Office Visio for Enterprise Architects 数据库设计与建模工具 Sybase Power Designer CA ERWin Microsoft Visual Studio Team System Microsoft Office Visio for Enterprise Architects 开发工具 Microsoft Visual Studio Team System(.NET平台) 开源 Eclipse (JAVA平台) 单元测试工具 Microsoft Visual Studio Team System 开源 NUnit (.NET平台) 开源 JUnit (JAVA平台)
软件工程常用支持工具
安装工具 Microsoft Visual Studio .NET InstallShield 开源 NSIS (编写安装脚本) 文档工具 Microsoft Help Workshop (制作HLP文件) Microsoft HTML Help Workshop (制作CHM文件) 开源 NDoc (根据代码注释自动生成文档) 画图工具 Microsoft Office Visio 源代码管理工具 Microsoft Visual Studio Team System Microsoft Visual SourceSafe (VSS) 开源 Concurrent Versions System (CVS/CVSNT) 项目管理工具 Microsoft Visual Studio Team System Microsoft Office Project
软件的管理过程
“外行关注结果,内行关注过程”。 1974年,美国人认识到“软件需要管理”。 1984年,美国人认识到“软件管理是过程管理”。 软件工程中主要存在3类过程管理模型: ISO9000质量管理和质量保证体系 CMM/CMMI过程能力成熟度模型 企业文化 (微软企业文化、敏捷文化现象等 )
牢记:软件管理过程比开发技术更重要!
软件工程中的3类过程管理模型
软件生存周期概论
任何有生命的动物、植物和人,都有一个生存周期(Life Cycle),例如人的生存周期为胎儿、婴儿、幼儿、儿童、少年、青年、中年、老年、死亡。 没有生命的事物或实体,例如PC机、路由器、家具、房子、汽车,它们也有一个生存周期,这个生存周期就是使用寿命,即生产周期加上使用周期。 生存周期与开发模型有关。
软件的生存周期(常规)
软件开发常见模型
瀑布模型 增量模型 迭代模型 原型模型
瀑布模型(Waterfall Model)
定义:1970年温斯顿?罗伊斯(Winston Royce)提出了著名的“瀑布模型”,直到80年代早期,它一直是唯一被广泛采用的软件开发模型。 瀑布模型核心思想是按工序将问题化简,将功能的实现与设计分开,便于分工协作,即采用结构化的分析与设计方法将逻辑实现与物理实现分开。将软件生命周期划分为制定计划、需求分析、软件设计、程序编写、软件测试和运行维护等六个基本活动,并且规定了它们自上而下、相互衔接的固定次序,如同瀑布流水,逐级下落。 瀑布模型是最早出现的软件开发模型,在软件工程中占有重要的地位,它提供了软件开发的基本框架。其过程是从上一项活动接收该项活动的工作对象作为输入,利用这一输入实施该项活动应完成的内容给出该项活动的工作成果,并作为输出传给下一项活动。同时评审该项活动的实施,若确认,则继续下一项活动;否则返回前面,甚至更前面的活动。对于经常变化的项目而言,瀑布模型毫无价值。
瀑布模型图
瀑布模型优缺点
优点: 提供了软件开发的基本框架 为项目提供了按阶段划分的检查点 当前一阶段完成后,您只需要去关注后续阶段 可在迭代模型中应用瀑布模型(*) 缺点: 在项目各个阶段之间极少有反馈 由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发的风险 通过过多的强制完成日期和里程碑来跟踪各个项目阶段。而且各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量 早期的错误可能要等到开发后期的测试阶段才能发现,进而带来严重的后果
瀑布模型选择条件
选择模型的条件: 在开发时间内需求没有或很少变化。 分析设计人员对应用领域很熟悉。 低风险项目(对目标、环境很熟悉)。 用户使用环境很稳定。 用户除提出需求以外,很少参与开发。
增量模型
增量模型将软件产品看作一组增量构件,每次设计、实现、集成、测试和交付一块构件,直到所有构件全部实现为止。 要开发一个大的软件系统,先开发其中的一个核心模块,后再开发其他模块,这样一个个模块地增加上去,直至整个系统开发完毕为止。 增量模型的特点是引进了增量包的概念,无须等到所有需求都出来,只要某个需求的增量包出来即可进行开发。虽然某个增量包可能还需要进一步适应客户的需求并且更改,但只要这个增量包足够小,其影响对整个项目来说是可以承受的。
增量模型图
增量模型的优缺点
优点 采用增量模型的优点是人员分配灵活,刚开始不用投入大量人力资源。 如果核心产品很受欢迎,则可增加人力实现下一个增量。 当配备的人员不能在设定的期限内完成产品时,它提供了一种先推出核心产品的途径。这样即可先发布部分功能给客户,对客户起到镇静剂的作用。 增量能够有计划地管理技术风险。 缺点 由于各个构件是逐渐并入已有的软件体系结构中的,所以加入构件必须不破坏已构造好的系统部分,这需要软件具备开放式的体系结构。 在开发过程中,需求的变化是不可避免的。增量模型的灵活性可以使其适应这种变化的能力大大优于瀑布模型和快速原型模型,但也很容易退化为边做边改模型,从而是软件过程的控制失去整体性。 如果增量包之间存在相交的情况且未很好处理,则必须做全盘系统分析,这种模型将功能细化后分别开发的方法较适应于需求经常改变的软件开发过程。
增量模型的选择条件
选择模型的条件: 在项目开发过程中,客户接受分阶段交付。 开发人员对应用领域不熟悉,难以一步到位。 工期过紧的中等或高风险项目。 用户可参与到整个软件开发过程中。 使用面向对象语言或第四代语言(傻瓜式编程)。 软件公司自己有较好的类库、构件库。
迭代模型( Iterative Model )
迭代被定义为:迭代包括产生产品发布(稳定、可执行的产品版本)的全部开发活动和要使用该发布必需的所有其他外围元素。 在某种程度上,开发迭代是一次完整地经过所有工作流程的过程:(至少包括)需求工作流程、分析设计工作流程、实施工作流程和测试工作流程。 实质上,它类似小型的瀑布式项目。所有的阶段(需求及其它)都可以细分为迭代。每一次的迭代都会产生一个可以发布的产品,这个产品是最终产品的一个子集。
迭代模型图
迭代模型的优缺点
优点 降低了在一个增量上的开支风险。如果开发人员重复某个迭代,那么损失只是这一个开发有误的迭代的花费。 降低了产品无法按照既定进度进入市场的风险。通过在开发早期就确定风险,可以尽早来解决而不至于在开发后期匆匆忙忙。 加快了整个开发工作的进度。因为开发人员清楚问题的焦点所在,他们的工作会更有效率。 由于用户的需求并不能在一开始就作出完全的界定,它们通常是在后续阶段中不断细化的。因此,迭代过程这种模式使适应需求的变化会更容易些。 缺点 对项目组成员要求很高。 必须掌握先进的开发工具
迭代模型的选择条件
选择模型的条件: 在项目开发早期需求可能有所变化。 分析设计人员对应用领域很熟悉。 高风险项目。 用户可不同程度地参与整个项目的开发过程。 使用面向对象的语言或UML语言。 使用CASE( Computer Aided Software Engineering,计算机辅助软件工程)工具,如Rose。 具有高素质的项目管理者和软件研发团队。
原型模型
先借用已有系统作为原型模型,通过“样品”不断改进,使得最后的产品就是用户所需要的。 在初步需求分析之后,马上向客户展示一个软件产品原型,对客户进行培训,让客户试用,在试用中收集客户意见,修改原型,再让客户试用,反复循环几次,直到客户确认为止。 原型驱动。因此,开发者必须先有一个原型,至少要有一个原型的核心。
原型模型图
原型模型的优缺点
优点 开发人员和用户在“原型”上达成一致。这样一来,可以减少设计中的错误和开发中的风险,也减少了对用户培训的时间,而提高了系统的实用、正确性以及用户的满意程度 缩短了开发周期,加快了工程进度 降低成本 缺点 因为事先有一个展示性的产品原型,所以在一定程度上,不利于开发人员的创新 当告诉用户,还必须重新生产该产品时,用户是很难接受的。这往往给工程继续开展带来不利因素。 不宜利用原型系统作为最终产品。采用原型模型开发系统,用户和开发者必须达成一致:原型被建造仅仅是用户用来定义需求,之后便部分或全部抛起,最终的软件是要充分考虑了质量和可维护性等方面之后才被开发。
原型模型的选择条件
选择模型的条件: 已有产品或产品的原型,只需客户化的项目。 简单而熟悉的行业或领域。 有快速原型开发工具。 进行产品移植或升级。
开发模型的对比与关联
原型与迭代是包含的关系,一次迭代的过程可以采用原型法,也可以采用其它方法 原型法里面的原型包括两种 抛弃型,只是为了获得用户需求,可能采用不同的技术实现,得到用户需求以后抛弃 迭代型,开始完成的是系统核心功能或者是系统架构,逐步求精和完善 增量和迭代的区别在于增量模型是从功能量上来划分的,每阶段完成一定的功能。迭代模型是从深度或细化的程度来划分的,每阶段功能得到完善、增强。 增量和迭代的共同点是每个迭代和增量结束后都有产品发布。 在实际应用中,增量、迭代经常一起使用,如迭代时加入新的功能进行开发,这也是他们经常一起出现的原因。
开发模型小结
进入IT企业参与软件开发或软件管理时,首先要明确:当前的项目或产品开发到底采用什么开发模型,由此确定软件的生存周期和当前的软件开发进度;合理安排项目组成员的工作。迅速适应IT企业文化,并很快进入角色。 瀑布模型、增量模型、迭代模型和原型模型。因为4个模型各有所长,所以它们有各自的生存空间。因为它们各有所短,所示才会产生相互竞争,共同构成一个丰富多彩的多个模型竞争的世界。 一个成熟的软件组织,根据上述通用的4个软件开发模型的普遍原则,结合本单位的开发经验和行业特点的具体实际,还需要定制适合本单位的“生存周期模型裁剪指南”,有针对性地对选定的软件开发模型中定义的生存周期,进行恰当的裁剪,使它完全适合于本单位的需求。从而构成了完全适合本单位的“生存周期模型裁剪指南”。该“指南”在软件组织内部,专供高层经理和项目经理在软件策划中选取软件开发模型时使用。